@inspark/inspark-components 14.0.71 → 19.0.1
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.
- package/full/bms.css +3 -2363
- package/full/bms.js +1 -1
- package/full/components/autocomplete/autocomplete.component.d.ts +36 -57
- package/full/components/autocomplete/autocomplete.component.d.ts.map +1 -0
- package/full/components/autocomplete/autocomplete.module.d.ts +10 -0
- package/full/components/autocomplete/autocomplete.module.d.ts.map +1 -0
- package/full/components/breadcrumb/breadcrumb.component.d.ts +2 -1
- package/full/components/breadcrumb/breadcrumb.component.d.ts.map +1 -0
- package/full/components/breadcrumb/breadcrumb.module.d.ts +9 -0
- package/full/components/breadcrumb/breadcrumb.module.d.ts.map +1 -0
- package/full/components/button/button.component.d.ts +9 -8
- package/full/components/button/button.component.d.ts.map +1 -0
- package/full/components/button/button.module.d.ts +12 -0
- package/full/components/button/button.module.d.ts.map +1 -0
- package/full/components/checkbox/checkbox.component.d.ts +2 -1
- package/full/components/checkbox/checkbox.component.d.ts.map +1 -0
- package/full/components/checkbox/checkbox.module.d.ts +10 -0
- package/full/components/checkbox/checkbox.module.d.ts.map +1 -0
- package/full/components/communication.service.d.ts +1 -0
- package/full/components/communication.service.d.ts.map +1 -0
- package/full/components/component-container/component-container.component.d.ts +3 -2
- package/full/components/component-container/component-container.component.d.ts.map +1 -0
- package/full/components/component-container/component-container.module.d.ts +9 -0
- package/full/components/component-container/component-container.module.d.ts.map +1 -0
- package/full/components/content-toggle/content-toggle.component.d.ts +2 -1
- package/full/components/content-toggle/content-toggle.component.d.ts.map +1 -0
- package/full/components/dropdown/dropdown.component.d.ts +31 -108
- package/full/components/dropdown/dropdown.component.d.ts.map +1 -0
- package/full/components/dropdown/dropdown.module.d.ts +10 -0
- package/full/components/dropdown/dropdown.module.d.ts.map +1 -0
- package/full/components/empty/empty.component.d.ts +2 -1
- package/full/components/empty/empty.component.d.ts.map +1 -0
- package/full/components/file/file.component.d.ts +2 -1
- package/full/components/file/file.component.d.ts.map +1 -0
- package/full/components/file/file.module.d.ts +9 -0
- package/full/components/file/file.module.d.ts.map +1 -0
- package/full/components/header/header.component.d.ts +2 -1
- package/full/components/header/header.component.d.ts.map +1 -0
- package/full/components/inline-message/inline-message.component.d.ts +2 -1
- package/full/components/inline-message/inline-message.component.d.ts.map +1 -0
- package/full/components/input-group/input-group.component.d.ts +2 -1
- package/full/components/input-group/input-group.component.d.ts.map +1 -0
- package/full/components/input-text/input-text.component.d.ts +2 -1
- package/full/components/input-text/input-text.component.d.ts.map +1 -0
- package/full/components/input-text/input-text.module.d.ts +10 -0
- package/full/components/input-text/input-text.module.d.ts.map +1 -0
- package/full/components/inspark.module.d.ts +41 -44
- package/full/components/inspark.module.d.ts.map +1 -0
- package/full/components/inspark.shared.d.ts +2 -1
- package/full/components/inspark.shared.d.ts.map +1 -0
- package/full/components/legacy/legacy-components.module.d.ts +12 -0
- package/full/components/legacy/legacy-components.module.d.ts.map +1 -0
- package/full/components/legacy/legacy-ui.module.d.ts +13 -0
- package/full/components/legacy/legacy-ui.module.d.ts.map +1 -0
- package/full/components/link/link.component.d.ts +4 -3
- package/full/components/link/link.component.d.ts.map +1 -0
- package/full/components/link/link.module.d.ts +11 -0
- package/full/components/link/link.module.d.ts.map +1 -0
- package/full/components/modal-input-text/modal-input-text.component.d.ts +2 -1
- package/full/components/modal-input-text/modal-input-text.component.d.ts.map +1 -0
- package/full/components/object-tree/object-tree.component.d.ts +2 -1
- package/full/components/object-tree/object-tree.component.d.ts.map +1 -0
- package/full/components/panel/panel.component.d.ts +2 -1
- package/full/components/panel/panel.component.d.ts.map +1 -0
- package/full/components/pie/pie.component.d.ts +2 -1
- package/full/components/pie/pie.component.d.ts.map +1 -0
- package/full/components/pie/pie.service.d.ts +1 -0
- package/full/components/pie/pie.service.d.ts.map +1 -0
- package/full/components/preloader/preloader.component.d.ts +3 -2
- package/full/components/preloader/preloader.component.d.ts.map +1 -0
- package/full/components/preloader/preloader.module.d.ts +9 -0
- package/full/components/preloader/preloader.module.d.ts.map +1 -0
- package/full/components/radiobutton/radiobutton.component.d.ts +2 -1
- package/full/components/radiobutton/radiobutton.component.d.ts.map +1 -0
- package/full/components/select-button/select-button.component.d.ts +3 -2
- package/full/components/select-button/select-button.component.d.ts.map +1 -0
- package/full/components/select-button/select-button.module.d.ts +9 -0
- package/full/components/select-button/select-button.module.d.ts.map +1 -0
- package/full/components/select-list/select-list.component.d.ts +2 -1
- package/full/components/select-list/select-list.component.d.ts.map +1 -0
- package/full/components/shared/shared-components.module.d.ts +11 -0
- package/full/components/shared/shared-components.module.d.ts.map +1 -0
- package/full/components/shared/shared-ui.module.d.ts +12 -0
- package/full/components/shared/shared-ui.module.d.ts.map +1 -0
- package/full/components/status-circle/status-circle.component.d.ts +2 -1
- package/full/components/status-circle/status-circle.component.d.ts.map +1 -0
- package/full/components/sticky/sticky.component.d.ts +2 -1
- package/full/components/sticky/sticky.component.d.ts.map +1 -0
- package/full/components/sticky/sticky.module.d.ts +9 -0
- package/full/components/sticky/sticky.module.d.ts.map +1 -0
- package/full/components/svg/svg.component.d.ts +4 -4
- package/full/components/svg/svg.component.d.ts.map +1 -0
- package/full/components/svg/svg.module.d.ts +10 -0
- package/full/components/svg/svg.module.d.ts.map +1 -0
- package/full/components/switcher/switcher.component.d.ts +2 -1
- package/full/components/switcher/switcher.component.d.ts.map +1 -0
- package/full/components/table/table-click-outside.directive.d.ts +2 -1
- package/full/components/table/table-click-outside.directive.d.ts.map +1 -0
- package/full/components/table/table-columns-multiselect/table-columns-multiselect.component.d.ts +2 -1
- package/full/components/table/table-columns-multiselect/table-columns-multiselect.component.d.ts.map +1 -0
- package/full/components/table/table-menu-overlay/table-menu-overlay.component.d.ts +2 -1
- package/full/components/table/table-menu-overlay/table-menu-overlay.component.d.ts.map +1 -0
- package/full/components/table/table.component.d.ts +10 -12
- package/full/components/table/table.component.d.ts.map +1 -0
- package/full/components/textarea/textarea.component.d.ts +2 -1
- package/full/components/textarea/textarea.component.d.ts.map +1 -0
- package/full/components/textarea/textarea.module.d.ts +10 -0
- package/full/components/textarea/textarea.module.d.ts.map +1 -0
- package/full/components/toolbar/toolbar.component.d.ts +2 -1
- package/full/components/toolbar/toolbar.component.d.ts.map +1 -0
- package/full/components/toolbar/toolbar.module.d.ts +9 -0
- package/full/components/toolbar/toolbar.module.d.ts.map +1 -0
- package/full/components/tooltip/tooltip.component.d.ts +2 -1
- package/full/components/tooltip/tooltip.component.d.ts.map +1 -0
- package/full/components/tree-table/tree-table.component.d.ts +3 -2
- package/full/components/tree-table/tree-table.component.d.ts.map +1 -0
- package/full/fesm2022/inspark-inspark-components.mjs +6292 -0
- package/full/fesm2022/inspark-inspark-components.mjs.map +1 -0
- package/full/index.css +6 -2366
- package/full/index.d.ts +1 -0
- package/full/index.js +1 -1
- package/full/inspark-inspark-components.d.ts.map +1 -0
- package/full/interface.d.ts +3 -2
- package/full/interface.d.ts.map +1 -0
- package/full/pipes/pipes.module.d.ts +1 -0
- package/full/pipes/pipes.module.d.ts.map +1 -0
- package/full/pipes/propertyValue.pipe.d.ts +1 -0
- package/full/pipes/propertyValue.pipe.d.ts.map +1 -0
- package/full/pipes/safeUrl.pipe.d.ts +1 -0
- package/full/pipes/safeUrl.pipe.d.ts.map +1 -0
- package/full/pipes/sort-by.pipe.d.ts +1 -0
- package/full/pipes/sort-by.pipe.d.ts.map +1 -0
- package/full/pipes/time.pipe.d.ts +2 -1
- package/full/pipes/time.pipe.d.ts.map +1 -0
- package/full/public_api.d.ts +24 -7
- package/full/public_api.d.ts.map +1 -0
- package/full/services/inspark-dialog.service.d.ts +19 -6
- package/full/services/inspark-dialog.service.d.ts.map +1 -0
- package/full/services/inspark-message.service.d.ts +3 -2
- package/full/services/inspark-message.service.d.ts.map +1 -0
- package/full/utils/gettextMarker.function.d.ts +1 -0
- package/full/utils/gettextMarker.function.d.ts.map +1 -0
- package/full/utils/hybrid/prime-table/row-state.enum.d.ts +1 -0
- package/full/utils/hybrid/prime-table/row-state.enum.d.ts.map +1 -0
- package/full/utils/hybrid/prime-table/table-row-data.model.d.ts +1 -0
- package/full/utils/hybrid/prime-table/table-row-data.model.d.ts.map +1 -0
- package/interface/index.d.ts +1 -0
- package/interface/inspark-inspark-components.d.ts.map +1 -0
- package/interface/interface.d.ts +3 -2
- package/interface/interface.d.ts.map +1 -0
- package/interface/public_api.d.ts +1 -0
- package/interface/public_api.d.ts.map +1 -0
- package/package.json +1 -1
- package/full/components/primeng.module.d.ts +0 -7
- package/full/esm2020/components/autocomplete/autocomplete.component.mjs +0 -220
- package/full/esm2020/components/breadcrumb/breadcrumb.component.mjs +0 -20
- package/full/esm2020/components/button/button.component.mjs +0 -160
- package/full/esm2020/components/checkbox/checkbox.component.mjs +0 -89
- package/full/esm2020/components/communication.service.mjs +0 -25
- package/full/esm2020/components/component-container/component-container.component.mjs +0 -17
- package/full/esm2020/components/content-toggle/content-toggle.component.mjs +0 -49
- package/full/esm2020/components/dropdown/dropdown.component.mjs +0 -338
- package/full/esm2020/components/empty/empty.component.mjs +0 -12
- package/full/esm2020/components/file/file.component.mjs +0 -53
- package/full/esm2020/components/header/header.component.mjs +0 -29
- package/full/esm2020/components/inline-message/inline-message.component.mjs +0 -20
- package/full/esm2020/components/input-group/input-group.component.mjs +0 -166
- package/full/esm2020/components/input-text/input-text.component.mjs +0 -149
- package/full/esm2020/components/inspark.module.mjs +0 -239
- package/full/esm2020/components/inspark.shared.mjs +0 -25
- package/full/esm2020/components/link/link.component.mjs +0 -131
- package/full/esm2020/components/modal-input-text/modal-input-text.component.mjs +0 -88
- package/full/esm2020/components/object-tree/object-tree.component.mjs +0 -14
- package/full/esm2020/components/panel/panel.component.mjs +0 -11
- package/full/esm2020/components/pie/pie.component.mjs +0 -44
- package/full/esm2020/components/pie/pie.service.mjs +0 -55
- package/full/esm2020/components/preloader/preloader.component.mjs +0 -25
- package/full/esm2020/components/primeng.module.mjs +0 -22
- package/full/esm2020/components/radiobutton/radiobutton.component.mjs +0 -50
- package/full/esm2020/components/select-button/select-button.component.mjs +0 -190
- package/full/esm2020/components/select-list/select-list.component.mjs +0 -55
- package/full/esm2020/components/status-circle/status-circle.component.mjs +0 -39
- package/full/esm2020/components/sticky/sticky.component.mjs +0 -64
- package/full/esm2020/components/svg/svg.component.mjs +0 -28
- package/full/esm2020/components/switcher/switcher.component.mjs +0 -123
- package/full/esm2020/components/table/table-click-outside.directive.mjs +0 -31
- package/full/esm2020/components/table/table-columns-multiselect/table-columns-multiselect.component.mjs +0 -32
- package/full/esm2020/components/table/table-menu-overlay/table-menu-overlay.component.mjs +0 -26
- package/full/esm2020/components/table/table.component.mjs +0 -482
- package/full/esm2020/components/textarea/textarea.component.mjs +0 -87
- package/full/esm2020/components/toolbar/toolbar.component.mjs +0 -30
- package/full/esm2020/components/tooltip/tooltip.component.mjs +0 -14
- package/full/esm2020/components/tree-table/tree-table.component.mjs +0 -206
- package/full/esm2020/inspark-inspark-components.mjs +0 -5
- package/full/esm2020/interface.mjs +0 -2
- package/full/esm2020/pipes/pipes.module.mjs +0 -19
- package/full/esm2020/pipes/propertyValue.pipe.mjs +0 -25
- package/full/esm2020/pipes/safeUrl.pipe.mjs +0 -36
- package/full/esm2020/pipes/sort-by.pipe.mjs +0 -28
- package/full/esm2020/pipes/time.pipe.mjs +0 -206
- package/full/esm2020/public_api.mjs +0 -60
- package/full/esm2020/services/inspark-dialog.service.mjs +0 -61
- package/full/esm2020/services/inspark-message.service.mjs +0 -77
- package/full/esm2020/utils/gettextMarker.function.mjs +0 -5
- package/full/esm2020/utils/hybrid/prime-table/row-state.enum.mjs +0 -9
- package/full/esm2020/utils/hybrid/prime-table/table-row-data.model.mjs +0 -2
- package/full/fesm2015/inspark-inspark-components.mjs +0 -3664
- package/full/fesm2015/inspark-inspark-components.mjs.map +0 -1
- package/full/fesm2020/inspark-inspark-components.mjs +0 -3666
- package/full/fesm2020/inspark-inspark-components.mjs.map +0 -1
- package/full/package.json +0 -36
- package/interface/esm2020/inspark-inspark-components.mjs +0 -5
- package/interface/esm2020/interface.mjs +0 -2
- package/interface/esm2020/public_api.mjs +0 -5
- package/interface/fesm2020/inspark-inspark-components.mjs +0 -8
- package/interface/fesm2020/inspark-inspark-components.mjs.map +0 -1
- package/interface/package.json +0 -36
- /package/interface/{fesm2015 → fesm2022}/inspark-inspark-components.mjs +0 -0
- /package/interface/{fesm2015 → fesm2022}/inspark-inspark-components.mjs.map +0 -0
|
@@ -1,482 +0,0 @@
|
|
|
1
|
-
import { Component, ContentChildren, EventEmitter, Input, NgModule, Output, QueryList, ViewChild } from '@angular/core';
|
|
2
|
-
import { Table, TableModule, TableService } from 'primeng/table';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
import { InsparkTemplate } from '../inspark.shared';
|
|
5
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
6
|
-
import { FormsModule } from '@angular/forms';
|
|
7
|
-
import { TableColumnsMultiselectComponent } from './table-columns-multiselect/table-columns-multiselect.component';
|
|
8
|
-
import { TableMenuOverlayComponent } from './table-menu-overlay/table-menu-overlay.component';
|
|
9
|
-
import { TableClickOutsideDirective } from './table-click-outside.directive';
|
|
10
|
-
import { DropdownModule } from 'primeng/dropdown';
|
|
11
|
-
import { MultiSelectModule } from 'primeng/multiselect';
|
|
12
|
-
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
|
|
13
|
-
import { CheckboxModule } from 'primeng/checkbox';
|
|
14
|
-
import { PipesModule } from '../../pipes/pipes.module';
|
|
15
|
-
import { ObjectUtils } from 'primeng/utils';
|
|
16
|
-
import { DomHandler } from 'primeng/dom';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "@angular/common";
|
|
19
|
-
import * as i2 from "primeng/table";
|
|
20
|
-
import * as i3 from "primeng/api";
|
|
21
|
-
import * as i4 from "@angular/forms";
|
|
22
|
-
import * as i5 from "primeng/dropdown";
|
|
23
|
-
import * as i6 from "primeng/multiselect";
|
|
24
|
-
import * as i7 from "@ng-bootstrap/ng-bootstrap";
|
|
25
|
-
import * as i8 from "../../pipes/propertyValue.pipe";
|
|
26
|
-
import * as i9 from "@ngx-translate/core";
|
|
27
|
-
// NEW Factory Function
|
|
28
|
-
export function tableFactory(wrapper) {
|
|
29
|
-
return wrapper.dt;
|
|
30
|
-
}
|
|
31
|
-
export class TableComponent {
|
|
32
|
-
constructor() {
|
|
33
|
-
this.columns = [];
|
|
34
|
-
this.filteredColumns = [];
|
|
35
|
-
this.globalFilteredColumns = [];
|
|
36
|
-
this.primaryColumns = [];
|
|
37
|
-
this.values = [];
|
|
38
|
-
this.checkboxSelection = true;
|
|
39
|
-
this.showHeader = true;
|
|
40
|
-
this.isMobileView = false;
|
|
41
|
-
this.resizableColumns = true;
|
|
42
|
-
this.isTextSearch = true;
|
|
43
|
-
this.isSortIcon = true;
|
|
44
|
-
this.columnResizeMode = 'expand';
|
|
45
|
-
this.activeChange = new EventEmitter();
|
|
46
|
-
this.selectionChange = new EventEmitter();
|
|
47
|
-
this.addAction = new EventEmitter();
|
|
48
|
-
this.treeAction = new EventEmitter();
|
|
49
|
-
this.csvAction = new EventEmitter();
|
|
50
|
-
this.saveAction = new EventEmitter();
|
|
51
|
-
this.removeAction = new EventEmitter();
|
|
52
|
-
this.unlinkAction = new EventEmitter();
|
|
53
|
-
this.linkAction = new EventEmitter();
|
|
54
|
-
this.groupEditAction = new EventEmitter();
|
|
55
|
-
this.paramsEditAction = new EventEmitter();
|
|
56
|
-
this.sortFunction = new EventEmitter();
|
|
57
|
-
this.filterFunction = new EventEmitter();
|
|
58
|
-
this.groupMode = 0;
|
|
59
|
-
this.groupInfo = {};
|
|
60
|
-
this.groupIndex = {};
|
|
61
|
-
this._selection = null;
|
|
62
|
-
}
|
|
63
|
-
set selection(val) {
|
|
64
|
-
this._selection = val;
|
|
65
|
-
}
|
|
66
|
-
get selectionValue() {
|
|
67
|
-
return this._selection;
|
|
68
|
-
}
|
|
69
|
-
set selectionValue(val) {
|
|
70
|
-
this._selection = val;
|
|
71
|
-
this.selectionChange.emit(val);
|
|
72
|
-
}
|
|
73
|
-
isRowActive(row) {
|
|
74
|
-
return this.active && this.active.id === row.id;
|
|
75
|
-
}
|
|
76
|
-
ngOnInit() {
|
|
77
|
-
this.updateData();
|
|
78
|
-
}
|
|
79
|
-
ngAfterViewInit() {
|
|
80
|
-
Object.entries(this.dt.filters).forEach(([key, value]) => {
|
|
81
|
-
this.dt.filter('', `${key}`, 'contains');
|
|
82
|
-
});
|
|
83
|
-
this.dt.filterGlobal(this.searchText, 'contains');
|
|
84
|
-
}
|
|
85
|
-
ngOnChanges(changes) {
|
|
86
|
-
this.resetColumnWidth();
|
|
87
|
-
this.visibleColumns();
|
|
88
|
-
}
|
|
89
|
-
updateData() {
|
|
90
|
-
this.primaryColumns = this.columns.filter(column => !column.isSecondary);
|
|
91
|
-
this.globalFilteredColumns = this.columns.filter(column => column.isFiltering !== false).map(val => val.field);
|
|
92
|
-
}
|
|
93
|
-
ngAfterContentInit() {
|
|
94
|
-
this.visibleColumns();
|
|
95
|
-
this.restoreSearchText();
|
|
96
|
-
this.templates.forEach((item) => {
|
|
97
|
-
switch (item.getType()) {
|
|
98
|
-
case 'caption':
|
|
99
|
-
this.captionTemplate = item.template;
|
|
100
|
-
break;
|
|
101
|
-
case 'header':
|
|
102
|
-
this.headerTemplate = item.template;
|
|
103
|
-
break;
|
|
104
|
-
case 'body':
|
|
105
|
-
this.bodyTemplate = item.template;
|
|
106
|
-
break;
|
|
107
|
-
case 'value':
|
|
108
|
-
this.valueTemplate = item.template;
|
|
109
|
-
break;
|
|
110
|
-
case 'loadingbody':
|
|
111
|
-
this.loadingBodyTemplate = item.template;
|
|
112
|
-
break;
|
|
113
|
-
case 'footer':
|
|
114
|
-
this.footerTemplate = item.template;
|
|
115
|
-
break;
|
|
116
|
-
case 'summary':
|
|
117
|
-
this.summaryTemplate = item.template;
|
|
118
|
-
break;
|
|
119
|
-
case 'colgroup':
|
|
120
|
-
this.colGroupTemplate = item.template;
|
|
121
|
-
break;
|
|
122
|
-
case 'rowexpansion':
|
|
123
|
-
this.expandedRowTemplate = item.template;
|
|
124
|
-
break;
|
|
125
|
-
case 'frozenrows':
|
|
126
|
-
this.frozenRowsTemplate = item.template;
|
|
127
|
-
break;
|
|
128
|
-
case 'frozenheader':
|
|
129
|
-
this.frozenHeaderTemplate = item.template;
|
|
130
|
-
break;
|
|
131
|
-
case 'frozenbody':
|
|
132
|
-
this.frozenBodyTemplate = item.template;
|
|
133
|
-
break;
|
|
134
|
-
case 'frozenfooter':
|
|
135
|
-
this.frozenFooterTemplate = item.template;
|
|
136
|
-
break;
|
|
137
|
-
case 'frozencolgroup':
|
|
138
|
-
this.frozenColGroupTemplate = item.template;
|
|
139
|
-
break;
|
|
140
|
-
case 'emptymessage':
|
|
141
|
-
this.emptyMessageTemplate = item.template;
|
|
142
|
-
break;
|
|
143
|
-
case 'paginatorleft':
|
|
144
|
-
this.paginatorLeftTemplate = item.template;
|
|
145
|
-
break;
|
|
146
|
-
case 'paginatorright':
|
|
147
|
-
this.paginatorRightTemplate = item.template;
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
visibleColumns() {
|
|
153
|
-
this.restoreHiddenColumns();
|
|
154
|
-
this.filteredColumns = this.columns.filter(column => !column.isHidden);
|
|
155
|
-
return this.filteredColumns;
|
|
156
|
-
}
|
|
157
|
-
columnsChange(data) {
|
|
158
|
-
data.column.isHidden = !data.event;
|
|
159
|
-
this.resetColumnWidth();
|
|
160
|
-
this.saveHiddenColumns();
|
|
161
|
-
this.visibleColumns();
|
|
162
|
-
}
|
|
163
|
-
showTooltip(event) {
|
|
164
|
-
const target = event.target;
|
|
165
|
-
if (target.title === undefined || !target.textContent) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
target.title = target.scrollWidth > target.clientWidth ? target.textContent : '';
|
|
169
|
-
}
|
|
170
|
-
colFilter(field) {
|
|
171
|
-
const found = this.toolbar.filter.cols.filter(item => item.field === field);
|
|
172
|
-
return found.length === 1 ? found[0] : undefined;
|
|
173
|
-
}
|
|
174
|
-
onFilterToolbar(event) {
|
|
175
|
-
if (this.toolbar && this.toolbar.filter) {
|
|
176
|
-
this.toolbar.filter.active = !this.toolbar.filter.active;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
onFilter(event) {
|
|
180
|
-
this.onSort();
|
|
181
|
-
this.filterFunction.emit(event.filteredValue);
|
|
182
|
-
}
|
|
183
|
-
stateSave(state) {
|
|
184
|
-
}
|
|
185
|
-
saveToLocalStorage(state, key) {
|
|
186
|
-
if (key) {
|
|
187
|
-
window.localStorage.setItem(key, JSON.stringify(state));
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
isHiddenFieldsChanged() {
|
|
191
|
-
const hiddenFieldsSaved = this.getHiddenHiddenFieldsFromStorage();
|
|
192
|
-
const hiddenFieldsColumns = (this.columns || []).filter(_col => _col.isHidden).map(_col => _col.field);
|
|
193
|
-
if (hiddenFieldsSaved.length === hiddenFieldsColumns.length) {
|
|
194
|
-
const diff = hiddenFieldsSaved.filter(field => !hiddenFieldsColumns.includes(field));
|
|
195
|
-
diff.length !== 0;
|
|
196
|
-
}
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
saveHiddenColumns() {
|
|
200
|
-
if (this.stateKey) {
|
|
201
|
-
if (!this.isHiddenFieldsChanged()) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
const hiddenFields = (this.columns || []).filter(_col => _col.isHidden).map(_col => _col.field).join(',');
|
|
205
|
-
this.saveToLocalStorage(hiddenFields, this.stateKey + 'HiddenFields');
|
|
206
|
-
window.localStorage.removeItem(this.stateKey);
|
|
207
|
-
if (this.searchText) {
|
|
208
|
-
window.localStorage.setItem(this.stateKey, JSON.stringify({
|
|
209
|
-
filters: { global: { value: this.searchText, matchMode: 'contains' } }
|
|
210
|
-
}));
|
|
211
|
-
}
|
|
212
|
-
if (this.dt) {
|
|
213
|
-
this.dt.restoreState();
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
countVisibleColumns() {
|
|
218
|
-
return (this.columns || []).filter(_col => !_col.isHidden).length;
|
|
219
|
-
}
|
|
220
|
-
restoreSearchText() {
|
|
221
|
-
const state = window.localStorage.getItem(this.stateKey);
|
|
222
|
-
if (state) {
|
|
223
|
-
const parsedState = JSON.parse(state);
|
|
224
|
-
this.searchText = (parsedState.filters || { global: { value: '' } }).global ? (parsedState.filters || { global: { value: '' } }).global.value : '';
|
|
225
|
-
this.sortField = parsedState.sortField || this.sortField;
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
this.resetColumnWidth();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
resetColumnWidthIfToWide() {
|
|
232
|
-
const visibleColumns = this.columns.filter(_column => !_column.isHidden);
|
|
233
|
-
const totalWidthInPercent = visibleColumns.reduce((s, column) => {
|
|
234
|
-
const percent = column.width.indexOf('%') > 0 ? parseInt(column.width, 10) : 0;
|
|
235
|
-
return s + percent;
|
|
236
|
-
}, 0);
|
|
237
|
-
if (totalWidthInPercent > 100) {
|
|
238
|
-
console.error(`Масимальная суммарная ширина столбцов таблицы 100%, текущая суммарная ширина ${totalWidthInPercent}%.`
|
|
239
|
-
+ `Выполняется принудительный перерасчет ширины для таблицы ${this.stateKey}`);
|
|
240
|
-
this.resetColumnWidth();
|
|
241
|
-
}
|
|
242
|
-
if (totalWidthInPercent < 100 && this.columns.length > 0) {
|
|
243
|
-
// расширяем первый столбец, чтобы не тянулся столбец с чекбоксом
|
|
244
|
-
const percent = this.columns[0].width.indexOf('%') > 0 ? parseInt(this.columns[0].width, 10) : 0;
|
|
245
|
-
this.columns[0].width = 100 - totalWidthInPercent + percent + '%';
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
resetColumnWidth() {
|
|
249
|
-
const cvc = this.countVisibleColumns();
|
|
250
|
-
let percent = Math.floor(100 / cvc);
|
|
251
|
-
let firstColumnPercent = percent;
|
|
252
|
-
if (cvc > 10) {
|
|
253
|
-
percent = Math.floor(90 / (cvc - 1));
|
|
254
|
-
firstColumnPercent = Math.floor(100 - (percent * (cvc - 1)));
|
|
255
|
-
}
|
|
256
|
-
this.columns.forEach((column, index) => column.width = index === 0 ? firstColumnPercent + '%' : `${percent}%`);
|
|
257
|
-
}
|
|
258
|
-
getHiddenHiddenFieldsFromStorage() {
|
|
259
|
-
if (this.stateKey) {
|
|
260
|
-
const hiddenFields = window.localStorage.getItem(this.stateKey + 'HiddenFields');
|
|
261
|
-
if (hiddenFields) {
|
|
262
|
-
return JSON.parse(hiddenFields).split(',');
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
return [];
|
|
266
|
-
}
|
|
267
|
-
restoreHiddenColumns() {
|
|
268
|
-
if (this.stateKey && window.localStorage.getItem(this.stateKey + 'HiddenFields')) {
|
|
269
|
-
const hiddenFieldsArray = this.getHiddenHiddenFieldsFromStorage();
|
|
270
|
-
this.columns.forEach(_col => _col.isHidden = hiddenFieldsArray.includes(_col.field) || _col.col_invisible);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
calcWidth(idx, label, width) {
|
|
274
|
-
return width && idx >= 0 ? width : 'auto';
|
|
275
|
-
}
|
|
276
|
-
onSort() {
|
|
277
|
-
if (this.isGrouped) {
|
|
278
|
-
Object.entries(this.groupInfo).forEach(([key, value]) => {
|
|
279
|
-
const cacheFlag = (this.groupInfo[key] || {}).isExpanded;
|
|
280
|
-
this.groupInfo[key] = { isExpanded: cacheFlag === undefined ? true : cacheFlag };
|
|
281
|
-
});
|
|
282
|
-
this.sortByGroup();
|
|
283
|
-
if (this.dt && this.dt.filteredValue) {
|
|
284
|
-
this.sortByGroup(this.dt.filteredValue, this.dt._sortOrder);
|
|
285
|
-
}
|
|
286
|
-
else if (this.dt && this.dt._value && this.dt._sortOrder) {
|
|
287
|
-
this.sortByGroup(this.dt._value, this.dt._sortOrder);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
isShowGroup(key, rowIndex) {
|
|
292
|
-
if (rowIndex === 0) {
|
|
293
|
-
this.groupIndex = {};
|
|
294
|
-
}
|
|
295
|
-
if (!this.groupInfo[key]) {
|
|
296
|
-
this.groupInfo[key] = { isExpanded: this.isGroupedExpanded !== undefined ? this.isGroupedExpanded : true };
|
|
297
|
-
}
|
|
298
|
-
if (!this.groupIndex[key]) {
|
|
299
|
-
this.groupIndex[key] = { rowIndex };
|
|
300
|
-
}
|
|
301
|
-
return this.groupIndex[key].rowIndex === rowIndex;
|
|
302
|
-
}
|
|
303
|
-
toggleGroup(rowIndex, key) {
|
|
304
|
-
this.groupInfo[key].isExpanded = !this.groupInfo[key].isExpanded;
|
|
305
|
-
this.onSort();
|
|
306
|
-
}
|
|
307
|
-
clear() {
|
|
308
|
-
this.dt.filterGlobal('', 'contains');
|
|
309
|
-
this.searchText = '';
|
|
310
|
-
this.dt.saveState();
|
|
311
|
-
}
|
|
312
|
-
localSearch(dt, searchText) {
|
|
313
|
-
dt.filterGlobal(searchText, 'contains');
|
|
314
|
-
}
|
|
315
|
-
sortByGroup(values, sortOrder) {
|
|
316
|
-
const g = this.groupMode;
|
|
317
|
-
if (values) {
|
|
318
|
-
return values.sort((row1, row2) => {
|
|
319
|
-
if (typeof (row1.groupOrder[g]) === 'number') {
|
|
320
|
-
return sortOrder * (row1.groupOrder[g] - row2.groupOrder[g]);
|
|
321
|
-
}
|
|
322
|
-
else {
|
|
323
|
-
return sortOrder * row1.groupOrder[g].localeCompare(row2.groupOrder[g], undefined, { numeric: true, sensitivity: 'base' });
|
|
324
|
-
}
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
this.values.sort((row1, row2) => {
|
|
328
|
-
if (typeof (row1.groupOrder[g]) === 'number') {
|
|
329
|
-
return row1.groupOrder[g] - row2.groupOrder[g];
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
return row1.groupOrder[g].localeCompare(row2.groupOrder[g], undefined, { numeric: true, sensitivity: 'base' });
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
countGroup(groupKey, g) {
|
|
337
|
-
return this.values.filter(_value => _value.groupKey[g] === groupKey).length;
|
|
338
|
-
}
|
|
339
|
-
toggleNodes(isExpanded) {
|
|
340
|
-
const g = this.groupMode;
|
|
341
|
-
this.values.forEach(v => {
|
|
342
|
-
if (this.groupInfo[v.groupKey[g]]) {
|
|
343
|
-
this.groupInfo[v.groupKey[g]].isExpanded = isExpanded;
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
toggleMode(item) {
|
|
348
|
-
this.groupMode = item;
|
|
349
|
-
this.groupInfo = {};
|
|
350
|
-
for (let i = 0; i < this.values.length; i++) {
|
|
351
|
-
this.isShowGroup(this.values[i].groupKey[this.groupMode], i);
|
|
352
|
-
}
|
|
353
|
-
if (this.searchText) {
|
|
354
|
-
this.dt.filterGlobal(this.searchText, 'contains');
|
|
355
|
-
}
|
|
356
|
-
this.sortByGroup();
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
360
|
-
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "in-table", inputs: { columns: "columns", values: "values", scrollHeight: "scrollHeight", scrollable: "scrollable", selectionMode: "selectionMode", label: "label", error: "error", class: "class", required: "required", style: "style", toolbar: "toolbar", checkboxSelection: "checkboxSelection", active: "active", sortField: "sortField", isAscending: "isAscending", dataKey: "dataKey", stateKey: "stateKey", isGrouped: "isGrouped", customSort: "customSort", isGroupedExpanded: "isGroupedExpanded", showHeader: "showHeader", isMobileView: "isMobileView", resizableColumns: "resizableColumns", isTextSearch: "isTextSearch", isSortIcon: "isSortIcon", columnResizeMode: "columnResizeMode", selection: "selection" }, outputs: { activeChange: "activeChange", selectionChange: "selectionChange", addAction: "addAction", treeAction: "treeAction", csvAction: "csvAction", saveAction: "saveAction", removeAction: "removeAction", unlinkAction: "unlinkAction", linkAction: "linkAction", groupEditAction: "groupEditAction", paramsEditAction: "paramsEditAction", sortFunction: "sortFunction", filterFunction: "filterFunction" }, providers: [
|
|
361
|
-
DomHandler,
|
|
362
|
-
ObjectUtils,
|
|
363
|
-
TableService,
|
|
364
|
-
{
|
|
365
|
-
provide: Table,
|
|
366
|
-
useFactory: tableFactory,
|
|
367
|
-
deps: [TableComponent], // new function depends on your wrapper
|
|
368
|
-
},
|
|
369
|
-
], queries: [{ propertyName: "templates", predicate: InsparkTemplate }], viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span *ngIf=\"label\" class=\"c-label\">\r\n {{label}}\r\n <span *ngIf=\"required\" class=\"c-label__req\">*</span>\r\n <span *ngIf=\"error\" class=\"c-label__sub_is-error\">{{error}}</span>\r\n</span>\r\n<p-table #dt\r\n (onFilter) = onFilter($event)\r\n (onSort)=\"onSort()\"\r\n (onStateRestore)=\"restoreSearchText()\"\r\n (onStateSave)=\"stateSave($event)\"\r\n (sortFunction)=\"sortFunction? sortFunction.emit($event): null\"\r\n [(selection)]=\"selectionValue\"\r\n [class]=\"class\"\r\n [columns]=\"filteredColumns\"\r\n [customSort]=\"customSort\"\r\n [dataKey]=\"dataKey || 'id'\"\r\n [globalFilterFields]=\"globalFilteredColumns\"\r\n [resizableColumns]=\"resizableColumns\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [scrollable]=\"scrollable\"\r\n [selectionMode]=\"selectionMode\"\r\n [sortField]=\"sortField || 'id'\"\r\n [sortOrder]=\"isAscending ? 1 : -1\"\r\n [stateKey]=\"stateKey\"\r\n [stateStorage]=\"'local'\"\r\n [style]=\"style\"\r\n [value]=\"values\"\r\n [columnResizeMode]=\"columnResizeMode\"\r\n>\r\n <ng-template *ngIf=\"colGroupTemplate\" let-columns pTemplate=\"colgroup\">\r\n <ng-container\r\n *ngTemplateOutlet=\"colGroupTemplate; context: {$implicit: { columns: columns}}\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"!colGroupTemplate\" let-columns pTemplate=\"colgroup\">\r\n <colgroup *ngIf=\"!isMobileView\">\r\n <col *ngIf=\"checkboxSelection\" style=\"width: 44px;\">\r\n <col *ngFor=\"let col of filteredColumns; let idx = index\">\r\n </colgroup>\r\n </ng-template>\r\n\r\n <ng-template let-columns pTemplate=\"header\">\r\n <ng-container *ngIf=\"showHeader\">\r\n <tr>\r\n <th *ngIf=\"checkboxSelection\" class=\"u-position-relative u-text_center\" pResizableColumn style=\"width: 44px;\">\r\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n <th *ngFor=\"let col of filteredColumns\" [pSortableColumn]=\"col.field\" class=\"u-position-relative\"\r\n pResizableColumn>\r\n <div class=\"p-table-thead-title\"\r\n title=\"{{col.label | translate}}\">\r\n {{col.label | translate}}\r\n </div>\r\n <p-sortIcon *ngIf=\"isSortIcon\" [field]=\"col.field\"\r\n class=\"u-position-absolute u-position-absolute-right c-sorticon\"\r\n style=\"display: flex; width: 18px; top: 0; height: 100%;\"></p-sortIcon>\r\n </th>\r\n </tr>\r\n <tr *ngIf=\"toolbar && toolbar.filter && toolbar.filter.active\">\r\n <th *ngIf=\"checkboxSelection\" class=\"u-position-relative u-text_center\" pResizableColumn\r\n style=\"width: 44px;\"></th>\r\n <th *ngFor=\"let col of columns\" [ngSwitch]=\"col.field\">\r\n <input\r\n (input)=\"dt.filter($event.target.value, col.field, 'contains')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'text' ? col.field : ''\"\r\n autofocus=\"\"\r\n class=\"c-input c-input_small ng-pristine ng-valid ng-scope ng-empty ng-touched\"\r\n pInputText\r\n type=\"text\">\r\n\r\n <p-dropdown (onChange)=\"dt.filter($event.value, col.field, 'equals')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'dropdown' ? col.field : ''\"\r\n [options]=\"colFilter(col.field)?.options\"\r\n [style]=\"{ width: '100%', overflow: 'visible' }\"\r\n appendTo=\"body\"></p-dropdown>\r\n\r\n <p-multiSelect (onChange)=\"dt.filter($event.value, col.field, 'in')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'multiselect' ? col.field : ''\"\r\n [options]=\"colFilter(col.field)?.options\"\r\n [style]=\"{ width: '100%', overflow: 'visible' }\" appendTo=\"body\"\r\n defaultLabel=\"{{'All' | translate}}\"></p-multiSelect>\r\n <input\r\n (input)=\"dt.filter($event.target.value, col.field + '2filter', 'contains')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'datetext' ? col.field : ''\"\r\n autofocus=\"\"\r\n class=\"c-input c-input_small ng-pristine ng-valid ng-scope ng-empty ng-touched\"\r\n pInputText\r\n type=\"text\">\r\n </th>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"bodyTemplate\" let-columns=\"columns\" let-rowData let-rowIndex=\"rowIndex\" pTemplate=\"body\">\r\n <ng-container\r\n *ngTemplateOutlet=\"bodyTemplate; context: {$implicit: { rowIndex: rowIndex, rowData: rowData, columns: columns}}\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"!bodyTemplate\" let-columns=\"columns\" let-index=\"rowIndex\" let-rowData pTemplate=\"body\">\r\n <tr\r\n (click)=\"toggleGroup(index, rowData.groupKey[groupMode])\"\r\n *ngIf=\"isGrouped && isShowGroup(rowData.groupKey[groupMode], index)\"\r\n class=\"row_hover_highlight\">\r\n <td [colSpan]=\"countVisibleColumns() + 1\">\r\n <span>\r\n <i\r\n [ngClass]=\"groupInfo[rowData.groupKey[groupMode]].isExpanded ? 'in fa-fw in-chevron-down' : 'in fa-fw in-chevron-right'\"></i>\r\n <span>{{rowData.groupKey[groupMode] | translate }} ({{countGroup(rowData.groupKey[groupMode], groupMode)}}\r\n )</span>\r\n </span>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"!isGrouped || groupInfo[(rowData.groupKey[groupMode])].isExpanded\"\r\n [ngClass]=\"{row_active: isRowActive(rowData)}\"\r\n [pSelectableRow]=\"rowData\"\r\n class=\"row\">\r\n <td *ngIf=\"checkboxSelection\" [ngClass]=\"{\r\n 'row_status_success': rowData.sdirparamstatecolor === 'success',\r\n 'row_status_error': rowData.sdirparamstatecolor === 'error',\r\n 'row_status_warning': rowData.sdirparamstatecolor === 'warning',\r\n 'row_status_critical': rowData.sdirparamstatecolor === 'critical',\r\n 'row_status_falsevalue': rowData.sdirparamstatecolor === 'falsevalue',\r\n 'row_status_pending': rowData.sdirparamstatecolor === 'pending'\r\n }\" class=\"u-text_center\"\r\n style=\"width: 44px\"\r\n >\r\n <p-tableCheckbox [value]=\"rowData\"\r\n [ngStyle]=\"{ 'pointer-events': selectionMode === 'single' || selectionMode === 'multiple' && checkboxSelection ? 'none' : 'auto'}\"\r\n ></p-tableCheckbox>\r\n </td>\r\n <td (click)=\"activeChange.emit(rowData)\"\r\n *ngFor=\"let col of filteredColumns\"\r\n class=\"u-overflow-visible\">\r\n <div (mouseover)=\"showTooltip($event)\" *ngIf=\"!valueTemplate\" class=\"p-table-tbody-content\" title>\r\n {{col.translatable ? (rowData | propertyValue: col.field | translate) : (rowData | propertyValue: col.field)}}\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"valueTemplate; context: {$implicit: { data: rowData, col: col}}\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"toolbar\" pTemplate=\"caption\">\r\n\r\n <div class=\"o-grid o-grid_no-gutter\">\r\n <div class=\"c-tree-table__toolbar-content u-display-inline-flex\">\r\n <div *ngIf=\"isTextSearch\" class=\"c-form c-form_inline u-display-inline-block\">\r\n <form class=\"c-label\">\r\n <div class=\"input-wrapper u-margin-right-tiny\">\r\n <input #searchTextInput\r\n (input)=\"localSearch(dt, searchText)\"\r\n [(ngModel)]=\"searchText\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n autofocus=\"\"\r\n class=\"search-box c-input c-input_small ng-pristine ng-valid ng-scope ng-empty ng-touched\"\r\n pInputText\r\n placeholder=\"{{('SHARED.SEARCH' | translate) + ':'}}\"\r\n required\r\n style=\"padding-right: 28px\"\r\n tabindex=\"1\"\r\n type=\"search\"\r\n >\r\n <button (click)=\"clear()\" class=\"button-reset\" type=\"reset\"\r\n [attr.title]=\"'Reset' | translate\">\r\n <i class=\"in in-close\"></i>\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"c-btn c-btn_border-free c-btn_small\">\r\n <in-table-columns-multiselect (columnsChange)=\"columnsChange($event)\"\r\n [columns]=\"primaryColumns\"\r\n [disableActiveCheckboxes]=\"countVisibleColumns() === 1\"></in-table-columns-multiselect>\r\n </div>\r\n\r\n <button (click)=\"onFilterToolbar($event)\" *ngIf=\"toolbar.filter\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-filter\" title=\"{{'Service filter' | translate}}\"></i>\r\n </button>\r\n\r\n <button (click)=\"treeAction.emit($event)\" *ngIf=\"toolbar.tree\" [disabled]=\"toolbar.tree.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-list\" title=\"{{'Filter by rubric' | translate}}\"></i>\r\n </button>\r\n\r\n <button (click)=\"addAction.emit($event)\" *ngIf=\"toolbar.add\" [disabled]=\"toolbar.add.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-plus\" title=\"{{'Add' | translate}}\"></i>\r\n </button>\r\n\r\n <button (click)=\"linkAction.emit($event)\" *ngIf=\"toolbar.link\" [disabled]=\"toolbar.link.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-link\" title=\"{{'Link' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"csvAction.emit($event)\" *ngIf=\"toolbar.csv\" [disabled]=\"toolbar.csv.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <!--Todo: \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430 in-file-csv-->\r\n <i class=\"in in-file-excel-outline\" title=\"{{'LOGS.SAVE_TO_CSV' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"saveAction.emit($event)\" *ngIf=\"toolbar.save\"\r\n [disabled]=\"toolbar.save.disabled\"\r\n class=\"c-btn c-btn_primary c-btn_small\"\r\n title=\"{{'Save' | translate}}\"\r\n >\r\n {{'Save' | translate}}\r\n </button>\r\n <button (click)=\"groupEditAction.emit($event)\" *ngIf=\"toolbar.groupEdit && toolbar.groupEdit.active\"\r\n [disabled]=\"toolbar.groupEdit.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-pencil\" title=\"{{'groupEdit' | translate}}\"></i>\r\n </button>\r\n <ng-content select=\"[buttons]\"></ng-content>\r\n <button (click)=\"paramsEditAction.emit($event)\" *ngIf=\"toolbar.paramsEdit && toolbar.paramsEdit.active\"\r\n [disabled]=\"toolbar.paramsEdit.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-pencil\" title=\"{{'paramsEdit' | translate}}\"></i>\r\n </button>\r\n\r\n\r\n <button (click)=\"removeAction.emit($event)\" *ngIf=\"toolbar.remove && toolbar.remove.active\"\r\n [disabled]=\"toolbar.remove.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-trash\" title=\"{{'Delete' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"unlinkAction.emit($event)\" *ngIf=\"toolbar.unlink\" [disabled]=\"toolbar.unlink.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-link-off\" title=\"{{'Detach tag from selected items' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"toggleNodes(true)\"\r\n *ngIf=\"toolbar.expandAll\"\r\n class=\"c-btn c-btn_small c-btn_svg-24 c-icon c-icon_svg c-icon_svg-24 c-btn_border-free\"\r\n title=\"{{'Expand all' | translate}}\">\r\n <svg fill=\"currentColor\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M20 2H4v2h16V2zM4 20v2h16v-2H4zM12 5l5 6H7l5-6zM17 13l-5 6-5-6h10z\"/>\r\n </svg>\r\n </button>\r\n <button (click)=\"toggleNodes(false)\"\r\n *ngIf=\"toolbar.expandAll\"\r\n class=\"c-btn c-btn_small c-btn_svg-24 c-icon c-icon_svg c-icon_svg-24 c-btn_border-free\"\r\n title=\"{{'Collapse all' | translate}}\">\r\n <svg fill=\"currentColor\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path clip-rule=\"evenodd\" d=\"M17 3l-5 6-5-6h10zM4 13v-2h16v2H4zm8 2l5 6H7l5-6z\" fill-rule=\"evenodd\"/>\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"toolbar.groupSort\"\r\n class=\"c-btn-group\"\r\n container=\"body\"\r\n ngbDropdown>\r\n\r\n <button class=\"c-btn c-btn_border-free c-btn_small\"\r\n id=\"dropdownGroupType\"\r\n ngbDropdownToggle\r\n title=\"{{'Change the way parameters are grouped' | translate}}\">\r\n <i aria-hidden=\"true\" class=\"in in-object-group\"></i>\r\n <i aria-hidden=\"true\" class=\"c-caret\"></i>\r\n </button>\r\n\r\n <ul aria-labelledby=\"dropdownGroupType\"\r\n class=\"c-dropdown-menu c-dropdown-menu_right ng-star-inserted\"\r\n ngbDropdownMenu\r\n role=\"menu\">\r\n <li *ngFor=\"let item of toolbar.groupSort.label\"\r\n [ngClass]=\"{'is-dropdown-menu__listitem_active': item.value === groupMode}\"\r\n class=\"c-dropdown-menu__listitem is-dropdown-menu__listitem_active\"\r\n ngbDropdownItem\r\n role=\"menuitem\">\r\n <a (click)=\"toggleMode(item.value)\" class=\"c-dropdown-menu__content\">\r\n {{item.label}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</p-table>\r\n", styles: ["@charset \"UTF-8\";.u-overflow-visible{overflow:visible!important}.row_status_success{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-success, #31AC51)}.row_status_error{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-error, #F95C5D)}.row_status_warning{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-warning, #EE9946)}.row_status_critical{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-critical, #F95C5D)}.row_status_falsevalue{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-falsevalue, #85B3CB)}.row_status_disabled{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-disabled)}.row_status_none{padding-left:9px!important;border-left:4px solid transparent}.row_status_pending{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-pending, #1f85ff)}.button-reset{display:flex;align-items:center;position:absolute;right:6px;top:5px;padding:6px;font-size:15px;border:none;outline:0;cursor:pointer;color:var(--colorTextMuted);background-color:transparent}.button-reset:hover{color:var(--ids-theme-btn-default-color, #FFFFFF)}.input-wrapper{position:relative;display:flex;align-items:baseline}.c-input:not(:valid)~.button-reset{display:none}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgStyle; }), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgSwitch; }), selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgSwitchCase; }), selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i0.forwardRef(function () { return i2.Table; }), selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.PrimeTemplate; }), selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.SortableColumn; }), selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.SelectableRow; }), selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.ResizableColumn; }), selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "component", type: i0.forwardRef(function () { return i2.SortIcon; }), selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i0.forwardRef(function () { return i2.TableCheckbox; }), selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i0.forwardRef(function () { return i2.TableHeaderCheckbox; }), selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.ɵNgNoValidate; }), selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i0.forwardRef(function () { return i4.DefaultValueAccessor; }), selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgControlStatusGroup; }), selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i0.forwardRef(function () { return i4.RequiredValidator; }), selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgModel; }), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgForm; }), selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i0.forwardRef(function () { return i5.Dropdown; }), selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MultiSelect; }), selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgbDropdown; }), selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgbDropdownToggle; }), selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgbDropdownMenu; }), selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i0.forwardRef(function () { return i7.NgbDropdownItem; }), selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "component", type: i0.forwardRef(function () { return TableColumnsMultiselectComponent; }), selector: "in-table-columns-multiselect", inputs: ["columns", "disableActiveCheckboxes"], outputs: ["columnsChange"] }, { kind: "pipe", type: i0.forwardRef(function () { return i8.PropertyValuePipe; }), name: "propertyValue" }, { kind: "pipe", type: i0.forwardRef(function () { return i9.TranslatePipe; }), name: "translate" }] });
|
|
370
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, decorators: [{
|
|
371
|
-
type: Component,
|
|
372
|
-
args: [{ selector: 'in-table', entryComponents: [], providers: [
|
|
373
|
-
DomHandler,
|
|
374
|
-
ObjectUtils,
|
|
375
|
-
TableService,
|
|
376
|
-
{
|
|
377
|
-
provide: Table,
|
|
378
|
-
useFactory: tableFactory,
|
|
379
|
-
deps: [TableComponent], // new function depends on your wrapper
|
|
380
|
-
},
|
|
381
|
-
], template: "<span *ngIf=\"label\" class=\"c-label\">\r\n {{label}}\r\n <span *ngIf=\"required\" class=\"c-label__req\">*</span>\r\n <span *ngIf=\"error\" class=\"c-label__sub_is-error\">{{error}}</span>\r\n</span>\r\n<p-table #dt\r\n (onFilter) = onFilter($event)\r\n (onSort)=\"onSort()\"\r\n (onStateRestore)=\"restoreSearchText()\"\r\n (onStateSave)=\"stateSave($event)\"\r\n (sortFunction)=\"sortFunction? sortFunction.emit($event): null\"\r\n [(selection)]=\"selectionValue\"\r\n [class]=\"class\"\r\n [columns]=\"filteredColumns\"\r\n [customSort]=\"customSort\"\r\n [dataKey]=\"dataKey || 'id'\"\r\n [globalFilterFields]=\"globalFilteredColumns\"\r\n [resizableColumns]=\"resizableColumns\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [scrollable]=\"scrollable\"\r\n [selectionMode]=\"selectionMode\"\r\n [sortField]=\"sortField || 'id'\"\r\n [sortOrder]=\"isAscending ? 1 : -1\"\r\n [stateKey]=\"stateKey\"\r\n [stateStorage]=\"'local'\"\r\n [style]=\"style\"\r\n [value]=\"values\"\r\n [columnResizeMode]=\"columnResizeMode\"\r\n>\r\n <ng-template *ngIf=\"colGroupTemplate\" let-columns pTemplate=\"colgroup\">\r\n <ng-container\r\n *ngTemplateOutlet=\"colGroupTemplate; context: {$implicit: { columns: columns}}\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"!colGroupTemplate\" let-columns pTemplate=\"colgroup\">\r\n <colgroup *ngIf=\"!isMobileView\">\r\n <col *ngIf=\"checkboxSelection\" style=\"width: 44px;\">\r\n <col *ngFor=\"let col of filteredColumns; let idx = index\">\r\n </colgroup>\r\n </ng-template>\r\n\r\n <ng-template let-columns pTemplate=\"header\">\r\n <ng-container *ngIf=\"showHeader\">\r\n <tr>\r\n <th *ngIf=\"checkboxSelection\" class=\"u-position-relative u-text_center\" pResizableColumn style=\"width: 44px;\">\r\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n <th *ngFor=\"let col of filteredColumns\" [pSortableColumn]=\"col.field\" class=\"u-position-relative\"\r\n pResizableColumn>\r\n <div class=\"p-table-thead-title\"\r\n title=\"{{col.label | translate}}\">\r\n {{col.label | translate}}\r\n </div>\r\n <p-sortIcon *ngIf=\"isSortIcon\" [field]=\"col.field\"\r\n class=\"u-position-absolute u-position-absolute-right c-sorticon\"\r\n style=\"display: flex; width: 18px; top: 0; height: 100%;\"></p-sortIcon>\r\n </th>\r\n </tr>\r\n <tr *ngIf=\"toolbar && toolbar.filter && toolbar.filter.active\">\r\n <th *ngIf=\"checkboxSelection\" class=\"u-position-relative u-text_center\" pResizableColumn\r\n style=\"width: 44px;\"></th>\r\n <th *ngFor=\"let col of columns\" [ngSwitch]=\"col.field\">\r\n <input\r\n (input)=\"dt.filter($event.target.value, col.field, 'contains')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'text' ? col.field : ''\"\r\n autofocus=\"\"\r\n class=\"c-input c-input_small ng-pristine ng-valid ng-scope ng-empty ng-touched\"\r\n pInputText\r\n type=\"text\">\r\n\r\n <p-dropdown (onChange)=\"dt.filter($event.value, col.field, 'equals')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'dropdown' ? col.field : ''\"\r\n [options]=\"colFilter(col.field)?.options\"\r\n [style]=\"{ width: '100%', overflow: 'visible' }\"\r\n appendTo=\"body\"></p-dropdown>\r\n\r\n <p-multiSelect (onChange)=\"dt.filter($event.value, col.field, 'in')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'multiselect' ? col.field : ''\"\r\n [options]=\"colFilter(col.field)?.options\"\r\n [style]=\"{ width: '100%', overflow: 'visible' }\" appendTo=\"body\"\r\n defaultLabel=\"{{'All' | translate}}\"></p-multiSelect>\r\n <input\r\n (input)=\"dt.filter($event.target.value, col.field + '2filter', 'contains')\"\r\n *ngSwitchCase=\"colFilter(col.field)?.type === 'datetext' ? col.field : ''\"\r\n autofocus=\"\"\r\n class=\"c-input c-input_small ng-pristine ng-valid ng-scope ng-empty ng-touched\"\r\n pInputText\r\n type=\"text\">\r\n </th>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"bodyTemplate\" let-columns=\"columns\" let-rowData let-rowIndex=\"rowIndex\" pTemplate=\"body\">\r\n <ng-container\r\n *ngTemplateOutlet=\"bodyTemplate; context: {$implicit: { rowIndex: rowIndex, rowData: rowData, columns: columns}}\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"!bodyTemplate\" let-columns=\"columns\" let-index=\"rowIndex\" let-rowData pTemplate=\"body\">\r\n <tr\r\n (click)=\"toggleGroup(index, rowData.groupKey[groupMode])\"\r\n *ngIf=\"isGrouped && isShowGroup(rowData.groupKey[groupMode], index)\"\r\n class=\"row_hover_highlight\">\r\n <td [colSpan]=\"countVisibleColumns() + 1\">\r\n <span>\r\n <i\r\n [ngClass]=\"groupInfo[rowData.groupKey[groupMode]].isExpanded ? 'in fa-fw in-chevron-down' : 'in fa-fw in-chevron-right'\"></i>\r\n <span>{{rowData.groupKey[groupMode] | translate }} ({{countGroup(rowData.groupKey[groupMode], groupMode)}}\r\n )</span>\r\n </span>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"!isGrouped || groupInfo[(rowData.groupKey[groupMode])].isExpanded\"\r\n [ngClass]=\"{row_active: isRowActive(rowData)}\"\r\n [pSelectableRow]=\"rowData\"\r\n class=\"row\">\r\n <td *ngIf=\"checkboxSelection\" [ngClass]=\"{\r\n 'row_status_success': rowData.sdirparamstatecolor === 'success',\r\n 'row_status_error': rowData.sdirparamstatecolor === 'error',\r\n 'row_status_warning': rowData.sdirparamstatecolor === 'warning',\r\n 'row_status_critical': rowData.sdirparamstatecolor === 'critical',\r\n 'row_status_falsevalue': rowData.sdirparamstatecolor === 'falsevalue',\r\n 'row_status_pending': rowData.sdirparamstatecolor === 'pending'\r\n }\" class=\"u-text_center\"\r\n style=\"width: 44px\"\r\n >\r\n <p-tableCheckbox [value]=\"rowData\"\r\n [ngStyle]=\"{ 'pointer-events': selectionMode === 'single' || selectionMode === 'multiple' && checkboxSelection ? 'none' : 'auto'}\"\r\n ></p-tableCheckbox>\r\n </td>\r\n <td (click)=\"activeChange.emit(rowData)\"\r\n *ngFor=\"let col of filteredColumns\"\r\n class=\"u-overflow-visible\">\r\n <div (mouseover)=\"showTooltip($event)\" *ngIf=\"!valueTemplate\" class=\"p-table-tbody-content\" title>\r\n {{col.translatable ? (rowData | propertyValue: col.field | translate) : (rowData | propertyValue: col.field)}}\r\n </div>\r\n <ng-container\r\n *ngTemplateOutlet=\"valueTemplate; context: {$implicit: { data: rowData, col: col}}\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"toolbar\" pTemplate=\"caption\">\r\n\r\n <div class=\"o-grid o-grid_no-gutter\">\r\n <div class=\"c-tree-table__toolbar-content u-display-inline-flex\">\r\n <div *ngIf=\"isTextSearch\" class=\"c-form c-form_inline u-display-inline-block\">\r\n <form class=\"c-label\">\r\n <div class=\"input-wrapper u-margin-right-tiny\">\r\n <input #searchTextInput\r\n (input)=\"localSearch(dt, searchText)\"\r\n [(ngModel)]=\"searchText\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n autofocus=\"\"\r\n class=\"search-box c-input c-input_small ng-pristine ng-valid ng-scope ng-empty ng-touched\"\r\n pInputText\r\n placeholder=\"{{('SHARED.SEARCH' | translate) + ':'}}\"\r\n required\r\n style=\"padding-right: 28px\"\r\n tabindex=\"1\"\r\n type=\"search\"\r\n >\r\n <button (click)=\"clear()\" class=\"button-reset\" type=\"reset\"\r\n [attr.title]=\"'Reset' | translate\">\r\n <i class=\"in in-close\"></i>\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"c-btn c-btn_border-free c-btn_small\">\r\n <in-table-columns-multiselect (columnsChange)=\"columnsChange($event)\"\r\n [columns]=\"primaryColumns\"\r\n [disableActiveCheckboxes]=\"countVisibleColumns() === 1\"></in-table-columns-multiselect>\r\n </div>\r\n\r\n <button (click)=\"onFilterToolbar($event)\" *ngIf=\"toolbar.filter\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-filter\" title=\"{{'Service filter' | translate}}\"></i>\r\n </button>\r\n\r\n <button (click)=\"treeAction.emit($event)\" *ngIf=\"toolbar.tree\" [disabled]=\"toolbar.tree.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-list\" title=\"{{'Filter by rubric' | translate}}\"></i>\r\n </button>\r\n\r\n <button (click)=\"addAction.emit($event)\" *ngIf=\"toolbar.add\" [disabled]=\"toolbar.add.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-plus\" title=\"{{'Add' | translate}}\"></i>\r\n </button>\r\n\r\n <button (click)=\"linkAction.emit($event)\" *ngIf=\"toolbar.link\" [disabled]=\"toolbar.link.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <i class=\"in in-link\" title=\"{{'Link' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"csvAction.emit($event)\" *ngIf=\"toolbar.csv\" [disabled]=\"toolbar.csv.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\"\r\n >\r\n <!--Todo: \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430 in-file-csv-->\r\n <i class=\"in in-file-excel-outline\" title=\"{{'LOGS.SAVE_TO_CSV' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"saveAction.emit($event)\" *ngIf=\"toolbar.save\"\r\n [disabled]=\"toolbar.save.disabled\"\r\n class=\"c-btn c-btn_primary c-btn_small\"\r\n title=\"{{'Save' | translate}}\"\r\n >\r\n {{'Save' | translate}}\r\n </button>\r\n <button (click)=\"groupEditAction.emit($event)\" *ngIf=\"toolbar.groupEdit && toolbar.groupEdit.active\"\r\n [disabled]=\"toolbar.groupEdit.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-pencil\" title=\"{{'groupEdit' | translate}}\"></i>\r\n </button>\r\n <ng-content select=\"[buttons]\"></ng-content>\r\n <button (click)=\"paramsEditAction.emit($event)\" *ngIf=\"toolbar.paramsEdit && toolbar.paramsEdit.active\"\r\n [disabled]=\"toolbar.paramsEdit.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-pencil\" title=\"{{'paramsEdit' | translate}}\"></i>\r\n </button>\r\n\r\n\r\n <button (click)=\"removeAction.emit($event)\" *ngIf=\"toolbar.remove && toolbar.remove.active\"\r\n [disabled]=\"toolbar.remove.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-trash\" title=\"{{'Delete' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"unlinkAction.emit($event)\" *ngIf=\"toolbar.unlink\" [disabled]=\"toolbar.unlink.disabled\"\r\n class=\"c-btn c-btn_border-free c-btn_small\">\r\n <i class=\"in in-link-off\" title=\"{{'Detach tag from selected items' | translate}}\"></i>\r\n </button>\r\n <button (click)=\"toggleNodes(true)\"\r\n *ngIf=\"toolbar.expandAll\"\r\n class=\"c-btn c-btn_small c-btn_svg-24 c-icon c-icon_svg c-icon_svg-24 c-btn_border-free\"\r\n title=\"{{'Expand all' | translate}}\">\r\n <svg fill=\"currentColor\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M20 2H4v2h16V2zM4 20v2h16v-2H4zM12 5l5 6H7l5-6zM17 13l-5 6-5-6h10z\"/>\r\n </svg>\r\n </button>\r\n <button (click)=\"toggleNodes(false)\"\r\n *ngIf=\"toolbar.expandAll\"\r\n class=\"c-btn c-btn_small c-btn_svg-24 c-icon c-icon_svg c-icon_svg-24 c-btn_border-free\"\r\n title=\"{{'Collapse all' | translate}}\">\r\n <svg fill=\"currentColor\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path clip-rule=\"evenodd\" d=\"M17 3l-5 6-5-6h10zM4 13v-2h16v2H4zm8 2l5 6H7l5-6z\" fill-rule=\"evenodd\"/>\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"toolbar.groupSort\"\r\n class=\"c-btn-group\"\r\n container=\"body\"\r\n ngbDropdown>\r\n\r\n <button class=\"c-btn c-btn_border-free c-btn_small\"\r\n id=\"dropdownGroupType\"\r\n ngbDropdownToggle\r\n title=\"{{'Change the way parameters are grouped' | translate}}\">\r\n <i aria-hidden=\"true\" class=\"in in-object-group\"></i>\r\n <i aria-hidden=\"true\" class=\"c-caret\"></i>\r\n </button>\r\n\r\n <ul aria-labelledby=\"dropdownGroupType\"\r\n class=\"c-dropdown-menu c-dropdown-menu_right ng-star-inserted\"\r\n ngbDropdownMenu\r\n role=\"menu\">\r\n <li *ngFor=\"let item of toolbar.groupSort.label\"\r\n [ngClass]=\"{'is-dropdown-menu__listitem_active': item.value === groupMode}\"\r\n class=\"c-dropdown-menu__listitem is-dropdown-menu__listitem_active\"\r\n ngbDropdownItem\r\n role=\"menuitem\">\r\n <a (click)=\"toggleMode(item.value)\" class=\"c-dropdown-menu__content\">\r\n {{item.label}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</p-table>\r\n", styles: ["@charset \"UTF-8\";.u-overflow-visible{overflow:visible!important}.row_status_success{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-success, #31AC51)}.row_status_error{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-error, #F95C5D)}.row_status_warning{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-warning, #EE9946)}.row_status_critical{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-critical, #F95C5D)}.row_status_falsevalue{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-falsevalue, #85B3CB)}.row_status_disabled{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-disabled)}.row_status_none{padding-left:9px!important;border-left:4px solid transparent}.row_status_pending{padding-left:9px!important;border-left:4px solid var(--ids-theme-status-pending, #1f85ff)}.button-reset{display:flex;align-items:center;position:absolute;right:6px;top:5px;padding:6px;font-size:15px;border:none;outline:0;cursor:pointer;color:var(--colorTextMuted);background-color:transparent}.button-reset:hover{color:var(--ids-theme-btn-default-color, #FFFFFF)}.input-wrapper{position:relative;display:flex;align-items:baseline}.c-input:not(:valid)~.button-reset{display:none}\n"] }]
|
|
382
|
-
}], propDecorators: { columns: [{
|
|
383
|
-
type: Input
|
|
384
|
-
}], values: [{
|
|
385
|
-
type: Input
|
|
386
|
-
}], scrollHeight: [{
|
|
387
|
-
type: Input
|
|
388
|
-
}], scrollable: [{
|
|
389
|
-
type: Input
|
|
390
|
-
}], selectionMode: [{
|
|
391
|
-
type: Input
|
|
392
|
-
}], label: [{
|
|
393
|
-
type: Input
|
|
394
|
-
}], error: [{
|
|
395
|
-
type: Input
|
|
396
|
-
}], class: [{
|
|
397
|
-
type: Input
|
|
398
|
-
}], required: [{
|
|
399
|
-
type: Input
|
|
400
|
-
}], style: [{
|
|
401
|
-
type: Input
|
|
402
|
-
}], toolbar: [{
|
|
403
|
-
type: Input
|
|
404
|
-
}], checkboxSelection: [{
|
|
405
|
-
type: Input
|
|
406
|
-
}], active: [{
|
|
407
|
-
type: Input
|
|
408
|
-
}], sortField: [{
|
|
409
|
-
type: Input
|
|
410
|
-
}], isAscending: [{
|
|
411
|
-
type: Input
|
|
412
|
-
}], dataKey: [{
|
|
413
|
-
type: Input
|
|
414
|
-
}], stateKey: [{
|
|
415
|
-
type: Input
|
|
416
|
-
}], isGrouped: [{
|
|
417
|
-
type: Input
|
|
418
|
-
}], customSort: [{
|
|
419
|
-
type: Input
|
|
420
|
-
}], isGroupedExpanded: [{
|
|
421
|
-
type: Input
|
|
422
|
-
}], showHeader: [{
|
|
423
|
-
type: Input
|
|
424
|
-
}], isMobileView: [{
|
|
425
|
-
type: Input
|
|
426
|
-
}], resizableColumns: [{
|
|
427
|
-
type: Input
|
|
428
|
-
}], isTextSearch: [{
|
|
429
|
-
type: Input
|
|
430
|
-
}], isSortIcon: [{
|
|
431
|
-
type: Input
|
|
432
|
-
}], columnResizeMode: [{
|
|
433
|
-
type: Input
|
|
434
|
-
}], activeChange: [{
|
|
435
|
-
type: Output
|
|
436
|
-
}], templates: [{
|
|
437
|
-
type: ContentChildren,
|
|
438
|
-
args: [InsparkTemplate]
|
|
439
|
-
}], selectionChange: [{
|
|
440
|
-
type: Output
|
|
441
|
-
}], addAction: [{
|
|
442
|
-
type: Output
|
|
443
|
-
}], treeAction: [{
|
|
444
|
-
type: Output
|
|
445
|
-
}], csvAction: [{
|
|
446
|
-
type: Output
|
|
447
|
-
}], saveAction: [{
|
|
448
|
-
type: Output
|
|
449
|
-
}], removeAction: [{
|
|
450
|
-
type: Output
|
|
451
|
-
}], unlinkAction: [{
|
|
452
|
-
type: Output
|
|
453
|
-
}], linkAction: [{
|
|
454
|
-
type: Output
|
|
455
|
-
}], groupEditAction: [{
|
|
456
|
-
type: Output
|
|
457
|
-
}], paramsEditAction: [{
|
|
458
|
-
type: Output
|
|
459
|
-
}], sortFunction: [{
|
|
460
|
-
type: Output
|
|
461
|
-
}], filterFunction: [{
|
|
462
|
-
type: Output
|
|
463
|
-
}], dt: [{
|
|
464
|
-
type: ViewChild,
|
|
465
|
-
args: ['dt', { static: false }]
|
|
466
|
-
}], selection: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}] } });
|
|
469
|
-
export class TableComponentModule {
|
|
470
|
-
}
|
|
471
|
-
TableComponentModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
472
|
-
TableComponentModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: TableComponentModule, declarations: [TableComponent, TableColumnsMultiselectComponent, TableMenuOverlayComponent, TableClickOutsideDirective], imports: [CommonModule, TableModule, PipesModule, TranslateModule, FormsModule, DropdownModule, MultiSelectModule, NgbDropdownModule, CheckboxModule], exports: [TableComponent, TableColumnsMultiselectComponent] });
|
|
473
|
-
TableComponentModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponentModule, imports: [CommonModule, TableModule, PipesModule, TranslateModule, FormsModule, DropdownModule, MultiSelectModule, NgbDropdownModule, CheckboxModule] });
|
|
474
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponentModule, decorators: [{
|
|
475
|
-
type: NgModule,
|
|
476
|
-
args: [{
|
|
477
|
-
imports: [CommonModule, TableModule, PipesModule, TranslateModule, FormsModule, DropdownModule, MultiSelectModule, NgbDropdownModule, CheckboxModule],
|
|
478
|
-
exports: [TableComponent, TableColumnsMultiselectComponent],
|
|
479
|
-
declarations: [TableComponent, TableColumnsMultiselectComponent, TableMenuOverlayComponent, TableClickOutsideDirective]
|
|
480
|
-
}]
|
|
481
|
-
}] });
|
|
482
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5zcGFyay1jb21wb25lbnRzL3NyYy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BhcmstY29tcG9uZW50cy9zcmMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLGlFQUFpRSxDQUFDO0FBQ2pILE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsY0FB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QUFFLHlCQUF5QixFQUFFLDBCQUEwQixhQUY1RyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLGFBdmF6SSxjQUFjLEVBd2FDLGdDQUFnQztrSEFHL0Msb0JBQW9CLFlBSnJCLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGNBQWM7MkZBSXpJLG9CQUFvQjtrQkFMaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLENBQUM7b0JBQ3JKLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxnQ0FBZ0MsQ0FBQztvQkFDM0QsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLGdDQUFnQyxFQUFFLHlCQUF5QixFQUFFLDBCQUEwQixDQUFDO2lCQUN4SCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE5nTW9kdWxlLCBPbkNoYW5nZXMsIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1RhYmxlLCBUYWJsZU1vZHVsZSwgVGFibGVTZXJ2aWNlfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7SW5zcGFya1RlbXBsYXRlfSBmcm9tICcuLi9pbnNwYXJrLnNoYXJlZCc7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1RhYmxlQ29sdW1uc011bHRpc2VsZWN0Q29tcG9uZW50fSBmcm9tICcuL3RhYmxlLWNvbHVtbnMtbXVsdGlzZWxlY3QvdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQge1RhYmxlTWVudU92ZXJsYXlDb21wb25lbnR9IGZyb20gJy4vdGFibGUtbWVudS1vdmVybGF5L3RhYmxlLW1lbnUtb3ZlcmxheS5jb21wb25lbnQnO1xyXG5pbXBvcnQge1RhYmxlQ2xpY2tPdXRzaWRlRGlyZWN0aXZlfSBmcm9tICcuL3RhYmxlLWNsaWNrLW91dHNpZGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtEcm9wZG93bk1vZHVsZX0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XHJcbmltcG9ydCB7TXVsdGlTZWxlY3RNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQge05nYkRyb3Bkb3duTW9kdWxlfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7Q2hlY2tib3hNb2R1bGV9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xyXG5pbXBvcnQge1RhYmxlUm93RGF0YX0gZnJvbSAnLi4vLi4vdXRpbHMvaHlicmlkL3ByaW1lLXRhYmxlL3RhYmxlLXJvdy1kYXRhLm1vZGVsJztcclxuaW1wb3J0IHtQaXBlc01vZHVsZX0gZnJvbSAnLi4vLi4vcGlwZXMvcGlwZXMubW9kdWxlJztcclxuaW1wb3J0IHtUYWJsZUNvbHVtbnMsIFRvb2xCYXIsIFRvb2xCYXJGaWx0ZXJDb2x1bW59IGZyb20gJy4uLy4uL2ludGVyZmFjZSc7XHJcblxyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tICdwcmltZW5nL3V0aWxzJztcclxuaW1wb3J0IHtEb21IYW5kbGVyfSBmcm9tICdwcmltZW5nL2RvbSc7XHJcblxyXG4vLyBORVcgRmFjdG9yeSBGdW5jdGlvblxyXG5leHBvcnQgZnVuY3Rpb24gdGFibGVGYWN0b3J5KHdyYXBwZXI6IFRhYmxlQ29tcG9uZW50KSB7XHJcbiAgcmV0dXJuIHdyYXBwZXIuZHQ7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaW4tdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbnRyeUNvbXBvbmVudHM6IFtdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgRG9tSGFuZGxlciwgLy8gZnJvbSBuZXcgaW1wb3J0c1xyXG4gICAgT2JqZWN0VXRpbHMsIC8vIGZyb20gbmV3IGltcG9ydHNcclxuICAgIFRhYmxlU2VydmljZSwgLy8gZnJvbSBvbGQgaW1wb3J0c1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBUYWJsZSwgLy8gcHJvdmlkaW5nIHRhYmxlIGNsYXNzXHJcbiAgICAgIHVzZUZhY3Rvcnk6IHRhYmxlRmFjdG9yeSwgLy8gdXNpbmcgbmV3IGZ1bmN0aW9uXHJcbiAgICAgIGRlcHM6IFtUYWJsZUNvbXBvbmVudF0sIC8vIG5ldyBmdW5jdGlvbiBkZXBlbmRzIG9uIHlvdXIgd3JhcHBlclxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IFRhYmxlQ29sdW1uc1tdID0gW107XHJcbiAgZmlsdGVyZWRDb2x1bW5zOiBUYWJsZUNvbHVtbnNbXSA9IFtdO1xyXG4gIGdsb2JhbEZpbHRlcmVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICBwcmltYXJ5Q29sdW1uczogVGFibGVDb2x1bW5zW10gPSBbXTtcclxuICBASW5wdXQoKSB2YWx1ZXMgPSBbXTtcclxuICBASW5wdXQoKSBzY3JvbGxIZWlnaHQ6IHN0cmluZztcclxuICBASW5wdXQoKSBzY3JvbGxhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6IHN0cmluZztcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY2xhc3M6IHN0cmluZztcclxuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzdHlsZTogYW55O1xyXG4gIEBJbnB1dCgpIHRvb2xiYXI6IFRvb2xCYXI7XHJcbiAgQElucHV0KCkgY2hlY2tib3hTZWxlY3Rpb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGFjdGl2ZTtcclxuICBASW5wdXQoKSBzb3J0RmllbGQ7XHJcbiAgQElucHV0KCkgaXNBc2NlbmRpbmc7XHJcbiAgQElucHV0KCkgZGF0YUtleTtcclxuICBASW5wdXQoKSBzdGF0ZUtleTtcclxuICBASW5wdXQoKSBpc0dyb3VwZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3VzdG9tU29ydDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBpc0dyb3VwZWRFeHBhbmRlZD86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgaXNNb2JpbGVWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcmVzaXphYmxlQ29sdW1uczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgaXNUZXh0U2VhcmNoPzogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgaXNTb3J0SWNvbj86IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNvbHVtblJlc2l6ZU1vZGU6ICdleHBhbmQnIHwgJ2ZpdCcgPSAnZXhwYW5kJztcclxuXHJcbiAgQE91dHB1dCgpIGFjdGl2ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oSW5zcGFya1RlbXBsYXRlKSB0ZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxJbnNwYXJrVGVtcGxhdGU+O1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBhZGRBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHRyZWVBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNzdkFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2F2ZUFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcmVtb3ZlQWN0aW9uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB1bmxpbmtBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGxpbmtBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGdyb3VwRWRpdEFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcGFyYW1zRWRpdEFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc29ydEZ1bmN0aW9uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJGdW5jdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZHQnLCB7c3RhdGljOiBmYWxzZX0pIGR0O1xyXG5cclxuICBncm91cE1vZGUgPSAwO1xyXG4gIGdyb3VwSW5mbyA9IHt9O1xyXG4gIGdyb3VwSW5kZXggPSB7fTtcclxuICBoZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBib2R5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgbG9hZGluZ0JvZHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBjYXB0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZnJvemVuUm93c1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGZvb3RlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHN1bW1hcnlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBjb2xHcm91cFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGV4cGFuZGVkUm93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZnJvemVuSGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZnJvemVuQm9keVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGZyb3plbkZvb3RlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIGZyb3plbkNvbEdyb3VwVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgZW1wdHlNZXNzYWdlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgcGFnaW5hdG9yTGVmdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHBhZ2luYXRvclJpZ2h0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgdmFsdWVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgX3NlbGVjdGlvbiA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBzZWxlY3Rpb24odmFsKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uVmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHNlbGVjdGlvblZhbHVlKHZhbCkge1xyXG4gICAgdGhpcy5fc2VsZWN0aW9uID0gdmFsO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzUm93QWN0aXZlKHJvdzogVGFibGVSb3dEYXRhKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUgJiYgdGhpcy5hY3RpdmUuaWQgPT09IHJvdy5pZDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmR0LmZpbHRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICB0aGlzLmR0LmZpbHRlcignJywgYCR7a2V5fWAsICdjb250YWlucycpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmR0LmZpbHRlckdsb2JhbCh0aGlzLnNlYXJjaFRleHQsICdjb250YWlucycpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgdGhpcy5yZXNldENvbHVtbldpZHRoKCk7XHJcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVEYXRhKCkge1xyXG4gICAgdGhpcy5wcmltYXJ5Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4uaXNTZWNvbmRhcnkpO1xyXG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uaXNGaWx0ZXJpbmcgIT09IGZhbHNlKS5tYXAodmFsID0+IHZhbC5maWVsZCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zKCk7XHJcbiAgICB0aGlzLnJlc3RvcmVTZWFyY2hUZXh0KCk7XHJcbiAgICB0aGlzLnRlbXBsYXRlcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoaXRlbS5nZXRUeXBlKCkpIHtcclxuICAgICAgICBjYXNlICdjYXB0aW9uJzpcclxuICAgICAgICAgIHRoaXMuY2FwdGlvblRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdoZWFkZXInOlxyXG4gICAgICAgICAgdGhpcy5oZWFkZXJUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnYm9keSc6XHJcbiAgICAgICAgICB0aGlzLmJvZHlUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICd2YWx1ZSc6XHJcbiAgICAgICAgICB0aGlzLnZhbHVlVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ2xvYWRpbmdib2R5JzpcclxuICAgICAgICAgIHRoaXMubG9hZGluZ0JvZHlUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZm9vdGVyJzpcclxuICAgICAgICAgIHRoaXMuZm9vdGVyVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ3N1bW1hcnknOlxyXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcclxuICAgICAgICAgIHRoaXMuY29sR3JvdXBUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAncm93ZXhwYW5zaW9uJzpcclxuICAgICAgICAgIHRoaXMuZXhwYW5kZWRSb3dUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZnJvemVucm93cyc6XHJcbiAgICAgICAgICB0aGlzLmZyb3plblJvd3NUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZnJvemVuaGVhZGVyJzpcclxuICAgICAgICAgIHRoaXMuZnJvemVuSGVhZGVyVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ2Zyb3plbmJvZHknOlxyXG4gICAgICAgICAgdGhpcy5mcm96ZW5Cb2R5VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ2Zyb3plbmZvb3Rlcic6XHJcbiAgICAgICAgICB0aGlzLmZyb3plbkZvb3RlclRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdmcm96ZW5jb2xncm91cCc6XHJcbiAgICAgICAgICB0aGlzLmZyb3plbkNvbEdyb3VwVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ2VtcHR5bWVzc2FnZSc6XHJcbiAgICAgICAgICB0aGlzLmVtcHR5TWVzc2FnZVRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdwYWdpbmF0b3JsZWZ0JzpcclxuICAgICAgICAgIHRoaXMucGFnaW5hdG9yTGVmdFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdwYWdpbmF0b3JyaWdodCc6XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvclJpZ2h0VGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHZpc2libGVDb2x1bW5zKCk6IFRhYmxlQ29sdW1uc1tdIHtcclxuICAgIHRoaXMucmVzdG9yZUhpZGRlbkNvbHVtbnMoKTtcclxuICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5pc0hpZGRlbik7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29sdW1uc0NoYW5nZShkYXRhKSB7XHJcbiAgICBkYXRhLmNvbHVtbi5pc0hpZGRlbiA9ICFkYXRhLmV2ZW50O1xyXG4gICAgdGhpcy5yZXNldENvbHVtbldpZHRoKCk7XHJcbiAgICB0aGlzLnNhdmVIaWRkZW5Db2x1bW5zKCk7XHJcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1Rvb2x0aXAoZXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuICAgIGlmICh0YXJnZXQudGl0bGUgPT09IHVuZGVmaW5lZCB8fCAhdGFyZ2V0LnRleHRDb250ZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRhcmdldC50aXRsZSA9IHRhcmdldC5zY3JvbGxXaWR0aCA+IHRhcmdldC5jbGllbnRXaWR0aCA/IHRhcmdldC50ZXh0Q29udGVudCA6ICcnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbEZpbHRlcihmaWVsZCk6IFRvb2xCYXJGaWx0ZXJDb2x1bW4ge1xyXG4gICAgY29uc3QgZm91bmQgPSB0aGlzLnRvb2xiYXIuZmlsdGVyLmNvbHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgcmV0dXJuIGZvdW5kLmxlbmd0aCA9PT0gMSA/IGZvdW5kWzBdIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRmlsdGVyVG9vbGJhcihldmVudCkge1xyXG4gICAgaWYgKHRoaXMudG9vbGJhciAmJiB0aGlzLnRvb2xiYXIuZmlsdGVyKSB7XHJcbiAgICAgIHRoaXMudG9vbGJhci5maWx0ZXIuYWN0aXZlID0gIXRoaXMudG9vbGJhci5maWx0ZXIuYWN0aXZlO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgb25GaWx0ZXIoZXZlbnQpIHtcclxuICAgIHRoaXMub25Tb3J0KCk7XHJcbiAgICB0aGlzLmZpbHRlckZ1bmN0aW9uLmVtaXQoZXZlbnQuZmlsdGVyZWRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGVTYXZlKHN0YXRlKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZVRvTG9jYWxTdG9yYWdlKHN0YXRlLCBrZXkpIHtcclxuICAgIGlmIChrZXkpIHtcclxuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0hpZGRlbkZpZWxkc0NoYW5nZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBoaWRkZW5GaWVsZHNTYXZlZCA9IHRoaXMuZ2V0SGlkZGVuSGlkZGVuRmllbGRzRnJvbVN0b3JhZ2UoKTtcclxuICAgIGNvbnN0IGhpZGRlbkZpZWxkc0NvbHVtbnMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoX2NvbCA9PiBfY29sLmlzSGlkZGVuKS5tYXAoX2NvbCA9PiBfY29sLmZpZWxkKTtcclxuICAgIGlmIChoaWRkZW5GaWVsZHNTYXZlZC5sZW5ndGggPT09IGhpZGRlbkZpZWxkc0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGRpZmYgPSBoaWRkZW5GaWVsZHNTYXZlZC5maWx0ZXIoZmllbGQgPT4gIWhpZGRlbkZpZWxkc0NvbHVtbnMuaW5jbHVkZXMoZmllbGQpKTtcclxuICAgICAgZGlmZi5sZW5ndGggIT09IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcHVibGljIHNhdmVIaWRkZW5Db2x1bW5zKCkge1xyXG4gICAgaWYgKHRoaXMuc3RhdGVLZXkpIHtcclxuICAgICAgaWYgKCF0aGlzLmlzSGlkZGVuRmllbGRzQ2hhbmdlZCgpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGhpZGRlbkZpZWxkcyA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbHRlcihfY29sID0+IF9jb2wuaXNIaWRkZW4pLm1hcChfY29sID0+IF9jb2wuZmllbGQpLmpvaW4oJywnKTtcclxuICAgICAgdGhpcy5zYXZlVG9Mb2NhbFN0b3JhZ2UoaGlkZGVuRmllbGRzLCB0aGlzLnN0YXRlS2V5ICsgJ0hpZGRlbkZpZWxkcycpO1xyXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5zdGF0ZUtleSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuc3RhdGVLZXksIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIGZpbHRlcnM6IHtnbG9iYWw6IHt2YWx1ZTogdGhpcy5zZWFyY2hUZXh0LCBtYXRjaE1vZGU6ICdjb250YWlucyd9fVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgICB0aGlzLmR0LnJlc3RvcmVTdGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY291bnRWaXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHJldHVybiAodGhpcy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoX2NvbCA9PiAhX2NvbC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyByZXN0b3JlU2VhcmNoVGV4dCgpIHtcclxuICAgIGNvbnN0IHN0YXRlID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZFN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IChwYXJzZWRTdGF0ZS5maWx0ZXJzIHx8IHtnbG9iYWw6IHt2YWx1ZTogJyd9fSkuZ2xvYmFsID8gKHBhcnNlZFN0YXRlLmZpbHRlcnMgfHwge2dsb2JhbDoge3ZhbHVlOiAnJ319KS5nbG9iYWwudmFsdWUgOiAnJztcclxuICAgICAgdGhpcy5zb3J0RmllbGQgPSBwYXJzZWRTdGF0ZS5zb3J0RmllbGQgfHwgdGhpcy5zb3J0RmllbGQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlc2V0Q29sdW1uV2lkdGgoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldENvbHVtbldpZHRoSWZUb1dpZGUoKSB7XHJcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoX2NvbHVtbiA9PiAhX2NvbHVtbi5pc0hpZGRlbik7XHJcbiAgICBjb25zdCB0b3RhbFdpZHRoSW5QZXJjZW50ID0gdmlzaWJsZUNvbHVtbnMucmVkdWNlKChzLCBjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgcGVyY2VudCA9IGNvbHVtbi53aWR0aC5pbmRleE9mKCclJykgPiAwID8gcGFyc2VJbnQoY29sdW1uLndpZHRoLCAxMCkgOiAwO1xyXG4gICAgICByZXR1cm4gcyArIHBlcmNlbnQ7XHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICBpZiAodG90YWxXaWR0aEluUGVyY2VudCA+IDEwMCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGDQnNCw0YHQuNC80LDQu9GM0L3QsNGPINGB0YPQvNC80LDRgNC90LDRjyDRiNC40YDQuNC90LAg0YHRgtC+0LvQsdGG0L7QsiDRgtCw0LHQu9C40YbRiyAgMTAwJSwg0YLQtdC60YPRidCw0Y8g0YHRg9C80LzQsNGA0L3QsNGPINGI0LjRgNC40L3QsCAke3RvdGFsV2lkdGhJblBlcmNlbnR9JS5gXHJcbiAgICAgICAgKyBg0JLRi9C/0L7Qu9C90Y/QtdGC0YHRjyDQv9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3Ri9C5INC/0LXRgNC10YDQsNGB0YfQtdGCINGI0LjRgNC40L3RiyDQtNC70Y8g0YLQsNCx0LvQuNGG0YsgJHt0aGlzLnN0YXRlS2V5fWApO1xyXG4gICAgICB0aGlzLnJlc2V0Q29sdW1uV2lkdGgoKTtcclxuICAgIH1cclxuICAgIGlmICh0b3RhbFdpZHRoSW5QZXJjZW50IDwgMTAwICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vINGA0LDRgdGI0LjRgNGP0LXQvCDQv9C10YDQstGL0Lkg0YHRgtC+0LvQsdC10YYsINGH0YLQvtCx0Ysg0L3QtSDRgtGP0L3Rg9C70YHRjyDRgdGC0L7Qu9Cx0LXRhiDRgSDRh9C10LrQsdC+0LrRgdC+0LxcclxuICAgICAgY29uc3QgcGVyY2VudCA9IHRoaXMuY29sdW1uc1swXS53aWR0aC5pbmRleE9mKCclJykgPiAwID8gcGFyc2VJbnQodGhpcy5jb2x1bW5zWzBdLndpZHRoLCAxMCkgOiAwO1xyXG4gICAgICB0aGlzLmNvbHVtbnNbMF0ud2lkdGggPSAxMDAgLSB0b3RhbFdpZHRoSW5QZXJjZW50ICsgcGVyY2VudCArICclJztcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRDb2x1bW5XaWR0aCgpIHtcclxuICAgIGNvbnN0IGN2YyA9IHRoaXMuY291bnRWaXNpYmxlQ29sdW1ucygpO1xyXG4gICAgbGV0IHBlcmNlbnQgPSBNYXRoLmZsb29yKDEwMCAvIGN2Yyk7XHJcbiAgICBsZXQgZmlyc3RDb2x1bW5QZXJjZW50ID0gcGVyY2VudDtcclxuICAgIGlmIChjdmMgPiAxMCkge1xyXG4gICAgICBwZXJjZW50ID0gTWF0aC5mbG9vcig5MCAvIChjdmMgLSAxKSk7XHJcbiAgICAgIGZpcnN0Q29sdW1uUGVyY2VudCA9IE1hdGguZmxvb3IoMTAwIC0gKHBlcmNlbnQgKiAoY3ZjIC0gMSkpKTtcclxuICAgIH1cclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiBjb2x1bW4ud2lkdGggPSBpbmRleCA9PT0gMCA/IGZpcnN0Q29sdW1uUGVyY2VudCArICclJyA6IGAke3BlcmNlbnR9JWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIaWRkZW5IaWRkZW5GaWVsZHNGcm9tU3RvcmFnZSgpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZUtleSkge1xyXG4gICAgICBjb25zdCBoaWRkZW5GaWVsZHMgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdGF0ZUtleSArICdIaWRkZW5GaWVsZHMnKTtcclxuICAgICAgaWYgKGhpZGRlbkZpZWxkcykge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGhpZGRlbkZpZWxkcykuc3BsaXQoJywnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuICBwdWJsaWMgcmVzdG9yZUhpZGRlbkNvbHVtbnMoKSB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZUtleSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdGF0ZUtleSArICdIaWRkZW5GaWVsZHMnKSkge1xyXG4gICAgICBjb25zdCBoaWRkZW5GaWVsZHNBcnJheSA9IHRoaXMuZ2V0SGlkZGVuSGlkZGVuRmllbGRzRnJvbVN0b3JhZ2UoKTtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goX2NvbCA9PiBfY29sLmlzSGlkZGVuID0gaGlkZGVuRmllbGRzQXJyYXkuaW5jbHVkZXMoX2NvbC5maWVsZCkgfHwgX2NvbC5jb2xfaW52aXNpYmxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYWxjV2lkdGgoaWR4LCBsYWJlbCwgd2lkdGgpIHtcclxuICAgIHJldHVybiB3aWR0aCAmJiBpZHggPj0gMCA/IHdpZHRoIDogJ2F1dG8nO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBvblNvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5pc0dyb3VwZWQpIHtcclxuXHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ3JvdXBJbmZvKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICBjb25zdCBjYWNoZUZsYWcgPSAodGhpcy5ncm91cEluZm9ba2V5XSB8fCB7fSkuaXNFeHBhbmRlZDtcclxuICAgICAgICB0aGlzLmdyb3VwSW5mb1trZXldID0ge2lzRXhwYW5kZWQ6IGNhY2hlRmxhZyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGNhY2hlRmxhZ307XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zb3J0QnlHcm91cCgpO1xyXG4gICAgICBpZiAodGhpcy5kdCAmJiB0aGlzLmR0LmZpbHRlcmVkVmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNvcnRCeUdyb3VwKHRoaXMuZHQuZmlsdGVyZWRWYWx1ZSwgdGhpcy5kdC5fc29ydE9yZGVyKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmR0ICYmIHRoaXMuZHQuX3ZhbHVlICYmIHRoaXMuZHQuX3NvcnRPcmRlcikge1xyXG4gICAgICAgIHRoaXMuc29ydEJ5R3JvdXAodGhpcy5kdC5fdmFsdWUsIHRoaXMuZHQuX3NvcnRPcmRlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1Nob3dHcm91cChrZXksIHJvd0luZGV4KSB7XHJcbiAgICBpZiAocm93SW5kZXggPT09IDApIHtcclxuICAgICAgdGhpcy5ncm91cEluZGV4ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmdyb3VwSW5mb1trZXldKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXBJbmZvW2tleV0gPSB7aXNFeHBhbmRlZDogdGhpcy5pc0dyb3VwZWRFeHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5pc0dyb3VwZWRFeHBhbmRlZCA6IHRydWV9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5ncm91cEluZGV4W2tleV0pIHtcclxuICAgICAgdGhpcy5ncm91cEluZGV4W2tleV0gPSB7cm93SW5kZXh9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBJbmRleFtrZXldLnJvd0luZGV4ID09PSByb3dJbmRleDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVHcm91cChyb3dJbmRleDogbnVtYmVyLCBrZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5ncm91cEluZm9ba2V5XS5pc0V4cGFuZGVkID0gIXRoaXMuZ3JvdXBJbmZvW2tleV0uaXNFeHBhbmRlZDtcclxuICAgIHRoaXMub25Tb3J0KCk7XHJcbiAgfVxyXG5cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZHQuZmlsdGVyR2xvYmFsKCcnLCAnY29udGFpbnMnKTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5kdC5zYXZlU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIGxvY2FsU2VhcmNoKGR0LCBzZWFyY2hUZXh0KSB7XHJcbiAgICBkdC5maWx0ZXJHbG9iYWwoc2VhcmNoVGV4dCwgJ2NvbnRhaW5zJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnRCeUdyb3VwKHZhbHVlcz86IGFueSwgc29ydE9yZGVyPzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBnID0gdGhpcy5ncm91cE1vZGU7XHJcbiAgICBpZiAodmFsdWVzKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZXMuc29ydCgocm93MTogVGFibGVSb3dEYXRhLCByb3cyOiBUYWJsZVJvd0RhdGEpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiAocm93MS5ncm91cE9yZGVyW2ddKSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgKiAocm93MS5ncm91cE9yZGVyW2ddIC0gcm93Mi5ncm91cE9yZGVyW2ddKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHNvcnRPcmRlciAqIHJvdzEuZ3JvdXBPcmRlcltnXS5sb2NhbGVDb21wYXJlKHJvdzIuZ3JvdXBPcmRlcltnXSwgdW5kZWZpbmVkLCB7bnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJ30pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZhbHVlcy5zb3J0KChyb3cxOiBUYWJsZVJvd0RhdGEsIHJvdzI6IFRhYmxlUm93RGF0YSkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChyb3cxLmdyb3VwT3JkZXJbZ10pID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHJldHVybiByb3cxLmdyb3VwT3JkZXJbZ10gLSByb3cyLmdyb3VwT3JkZXJbZ107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHJvdzEuZ3JvdXBPcmRlcltnXS5sb2NhbGVDb21wYXJlKHJvdzIuZ3JvdXBPcmRlcltnXSwgdW5kZWZpbmVkLCB7bnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJ30pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvdW50R3JvdXAoZ3JvdXBLZXksIGc6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuZmlsdGVyKF92YWx1ZSA9PiBfdmFsdWUuZ3JvdXBLZXlbZ10gPT09IGdyb3VwS2V5KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVOb2Rlcyhpc0V4cGFuZGVkOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBnID0gdGhpcy5ncm91cE1vZGU7XHJcbiAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICBpZiAodGhpcy5ncm91cEluZm9bdi5ncm91cEtleVtnXV0pIHtcclxuICAgICAgICB0aGlzLmdyb3VwSW5mb1t2Lmdyb3VwS2V5W2ddXS5pc0V4cGFuZGVkID0gaXNFeHBhbmRlZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNb2RlKGl0ZW0pIHtcclxuICAgIHRoaXMuZ3JvdXBNb2RlID0gaXRlbTtcclxuICAgIHRoaXMuZ3JvdXBJbmZvID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuaXNTaG93R3JvdXAodGhpcy52YWx1ZXNbaV0uZ3JvdXBLZXlbdGhpcy5ncm91cE1vZGVdLCBpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQpIHtcclxuICAgICAgdGhpcy5kdC5maWx0ZXJHbG9iYWwodGhpcy5zZWFyY2hUZXh0LCAnY29udGFpbnMnKTtcclxuICAgIH1cclxuICAgIHRoaXMuc29ydEJ5R3JvdXAoKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRhYmxlTW9kdWxlLCBQaXBlc01vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHJvcGRvd25Nb2R1bGUsIE11bHRpU2VsZWN0TW9kdWxlLCBOZ2JEcm9wZG93bk1vZHVsZSwgQ2hlY2tib3hNb2R1bGVdLFxyXG4gIGV4cG9ydHM6IFtUYWJsZUNvbXBvbmVudCwgVGFibGVDb2x1bW5zTXVsdGlzZWxlY3RDb21wb25lbnRdLFxyXG4gIGRlY2xhcmF0aW9uczogW1RhYmxlQ29tcG9uZW50LCBUYWJsZUNvbHVtbnNNdWx0aXNlbGVjdENvbXBvbmVudCwgVGFibGVNZW51T3ZlcmxheUNvbXBvbmVudCwgVGFibGVDbGlja091dHNpZGVEaXJlY3RpdmVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudE1vZHVsZSB7XHJcbn1cclxuIiwiPHNwYW4gKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwiYy1sYWJlbFwiPlxyXG4gICAgICAgIHt7bGFiZWx9fVxyXG4gIDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cImMtbGFiZWxfX3JlcVwiPio8L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiYy1sYWJlbF9fc3ViX2lzLWVycm9yXCI+e3tlcnJvcn19PC9zcGFuPlxyXG48L3NwYW4+XHJcbjxwLXRhYmxlICNkdFxyXG4gICAgICAgICAob25GaWx0ZXIpID0gb25GaWx0ZXIoJGV2ZW50KVxyXG4gICAgICAgICAob25Tb3J0KT1cIm9uU29ydCgpXCJcclxuICAgICAgICAgKG9uU3RhdGVSZXN0b3JlKT1cInJlc3RvcmVTZWFyY2hUZXh0KClcIlxyXG4gICAgICAgICAob25TdGF0ZVNhdmUpPVwic3RhdGVTYXZlKCRldmVudClcIlxyXG4gICAgICAgICAoc29ydEZ1bmN0aW9uKT1cInNvcnRGdW5jdGlvbj8gc29ydEZ1bmN0aW9uLmVtaXQoJGV2ZW50KTogbnVsbFwiXHJcbiAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25WYWx1ZVwiXHJcbiAgICAgICAgIFtjbGFzc109XCJjbGFzc1wiXHJcbiAgICAgICAgIFtjb2x1bW5zXT1cImZpbHRlcmVkQ29sdW1uc1wiXHJcbiAgICAgICAgIFtjdXN0b21Tb3J0XT1cImN1c3RvbVNvcnRcIlxyXG4gICAgICAgICBbZGF0YUtleV09XCJkYXRhS2V5IHx8ICdpZCdcIlxyXG4gICAgICAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlcmVkQ29sdW1uc1wiXHJcbiAgICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cInJlc2l6YWJsZUNvbHVtbnNcIlxyXG4gICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXHJcbiAgICAgICAgIFtzY3JvbGxhYmxlXT1cInNjcm9sbGFibGVcIlxyXG4gICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgICAgW3NvcnRGaWVsZF09XCJzb3J0RmllbGQgfHwgJ2lkJ1wiXHJcbiAgICAgICAgIFtzb3J0T3JkZXJdPVwiaXNBc2NlbmRpbmcgPyAxIDogLTFcIlxyXG4gICAgICAgICBbc3RhdGVLZXldPVwic3RhdGVLZXlcIlxyXG4gICAgICAgICBbc3RhdGVTdG9yYWdlXT1cIidsb2NhbCdcIlxyXG4gICAgICAgICBbc3R5bGVdPVwic3R5bGVcIlxyXG4gICAgICAgICBbdmFsdWVdPVwidmFsdWVzXCJcclxuICAgICAgICAgW2NvbHVtblJlc2l6ZU1vZGVdPVwiY29sdW1uUmVzaXplTW9kZVwiXHJcbj5cclxuICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjb2xHcm91cFRlbXBsYXRlXCIgbGV0LWNvbHVtbnMgcFRlbXBsYXRlPVwiY29sZ3JvdXBcIj5cclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2xHcm91cFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiB7IGNvbHVtbnM6IGNvbHVtbnN9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIiFjb2xHcm91cFRlbXBsYXRlXCIgbGV0LWNvbHVtbnMgcFRlbXBsYXRlPVwiY29sZ3JvdXBcIj5cclxuICAgIDxjb2xncm91cCAqbmdJZj1cIiFpc01vYmlsZVZpZXdcIj5cclxuICAgICAgPGNvbCAqbmdJZj1cImNoZWNrYm94U2VsZWN0aW9uXCIgc3R5bGU9XCJ3aWR0aDogNDRweDtcIj5cclxuICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sIG9mIGZpbHRlcmVkQ29sdW1uczsgbGV0IGlkeCA9IGluZGV4XCI+XHJcbiAgICA8L2NvbGdyb3VwPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSBsZXQtY29sdW1ucyBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93SGVhZGVyXCI+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGggKm5nSWY9XCJjaGVja2JveFNlbGVjdGlvblwiIGNsYXNzPVwidS1wb3NpdGlvbi1yZWxhdGl2ZSB1LXRleHRfY2VudGVyXCIgcFJlc2l6YWJsZUNvbHVtbiBzdHlsZT1cIndpZHRoOiA0NHB4O1wiPlxyXG4gICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIGZpbHRlcmVkQ29sdW1uc1wiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCIgY2xhc3M9XCJ1LXBvc2l0aW9uLXJlbGF0aXZlXCJcclxuICAgICAgICAgICAgcFJlc2l6YWJsZUNvbHVtbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLXRhYmxlLXRoZWFkLXRpdGxlXCJcclxuICAgICAgICAgICAgICAgdGl0bGU9XCJ7e2NvbC5sYWJlbCB8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgICAgIHt7Y29sLmxhYmVsIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAtc29ydEljb24gKm5nSWY9XCJpc1NvcnRJY29uXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInUtcG9zaXRpb24tYWJzb2x1dGUgdS1wb3NpdGlvbi1hYnNvbHV0ZS1yaWdodCBjLXNvcnRpY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDE4cHg7IHRvcDogMDsgaGVpZ2h0OiAxMDAlO1wiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICA8dHIgKm5nSWY9XCJ0b29sYmFyICYmIHRvb2xiYXIuZmlsdGVyICYmIHRvb2xiYXIuZmlsdGVyLmFjdGl2ZVwiPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cImNoZWNrYm94U2VsZWN0aW9uXCIgY2xhc3M9XCJ1LXBvc2l0aW9uLXJlbGF0aXZlIHUtdGV4dF9jZW50ZXJcIiBwUmVzaXphYmxlQ29sdW1uXHJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQ0cHg7XCI+PC90aD5cclxuICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW25nU3dpdGNoXT1cImNvbC5maWVsZFwiPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIChpbnB1dCk9XCJkdC5maWx0ZXIoJGV2ZW50LnRhcmdldC52YWx1ZSwgY29sLmZpZWxkLCAnY29udGFpbnMnKVwiXHJcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJjb2xGaWx0ZXIoY29sLmZpZWxkKT8udHlwZSA9PT0gJ3RleHQnID8gY29sLmZpZWxkIDogJydcIlxyXG4gICAgICAgICAgICBhdXRvZm9jdXM9XCJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImMtaW5wdXQgYy1pbnB1dF9zbWFsbCBuZy1wcmlzdGluZSBuZy12YWxpZCBuZy1zY29wZSBuZy1lbXB0eSBuZy10b3VjaGVkXCJcclxuICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiPlxyXG5cclxuICAgICAgICAgIDxwLWRyb3Bkb3duIChvbkNoYW5nZSk9XCJkdC5maWx0ZXIoJGV2ZW50LnZhbHVlLCBjb2wuZmllbGQsICdlcXVhbHMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiY29sRmlsdGVyKGNvbC5maWVsZCk/LnR5cGUgPT09ICdkcm9wZG93bicgPyBjb2wuZmllbGQgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2xGaWx0ZXIoY29sLmZpZWxkKT8ub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogJzEwMCUnLCBvdmVyZmxvdzogJ3Zpc2libGUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCI+PC9wLWRyb3Bkb3duPlxyXG5cclxuICAgICAgICAgIDxwLW11bHRpU2VsZWN0IChvbkNoYW5nZSk9XCJkdC5maWx0ZXIoJGV2ZW50LnZhbHVlLCBjb2wuZmllbGQsICdpbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJjb2xGaWx0ZXIoY29sLmZpZWxkKT8udHlwZSA9PT0gJ211bHRpc2VsZWN0JyA/IGNvbC5maWVsZCA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbEZpbHRlcihjb2wuZmllbGQpPy5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScsIG92ZXJmbG93OiAndmlzaWJsZScgfVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TGFiZWw9XCJ7eydBbGwnIHwgdHJhbnNsYXRlfX1cIj48L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgKGlucHV0KT1cImR0LmZpbHRlcigkZXZlbnQudGFyZ2V0LnZhbHVlLCBjb2wuZmllbGQgKyAnMmZpbHRlcicsICdjb250YWlucycpXCJcclxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImNvbEZpbHRlcihjb2wuZmllbGQpPy50eXBlID09PSAnZGF0ZXRleHQnID8gY29sLmZpZWxkIDogJydcIlxyXG4gICAgICAgICAgICBhdXRvZm9jdXM9XCJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImMtaW5wdXQgYy1pbnB1dF9zbWFsbCBuZy1wcmlzdGluZSBuZy12YWxpZCBuZy1zY29wZSBuZy1lbXB0eSBuZy10b3VjaGVkXCJcclxuICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8bmctdGVtcGxhdGUgKm5nSWY9XCJib2R5VGVtcGxhdGVcIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtcm93RGF0YSBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIHBUZW1wbGF0ZT1cImJvZHlcIj5cclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5VGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHsgcm93SW5kZXg6IHJvd0luZGV4LCByb3dEYXRhOiByb3dEYXRhLCBjb2x1bW5zOiBjb2x1bW5zfX1cIj48L25nLWNvbnRhaW5lcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhYm9keVRlbXBsYXRlXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LWluZGV4PVwicm93SW5kZXhcIiBsZXQtcm93RGF0YSBwVGVtcGxhdGU9XCJib2R5XCI+XHJcbiAgICA8dHJcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZUdyb3VwKGluZGV4LCByb3dEYXRhLmdyb3VwS2V5W2dyb3VwTW9kZV0pXCJcclxuICAgICAgKm5nSWY9XCJpc0dyb3VwZWQgJiYgaXNTaG93R3JvdXAocm93RGF0YS5ncm91cEtleVtncm91cE1vZGVdLCBpbmRleClcIlxyXG4gICAgICBjbGFzcz1cInJvd19ob3Zlcl9oaWdobGlnaHRcIj5cclxuICAgICAgPHRkIFtjb2xTcGFuXT1cImNvdW50VmlzaWJsZUNvbHVtbnMoKSArIDFcIj5cclxuICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwSW5mb1tyb3dEYXRhLmdyb3VwS2V5W2dyb3VwTW9kZV1dLmlzRXhwYW5kZWQgPyAnaW4gZmEtZncgaW4tY2hldnJvbi1kb3duJyA6ICdpbiBmYS1mdyBpbi1jaGV2cm9uLXJpZ2h0J1wiPjwvaT5cclxuICAgICAgICAgIDxzcGFuPnt7cm93RGF0YS5ncm91cEtleVtncm91cE1vZGVdIHwgdHJhbnNsYXRlIH19ICh7e2NvdW50R3JvdXAocm93RGF0YS5ncm91cEtleVtncm91cE1vZGVdLCBncm91cE1vZGUpfX1cclxuICAgICAgICAgICAgKTwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L3RyPlxyXG4gICAgPHRyICpuZ0lmPVwiIWlzR3JvdXBlZCB8fCBncm91cEluZm9bKHJvd0RhdGEuZ3JvdXBLZXlbZ3JvdXBNb2RlXSldLmlzRXhwYW5kZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntyb3dfYWN0aXZlOiBpc1Jvd0FjdGl2ZShyb3dEYXRhKX1cIlxyXG4gICAgICAgIFtwU2VsZWN0YWJsZVJvd109XCJyb3dEYXRhXCJcclxuICAgICAgICBjbGFzcz1cInJvd1wiPlxyXG4gICAgICA8dGQgKm5nSWY9XCJjaGVja2JveFNlbGVjdGlvblwiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgJ3Jvd19zdGF0dXNfc3VjY2Vzcyc6IHJvd0RhdGEuc2RpcnBhcmFtc3RhdGVjb2xvciA9PT0gJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAncm93X3N0YXR1c19lcnJvcic6IHJvd0RhdGEuc2RpcnBhcmFtc3RhdGVjb2xvciA9PT0gJ2Vycm9yJyxcclxuICAgICAgICAgICAgJ3Jvd19zdGF0dXNfd2FybmluZyc6IHJvd0RhdGEuc2RpcnBhcmFtc3RhdGVjb2xvciA9PT0gJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICAncm93X3N0YXR1c19jcml0aWNhbCc6IHJvd0RhdGEuc2RpcnBhcmFtc3RhdGVjb2xvciA9PT0gJ2NyaXRpY2FsJyxcclxuICAgICAgICAgICAgJ3Jvd19zdGF0dXNfZmFsc2V2YWx1ZSc6IHJvd0RhdGEuc2RpcnBhcmFtc3RhdGVjb2xvciA9PT0gJ2ZhbHNldmFsdWUnLFxyXG4gICAgICAgICAgICAncm93X3N0YXR1c19wZW5kaW5nJzogcm93RGF0YS5zZGlycGFyYW1zdGF0ZWNvbG9yID09PSAncGVuZGluZydcclxuICAgICAgICAgIH1cIiBjbGFzcz1cInUtdGV4dF9jZW50ZXJcIlxyXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDRweFwiXHJcbiAgICAgID5cclxuICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJyb3dEYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3BvaW50ZXItZXZlbnRzJzogc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScgfHwgc2VsZWN0aW9uTW9kZSA9PT0gJ211bHRpcGxlJyAmJiBjaGVja2JveFNlbGVjdGlvbiA/ICdub25lJyA6ICdhdXRvJ31cIlxyXG4gICAgICAgID48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgPC90ZD5cclxuICAgICAgPHRkIChjbGljayk9XCJhY3RpdmVDaGFuZ2UuZW1pdChyb3dEYXRhKVwiXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGZpbHRlcmVkQ29sdW1uc1wiXHJcbiAgICAgICAgICBjbGFzcz1cInUtb3ZlcmZsb3ctdmlzaWJsZVwiPlxyXG4gICAgICAgIDxkaXYgKG1vdXNlb3Zlcik9XCJzaG93VG9vbHRpcCgkZXZlbnQpXCIgKm5nSWY9XCIhdmFsdWVUZW1wbGF0ZVwiIGNsYXNzPVwicC10YWJsZS10Ym9keS1jb250ZW50XCIgdGl0bGU+XHJcbiAgICAgICAgICB7e2NvbC50cmFuc2xhdGFibGUgPyAocm93RGF0YSB8IHByb3BlcnR5VmFsdWU6IGNvbC5maWVsZCB8IHRyYW5zbGF0ZSkgOiAocm93RGF0YSB8IHByb3BlcnR5VmFsdWU6IGNvbC5maWVsZCl9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidmFsdWVUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogeyBkYXRhOiByb3dEYXRhLCBjb2w6IGNvbH19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L3RyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAqbmdJZj1cInRvb2xiYXJcIiBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm8tZ3JpZCBvLWdyaWRfbm8tZ3V0dGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjLXRyZWUtdGFibGVfX3Rvb2xiYXItY29udGVudCB1LWRpc3BsYXktaW5saW5lLWZsZXhcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNUZXh0U2VhcmNoXCIgY2xhc3M9XCJjLWZvcm0gYy1mb3JtX2lubGluZSB1LWRpc3BsYXktaW5saW5lLWJsb2NrXCI+XHJcbiAgICAgICAgICA8Zm9ybSBjbGFzcz1cImMtbGFiZWxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXIgdS1tYXJnaW4tcmlnaHQtdGlueVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoVGV4dElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJsb2NhbFNlYXJjaChkdCwgc2VhcmNoVGV4dClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzPVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtYm94IGMtaW5wdXQgYy1pbnB1dF9zbWFsbCBuZy1wcmlzdGluZSBuZy12YWxpZCBuZy1zY29wZSBuZy1lbXB0eSBuZy10b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7KCdTSEFSRUQuU0VBUkNIJyB8IHRyYW5zbGF0ZSkgKyAnOid9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1yaWdodDogMjhweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhcigpXCIgY2xhc3M9XCJidXR0b24tcmVzZXRcIiB0eXBlPVwicmVzZXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiJ1Jlc2V0JyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpbiBpbi1jbG9zZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImMtYnRuIGMtYnRuX2JvcmRlci1mcmVlIGMtYnRuX3NtYWxsXCI+XHJcbiAgICAgICAgICA8aW4tdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdCAoY29sdW1uc0NoYW5nZSk9XCJjb2x1bW5zQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwicHJpbWFyeUNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVBY3RpdmVDaGVja2JveGVzXT1cImNvdW50VmlzaWJsZUNvbHVtbnMoKSA9PT0gMVwiPjwvaW4tdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25GaWx0ZXJUb29sYmFyKCRldmVudClcIiAqbmdJZj1cInRvb2xiYXIuZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYy1idG4gYy1idG5fYm9yZGVyLWZyZWUgYy1idG5fc21hbGxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiaW4gaW4tZmlsdGVyXCIgdGl0bGU9XCJ7eydTZXJ2aWNlIGZpbHRlcicgfCB0cmFuc2xhdGV9fVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidHJlZUFjdGlvbi5lbWl0KCRldmVudClcIiAqbmdJZj1cInRvb2xiYXIudHJlZVwiIFtkaXNhYmxlZF09XCJ0b29sYmFyLnRyZWUuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjLWJ0biBjLWJ0bl9ib3JkZXItZnJlZSBjLWJ0bl9zbWFsbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJpbiBpbi1saXN0XCIgdGl0bGU9XCJ7eydGaWx0ZXIgYnkgcnVicmljJyB8IHRyYW5zbGF0ZX19XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRBY3Rpb24uZW1pdCgkZXZlbnQpXCIgKm5nSWY9XCJ0b29sYmFyLmFkZFwiIFtkaXNhYmxlZF09XCJ0b29sYmFyLmFkZC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImMtYnRuIGMtYnRuX2JvcmRlci1mcmVlIGMtYnRuX3NtYWxsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImluIGluLXBsdXNcIiB0aXRsZT1cInt7J0FkZCcgfCB0cmFuc2xhdGV9fVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibGlua0FjdGlvbi5lbWl0KCRldmVudClcIiAqbmdJZj1cInRvb2xiYXIubGlua1wiIFtkaXNhYmxlZF09XCJ0b29sYmFyLmxpbmsuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjLWJ0biBjLWJ0bl9ib3JkZXItZnJlZSBjLWJ0bl9zbWFsbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJpbiBpbi1saW5rXCIgdGl0bGU9XCJ7eydMaW5rJyB8IHRyYW5zbGF0ZX19XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNzdkFjdGlvbi5lbWl0KCRldmVudClcIiAqbmdJZj1cInRvb2xiYXIuY3N2XCIgW2Rpc2FibGVkXT1cInRvb2xiYXIuY3N2LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYy1idG4gYy1idG5fYm9yZGVyLWZyZWUgYy1idG5fc21hbGxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDwhLS1Ub2RvOiDQt9Cw0LzQtdC90LjRgtGMINC90LAgaW4tZmlsZS1jc3YtLT5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiaW4gaW4tZmlsZS1leGNlbC1vdXRsaW5lXCIgdGl0bGU9XCJ7eydMT0dTLlNBVkVfVE9fQ1NWJyB8IHRyYW5zbGF0ZX19XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNhdmVBY3Rpb24uZW1pdCgkZXZlbnQpXCIgKm5nSWY9XCJ0b29sYmFyLnNhdmVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRvb2xiYXIuc2F2ZS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImMtYnRuIGMtYnRuX3ByaW1hcnkgYy1idG5fc21hbGxcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eydTYXZlJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eydTYXZlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZ3JvdXBFZGl0QWN0aW9uLmVtaXQoJGV2ZW50KVwiICpuZ0lmPVwidG9vbGJhci5ncm91cEVkaXQgJiYgdG9vbGJhci5ncm91cEVkaXQuYWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0b29sYmFyLmdyb3VwRWRpdC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImMtYnRuIGMtYnRuX2JvcmRlci1mcmVlIGMtYnRuX3NtYWxsXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImluIGluLXBlbmNpbFwiIHRpdGxlPVwie3snZ3JvdXBFZGl0JyB8IHRyYW5zbGF0ZX19XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltidXR0b25zXVwiPjwvbmctY29udGVudD5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJwYXJhbXNFZGl0QWN0aW9uLmVtaXQoJGV2ZW50KVwiICpuZ0lmPVwidG9vbGJhci5wYXJhbXNFZGl0ICYmIHRvb2xiYXIucGFyYW1zRWRpdC5hY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRvb2xiYXIucGFyYW1zRWRpdC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImMtYnRuIGMtYnRuX2JvcmRlci1mcmVlIGMtYnRuX3NtYWxsXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImluIGluLXBlbmNpbFwiIHRpdGxlPVwie3sncGFyYW1zRWRpdCcgfCB0cmFuc2xhdGV9fVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZUFjdGlvbi5lbWl0KCRldmVudClcIiAqbmdJZj1cInRvb2xiYXIucmVtb3ZlICYmIHRvb2xiYXIucmVtb3ZlLmFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidG9vbGJhci5yZW1vdmUuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjLWJ0biBjLWJ0bl9ib3JkZXItZnJlZSBjLWJ0bl9zbWFsbFwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJpbiBpbi10cmFzaFwiIHRpdGxlPVwie3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInVubGlua0FjdGlvbi5lbWl0KCRldmVudClcIiAqbmdJZj1cInRvb2xiYXIudW5saW5rXCIgW2Rpc2FibGVkXT1cInRvb2xiYXIudW5saW5rLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYy1idG4gYy1idG5fYm9yZGVyLWZyZWUgYy1idG5fc21hbGxcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiaW4gaW4tbGluay1vZmZcIiB0aXRsZT1cInt7J0RldGFjaCB0YWcgZnJvbSBzZWxlY3RlZCBpdGVtcycgfCB0cmFuc2xhdGV9fVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVOb2Rlcyh0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInRvb2xiYXIuZXhwYW5kQWxsXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYy1idG4gYy1idG5fc21hbGwgYy1idG5fc3ZnLTI0IGMtaWNvbiBjLWljb25fc3ZnIGMtaWNvbl9zdmctMjQgYy1idG5fYm9yZGVyLWZyZWVcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eydFeHBhbmQgYWxsJyB8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgICA8c3ZnIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTIwIDJINHYyaDE2VjJ6TTQgMjB2MmgxNnYtMkg0ek0xMiA1bDUgNkg3bDUtNnpNMTcgMTNsLTUgNi01LTZoMTB6XCIvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlTm9kZXMoZmFsc2UpXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidG9vbGJhci5leHBhbmRBbGxcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjLWJ0biBjLWJ0bl9zbWFsbCBjLWJ0bl9zdmctMjQgYy1pY29uIGMtaWNvbl9zdmcgYy1pY29uX3N2Zy0yNCBjLWJ0bl9ib3JkZXItZnJlZVwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7J0NvbGxhcHNlIGFsbCcgfCB0cmFuc2xhdGV9fVwiPlxyXG4gICAgICAgICAgPHN2ZyBmaWxsPVwiY3VycmVudENvbG9yXCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTcgM2wtNSA2LTUtNmgxMHpNNCAxM3YtMmgxNnYySDR6bTggMmw1IDZIN2w1LTZ6XCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhci5ncm91cFNvcnRcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJjLWJ0bi1ncm91cFwiXHJcbiAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcclxuICAgICAgICAgICAgIG5nYkRyb3Bkb3duPlxyXG5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjLWJ0biBjLWJ0bl9ib3JkZXItZnJlZSBjLWJ0bl9zbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgIGlkPVwiZHJvcGRvd25Hcm91cFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZVxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7J0NoYW5nZSB0aGUgd2F5IHBhcmFtZXRlcnMgYXJlIGdyb3VwZWQnIHwgdHJhbnNsYXRlfX1cIj5cclxuICAgICAgICAgICAgPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJpbiBpbi1vYmplY3QtZ3JvdXBcIj48L2k+XHJcbiAgICAgICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiYy1jYXJldFwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDx1bCBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkdyb3VwVHlwZVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjLWRyb3Bkb3duLW1lbnUgYy1kcm9wZG93bi1tZW51X3JpZ2h0IG5nLXN0YXItaW5zZXJ0ZWRcIlxyXG4gICAgICAgICAgICAgIG5nYkRyb3Bkb3duTWVudVxyXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51XCI+XHJcbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiB0b29sYmFyLmdyb3VwU29ydC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWRyb3Bkb3duLW1lbnVfX2xpc3RpdGVtX2FjdGl2ZSc6IGl0ZW0udmFsdWUgPT09IGdyb3VwTW9kZX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjLWRyb3Bkb3duLW1lbnVfX2xpc3RpdGVtIGlzLWRyb3Bkb3duLW1lbnVfX2xpc3RpdGVtX2FjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICBuZ2JEcm9wZG93bkl0ZW1cclxuICAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiPlxyXG4gICAgICAgICAgICAgIDxhIChjbGljayk9XCJ0b2dnbGVNb2RlKGl0ZW0udmFsdWUpXCIgY2xhc3M9XCJjLWRyb3Bkb3duLW1lbnVfX2NvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIHt7aXRlbS5sYWJlbH19XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L3AtdGFibGU+XHJcbiJdfQ==
|