ngx-aur-mat-table 15.0.3 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/{esm2020 → esm2022}/lib/components/column-value/column-view.component.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/data-property-getter-pipe/data-property-getter.pipe.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/directive/ngx-table-sub-footer-row.directive.mjs +4 -4
  4. package/esm2022/lib/model/EmptyValue.mjs +29 -0
  5. package/esm2022/lib/ngx-aur-mat-table.component.mjs +316 -0
  6. package/{esm2020 → esm2022}/lib/ngx-aur-mat-table.module.mjs +28 -28
  7. package/esm2022/lib/providers/IndexProvider.mjs +65 -0
  8. package/esm2022/lib/providers/RowActionProvider.mjs +66 -0
  9. package/esm2022/lib/providers/SelectionProvider.mjs +77 -0
  10. package/{fesm2020 → fesm2022}/ngx-aur-mat-table.mjs +74 -74
  11. package/{fesm2020 → fesm2022}/ngx-aur-mat-table.mjs.map +1 -1
  12. package/lib/components/column-value/column-view.component.d.ts +1 -1
  13. package/lib/ngx-aur-mat-table.component.d.ts +1 -1
  14. package/package.json +13 -19
  15. package/esm2020/lib/model/EmptyValue.mjs +0 -29
  16. package/esm2020/lib/ngx-aur-mat-table.component.mjs +0 -316
  17. package/esm2020/lib/providers/IndexProvider.mjs +0 -65
  18. package/esm2020/lib/providers/RowActionProvider.mjs +0 -66
  19. package/esm2020/lib/providers/SelectionProvider.mjs +0 -77
  20. package/fesm2015/ngx-aur-mat-table.mjs +0 -1230
  21. package/fesm2015/ngx-aur-mat-table.mjs.map +0 -1
  22. /package/{esm2020 → esm2022}/lib/factories/ActionViewFactory.mjs +0 -0
  23. /package/{esm2020 → esm2022}/lib/factories/DisplayColumnsFactory.mjs +0 -0
  24. /package/{esm2020 → esm2022}/lib/factories/MatTableDataSourceFactory.mjs +0 -0
  25. /package/{esm2020 → esm2022}/lib/factories/TableRowsFactory.mjs +0 -0
  26. /package/{esm2020 → esm2022}/lib/filters/NgxAurFilters.mjs +0 -0
  27. /package/{esm2020 → esm2022}/lib/model/ColumnConfig.mjs +0 -0
  28. /package/{esm2020 → esm2022}/lib/model/TableRow.mjs +0 -0
  29. /package/{esm2020 → esm2022}/lib/model/TableViewFactory.mjs +0 -0
  30. /package/{esm2020 → esm2022}/lib/ngx-aur-mat-table-filterable.mjs +0 -0
  31. /package/{esm2020 → esm2022}/lib/ngx-aur-mat-table-public.mjs +0 -0
  32. /package/{esm2020 → esm2022}/lib/ngx-aur-mat-table-refreshable.mjs +0 -0
  33. /package/{esm2020 → esm2022}/lib/ngx-aur-mat-table-selection-model.mjs +0 -0
  34. /package/{esm2020 → esm2022}/lib/providers/AbstractProvider.mjs +0 -0
  35. /package/{esm2020 → esm2022}/lib/providers/PaginationProvider.mjs +0 -0
  36. /package/{esm2020 → esm2022}/lib/providers/TotalRowProvider.mjs +0 -0
  37. /package/{esm2020 → esm2022}/lib/style-builder/style-builder.mjs +0 -0
  38. /package/{esm2020 → esm2022}/lib/utils/ngx-aur-table-config.util.mjs +0 -0
  39. /package/{esm2020 → esm2022}/lib/utils/offset.util.mjs +0 -0
  40. /package/{esm2020 → esm2022}/ngx-aur-mat-table.mjs +0 -0
  41. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -4,10 +4,10 @@ import * as i1 from "@angular/common";
4
4
  import * as i2 from "@angular/material/icon";
5
5
  import * as i3 from "@angular/material/tooltip";
6
6
  export class ColumnViewComponent {
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ColumnViewComponent, selector: "lib-column-view", inputs: { config: "config", value: "value" }, ngImport: i0, template: "<div class=\"align-container\">\n <div [ngClass]=\"{'circle': config?.icon?.wrapper}\"\n [style.background-color]=\"config?.icon?.wrapper?.color\"\n >\n <mat-icon *ngIf=\"config?.icon\"\n [matTooltip]=\"config?.icon?.tooltip?.toString() || ''\"\n [style.color]=\"config?.icon?.color\"\n >\n {{config?.icon?.name}}\n </mat-icon>\n </div>\n\n <img\n *ngIf=\"config?.image?.src\"\n [src]=\"config?.image?.src\"\n [style.height]=\"config?.image?.height\"\n [style.width]=\"config?.image?.width\"\n alt=\"img\"\n >\n\n <span *ngIf=\"config?.text?.show != false\"\n [matTooltip]=\"config?.text?.tooltip?.toString() || ''\"\n >\n {{value}}\n </span>\n</div>\n", styles: [".align-container{display:flex;align-items:center}span{margin-left:4px}.circle{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
7
9
  }
8
- ColumnViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
- ColumnViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ColumnViewComponent, selector: "lib-column-view", inputs: { config: "config", value: "value" }, ngImport: i0, template: "<div class=\"align-container\">\n <div [ngClass]=\"{'circle': config?.icon?.wrapper}\"\n [style.background-color]=\"config?.icon?.wrapper?.color\"\n >\n <mat-icon *ngIf=\"config?.icon\"\n [matTooltip]=\"config?.icon?.tooltip?.toString() || ''\"\n [style.color]=\"config?.icon?.color\"\n >\n {{config?.icon?.name}}\n </mat-icon>\n </div>\n\n <img\n *ngIf=\"config?.image?.src\"\n [src]=\"config?.image?.src\"\n [style.height]=\"config?.image?.height\"\n [style.width]=\"config?.image?.width\"\n alt=\"img\"\n >\n\n <span *ngIf=\"config?.text?.show != false\"\n [matTooltip]=\"config?.text?.tooltip?.toString() || ''\"\n >\n {{value}}\n </span>\n</div>\n", styles: [".align-container{display:flex;align-items:center}span{margin-left:4px}.circle{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnViewComponent, decorators: [{
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnViewComponent, decorators: [{
11
11
  type: Component,
12
12
  args: [{ selector: 'lib-column-view', template: "<div class=\"align-container\">\n <div [ngClass]=\"{'circle': config?.icon?.wrapper}\"\n [style.background-color]=\"config?.icon?.wrapper?.color\"\n >\n <mat-icon *ngIf=\"config?.icon\"\n [matTooltip]=\"config?.icon?.tooltip?.toString() || ''\"\n [style.color]=\"config?.icon?.color\"\n >\n {{config?.icon?.name}}\n </mat-icon>\n </div>\n\n <img\n *ngIf=\"config?.image?.src\"\n [src]=\"config?.image?.src\"\n [style.height]=\"config?.image?.height\"\n [style.width]=\"config?.image?.width\"\n alt=\"img\"\n >\n\n <span *ngIf=\"config?.text?.show != false\"\n [matTooltip]=\"config?.text?.tooltip?.toString() || ''\"\n >\n {{value}}\n </span>\n</div>\n", styles: [".align-container{display:flex;align-items:center}span{margin-left:4px}.circle{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%}\n"] }]
13
13
  }], propDecorators: { config: [{
@@ -15,4 +15,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
15
15
  }], value: [{
16
16
  type: Input
17
17
  }] } });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1ci1tYXQtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2NvbHVtbi12YWx1ZS9jb2x1bW4tdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYXVyLW1hdC10YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvY29sdW1uLXZhbHVlL2NvbHVtbi12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2RCxNQUFNLE9BQU8sbUJBQW1COztpSEFBbkIsbUJBQW1CO3FHQUFuQixtQkFBbUIscUdDUmhDLGt1QkEwQkE7NEZEbEJhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OEJBS2xCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbHVtblZpZXd9IGZyb20gXCIuLi8uLi9tb2RlbC9Db2x1bW5Db25maWdcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNvbHVtbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbHVtbi12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29sdW1uLXZpZXcuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbHVtblZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBjb25maWc6IENvbHVtblZpZXc8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJhbGlnbi1jb250YWluZXJcIj5cbiAgPGRpdiAgW25nQ2xhc3NdPVwieydjaXJjbGUnOiBjb25maWc/Lmljb24/LndyYXBwZXJ9XCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29uZmlnPy5pY29uPy53cmFwcGVyPy5jb2xvclwiXG4gID5cbiAgICA8bWF0LWljb24gKm5nSWY9XCJjb25maWc/Lmljb25cIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJjb25maWc/Lmljb24/LnRvb2x0aXA/LnRvU3RyaW5nKCkgfHwgJydcIlxuICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiY29uZmlnPy5pY29uPy5jb2xvclwiXG4gICAgPlxuICAgICAge3tjb25maWc/Lmljb24/Lm5hbWV9fVxuICAgIDwvbWF0LWljb24+XG4gIDwvZGl2PlxuXG4gIDxpbWdcbiAgICAqbmdJZj1cImNvbmZpZz8uaW1hZ2U/LnNyY1wiXG4gICAgW3NyY109XCJjb25maWc/LmltYWdlPy5zcmNcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY29uZmlnPy5pbWFnZT8uaGVpZ2h0XCJcbiAgICBbc3R5bGUud2lkdGhdPVwiY29uZmlnPy5pbWFnZT8ud2lkdGhcIlxuICAgIGFsdD1cImltZ1wiXG4gID5cblxuICA8c3BhbiAqbmdJZj1cImNvbmZpZz8udGV4dD8uc2hvdyAhPSBmYWxzZVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cImNvbmZpZz8udGV4dD8udG9vbHRpcD8udG9TdHJpbmcoKSB8fCAnJ1wiXG4gID5cbiAgICAgICB7e3ZhbHVlfX1cbiAgPC9zcGFuPlxuPC9kaXY+XG4iXX0=
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1ci1tYXQtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2NvbHVtbi12YWx1ZS9jb2x1bW4tdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYXVyLW1hdC10YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvY29sdW1uLXZhbHVlL2NvbHVtbi12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2RCxNQUFNLE9BQU8sbUJBQW1COytHQUFuQixtQkFBbUI7bUdBQW5CLG1CQUFtQixxR0NSaEMsa3VCQTBCQTs7NEZEbEJhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OEJBS2xCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbHVtblZpZXd9IGZyb20gXCIuLi8uLi9tb2RlbC9Db2x1bW5Db25maWdcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNvbHVtbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbHVtbi12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29sdW1uLXZpZXcuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbHVtblZpZXdDb21wb25lbnQge1xuICBASW5wdXQoKSBjb25maWc6IENvbHVtblZpZXc8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJhbGlnbi1jb250YWluZXJcIj5cbiAgPGRpdiAgW25nQ2xhc3NdPVwieydjaXJjbGUnOiBjb25maWc/Lmljb24/LndyYXBwZXJ9XCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29uZmlnPy5pY29uPy53cmFwcGVyPy5jb2xvclwiXG4gID5cbiAgICA8bWF0LWljb24gKm5nSWY9XCJjb25maWc/Lmljb25cIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJjb25maWc/Lmljb24/LnRvb2x0aXA/LnRvU3RyaW5nKCkgfHwgJydcIlxuICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiY29uZmlnPy5pY29uPy5jb2xvclwiXG4gICAgPlxuICAgICAge3tjb25maWc/Lmljb24/Lm5hbWV9fVxuICAgIDwvbWF0LWljb24+XG4gIDwvZGl2PlxuXG4gIDxpbWdcbiAgICAqbmdJZj1cImNvbmZpZz8uaW1hZ2U/LnNyY1wiXG4gICAgW3NyY109XCJjb25maWc/LmltYWdlPy5zcmNcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY29uZmlnPy5pbWFnZT8uaGVpZ2h0XCJcbiAgICBbc3R5bGUud2lkdGhdPVwiY29uZmlnPy5pbWFnZT8ud2lkdGhcIlxuICAgIGFsdD1cImltZ1wiXG4gID5cblxuICA8c3BhbiAqbmdJZj1cImNvbmZpZz8udGV4dD8uc2hvdyAhPSBmYWxzZVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cImNvbmZpZz8udGV4dD8udG9vbHRpcD8udG9TdHJpbmcoKSB8fCAnJ1wiXG4gID5cbiAgICAgICB7e3ZhbHVlfX1cbiAgPC9zcGFuPlxuPC9kaXY+XG4iXX0=
@@ -4,13 +4,13 @@ export class DataPropertyGetterPipe {
4
4
  transform(object, keyName, ...args) {
5
5
  return object[keyName];
6
6
  }
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataPropertyGetterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
8
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: DataPropertyGetterPipe, name: "dataPropertyGetter" }); }
7
9
  }
8
- DataPropertyGetterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataPropertyGetterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
9
- DataPropertyGetterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: DataPropertyGetterPipe, name: "dataPropertyGetter" });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataPropertyGetterPipe, decorators: [{
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataPropertyGetterPipe, decorators: [{
11
11
  type: Pipe,
12
12
  args: [{
13
13
  name: 'dataPropertyGetter'
14
14
  }]
15
15
  }] });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1wcm9wZXJ0eS1nZXR0ZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hdXItbWF0LXRhYmxlL3NyYy9saWIvZGF0YS1wcm9wZXJ0eS1nZXR0ZXItcGlwZS9kYXRhLXByb3BlcnR5LWdldHRlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDOztBQUtsRCxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFNBQVMsQ0FBQyxNQUFXLEVBQUUsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDOztvSEFKVSxzQkFBc0I7a0hBQXRCLHNCQUFzQjs0RkFBdEIsc0JBQXNCO2tCQUhsQyxJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxvQkFBb0I7aUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnZGF0YVByb3BlcnR5R2V0dGVyJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVByb3BlcnR5R2V0dGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG5cclxuICB0cmFuc2Zvcm0ob2JqZWN0OiBhbnksIGtleU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB7XHJcbiAgICByZXR1cm4gb2JqZWN0W2tleU5hbWVdO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1wcm9wZXJ0eS1nZXR0ZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hdXItbWF0LXRhYmxlL3NyYy9saWIvZGF0YS1wcm9wZXJ0eS1nZXR0ZXItcGlwZS9kYXRhLXByb3BlcnR5LWdldHRlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDOztBQUtsRCxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFNBQVMsQ0FBQyxNQUFXLEVBQUUsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixDQUFDOytHQUpVLHNCQUFzQjs2R0FBdEIsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQUhsQyxJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxvQkFBb0I7aUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnZGF0YVByb3BlcnR5R2V0dGVyJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVByb3BlcnR5R2V0dGVyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG5cclxuICB0cmFuc2Zvcm0ob2JqZWN0OiBhbnksIGtleU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB7XHJcbiAgICByZXR1cm4gb2JqZWN0W2tleU5hbWVdO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -2,13 +2,13 @@ import { Directive } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  export class NgxTableSubFooterRowDirective {
4
4
  constructor() { }
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxTableSubFooterRowDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: NgxTableSubFooterRowDirective, selector: "[ngxAurTableSubFooterRow]", ngImport: i0 }); }
5
7
  }
6
- NgxTableSubFooterRowDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxTableSubFooterRowDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7
- NgxTableSubFooterRowDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: NgxTableSubFooterRowDirective, selector: "[ngxAurTableSubFooterRow]", ngImport: i0 });
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxTableSubFooterRowDirective, decorators: [{
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxTableSubFooterRowDirective, decorators: [{
9
9
  type: Directive,
10
10
  args: [{
11
11
  selector: '[ngxAurTableSubFooterRow]'
12
12
  }]
13
13
  }], ctorParameters: function () { return []; } });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRhYmxlLXN1Yi1mb290ZXItcm93LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hdXItbWF0LXRhYmxlL3NyYy9saWIvZGlyZWN0aXZlL25neC10YWJsZS1zdWItZm9vdGVyLXJvdy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFLeEMsTUFBTSxPQUFPLDZCQUE2QjtJQUN4QyxnQkFBZSxDQUFDOzsySEFETCw2QkFBNkI7K0dBQTdCLDZCQUE2Qjs0RkFBN0IsNkJBQTZCO2tCQUh6QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4QXVyVGFibGVTdWJGb290ZXJSb3ddJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hUYWJsZVN1YkZvb3RlclJvd0RpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRhYmxlLXN1Yi1mb290ZXItcm93LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hdXItbWF0LXRhYmxlL3NyYy9saWIvZGlyZWN0aXZlL25neC10YWJsZS1zdWItZm9vdGVyLXJvdy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFLeEMsTUFBTSxPQUFPLDZCQUE2QjtJQUN4QyxnQkFBZSxDQUFDOytHQURMLDZCQUE2QjttR0FBN0IsNkJBQTZCOzs0RkFBN0IsNkJBQTZCO2tCQUh6QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4QXVyVGFibGVTdWJGb290ZXJSb3ddJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hUYWJsZVN1YkZvb3RlclJvd0RpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { MatTableDataSource } from "@angular/material/table";
2
+ export class EmptyValue {
3
+ static { this.SELECTION_CONFIG = {
4
+ enable: false,
5
+ }; }
6
+ static { this.ACTION_CONFIG = {
7
+ enable: false,
8
+ actions: []
9
+ }; }
10
+ static { this.INDEX_CONFIG = {
11
+ enable: false,
12
+ }; }
13
+ static { this.PAGINATION_CONFIG = {
14
+ enable: false,
15
+ size: 0,
16
+ sizes: []
17
+ }; }
18
+ static { this.TABLE_CONFIG = {
19
+ columnsCfg: [],
20
+ selectionCfg: EmptyValue.SELECTION_CONFIG,
21
+ actionCfg: EmptyValue.ACTION_CONFIG,
22
+ indexCfg: EmptyValue.INDEX_CONFIG,
23
+ pageableCfg: EmptyValue.PAGINATION_CONFIG
24
+ }; }
25
+ static { this.MAT_TABLE_DATA_SOURCE = new MatTableDataSource(); }
26
+ static { this.RESIZE_OBSERVER = new ResizeObserver(() => {
27
+ }); }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1wdHlWYWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hdXItbWF0LXRhYmxlL3NyYy9saWIvbW9kZWwvRW1wdHlWYWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRCxNQUFNLE9BQU8sVUFBVTthQUVFLHFCQUFnQixHQUFvQjtRQUN6RCxNQUFNLEVBQUUsS0FBSztLQUNkLENBQUE7YUFFc0Isa0JBQWEsR0FBc0I7UUFDeEQsTUFBTSxFQUFFLEtBQUs7UUFDYixPQUFPLEVBQUUsRUFBRTtLQUNaLENBQUE7YUFFc0IsaUJBQVksR0FBZ0I7UUFDakQsTUFBTSxFQUFFLEtBQUs7S0FDZCxDQUFBO2FBRXNCLHNCQUFpQixHQUFxQjtRQUMzRCxNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSxDQUFDO1FBQ1AsS0FBSyxFQUFFLEVBQUU7S0FDVixDQUFBO2FBR3NCLGlCQUFZLEdBQXFCO1FBQ3RELFVBQVUsRUFBRSxFQUFFO1FBQ2QsWUFBWSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7UUFDekMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxhQUFhO1FBQ25DLFFBQVEsRUFBRSxVQUFVLENBQUMsWUFBWTtRQUNqQyxXQUFXLEVBQUUsVUFBVSxDQUFDLGlCQUFpQjtLQUMxQyxDQUFBO2FBRXNCLDBCQUFxQixHQUFzQyxJQUFJLGtCQUFrQixFQUFFLENBQUM7YUFFcEYsb0JBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUU7SUFDakUsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FjdGlvbkNvbmZpZywgSW5kZXhDb25maWcsIFBhZ2luYXRpb25Db25maWcsIFNlbGVjdGlvbkNvbmZpZywgVGFibGVDb25maWd9IGZyb20gXCIuLi9tb2RlbC9Db2x1bW5Db25maWdcIjtcclxuaW1wb3J0IHtUYWJsZVJvd30gZnJvbSBcIi4uL21vZGVsL1RhYmxlUm93XCI7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbXB0eVZhbHVlIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRUxFQ1RJT05fQ09ORklHOiBTZWxlY3Rpb25Db25maWcgPSB7XHJcbiAgICBlbmFibGU6IGZhbHNlLFxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ1RJT05fQ09ORklHOiBBY3Rpb25Db25maWc8YW55PiA9IHtcclxuICAgIGVuYWJsZTogZmFsc2UsXHJcbiAgICBhY3Rpb25zOiBbXVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTkRFWF9DT05GSUc6IEluZGV4Q29uZmlnID0ge1xyXG4gICAgZW5hYmxlOiBmYWxzZSxcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFHSU5BVElPTl9DT05GSUc6IFBhZ2luYXRpb25Db25maWcgPSB7XHJcbiAgICBlbmFibGU6IGZhbHNlLFxyXG4gICAgc2l6ZTogMCxcclxuICAgIHNpemVzOiBbXVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEFCTEVfQ09ORklHOiBUYWJsZUNvbmZpZzxhbnk+ID0ge1xyXG4gICAgY29sdW1uc0NmZzogW10sXHJcbiAgICBzZWxlY3Rpb25DZmc6IEVtcHR5VmFsdWUuU0VMRUNUSU9OX0NPTkZJRyxcclxuICAgIGFjdGlvbkNmZzogRW1wdHlWYWx1ZS5BQ1RJT05fQ09ORklHLFxyXG4gICAgaW5kZXhDZmc6IEVtcHR5VmFsdWUuSU5ERVhfQ09ORklHLFxyXG4gICAgcGFnZWFibGVDZmc6IEVtcHR5VmFsdWUuUEFHSU5BVElPTl9DT05GSUdcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFUX1RBQkxFX0RBVEFfU09VUkNFOiBNYXRUYWJsZURhdGFTb3VyY2U8VGFibGVSb3c8YW55Pj4gPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVTSVpFX09CU0VSVkVSID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICB9KVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,316 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, Input, Output, ViewChild, ViewChildren } from '@angular/core';
2
+ import { MatSort } from '@angular/material/sort';
3
+ import { MatTableDataSource } from '@angular/material/table';
4
+ import { MatPaginator } from '@angular/material/paginator';
5
+ import { SelectionProvider, SelectionProviderDummy } from './providers/SelectionProvider';
6
+ import { RowActionProvider, RowActionProviderDummy } from './providers/RowActionProvider';
7
+ import { TableViewFactory } from "./model/TableViewFactory";
8
+ import { IndexProvider, IndexProviderDummy } from "./providers/IndexProvider";
9
+ import { PaginationProvider, PaginationProviderDummy } from "./providers/PaginationProvider";
10
+ import { MatTableDataSourceFactory } from "./factories/MatTableDataSourceFactory";
11
+ import { DisplayColumnsFactory } from "./factories/DisplayColumnsFactory";
12
+ import { EmptyValue } from "./model/EmptyValue";
13
+ import { TotalRowProvider, TotalRowProviderDummy } from "./providers/TotalRowProvider";
14
+ import { OffsetUtil } from "./utils/offset.util";
15
+ import { animate, state, style, transition, trigger } from "@angular/animations";
16
+ import { NgxTableSubFooterRowDirective } from "./directive/ngx-table-sub-footer-row.directive";
17
+ import * as i0 from "@angular/core";
18
+ import * as i1 from "@angular/common";
19
+ import * as i2 from "@angular/material/icon";
20
+ import * as i3 from "@angular/material/table";
21
+ import * as i4 from "@angular/material/paginator";
22
+ import * as i5 from "@angular/material/button";
23
+ import * as i6 from "@angular/material/input";
24
+ import * as i7 from "@angular/material/form-field";
25
+ import * as i8 from "@angular/material/sort";
26
+ import * as i9 from "@angular/material/tooltip";
27
+ import * as i10 from "@angular/material/checkbox";
28
+ import * as i11 from "./components/column-value/column-view.component";
29
+ import * as i12 from "./data-property-getter-pipe/data-property-getter.pipe";
30
+ var ExpandState;
31
+ (function (ExpandState) {
32
+ ExpandState["COLLAPSED"] = "collapsed";
33
+ ExpandState["EXPANDED"] = "expanded";
34
+ })(ExpandState || (ExpandState = {}));
35
+ export class NgxAurMatTableComponent {
36
+ set displayColumns(columns) {
37
+ if (columns) {
38
+ this._displayColumns = [...columns];
39
+ this._customDisplayColumnsEnabled = columns && columns.length > 0;
40
+ }
41
+ }
42
+ constructor() {
43
+ this.expandedStateEnum = ExpandState;
44
+ this.tableDataSource = new MatTableDataSource([]);
45
+ this._displayColumns = [];
46
+ this._customDisplayColumnsEnabled = false;
47
+ this.tableView = [];
48
+ this.tableData = [];
49
+ this.extendedRowTemplate = null;
50
+ this.sort = new EventEmitter();
51
+ // events if enabled actions
52
+ this.onRowAction = new EventEmitter();
53
+ // -----------------------
54
+ // events if enabled select event
55
+ this.selected = new EventEmitter();
56
+ this.onSelect = new EventEmitter();
57
+ this.onDeselect = new EventEmitter();
58
+ this.onSelectedRowsAction = new EventEmitter();
59
+ this.selectionModel = new EventEmitter();
60
+ //------------------------
61
+ this.onRowClick = new EventEmitter();
62
+ /**
63
+ * return filtered rows
64
+ */
65
+ this.onFilter = new EventEmitter();
66
+ this.columnOffsets = new EventEmitter();
67
+ this.prevColumnOffsets = [];
68
+ // @ts-ignore
69
+ this.resizeColumnOffsetsObserver = EmptyValue.RESIZE_OBSERVER;
70
+ this.selectionProvider = new SelectionProviderDummy();
71
+ this.rowActionsProvider = new RowActionProviderDummy();
72
+ this.indexProvider = new IndexProviderDummy();
73
+ this.paginationProvider = new PaginationProviderDummy();
74
+ this.totalRowProvider = new TotalRowProviderDummy();
75
+ this.customSortFunctions = new Map();
76
+ this.filterStorage = new Map();
77
+ }
78
+ ngOnChanges(changes) {
79
+ if ((changes['tableData'] && this.tableData) || (changes['displayColumns'] && this._displayColumns)) {
80
+ this.refreshTable();
81
+ }
82
+ if (changes['highlight'] && this.highlight) {
83
+ this.handleHighlightChange(this.highlight);
84
+ }
85
+ }
86
+ refreshTable() {
87
+ const selected = this.selectionProvider?.selection?.selected ?? [];
88
+ this.tableData = this.tableData || [];
89
+ this.prepareTableData(selected);
90
+ }
91
+ handleHighlightChange(h) {
92
+ if (this.highlighted === h.value) {
93
+ this.highlight = undefined;
94
+ this.highlighted = undefined;
95
+ }
96
+ else {
97
+ this.highlighted = h.value;
98
+ const index = this.tableDataSource.data.findIndex(row => row.rowSrc === h.value);
99
+ if (index >= 0) {
100
+ this.rows?.toArray()[index]?.nativeElement.scrollIntoView({
101
+ behavior: "smooth",
102
+ block: "center",
103
+ inline: "center"
104
+ });
105
+ }
106
+ }
107
+ }
108
+ ngOnInit() {
109
+ if (!this.tableConfig) {
110
+ throw new Error("init inputs [tableConfig] is mandatory!");
111
+ }
112
+ }
113
+ // we need this, in order to make pagination work with *ngIf
114
+ ngAfterViewInit() {
115
+ this.initPaginator();
116
+ this.initSortingDataAccessor();
117
+ this.resizeColumnOffsetsObserver = new ResizeObserver(() => this.updateColumnOffsets());
118
+ this.resizeColumnOffsetsObserver.observe(this.table.nativeElement);
119
+ }
120
+ ngAfterViewChecked() {
121
+ this.updateColumnOffsets();
122
+ }
123
+ initPaginator() {
124
+ if (this.tableDataSource) {
125
+ this.tableDataSource.paginator = this.matPaginator;
126
+ }
127
+ }
128
+ initSortingDataAccessor() {
129
+ if (this.tableDataSource) {
130
+ this.tableDataSource.sort = this.matSort;
131
+ this.tableDataSource.sortingDataAccessor = (data, key) => {
132
+ const customSortFunction = this.customSortFunctions.get(key);
133
+ return customSortFunction ? customSortFunction(data, key) : data[key];
134
+ };
135
+ }
136
+ }
137
+ updateColumnOffsets() {
138
+ if (this.table?.nativeElement?.querySelectorAll('th')) {
139
+ const offsets = Array.from(this.table.nativeElement.querySelectorAll('th'))
140
+ .map((c) => c)
141
+ .map((c, index) => ({
142
+ left: c.offsetLeft,
143
+ width: c.offsetWidth,
144
+ key: this._displayColumns[index]
145
+ }));
146
+ if (OffsetUtil.areNotEqual(this.prevColumnOffsets, offsets)) {
147
+ this.prevColumnOffsets = offsets;
148
+ this.columnOffsets.emit(offsets);
149
+ }
150
+ }
151
+ }
152
+ prepareTableData(initSelection = []) {
153
+ this.initTable();
154
+ this.initCustomSortFunctionsMap();
155
+ this.initPaginator();
156
+ this.initSortingDataAccessor();
157
+ this.indexProvider = IndexProvider.create(this.tableConfig)
158
+ .addIndexColumn(this._displayColumns);
159
+ this.rowActionsProvider = RowActionProvider.create(this.tableConfig)
160
+ .addActionColumn(this._displayColumns)
161
+ .setView(this.tableDataSource.data);
162
+ this.selectionProvider = SelectionProvider.create(this.tableConfig, this.tableDataSource, initSelection)
163
+ .addCheckboxColumn(this._displayColumns)
164
+ .bindEventEmitters(this.selected, this.onSelect, this.onDeselect, this.selectionModel);
165
+ this.paginationProvider = PaginationProvider.create(this.tableConfig);
166
+ this.totalRowProvider = TotalRowProvider.create(this.tableConfig, this.tableDataSource)
167
+ .setStyle()
168
+ .setTotalRow();
169
+ this.emitFilteredValues();
170
+ }
171
+ initCustomSortFunctionsMap() {
172
+ this.tableConfig.columnsCfg
173
+ .filter(c => c.sort && c.sort.enable && c.sort.customSort)
174
+ .forEach(c => this.customSortFunctions.set(c.key, c.sort.customSort));
175
+ }
176
+ initTable() {
177
+ this.tableDataSource = MatTableDataSourceFactory.convert(this.tableData, this.tableConfig.columnsCfg);
178
+ this.tableView = TableViewFactory.toView(this.tableDataSource.data, this.tableConfig);
179
+ if (!this._customDisplayColumnsEnabled) {
180
+ this._displayColumns = DisplayColumnsFactory.create(this.tableConfig);
181
+ }
182
+ }
183
+ applySearchFilter(event) {
184
+ const filterValue = event.target.value;
185
+ this.tableDataSource.filter = filterValue.trim().toLowerCase();
186
+ this.emitFilteredValues();
187
+ }
188
+ removeFilter(filterName) {
189
+ if (this.filterStorage.get(filterName)) {
190
+ this.filterStorage.delete(filterName);
191
+ this.applyFiltersInternal();
192
+ }
193
+ }
194
+ applyFilter(filterName, filter) {
195
+ if (!this.filterStorage.get(filterName) || (!this.filterStorage.get(filterName).equals(filter))) {
196
+ this.filterStorage.set(filterName, filter);
197
+ this.applyFiltersInternal();
198
+ }
199
+ }
200
+ clearFilters() {
201
+ this.filterStorage.clear();
202
+ this.applyFiltersInternal();
203
+ }
204
+ applyFiltersInternal() {
205
+ const filterActions = [...this.filterStorage.values()];
206
+ this.tableDataSource.filterPredicate = (data) => {
207
+ return filterActions.every(filterAction => filterAction.filterFn()(data));
208
+ };
209
+ // Применение фильтрации. нужно передать уникальное значение чтобы фильтрация запустилась
210
+ this.tableDataSource.filter = 'trigger-' + Math.random();
211
+ this.emitFilteredValues();
212
+ }
213
+ emitFilteredValues() {
214
+ this.onFilter.emit(this.tableDataSource.filteredData.map(f => f.rowSrc));
215
+ }
216
+ sortTable(sortParameters) {
217
+ this.sort.emit(sortParameters);
218
+ }
219
+ emitSelectedRowsAction(action, rows) {
220
+ this.onSelectedRowsAction.emit({ action, value: rows });
221
+ }
222
+ emitRowAction(action, row, $event) {
223
+ $event.stopPropagation();
224
+ this.onRowAction.emit({ action, value: row });
225
+ }
226
+ masterToggle() {
227
+ this.selectionProvider.masterToggle();
228
+ }
229
+ isAllSelected() {
230
+ return this.selectionProvider.isAllSelected();
231
+ }
232
+ castSrc(row) {
233
+ return row;
234
+ }
235
+ rowClick(row) {
236
+ if (row.rowSrc !== this.highlighted || (row.rowSrc === this.highlighted && !this.tableConfig.clickCfg?.cancelable)) {
237
+ this.onRowClick.emit(row.rowSrc);
238
+ this.highlighted = row.rowSrc;
239
+ }
240
+ else {
241
+ this.onRowClick.emit(undefined);
242
+ this.highlighted = undefined;
243
+ }
244
+ }
245
+ getSelectionModel() {
246
+ return this.selectionProvider.selection;
247
+ }
248
+ ngOnDestroy() {
249
+ // Останавливаем наблюдение при уничтожении компонента
250
+ this.resizeColumnOffsetsObserver.disconnect();
251
+ }
252
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxAurMatTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
253
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgxAurMatTableComponent, selector: "aur-mat-table", inputs: { displayColumns: "displayColumns", tableConfig: "tableConfig", tableData: "tableData", extendedRowTemplate: "extendedRowTemplate", highlight: "highlight" }, outputs: { sort: "sort", onRowAction: "onRowAction", selected: "selected", onSelect: "onSelect", onDeselect: "onDeselect", onSelectedRowsAction: "onSelectedRowsAction", selectionModel: "selectionModel", onRowClick: "onRowClick", onFilter: "onFilter", columnOffsets: "columnOffsets" }, queries: [{ propertyName: "subFooterRowTemplate", first: true, predicate: NgxTableSubFooterRowDirective, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, read: ElementRef }, { propertyName: "matPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "rows", predicate: ["rowLink"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"aur-mat-table\">\r\n <ng-container>\r\n\r\n <!-- Filter -->\r\n <ng-container *ngIf=\"tableConfig.filterCfg\">\r\n <mat-form-field>\r\n <mat-label>{{ tableConfig.filterCfg?.label }}</mat-label>\r\n <input matInput (keyup)=\"applySearchFilter($event)\"\r\n placeholder=\"{{tableConfig.filterCfg?.placeholder}}\"\r\n style=\"font-size: 18px;\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Table -->\r\n <table #table mat-table matSort\r\n [multiTemplateDataRows]=\"extendedRowTemplate !== null\"\r\n [dataSource]=\"tableDataSource\"\r\n (matSortChange)=\"sortTable($event)\"\r\n [style.height]=\"tableConfig.tableView?.height\"\r\n [style.max-height]=\"tableConfig.tableView?.maxHeight\"\r\n [style.min-height]=\"tableConfig.tableView?.minHeight\">\r\n\r\n <!-- index-column-->\r\n <ng-container *ngIf=\"indexProvider.isEnabled\" [matColumnDef]=\"indexProvider.COLUMN_NAME\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n <lib-column-view [config]=\"indexProvider.headerView\">\r\n {{ indexProvider.name }}\r\n </lib-column-view>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let element; let rowIndex = index\">\r\n {{ rowIndex + indexProvider.offset }}\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef>\r\n {{ totalRowProvider.totals.get(indexProvider.COLUMN_NAME) || '' }}\r\n </td>\r\n </ng-container>\r\n\r\n <!-- selection-column-->\r\n <ng-container [matColumnDef]=\"selectionProvider.COLUMN_NAME\" *ngIf=\"selectionProvider.isEnabled\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <div class=\"flex-container\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selectionProvider.selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selectionProvider.selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n <div\r\n *ngIf=\"tableConfig.selectionCfg?.showSelectedCount && selectionProvider.selection.hasValue()\">\r\n (\r\n {{ selectionProvider.selection.selected.length }}\r\n <span\r\n *ngIf=\"tableConfig.selectionCfg?.showTotalCount !== false\">/{{ tableDataSource.filteredData.length }}</span>\r\n )\r\n </div>\r\n\r\n <div *ngIf=\"selectionProvider.selection.hasValue() && tableConfig?.selectionCfg?.actions\">\r\n <button mat-icon-button\r\n (click)=\"emitSelectedRowsAction(action.action, selectionProvider.selection.selected)\"\r\n [matTooltip]=\"action.icon.tooltip || ''\"\r\n *ngFor=\"let action of tableConfig.selectionCfg!.actions\">\r\n <mat-icon [style.color]=\"action.icon.color\">\r\n {{ action.icon.name }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selectionProvider.selection.toggle(castSrc(row).rowSrc) : null\"\r\n [checked]=\"selectionProvider.selection.isSelected(castSrc(row).rowSrc)\">\r\n </mat-checkbox>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- action column -->\r\n <ng-container *ngIf=\"rowActionsProvider.isEnabled\" [matColumnDef]=\"rowActionsProvider.COLUMN_NAME\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button mat-icon-button\r\n (click)=\"emitRowAction(action.action, element.rowSrc, $event)\"\r\n [matTooltip]=\"action.icon.tooltip || ''\"\r\n *ngFor=\"let action of rowActionsProvider.actionView.get(element.id)\">\r\n <mat-icon [style.color]=\"action.icon.color\">\r\n {{ action.icon.name }}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n\r\n <ng-container *ngTemplateOutlet=\"footerCellTemplate; context: {$implicit: rowActionsProvider.COLUMN_NAME}\">\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- value-icon-->\r\n <ng-container *ngFor=\"let columnConfig of tableConfig.columnsCfg\" [matColumnDef]=\"columnConfig.key\">\r\n\r\n <!-- if sortable column header -->\r\n <ng-container *ngIf=\"columnConfig.sort && columnConfig.sort.enable; else notSortable\">\r\n <th mat-header-cell *matHeaderCellDef [mat-sort-header]=\"columnConfig.key\"\r\n [arrowPosition]=\"columnConfig.sort.position === 'right' ? 'before' : 'after'\">\r\n <ng-container *ngTemplateOutlet=\"headerValue\"></ng-container>\r\n </th>\r\n </ng-container>\r\n\r\n <!-- else not sortable -->\r\n <ng-template #notSortable>\r\n <th mat-header-cell *matHeaderCellDef>\r\n <ng-container *ngTemplateOutlet=\"headerValue\"></ng-container>\r\n </th>\r\n </ng-template>\r\n\r\n <!-- header value-->\r\n <ng-template #headerValue>\r\n <lib-column-view [config]=\"columnConfig.headerView\"\r\n [value]=\"columnConfig.name\">\r\n </lib-column-view>\r\n </ng-template>\r\n\r\n <!-- column value \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u043E\u043B\u043E\u043D\u043E\u043A \u043D\u0443\u0436\u043D\u043E \u0447\u0435\u0440\u0435\u0437 getView(rowIndex, columnConfig.key) \u0442\u0430\u043C \u043D\u0430\u0445\u043E\u0434\u044F\u0442\u0441\u044F \u0443\u0436\u0435\r\n \u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F-->\r\n <td mat-cell *matCellDef=\"let element;\">\r\n <lib-column-view\r\n [config]=\"tableView[element.id]?.get(columnConfig.key)\"\r\n [value]=\"element | dataPropertyGetter: columnConfig.key\">\r\n </lib-column-view>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef>\r\n {{ totalRowProvider.totals.get(columnConfig.key) || '' }}\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"_displayColumns; sticky: this.tableConfig.stickyCfg?.header\"></tr>\r\n <tr mat-row #rowLink\r\n *matRowDef=\"let row; columns: _displayColumns;\"\r\n (click)=\"rowClick(row)\"\r\n [ngClass]=\"{'pointer': tableConfig.clickCfg?.pointer || false, 'new-color': highlighted===row.rowSrc && tableConfig?.clickCfg?.highlightClicked?.color}\"\r\n [ngStyle]=\"{\r\n 'color': highlighted===row.rowSrc? tableConfig?.clickCfg?.highlightClicked?.color : undefined,\r\n 'background-color': highlighted === row.rowSrc? tableConfig?.clickCfg?.highlightClicked?.background : undefined,\r\n 'border': highlighted === row.rowSrc? tableConfig?.clickCfg?.highlightClicked?.border : undefined\r\n }\">\r\n </tr>\r\n\r\n <!--expanded-row-->\r\n <ng-container matColumnDef=\"expandedRow\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"_displayColumns.length\">\r\n <div class=\"row-detail\"\r\n [@detailExpand]=\"element.rowSrc === highlighted ? expandedStateEnum.EXPANDED : expandedStateEnum.COLLAPSED\">\r\n <ng-container *ngTemplateOutlet=\"extendedRowTemplate; context: {$implicit: element}\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"extendedRowTemplate\">\r\n <tr mat-row class=\"expanded-row\" *matRowDef=\"let row; columns: ['expandedRow']\"></tr>\r\n </ng-container>\r\n <!--expanded-row-->\r\n\r\n <ng-container *ngIf=\"totalRowProvider.isEnabled\">\r\n <tr mat-footer-row *matFooterRowDef=\"_displayColumns; sticky: this.tableConfig.stickyCfg?.total\"\r\n [style]=\"totalRowProvider.style\"></tr>\r\n </ng-container>\r\n\r\n <!--sub-footer-row-->\r\n <ng-container matColumnDef=\"subFooterRow\">\r\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"_displayColumns.length\">\r\n <ng-container>\r\n <ng-content select=\"[ngxAurTableSubFooterRow]\"></ng-content>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"subFooterRowTemplate\">\r\n <tr mat-footer-row *matFooterRowDef=\"['subFooterRow']; sticky: this.tableConfig.stickyCfg?.subFooter\"></tr>\r\n </ng-container>\r\n <!-- sub-footer-row END-->\r\n\r\n <!--sub-footer-pagination-->\r\n <ng-container matColumnDef=\"subFooterPagination\">\r\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"_displayColumns.length\">\r\n\r\n <mat-paginator [pageSizeOptions]=\"paginationProvider.sizes\"\r\n [pageSize]=\"paginationProvider.size\"\r\n [style]=\"this.tableConfig?.pageableCfg?.style\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"paginationProvider.isEnabled\">\r\n <tr mat-footer-row\r\n *matFooterRowDef=\"['subFooterPagination']; sticky: this.tableConfig.stickyCfg?.subFooterPagination\"\r\n [style]=\"this.tableConfig?.pageableCfg?.style\"></tr>\r\n </ng-container>\r\n <!-- sub-footer-pagination END-->\r\n </table>\r\n <!-- Pagination -->\r\n\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #footerCellTemplate let-columnName>\r\n <td mat-footer-cell *matFooterCellDef>\r\n {{ totalRowProvider.totals.get(columnName) || '' }}\r\n </td>\r\n</ng-template>\r\n", styles: [".aur-mat-table table{width:100%;border-collapse:collapse}.aur-mat-table th,td{padding-right:10px!important}.aur-mat-table .new-color td.mat-mdc-cell,.aur-mat-table .new-color td.mat-mdc-footer-cell{color:inherit}.aur-mat-table mat-form-field{width:100%}.aur-mat-table .text-right{text-align:right!important}.aur-mat-table .pointer:hover{background-color:#f2f2f2;cursor:pointer}.aur-mat-table .flex-container{display:flex;align-items:center}.aur-mat-table .expanded-row{height:0}.aur-mat-table .row-detail{overflow:hidden;display:flex}.aur-mat-table .clear-bottom-border{border-bottom:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i3.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i3.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i3.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i4.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i11.ColumnViewComponent, selector: "lib-column-view", inputs: ["config", "value"] }, { kind: "pipe", type: i12.DataPropertyGetterPipe, name: "dataPropertyGetter" }], animations: [
254
+ trigger('detailExpand', [
255
+ state(ExpandState.COLLAPSED, style({ height: '0px', minHeight: '0' })),
256
+ state(ExpandState.EXPANDED, style({ height: '*' })),
257
+ transition(`${ExpandState.EXPANDED} <=> ${ExpandState.COLLAPSED}`, animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
258
+ ]),
259
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
260
+ }
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxAurMatTableComponent, decorators: [{
262
+ type: Component,
263
+ args: [{ selector: 'aur-mat-table', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
264
+ trigger('detailExpand', [
265
+ state(ExpandState.COLLAPSED, style({ height: '0px', minHeight: '0' })),
266
+ state(ExpandState.EXPANDED, style({ height: '*' })),
267
+ transition(`${ExpandState.EXPANDED} <=> ${ExpandState.COLLAPSED}`, animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
268
+ ]),
269
+ ], template: "<div class=\"aur-mat-table\">\r\n <ng-container>\r\n\r\n <!-- Filter -->\r\n <ng-container *ngIf=\"tableConfig.filterCfg\">\r\n <mat-form-field>\r\n <mat-label>{{ tableConfig.filterCfg?.label }}</mat-label>\r\n <input matInput (keyup)=\"applySearchFilter($event)\"\r\n placeholder=\"{{tableConfig.filterCfg?.placeholder}}\"\r\n style=\"font-size: 18px;\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Table -->\r\n <table #table mat-table matSort\r\n [multiTemplateDataRows]=\"extendedRowTemplate !== null\"\r\n [dataSource]=\"tableDataSource\"\r\n (matSortChange)=\"sortTable($event)\"\r\n [style.height]=\"tableConfig.tableView?.height\"\r\n [style.max-height]=\"tableConfig.tableView?.maxHeight\"\r\n [style.min-height]=\"tableConfig.tableView?.minHeight\">\r\n\r\n <!-- index-column-->\r\n <ng-container *ngIf=\"indexProvider.isEnabled\" [matColumnDef]=\"indexProvider.COLUMN_NAME\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n <lib-column-view [config]=\"indexProvider.headerView\">\r\n {{ indexProvider.name }}\r\n </lib-column-view>\r\n </th>\r\n\r\n <td mat-cell *matCellDef=\"let element; let rowIndex = index\">\r\n {{ rowIndex + indexProvider.offset }}\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef>\r\n {{ totalRowProvider.totals.get(indexProvider.COLUMN_NAME) || '' }}\r\n </td>\r\n </ng-container>\r\n\r\n <!-- selection-column-->\r\n <ng-container [matColumnDef]=\"selectionProvider.COLUMN_NAME\" *ngIf=\"selectionProvider.isEnabled\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <div class=\"flex-container\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selectionProvider.selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selectionProvider.selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n <div\r\n *ngIf=\"tableConfig.selectionCfg?.showSelectedCount && selectionProvider.selection.hasValue()\">\r\n (\r\n {{ selectionProvider.selection.selected.length }}\r\n <span\r\n *ngIf=\"tableConfig.selectionCfg?.showTotalCount !== false\">/{{ tableDataSource.filteredData.length }}</span>\r\n )\r\n </div>\r\n\r\n <div *ngIf=\"selectionProvider.selection.hasValue() && tableConfig?.selectionCfg?.actions\">\r\n <button mat-icon-button\r\n (click)=\"emitSelectedRowsAction(action.action, selectionProvider.selection.selected)\"\r\n [matTooltip]=\"action.icon.tooltip || ''\"\r\n *ngFor=\"let action of tableConfig.selectionCfg!.actions\">\r\n <mat-icon [style.color]=\"action.icon.color\">\r\n {{ action.icon.name }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selectionProvider.selection.toggle(castSrc(row).rowSrc) : null\"\r\n [checked]=\"selectionProvider.selection.isSelected(castSrc(row).rowSrc)\">\r\n </mat-checkbox>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- action column -->\r\n <ng-container *ngIf=\"rowActionsProvider.isEnabled\" [matColumnDef]=\"rowActionsProvider.COLUMN_NAME\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button mat-icon-button\r\n (click)=\"emitRowAction(action.action, element.rowSrc, $event)\"\r\n [matTooltip]=\"action.icon.tooltip || ''\"\r\n *ngFor=\"let action of rowActionsProvider.actionView.get(element.id)\">\r\n <mat-icon [style.color]=\"action.icon.color\">\r\n {{ action.icon.name }}\r\n </mat-icon>\r\n </button>\r\n </td>\r\n\r\n <ng-container *ngTemplateOutlet=\"footerCellTemplate; context: {$implicit: rowActionsProvider.COLUMN_NAME}\">\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- value-icon-->\r\n <ng-container *ngFor=\"let columnConfig of tableConfig.columnsCfg\" [matColumnDef]=\"columnConfig.key\">\r\n\r\n <!-- if sortable column header -->\r\n <ng-container *ngIf=\"columnConfig.sort && columnConfig.sort.enable; else notSortable\">\r\n <th mat-header-cell *matHeaderCellDef [mat-sort-header]=\"columnConfig.key\"\r\n [arrowPosition]=\"columnConfig.sort.position === 'right' ? 'before' : 'after'\">\r\n <ng-container *ngTemplateOutlet=\"headerValue\"></ng-container>\r\n </th>\r\n </ng-container>\r\n\r\n <!-- else not sortable -->\r\n <ng-template #notSortable>\r\n <th mat-header-cell *matHeaderCellDef>\r\n <ng-container *ngTemplateOutlet=\"headerValue\"></ng-container>\r\n </th>\r\n </ng-template>\r\n\r\n <!-- header value-->\r\n <ng-template #headerValue>\r\n <lib-column-view [config]=\"columnConfig.headerView\"\r\n [value]=\"columnConfig.name\">\r\n </lib-column-view>\r\n </ng-template>\r\n\r\n <!-- column value \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u043E\u043B\u043E\u043D\u043E\u043A \u043D\u0443\u0436\u043D\u043E \u0447\u0435\u0440\u0435\u0437 getView(rowIndex, columnConfig.key) \u0442\u0430\u043C \u043D\u0430\u0445\u043E\u0434\u044F\u0442\u0441\u044F \u0443\u0436\u0435\r\n \u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F-->\r\n <td mat-cell *matCellDef=\"let element;\">\r\n <lib-column-view\r\n [config]=\"tableView[element.id]?.get(columnConfig.key)\"\r\n [value]=\"element | dataPropertyGetter: columnConfig.key\">\r\n </lib-column-view>\r\n </td>\r\n\r\n <td mat-footer-cell *matFooterCellDef>\r\n {{ totalRowProvider.totals.get(columnConfig.key) || '' }}\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"_displayColumns; sticky: this.tableConfig.stickyCfg?.header\"></tr>\r\n <tr mat-row #rowLink\r\n *matRowDef=\"let row; columns: _displayColumns;\"\r\n (click)=\"rowClick(row)\"\r\n [ngClass]=\"{'pointer': tableConfig.clickCfg?.pointer || false, 'new-color': highlighted===row.rowSrc && tableConfig?.clickCfg?.highlightClicked?.color}\"\r\n [ngStyle]=\"{\r\n 'color': highlighted===row.rowSrc? tableConfig?.clickCfg?.highlightClicked?.color : undefined,\r\n 'background-color': highlighted === row.rowSrc? tableConfig?.clickCfg?.highlightClicked?.background : undefined,\r\n 'border': highlighted === row.rowSrc? tableConfig?.clickCfg?.highlightClicked?.border : undefined\r\n }\">\r\n </tr>\r\n\r\n <!--expanded-row-->\r\n <ng-container matColumnDef=\"expandedRow\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"_displayColumns.length\">\r\n <div class=\"row-detail\"\r\n [@detailExpand]=\"element.rowSrc === highlighted ? expandedStateEnum.EXPANDED : expandedStateEnum.COLLAPSED\">\r\n <ng-container *ngTemplateOutlet=\"extendedRowTemplate; context: {$implicit: element}\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"extendedRowTemplate\">\r\n <tr mat-row class=\"expanded-row\" *matRowDef=\"let row; columns: ['expandedRow']\"></tr>\r\n </ng-container>\r\n <!--expanded-row-->\r\n\r\n <ng-container *ngIf=\"totalRowProvider.isEnabled\">\r\n <tr mat-footer-row *matFooterRowDef=\"_displayColumns; sticky: this.tableConfig.stickyCfg?.total\"\r\n [style]=\"totalRowProvider.style\"></tr>\r\n </ng-container>\r\n\r\n <!--sub-footer-row-->\r\n <ng-container matColumnDef=\"subFooterRow\">\r\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"_displayColumns.length\">\r\n <ng-container>\r\n <ng-content select=\"[ngxAurTableSubFooterRow]\"></ng-content>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"subFooterRowTemplate\">\r\n <tr mat-footer-row *matFooterRowDef=\"['subFooterRow']; sticky: this.tableConfig.stickyCfg?.subFooter\"></tr>\r\n </ng-container>\r\n <!-- sub-footer-row END-->\r\n\r\n <!--sub-footer-pagination-->\r\n <ng-container matColumnDef=\"subFooterPagination\">\r\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"_displayColumns.length\">\r\n\r\n <mat-paginator [pageSizeOptions]=\"paginationProvider.sizes\"\r\n [pageSize]=\"paginationProvider.size\"\r\n [style]=\"this.tableConfig?.pageableCfg?.style\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"paginationProvider.isEnabled\">\r\n <tr mat-footer-row\r\n *matFooterRowDef=\"['subFooterPagination']; sticky: this.tableConfig.stickyCfg?.subFooterPagination\"\r\n [style]=\"this.tableConfig?.pageableCfg?.style\"></tr>\r\n </ng-container>\r\n <!-- sub-footer-pagination END-->\r\n </table>\r\n <!-- Pagination -->\r\n\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #footerCellTemplate let-columnName>\r\n <td mat-footer-cell *matFooterCellDef>\r\n {{ totalRowProvider.totals.get(columnName) || '' }}\r\n </td>\r\n</ng-template>\r\n", styles: [".aur-mat-table table{width:100%;border-collapse:collapse}.aur-mat-table th,td{padding-right:10px!important}.aur-mat-table .new-color td.mat-mdc-cell,.aur-mat-table .new-color td.mat-mdc-footer-cell{color:inherit}.aur-mat-table mat-form-field{width:100%}.aur-mat-table .text-right{text-align:right!important}.aur-mat-table .pointer:hover{background-color:#f2f2f2;cursor:pointer}.aur-mat-table .flex-container{display:flex;align-items:center}.aur-mat-table .expanded-row{height:0}.aur-mat-table .row-detail{overflow:hidden;display:flex}.aur-mat-table .clear-bottom-border{border-bottom:none}\n"] }]
270
+ }], ctorParameters: function () { return []; }, propDecorators: { displayColumns: [{
271
+ type: Input
272
+ }], subFooterRowTemplate: [{
273
+ type: ContentChild,
274
+ args: [NgxTableSubFooterRowDirective]
275
+ }], rows: [{
276
+ type: ViewChildren,
277
+ args: ['rowLink', { read: ElementRef }]
278
+ }], table: [{
279
+ type: ViewChild,
280
+ args: ['table', { read: ElementRef }]
281
+ }], tableConfig: [{
282
+ type: Input
283
+ }], tableData: [{
284
+ type: Input
285
+ }], extendedRowTemplate: [{
286
+ type: Input
287
+ }], matPaginator: [{
288
+ type: ViewChild,
289
+ args: [MatPaginator, { static: false }]
290
+ }], matSort: [{
291
+ type: ViewChild,
292
+ args: [MatSort, { static: true }]
293
+ }], sort: [{
294
+ type: Output
295
+ }], onRowAction: [{
296
+ type: Output
297
+ }], selected: [{
298
+ type: Output
299
+ }], onSelect: [{
300
+ type: Output
301
+ }], onDeselect: [{
302
+ type: Output
303
+ }], onSelectedRowsAction: [{
304
+ type: Output
305
+ }], selectionModel: [{
306
+ type: Output
307
+ }], onRowClick: [{
308
+ type: Output
309
+ }], onFilter: [{
310
+ type: Output
311
+ }], columnOffsets: [{
312
+ type: Output
313
+ }], highlight: [{
314
+ type: Input
315
+ }] } });
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF1ci1tYXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1ci1tYXQtdGFibGUvc3JjL2xpYi9uZ3gtYXVyLW1hdC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYXVyLW1hdC10YWJsZS9zcmMvbGliL25neC1hdXItbWF0LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUFFLFlBQVksRUFDdkIsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLE9BQU8sRUFBTyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RixPQUFPLEVBQWMsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUVyRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDNUUsT0FBTyxFQUFDLGtCQUFrQixFQUFFLHVCQUF1QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0YsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFDLFVB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RUgsS0FBSztzQkFBNUMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDO2dCQUc3QixXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdvQyxZQUFZO3NCQUFyRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBRUosT0FBTztzQkFBMUMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUV4QixJQUFJO3NCQUFiLE1BQU07Z0JBR0csV0FBVztzQkFBcEIsTUFBTTtnQkFJRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFJRyxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkF3QkUsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCwgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0NvbHVtblZpZXcsIFRhYmxlQ29uZmlnfSBmcm9tICcuL21vZGVsL0NvbHVtbkNvbmZpZyc7XHJcbmltcG9ydCB7TWF0U29ydCwgU29ydH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7TWF0UGFnaW5hdG9yfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQge1NlbGVjdGlvblByb3ZpZGVyLCBTZWxlY3Rpb25Qcm92aWRlckR1bW15fSBmcm9tICcuL3Byb3ZpZGVycy9TZWxlY3Rpb25Qcm92aWRlcic7XHJcbmltcG9ydCB7QWN0aW9uRXZlbnQsIFJvd0FjdGlvblByb3ZpZGVyLCBSb3dBY3Rpb25Qcm92aWRlckR1bW15fSBmcm9tICcuL3Byb3ZpZGVycy9Sb3dBY3Rpb25Qcm92aWRlcic7XHJcbmltcG9ydCB7VGFibGVSb3d9IGZyb20gXCIuL21vZGVsL1RhYmxlUm93XCI7XHJcbmltcG9ydCB7VGFibGVWaWV3RmFjdG9yeX0gZnJvbSBcIi4vbW9kZWwvVGFibGVWaWV3RmFjdG9yeVwiO1xyXG5pbXBvcnQge0luZGV4UHJvdmlkZXIsIEluZGV4UHJvdmlkZXJEdW1teX0gZnJvbSBcIi4vcHJvdmlkZXJzL0luZGV4UHJvdmlkZXJcIjtcclxuaW1wb3J0IHtQYWdpbmF0aW9uUHJvdmlkZXIsIFBhZ2luYXRpb25Qcm92aWRlckR1bW15fSBmcm9tIFwiLi9wcm92aWRlcnMvUGFnaW5hdGlvblByb3ZpZGVyXCI7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlRmFjdG9yeX0gZnJvbSBcIi4vZmFjdG9yaWVzL01hdFRhYmxlRGF0YVNvdXJjZUZhY3RvcnlcIjtcclxuaW1wb3J0IHtEaXNwbGF5Q29sdW1uc0ZhY3Rvcnl9IGZyb20gXCIuL2ZhY3Rvcmllcy9EaXNwbGF5Q29sdW1uc0ZhY3RvcnlcIjtcclxuaW1wb3J0IHtFbXB0eVZhbHVlfSBmcm9tIFwiLi9tb2RlbC9FbXB0eVZhbHVlXCI7XHJcbmltcG9ydCB7VG90YWxSb3dQcm92aWRlciwgVG90YWxSb3dQcm92aWRlckR1bW15fSBmcm9tIFwiLi9wcm92aWRlcnMvVG90YWxSb3dQcm92aWRlclwiO1xyXG5pbXBvcnQge05neEF1ckZpbHRlcnN9IGZyb20gXCIuL2ZpbHRlcnMvTmd4QXVyRmlsdGVyc1wiO1xyXG5pbXBvcnQge05neEF1ck1hdFRhYmxlUHVibGljfSBmcm9tIFwiLi9uZ3gtYXVyLW1hdC10YWJsZS1wdWJsaWNcIjtcclxuaW1wb3J0IHtPZmZzZXRVdGlsfSBmcm9tIFwiLi91dGlscy9vZmZzZXQudXRpbFwiO1xyXG5pbXBvcnQge2FuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL2FuaW1hdGlvbnNcIjtcclxuaW1wb3J0IHtOZ3hUYWJsZVN1YkZvb3RlclJvd0RpcmVjdGl2ZX0gZnJvbSBcIi4vZGlyZWN0aXZlL25neC10YWJsZS1zdWItZm9vdGVyLXJvdy5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHtTZWxlY3Rpb25Nb2RlbH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIaWdobGlnaHRDb250YWluZXI8VD4ge1xyXG4gIHZhbHVlOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT2Zmc2V0IHtcclxuICBsZWZ0OiBudW1iZXIsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBrZXk6IHN0cmluZ1xyXG59XHJcblxyXG5lbnVtIEV4cGFuZFN0YXRlIHtcclxuICBDT0xMQVBTRUQgPSAnY29sbGFwc2VkJyxcclxuICBFWFBBTkRFRCA9ICdleHBhbmRlZCdcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhdXItbWF0LXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LWF1ci1tYXQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC1hdXItbWF0LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG4gICAgICBzdGF0ZShFeHBhbmRTdGF0ZS5DT0xMQVBTRUQsIHN0eWxlKHtoZWlnaHQ6ICcwcHgnLCBtaW5IZWlnaHQ6ICcwJ30pKSxcclxuICAgICAgc3RhdGUoRXhwYW5kU3RhdGUuRVhQQU5ERUQsIHN0eWxlKHtoZWlnaHQ6ICcqJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbihgJHtFeHBhbmRTdGF0ZS5FWFBBTkRFRH0gPD0+ICR7RXhwYW5kU3RhdGUuQ09MTEFQU0VEfWAsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hBdXJNYXRUYWJsZUNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE5neEF1ck1hdFRhYmxlUHVibGljPFQ+IHtcclxuXHJcbiAgZXhwYW5kZWRTdGF0ZUVudW0gPSBFeHBhbmRTdGF0ZTtcclxuXHJcbiAgcHVibGljIHRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8VGFibGVSb3c8VD4+KFtdKTtcclxuICBfZGlzcGxheUNvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcbiAgX2N1c3RvbURpc3BsYXlDb2x1bW5zRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzZXQgZGlzcGxheUNvbHVtbnMoY29sdW1uczogc3RyaW5nW10pIHtcclxuICAgIGlmIChjb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuX2Rpc3BsYXlDb2x1bW5zID0gWy4uLmNvbHVtbnNdO1xyXG4gICAgICB0aGlzLl9jdXN0b21EaXNwbGF5Q29sdW1uc0VuYWJsZWQgPSBjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRhYmxlVmlldzogTWFwPHN0cmluZywgQ29sdW1uVmlldzxzdHJpbmc+PltdID0gW107XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoTmd4VGFibGVTdWJGb290ZXJSb3dEaXJlY3RpdmUpIHN1YkZvb3RlclJvd1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIEBWaWV3Q2hpbGRyZW4oJ3Jvd0xpbmsnLCB7cmVhZDogRWxlbWVudFJlZn0pIHJvd3M6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgQFZpZXdDaGlsZCgndGFibGUnLCB7cmVhZDogRWxlbWVudFJlZn0pIHRhYmxlOiBFbGVtZW50UmVmO1xyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgQElucHV0KCkgdGFibGVDb25maWc6IFRhYmxlQ29uZmlnPFQ+O1xyXG5cclxuICBASW5wdXQoKSB0YWJsZURhdGE6IFRbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBleHRlbmRlZFJvd1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvciwge3N0YXRpYzogZmFsc2V9KSBtYXRQYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgQFZpZXdDaGlsZChNYXRTb3J0LCB7c3RhdGljOiB0cnVlfSkgbWF0U29ydDogTWF0U29ydDtcclxuXHJcbiAgQE91dHB1dCgpIHNvcnQ6IEV2ZW50RW1pdHRlcjxTb3J0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gZXZlbnRzIGlmIGVuYWJsZWQgYWN0aW9uc1xyXG4gIEBPdXRwdXQoKSBvblJvd0FjdGlvbjogRXZlbnRFbWl0dGVyPEFjdGlvbkV2ZW50PFQ+PiA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uRXZlbnQ8VD4+KCk7XHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLy8gZXZlbnRzIGlmIGVuYWJsZWQgc2VsZWN0IGV2ZW50XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XHJcbiAgQE91dHB1dCgpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XHJcbiAgQE91dHB1dCgpIG9uRGVzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uU2VsZWN0ZWRSb3dzQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxBY3Rpb25FdmVudDxUW10+PigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uTW9kZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGlvbk1vZGVsPFQ+PigpO1xyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJuIGZpbHRlcmVkIHJvd3NcclxuICAgKi9cclxuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGNvbHVtbk9mZnNldHMgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbk9mZnNldFtdPigpO1xyXG4gIHByaXZhdGUgcHJldkNvbHVtbk9mZnNldHM6IENvbHVtbk9mZnNldFtdID0gW107XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBwcml2YXRlIHJlc2l6ZUNvbHVtbk9mZnNldHNPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgPSBFbXB0eVZhbHVlLlJFU0laRV9PQlNFUlZFUjtcclxuXHJcbiAgc2VsZWN0aW9uUHJvdmlkZXI6IFNlbGVjdGlvblByb3ZpZGVyPFQ+ID0gbmV3IFNlbGVjdGlvblByb3ZpZGVyRHVtbXkoKTtcclxuXHJcbiAgcm93QWN0aW9uc1Byb3ZpZGVyOiBSb3dBY3Rpb25Qcm92aWRlcjxUPiA9IG5ldyBSb3dBY3Rpb25Qcm92aWRlckR1bW15PFQ+KCk7XHJcblxyXG4gIGluZGV4UHJvdmlkZXI6IEluZGV4UHJvdmlkZXIgPSBuZXcgSW5kZXhQcm92aWRlckR1bW15KCk7XHJcblxyXG4gIHBhZ2luYXRpb25Qcm92aWRlcjogUGFnaW5hdGlvblByb3ZpZGVyID0gbmV3IFBhZ2luYXRpb25Qcm92aWRlckR1bW15KCk7XHJcblxyXG4gIHRvdGFsUm93UHJvdmlkZXI6IFRvdGFsUm93UHJvdmlkZXI8VD4gPSBuZXcgVG90YWxSb3dQcm92aWRlckR1bW15KCk7XHJcblxyXG4gIGhpZ2hsaWdodGVkOiBUIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGN1c3RvbVNvcnRGdW5jdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgKGRhdGE6IFRhYmxlUm93PFQ+LCBrZXk6IHN0cmluZykgPT4gYW55PigpO1xyXG5cclxuICBwcml2YXRlIGZpbHRlclN0b3JhZ2UgPSBuZXcgTWFwPHN0cmluZywgTmd4QXVyRmlsdGVycy5CYXNlPFQ+PigpO1xyXG5cclxuICAvL9C30L3QsNGH0LXQvdC40LUg0L/QtdGA0LXQtNCw0LXRgtGB0Y8g0LIg0LrQvtC90YLQtdC50L3QtdGA0LUg0LjQvdCw0YfQtSBPbkNoYW5nZSDQvdC1INCy0LjQtNC40YIg0LjQt9C80LXQvdC10L3QuNC5INC60L7Qs9C00LAg0L/QtdGA0LXQtNCw0Y7RgtGB0Y8g0L7QtNC40L3QsNC60L7QstGL0LUg0LfQvdCw0YfQtdC90LjQtSDQuCDQv9C+0LTRgdCy0LXRgtC60LAg0YHRgtGA0L7QutC4INC90LUg0L7RgtC60LvRjtGH0LDQtdGC0YHRj1xyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBASW5wdXQoKSBoaWdobGlnaHQ6IEhpZ2hsaWdodENvbnRhaW5lcjxUPiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoKGNoYW5nZXNbJ3RhYmxlRGF0YSddICYmIHRoaXMudGFibGVEYXRhKSB8fCAoY2hhbmdlc1snZGlzcGxheUNvbHVtbnMnXSAmJiB0aGlzLl9kaXNwbGF5Q29sdW1ucykpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoVGFibGUoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydoaWdobGlnaHQnXSAmJiB0aGlzLmhpZ2hsaWdodCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUhpZ2hsaWdodENoYW5nZSh0aGlzLmhpZ2hsaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaFRhYmxlKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvblByb3ZpZGVyPy5zZWxlY3Rpb24/LnNlbGVjdGVkID8/IFtdO1xyXG4gICAgdGhpcy50YWJsZURhdGEgPSB0aGlzLnRhYmxlRGF0YSB8fCBbXTtcclxuICAgIHRoaXMucHJlcGFyZVRhYmxlRGF0YShzZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUhpZ2hsaWdodENoYW5nZShoOiBIaWdobGlnaHRDb250YWluZXI8VD4pIHtcclxuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkID09PSBoLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkID0gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5oaWdobGlnaHRlZCA9IGgudmFsdWU7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YS5maW5kSW5kZXgocm93ID0+IHJvdy5yb3dTcmMgPT09IGgudmFsdWUpO1xyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIHRoaXMucm93cz8udG9BcnJheSgpW2luZGV4XT8ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XHJcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcclxuICAgICAgICAgIGJsb2NrOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgaW5saW5lOiBcImNlbnRlclwiXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRhYmxlQ29uZmlnKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImluaXQgaW5wdXRzIFt0YWJsZUNvbmZpZ10gaXMgbWFuZGF0b3J5IVwiKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gd2UgbmVlZCB0aGlzLCBpbiBvcmRlciB0byBtYWtlIHBhZ2luYXRpb24gd29yayB3aXRoICpuZ0lmXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0UGFnaW5hdG9yKClcclxuICAgIHRoaXMuaW5pdFNvcnRpbmdEYXRhQWNjZXNzb3IoKTtcclxuICAgIHRoaXMucmVzaXplQ29sdW1uT2Zmc2V0c09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMudXBkYXRlQ29sdW1uT2Zmc2V0cygpKTtcclxuICAgIHRoaXMucmVzaXplQ29sdW1uT2Zmc2V0c09ic2VydmVyLm9ic2VydmUodGhpcy50YWJsZS5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgIHRoaXMudXBkYXRlQ29sdW1uT2Zmc2V0cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0UGFnaW5hdG9yKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGFibGVEYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMubWF0UGFnaW5hdG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U29ydGluZ0RhdGFBY2Nlc3NvcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRhYmxlRGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5tYXRTb3J0O1xyXG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5zb3J0aW5nRGF0YUFjY2Vzc29yID0gKGRhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbVNvcnRGdW5jdGlvbiA9IHRoaXMuY3VzdG9tU29ydEZ1bmN0aW9ucy5nZXQoa2V5KTtcclxuICAgICAgICByZXR1cm4gY3VzdG9tU29ydEZ1bmN0aW9uID8gY3VzdG9tU29ydEZ1bmN0aW9uKGRhdGEsIGtleSkgOiBkYXRhW2tleV07XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk9mZnNldHMoKSB7XHJcbiAgICBpZiAodGhpcy50YWJsZT8ubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvckFsbCgndGgnKSkge1xyXG4gICAgICBjb25zdCBvZmZzZXRzOiBDb2x1bW5PZmZzZXRbXSA9IEFycmF5LmZyb20odGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJykpXHJcbiAgICAgICAgLm1hcCgoYykgPT4gKGMgYXMgSFRNTEVsZW1lbnQpKVxyXG4gICAgICAgIC5tYXAoKGMsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgbGVmdDogYy5vZmZzZXRMZWZ0LFxyXG4gICAgICAgICAgd2lkdGg6IGMub2Zmc2V0V2lkdGgsXHJcbiAgICAgICAgICBrZXk6IHRoaXMuX2Rpc3BsYXlDb2x1bW5zW2luZGV4XVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgaWYgKE9mZnNldFV0aWwuYXJlTm90RXF1YWwodGhpcy5wcmV2Q29sdW1uT2Zmc2V0cywgb2Zmc2V0cykpIHtcclxuICAgICAgICB0aGlzLnByZXZDb2x1bW5PZmZzZXRzID0gb2Zmc2V0cztcclxuICAgICAgICB0aGlzLmNvbHVtbk9mZnNldHMuZW1pdChvZmZzZXRzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlVGFibGVEYXRhKGluaXRTZWxlY3Rpb246IFRbXSA9IFtdKSB7XHJcbiAgICB0aGlzLmluaXRUYWJsZSgpO1xyXG4gICAgdGhpcy5pbml0Q3VzdG9tU29ydEZ1bmN0aW9uc01hcCgpO1xyXG4gICAgdGhpcy5pbml0UGFnaW5hdG9yKCk7XHJcbiAgICB0aGlzLmluaXRTb3J0aW5nRGF0YUFjY2Vzc29yKCk7XHJcbiAgICB0aGlzLmluZGV4UHJvdmlkZXIgPSBJbmRleFByb3ZpZGVyLmNyZWF0ZSh0aGlzLnRhYmxlQ29uZmlnKVxyXG4gICAgICAuYWRkSW5kZXhDb2x1bW4odGhpcy5fZGlzcGxheUNvbHVtbnMpO1xyXG5cclxuICAgIHRoaXMucm93QWN0aW9uc1Byb3ZpZGVyID0gUm93QWN0aW9uUHJvdmlkZXIuY3JlYXRlKHRoaXMudGFibGVDb25maWcpXHJcbiAgICAgIC5hZGRBY3Rpb25Db2x1bW4odGhpcy5fZGlzcGxheUNvbHVtbnMpXHJcbiAgICAgIC5zZXRWaWV3KHRoaXMudGFibGVEYXRhU291cmNlLmRhdGEpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBTZWxlY3Rpb25Qcm92aWRlci5jcmVhdGUodGhpcy50YWJsZUNvbmZpZywgdGhpcy50YWJsZURhdGFTb3VyY2UsIGluaXRTZWxlY3Rpb24pXHJcbiAgICAgIC5hZGRDaGVja2JveENvbHVtbih0aGlzLl9kaXNwbGF5Q29sdW1ucylcclxuICAgICAgLmJpbmRFdmVudEVtaXR0ZXJzKHRoaXMuc2VsZWN0ZWQsIHRoaXMub25TZWxlY3QsIHRoaXMub25EZXNlbGVjdCwgdGhpcy5zZWxlY3Rpb25Nb2RlbCk7XHJcblxyXG4gICAgdGhpcy5wYWdpbmF0aW9uUHJvdmlkZXIgPSBQYWdpbmF0aW9uUHJvdmlkZXIuY3JlYXRlKHRoaXMudGFibGVDb25maWcpO1xyXG5cclxuICAgIHRoaXMudG90YWxSb3dQcm92aWRlciA9IFRvdGFsUm93UHJvdmlkZXIuY3JlYXRlKHRoaXMudGFibGVDb25maWcsIHRoaXMudGFibGVEYXRhU291cmNlKVxyXG4gICAgICAuc2V0U3R5bGUoKVxyXG4gICAgICAuc2V0VG90YWxSb3coKTtcclxuXHJcbiAgICB0aGlzLmVtaXRGaWx0ZXJlZFZhbHVlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q3VzdG9tU29ydEZ1bmN0aW9uc01hcCgpIHtcclxuICAgIHRoaXMudGFibGVDb25maWcuY29sdW1uc0NmZ1xyXG4gICAgICAuZmlsdGVyKGMgPT4gYy5zb3J0ICYmIGMuc29ydC5lbmFibGUgJiYgYy5zb3J0LmN1c3RvbVNvcnQpXHJcbiAgICAgIC5mb3JFYWNoKGMgPT4gdGhpcy5jdXN0b21Tb3J0RnVuY3Rpb25zLnNldChjLmtleSwgYy5zb3J0IS5jdXN0b21Tb3J0ISkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRUYWJsZSgpIHtcclxuICAgIHRoaXMudGFibGVEYXRhU291cmNlID0gTWF0VGFibGVEYXRhU291cmNlRmFjdG9yeS5jb252ZXJ0KHRoaXMudGFibGVEYXRhLCB0aGlzLnRhYmxlQ29uZmlnLmNvbHVtbnNDZmcpO1xyXG4gICAgdGhpcy50YWJsZVZpZXcgPSBUYWJsZVZpZXdGYWN0b3J5LnRvVmlldyh0aGlzLnRhYmxlRGF0YVNvdXJjZS5kYXRhLCB0aGlzLnRhYmxlQ29uZmlnKVxyXG4gICAgaWYgKCF0aGlzLl9jdXN0b21EaXNwbGF5Q29sdW1uc0VuYWJsZWQpIHtcclxuICAgICAgdGhpcy5fZGlzcGxheUNvbHVtbnMgPSBEaXNwbGF5Q29sdW1uc0ZhY3RvcnkuY3JlYXRlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlTZWFyY2hGaWx0ZXIoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5maWx0ZXIgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuZW1pdEZpbHRlcmVkVmFsdWVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlRmlsdGVyKGZpbHRlck5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyU3RvcmFnZS5nZXQoZmlsdGVyTmFtZSkpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTdG9yYWdlLmRlbGV0ZShmaWx0ZXJOYW1lKTtcclxuICAgICAgdGhpcy5hcHBseUZpbHRlcnNJbnRlcm5hbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFwcGx5RmlsdGVyKGZpbHRlck5hbWU6IHN0cmluZywgZmlsdGVyOiBOZ3hBdXJGaWx0ZXJzLkJhc2U8VD4pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJTdG9yYWdlLmdldChmaWx0ZXJOYW1lKSB8fCAoIXRoaXMuZmlsdGVyU3RvcmFnZS5nZXQoZmlsdGVyTmFtZSkhLmVxdWFscyhmaWx0ZXIpKSkge1xyXG4gICAgICB0aGlzLmZpbHRlclN0b3JhZ2Uuc2V0KGZpbHRlck5hbWUsIGZpbHRlcik7XHJcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW50ZXJuYWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmZpbHRlclN0b3JhZ2UuY2xlYXIoKTtcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzSW50ZXJuYWwoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJBY3Rpb25zID0gWy4uLnRoaXMuZmlsdGVyU3RvcmFnZS52YWx1ZXMoKV07XHJcbiAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAoZGF0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gZmlsdGVyQWN0aW9ucy5ldmVyeShmaWx0ZXJBY3Rpb24gPT4gZmlsdGVyQWN0aW9uLmZpbHRlckZuKCkoZGF0YSkpO1xyXG4gICAgfTtcclxuICAgIC8vINCf0YDQuNC80LXQvdC10L3QuNC1INGE0LjQu9GM0YLRgNCw0YbQuNC4LiDQvdGD0LbQvdC+INC/0LXRgNC10LTQsNGC0Ywg0YPQvdC40LrQsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDRh9GC0L7QsdGLINGE0LjQu9GM0YLRgNCw0YbQuNGPINC30LDQv9GD0YHRgtC40LvQsNGB0YxcclxuICAgIHRoaXMudGFibGVEYXRhU291cmNlLmZpbHRlciA9ICd0cmlnZ2VyLScgKyBNYXRoLnJhbmRvbSgpO1xyXG4gICAgdGhpcy5lbWl0RmlsdGVyZWRWYWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdEZpbHRlcmVkVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHRoaXMudGFibGVEYXRhU291cmNlLmZpbHRlcmVkRGF0YS5tYXAoZiA9PiBmLnJvd1NyYykpXHJcbiAgfVxyXG5cclxuICBzb3J0VGFibGUoc29ydFBhcmFtZXRlcnM6IFNvcnQpIHtcclxuICAgIHRoaXMuc29ydC5lbWl0KHNvcnRQYXJhbWV0ZXJzKTtcclxuICB9XHJcblxyXG4gIGVtaXRTZWxlY3RlZFJvd3NBY3Rpb24oYWN0aW9uOiBzdHJpbmcsIHJvd3M6IFRbXSkge1xyXG4gICAgdGhpcy5vblNlbGVjdGVkUm93c0FjdGlvbi5lbWl0KHthY3Rpb24sIHZhbHVlOiByb3dzfSk7XHJcbiAgfVxyXG5cclxuICBlbWl0Um93QWN0aW9uKGFjdGlvbjogc3RyaW5nLCByb3c6IFQsICRldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vblJvd0FjdGlvbi5lbWl0KHthY3Rpb24sIHZhbHVlOiByb3d9KTtcclxuICB9XHJcblxyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIubWFzdGVyVG9nZ2xlKCk7XHJcbiAgfVxyXG5cclxuICBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIuaXNBbGxTZWxlY3RlZCgpO1xyXG4gIH1cclxuXHJcbiAgY2FzdFNyYyhyb3c6IGFueSk6IFRhYmxlUm93PFQ+IHtcclxuICAgIHJldHVybiByb3c7XHJcbiAgfVxyXG5cclxuICByb3dDbGljayhyb3c6IFRhYmxlUm93PFQ+KSB7XHJcbiAgICBpZiAocm93LnJvd1NyYyAhPT0gdGhpcy5oaWdobGlnaHRlZCB8fCAocm93LnJvd1NyYyA9PT0gdGhpcy5oaWdobGlnaHRlZCAmJiAhdGhpcy50YWJsZUNvbmZpZy5jbGlja0NmZz8uY2FuY2VsYWJsZSkpIHtcclxuICAgICAgdGhpcy5vblJvd0NsaWNrLmVtaXQocm93LnJvd1NyYyk7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWQgPSByb3cucm93U3JjO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5oaWdobGlnaHRlZCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb25Nb2RlbCgpOiBTZWxlY3Rpb25Nb2RlbDxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Qcm92aWRlci5zZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vINCe0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INC90LDQsdC70Y7QtNC10L3QuNC1INC/0YDQuCDRg9C90LjRh9GC0L7QttC10L3QuNC4INC60L7QvNC/0L7QvdC10L3RgtCwXHJcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbk9mZnNldHNPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdXItbWF0LXRhYmxlXCI+XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIEZpbHRlciAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUNvbmZpZy5maWx0ZXJDZmdcIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3sgdGFibGVDb25maWcuZmlsdGVyQ2ZnPy5sYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCAoa2V5dXApPVwiYXBwbHlTZWFyY2hGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3t0YWJsZUNvbmZpZy5maWx0ZXJDZmc/LnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIj5cclxuICAgICAgICA8bWF0LWljb24gbWF0UHJlZml4PnNlYXJjaDwvbWF0LWljb24+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIFRhYmxlIC0tPlxyXG4gICAgPHRhYmxlICN0YWJsZSBtYXQtdGFibGUgbWF0U29ydFxyXG4gICAgICAgICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiZXh0ZW5kZWRSb3dUZW1wbGF0ZSAhPT0gbnVsbFwiXHJcbiAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCJcclxuICAgICAgICAgICAobWF0U29ydENoYW5nZSk9XCJzb3J0VGFibGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJ0YWJsZUNvbmZpZy50YWJsZVZpZXc/LmhlaWdodFwiXHJcbiAgICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwidGFibGVDb25maWcudGFibGVWaWV3Py5tYXhIZWlnaHRcIlxyXG4gICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0XT1cInRhYmxlQ29uZmlnLnRhYmxlVmlldz8ubWluSGVpZ2h0XCI+XHJcblxyXG4gICAgICA8IS0tICAgICAgICBpbmRleC1jb2x1bW4tLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluZGV4UHJvdmlkZXIuaXNFbmFibGVkXCIgW21hdENvbHVtbkRlZl09XCJpbmRleFByb3ZpZGVyLkNPTFVNTl9OQU1FXCI+XHJcblxyXG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgICA8bGliLWNvbHVtbi12aWV3IFtjb25maWddPVwiaW5kZXhQcm92aWRlci5oZWFkZXJWaWV3XCI+XHJcbiAgICAgICAgICAgIHt7IGluZGV4UHJvdmlkZXIubmFtZSB9fVxyXG4gICAgICAgICAgPC9saWItY29sdW1uLXZpZXc+XHJcbiAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICB7eyByb3dJbmRleCArIGluZGV4UHJvdmlkZXIub2Zmc2V0IH19XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj5cclxuICAgICAgICAgIHt7IHRvdGFsUm93UHJvdmlkZXIudG90YWxzLmdldChpbmRleFByb3ZpZGVyLkNPTFVNTl9OQU1FKSB8fCAnJyB9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSAgICAgICAgc2VsZWN0aW9uLWNvbHVtbi0tPlxyXG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwic2VsZWN0aW9uUHJvdmlkZXIuQ09MVU1OX05BTUVcIiAqbmdJZj1cInNlbGVjdGlvblByb3ZpZGVyLmlzRW5hYmxlZFwiPlxyXG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uUHJvdmlkZXIuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb25Qcm92aWRlci5zZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCI+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ0YWJsZUNvbmZpZy5zZWxlY3Rpb25DZmc/LnNob3dTZWxlY3RlZENvdW50ICYmIHNlbGVjdGlvblByb3ZpZGVyLnNlbGVjdGlvbi5oYXNWYWx1ZSgpXCI+XHJcbiAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgIHt7IHNlbGVjdGlvblByb3ZpZGVyLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggfX1cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWJsZUNvbmZpZy5zZWxlY3Rpb25DZmc/LnNob3dUb3RhbENvdW50ICE9PSBmYWxzZVwiPi97eyB0YWJsZURhdGFTb3VyY2UuZmlsdGVyZWREYXRhLmxlbmd0aCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGlvblByb3ZpZGVyLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIHRhYmxlQ29uZmlnPy5zZWxlY3Rpb25DZmc/LmFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVtaXRTZWxlY3RlZFJvd3NBY3Rpb24oYWN0aW9uLmFjdGlvbiwgc2VsZWN0aW9uUHJvdmlkZXIuc2VsZWN0aW9uLnNlbGVjdGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJhY3Rpb24uaWNvbi50b29sdGlwIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgdGFibGVDb25maWcuc2VsZWN0aW9uQ2ZnIS5hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImFjdGlvbi5pY29uLmNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbi5pY29uLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb25Qcm92aWRlci5zZWxlY3Rpb24udG9nZ2xlKGNhc3RTcmMocm93KS5yb3dTcmMpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvblByb3ZpZGVyLnNlbGVjdGlvbi5pc1NlbGVjdGVkKGNhc3RTcmMocm93KS5yb3dTcmMpXCI+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSBhY3Rpb24gY29sdW1uIC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93QWN0aW9uc1Byb3ZpZGVyLmlzRW5hYmxlZFwiIFttYXRDb2x1bW5EZWZdPVwicm93QWN0aW9uc1Byb3ZpZGVyLkNPTFVNTl9OQU1FXCI+XHJcbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW1pdFJvd0FjdGlvbihhY3Rpb24uYWN0aW9uLCBlbGVtZW50LnJvd1NyYywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImFjdGlvbi5pY29uLnRvb2x0aXAgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHJvd0FjdGlvbnNQcm92aWRlci5hY3Rpb25WaWV3LmdldChlbGVtZW50LmlkKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImFjdGlvbi5pY29uLmNvbG9yXCI+XHJcbiAgICAgICAgICAgICAge3sgYWN0aW9uLmljb24ubmFtZSB9fVxyXG4gICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogcm93QWN0aW9uc1Byb3ZpZGVyLkNPTFVNTl9OQU1FfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwhLS0gICAgdmFsdWUtaWNvbi0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW5Db25maWcgb2YgdGFibGVDb25maWcuY29sdW1uc0NmZ1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uQ29uZmlnLmtleVwiPlxyXG5cclxuICAgICAgICA8IS0tIGlmIHNvcnRhYmxlIGNvbHVtbiBoZWFkZXIgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkNvbmZpZy5zb3J0ICYmIGNvbHVtbkNvbmZpZy5zb3J0LmVuYWJsZTsgZWxzZSBub3RTb3J0YWJsZVwiPlxyXG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbbWF0LXNvcnQtaGVhZGVyXT1cImNvbHVtbkNvbmZpZy5rZXlcIlxyXG4gICAgICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbkNvbmZpZy5zb3J0LnBvc2l0aW9uID09PSAncmlnaHQnID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJWYWx1ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBlbHNlIG5vdCBzb3J0YWJsZSAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vdFNvcnRhYmxlPlxyXG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclZhbHVlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS0gICAgICBoZWFkZXIgdmFsdWUtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclZhbHVlPlxyXG4gICAgICAgICAgPGxpYi1jb2x1bW4tdmlldyBbY29uZmlnXT1cImNvbHVtbkNvbmZpZy5oZWFkZXJWaWV3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbHVtbkNvbmZpZy5uYW1lXCI+XHJcbiAgICAgICAgICA8L2xpYi1jb2x1bW4tdmlldz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8IS0tIGNvbHVtbiB2YWx1ZSDQv9C+0LvRg9GH0LDRgtGMINC90LDRgdGC0YDQvtC50LrQuCDQutC+0LvQvtC90L7QuiDQvdGD0LbQvdC+INGH0LXRgNC10LcgZ2V0Vmlldyhyb3dJbmRleCwgY29sdW1uQ29uZmlnLmtleSkg0YLQsNC8INC90LDRhdC+0LTRj9GC0YHRjyDRg9C20LVcclxuICAgICAgICDQv9C+0LTQs9C+0YLQvtCy0LvQtdC90L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g0LTQu9GPINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPLS0+XHJcbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7XCI+XHJcbiAgICAgICAgICA8bGliLWNvbHVtbi12aWV3XHJcbiAgICAgICAgICAgIFtjb25maWddPVwidGFibGVWaWV3W2VsZW1lbnQuaWRdPy5nZXQoY29sdW1uQ29uZmlnLmtleSlcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWxlbWVudCB8IGRhdGFQcm9wZXJ0eUdldHRlcjogY29sdW1uQ29uZmlnLmtleVwiPlxyXG4gICAgICAgICAgPC9saWItY29sdW1uLXZpZXc+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj5cclxuICAgICAgICAgIHt7IHRvdGFsUm93UHJvdmlkZXIudG90YWxzLmdldChjb2x1bW5Db25maWcua2V5KSB8fCAnJyB9fVxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiX2Rpc3BsYXlDb2x1bW5zOyAgc3RpY2t5OiB0aGlzLnRhYmxlQ29uZmlnLnN0aWNreUNmZz8uaGVhZGVyXCI+PC90cj5cclxuICAgICAgPHRyIG1hdC1yb3cgI3Jvd0xpbmtcclxuICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBfZGlzcGxheUNvbHVtbnM7XCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3dDbGljayhyb3cpXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsncG9pbnRlcic6IHRhYmxlQ29uZmlnLmNsaWNrQ2ZnPy5wb2ludGVyIHx8IGZhbHNlLCAnbmV3LWNvbG9yJzogaGlnaGxpZ2h0ZWQ9PT1yb3cucm93U3JjICYmIHRhYmxlQ29uZmlnPy5jbGlja0NmZz8uaGlnaGxpZ2h0Q2xpY2tlZD8uY29sb3J9XCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICdjb2xvcic6IGhpZ2hsaWdodGVkPT09cm93LnJvd1NyYz8gdGFibGVDb25maWc/LmNsaWNrQ2ZnPy5oaWdobGlnaHRDbGlja2VkPy5jb2xvciA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogaGlnaGxpZ2h0ZWQgPT09IHJvdy5yb3dTcmM/IHRhYmxlQ29uZmlnPy5jbGlja0NmZz8uaGlnaGxpZ2h0Q2xpY2tlZD8uYmFja2dyb3VuZCA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICdib3JkZXInOiBoaWdobGlnaHRlZCA9PT0gcm93LnJvd1NyYz8gdGFibGVDb25maWc/LmNsaWNrQ2ZnPy5oaWdobGlnaHRDbGlja2VkPy5ib3JkZXIgOiB1bmRlZmluZWRcclxuICAgICAgICAgIH1cIj5cclxuICAgICAgPC90cj5cclxuXHJcbiAgICAgIDwhLS1leHBhbmRlZC1yb3ctLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBhbmRlZFJvd1wiPlxyXG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW2F0dHIuY29sc3Bhbl09XCJfZGlzcGxheUNvbHVtbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRldGFpbFwiXHJcbiAgICAgICAgICAgICAgIFtAZGV0YWlsRXhwYW5kXT1cImVsZW1lbnQucm93U3JjID09PSBoaWdobGlnaHRlZCA/IGV4cGFuZGVkU3RhdGVFbnVtLkVYUEFOREVEIDogZXhwYW5kZWRTdGF0ZUVudW0uQ09MTEFQU0VEXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJleHRlbmRlZFJvd1RlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBlbGVtZW50fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXh0ZW5kZWRSb3dUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDx0ciBtYXQtcm93IGNsYXNzPVwiZXhwYW5kZWQtcm93XCIgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWRSb3cnXVwiPjwvdHI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8IS0tZXhwYW5kZWQtcm93LS0+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxSb3dQcm92aWRlci5pc0VuYWJsZWRcIj5cclxuICAgICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cIl9kaXNwbGF5Q29sdW1uczsgc3RpY2t5OiB0aGlzLnRhYmxlQ29uZmlnLnN0aWNreUNmZz8udG90YWxcIlxyXG4gICAgICAgICAgICBbc3R5bGVdPVwidG90YWxSb3dQcm92aWRlci5zdHlsZVwiPjwvdHI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLXN1Yi1mb290ZXItcm93LS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3ViRm9vdGVyUm93XCI+XHJcbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cIl9kaXNwbGF5Q29sdW1ucy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltuZ3hBdXJUYWJsZVN1YkZvb3RlclJvd11cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJGb290ZXJSb3dUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiWydzdWJGb290ZXJSb3cnXTsgc3RpY2t5OiB0aGlzLnRhYmxlQ29uZmlnLnN0aWNreUNmZz8uc3ViRm9vdGVyXCI+PC90cj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gICAgICBzdWItZm9vdGVyLXJvdyBFTkQtLT5cclxuXHJcbiAgICAgIDwhLS1zdWItZm9vdGVyLXBhZ2luYXRpb24tLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdWJGb290ZXJQYWdpbmF0aW9uXCI+XHJcbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cIl9kaXNwbGF5Q29sdW1ucy5sZW5ndGhcIj5cclxuXHJcbiAgICAgICAgICA8bWF0LXBhZ2luYXRvciBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2luYXRpb25Qcm92aWRlci5zaXplc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnaW5hdGlvblByb3ZpZGVyLnNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInRoaXMudGFibGVDb25maWc/LnBhZ2VhYmxlQ2ZnPy5zdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rmlyc3RMYXN0QnV0dG9ucz5cclxuICAgICAgICAgIDwvbWF0LXBhZ2luYXRvcj5cclxuXHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnaW5hdGlvblByb3ZpZGVyLmlzRW5hYmxlZFwiPlxyXG4gICAgICAgIDx0ciBtYXQtZm9vdGVyLXJvd1xyXG4gICAgICAgICAgICAqbWF0Rm9vdGVyUm93RGVmPVwiWydzdWJGb290ZXJQYWdpbmF0aW9uJ107IHN0aWNreTogdGhpcy50YWJsZUNvbmZpZy5zdGlja3lDZmc/LnN1YkZvb3RlclBhZ2luYXRpb25cIlxyXG4gICAgICAgICAgICBbc3R5bGVdPVwidGhpcy50YWJsZUNvbmZpZz8ucGFnZWFibGVDZmc/LnN0eWxlXCI+PC90cj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gICAgICBzdWItZm9vdGVyLXBhZ2luYXRpb24gRU5ELS0+XHJcbiAgICA8L3RhYmxlPlxyXG4gICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxyXG5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2Zvb3RlckNlbGxUZW1wbGF0ZSBsZXQtY29sdW1uTmFtZT5cclxuICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPlxyXG4gICAge3sgdG90YWxSb3dQcm92aWRlci50b3RhbHMuZ2V0KGNvbHVtbk5hbWUpIHx8ICcnIH19XHJcbiAgPC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19