@universis/ngx-tables 0.8.5 → 15.0.2
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/esm2020/lib/actions/table.actions.mjs +27 -0
- package/esm2020/lib/advanced-aggregator.mjs +2 -0
- package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
- package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
- package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
- package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
- package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
- package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
- package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
- package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
- package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
- package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
- package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
- package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
- package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
- package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
- package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
- package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
- package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
- package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
- package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
- package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
- package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
- package/esm2020/lib/i18n/tables.el.mjs +129 -0
- package/esm2020/lib/i18n/tables.en.mjs +128 -0
- package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
- package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
- package/esm2020/lib/reducers/index.mjs +37 -0
- package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
- package/esm2020/lib/tables.activated-table.service.mjs +46 -0
- package/esm2020/lib/tables.module.mjs +218 -0
- package/esm2020/public_api.mjs +37 -0
- package/esm2020/universis-ngx-tables.mjs +5 -0
- package/fesm2015/{universis-ngx-tables.js → universis-ngx-tables.mjs} +2927 -2729
- package/fesm2015/universis-ngx-tables.mjs.map +1 -0
- package/fesm2020/universis-ngx-tables.mjs +5609 -0
- package/fesm2020/universis-ngx-tables.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/actions/table.actions.d.ts +4 -4
- package/lib/components/add-items/add-items.component.d.ts +14 -21
- package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +15 -9
- package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
- package/lib/components/advanced-list/advanced-list.component.d.ts +17 -14
- package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +20 -23
- package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +7 -4
- package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
- package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
- package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
- package/lib/components/advanced-table/advanced-table-search.component.d.ts +11 -7
- package/lib/components/advanced-table/advanced-table-settings.component.d.ts +8 -6
- package/lib/components/advanced-table/advanced-table.component.d.ts +33 -25
- package/lib/components/advanced-table/advanced-table.formatters.d.ts +11 -11
- package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +15 -12
- package/lib/components/column-selector/column-selector.component.d.ts +9 -6
- package/lib/components/column-selector/column-selector.service.d.ts +3 -0
- package/lib/components/table-simple-header/table-simple-header.component.d.ts +8 -3
- package/lib/directives/advance-search-state.directive.d.ts +6 -3
- package/lib/directives/advance-table-state.directive.d.ts +4 -1
- package/lib/directives/advanced-search-router-state.directive.d.ts +9 -6
- package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
- package/lib/directives/btnexp.directive.d.ts +12 -9
- package/lib/i18n/tables.el.d.ts +107 -107
- package/lib/i18n/tables.en.d.ts +106 -106
- package/lib/pipes/advanced-aggregator.pipe.d.ts +7 -4
- package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +9 -6
- package/lib/reducers/index.d.ts +5 -3
- package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +11 -8
- package/lib/tables.activated-table.service.d.ts +10 -6
- package/lib/tables.module.d.ts +36 -0
- package/package.json +44 -36
- package/public_api.d.ts +3 -0
- package/bundles/universis-ngx-tables.umd.js +0 -6101
- package/bundles/universis-ngx-tables.umd.js.map +0 -1
- package/bundles/universis-ngx-tables.umd.min.js +0 -2
- package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
- package/esm2015/lib/actions/table.actions.js +0 -28
- package/esm2015/lib/advanced-aggregator.js +0 -2
- package/esm2015/lib/components/add-items/add-items.component.js +0 -142
- package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -120
- package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -53
- package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -173
- package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -184
- package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -142
- package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -65
- package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -40
- package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -37
- package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -44
- package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -28
- package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -526
- package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -109
- package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1523
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -429
- package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
- package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -397
- package/esm2015/lib/components/column-selector/column-selector.component.js +0 -202
- package/esm2015/lib/components/column-selector/column-selector.service.js +0 -47
- package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -52
- package/esm2015/lib/directives/advance-search-state.directive.js +0 -108
- package/esm2015/lib/directives/advance-table-state.directive.js +0 -63
- package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -63
- package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -156
- package/esm2015/lib/directives/btnexp.directive.js +0 -229
- package/esm2015/lib/i18n/tables.el.js +0 -130
- package/esm2015/lib/i18n/tables.en.js +0 -129
- package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -35
- package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -46
- package/esm2015/lib/reducers/index.js +0 -32
- package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -120
- package/esm2015/lib/tables.activated-table.service.js +0 -50
- package/esm2015/lib/tables.module.js +0 -149
- package/esm2015/public_api.js +0 -33
- package/esm2015/universis-ngx-tables.js +0 -9
- package/esm5/lib/actions/table.actions.js +0 -34
- package/esm5/lib/advanced-aggregator.js +0 -2
- package/esm5/lib/components/add-items/add-items.component.js +0 -153
- package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -169
- package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -56
- package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -185
- package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -188
- package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -145
- package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -71
- package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -43
- package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -50
- package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -48
- package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -34
- package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -563
- package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -115
- package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -1548
- package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
- package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -480
- package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
- package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -314
- package/esm5/lib/components/column-selector/column-selector.component.js +0 -270
- package/esm5/lib/components/column-selector/column-selector.service.js +0 -50
- package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -58
- package/esm5/lib/directives/advance-search-state.directive.js +0 -116
- package/esm5/lib/directives/advance-table-state.directive.js +0 -65
- package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -71
- package/esm5/lib/directives/advanced-table-editor.directive.js +0 -196
- package/esm5/lib/directives/btnexp.directive.js +0 -257
- package/esm5/lib/i18n/tables.el.js +0 -130
- package/esm5/lib/i18n/tables.en.js +0 -129
- package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -39
- package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -49
- package/esm5/lib/reducers/index.js +0 -34
- package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -134
- package/esm5/lib/tables.activated-table.service.js +0 -57
- package/esm5/lib/tables.module.js +0 -154
- package/esm5/public_api.js +0 -33
- package/esm5/universis-ngx-tables.js +0 -9
- package/fesm2015/universis-ngx-tables.js.map +0 -1
- package/fesm5/universis-ngx-tables.js +0 -5737
- package/fesm5/universis-ngx-tables.js.map +0 -1
- package/universis-ngx-tables.d.ts +0 -8
- package/universis-ngx-tables.metadata.json +0 -1
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { Directive, Output, EventEmitter, } from '@angular/core';
|
|
2
|
-
import { AdvancedTableComponent } from '../components/advanced-table/advanced-table.component';
|
|
3
|
-
export class AdvancedTableNotNullError extends Error {
|
|
4
|
-
constructor() {
|
|
5
|
-
super('Advanced table component cannot be empty at this context.');
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
export class AdvancedTableEditorDirective {
|
|
9
|
-
constructor(table) {
|
|
10
|
-
this.table = table;
|
|
11
|
-
this.dirty = false;
|
|
12
|
-
this.dirtyChange = new EventEmitter(false);
|
|
13
|
-
//
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Add rows to table and mark them as added rows
|
|
17
|
-
*/
|
|
18
|
-
add(...addItems) {
|
|
19
|
-
if (this.table == null) {
|
|
20
|
-
throw new AdvancedTableNotNullError();
|
|
21
|
-
}
|
|
22
|
-
// decorate items
|
|
23
|
-
const key = this.table.config.columns[0].property || this.table.config.columns[0].name;
|
|
24
|
-
for (const element of addItems) {
|
|
25
|
-
let tr = this.table.dataTable.rows(':has(input[data-id="' + element[key] + '"])').nodes().to$();
|
|
26
|
-
if (tr.hasClass('removed')) {
|
|
27
|
-
tr.toggleClass('removed text-gray-400 text-decoration-line-through');
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
this.table.dataTable.rows.add([element]);
|
|
31
|
-
tr = this.table.dataTable.rows(':has(input[data-id="' + element[key] + '"])').nodes().to$();
|
|
32
|
-
tr.toggleClass('added font-weight-bold text-success');
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
this.table.dataTable.draw();
|
|
36
|
-
// find removed
|
|
37
|
-
const removedLength = this.table.dataTable.rows('.removed')[0].length;
|
|
38
|
-
// find added
|
|
39
|
-
const addedLength = this.table.dataTable.rows('.added')[0].length;
|
|
40
|
-
// and emit event
|
|
41
|
-
const items = this.table.dataTable.rows().data();
|
|
42
|
-
this.table.load.emit({
|
|
43
|
-
data: items,
|
|
44
|
-
recordsFiltered: items.length - removedLength,
|
|
45
|
-
recordsTotal: items.length - removedLength,
|
|
46
|
-
});
|
|
47
|
-
this.dirty = (removedLength > 0 || addedLength > 0);
|
|
48
|
-
this.dirtyChange.emit(this.dirty);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Marks rows as removed rows
|
|
52
|
-
*/
|
|
53
|
-
remove(...removeItems) {
|
|
54
|
-
if (this.table == null) {
|
|
55
|
-
throw new AdvancedTableNotNullError();
|
|
56
|
-
}
|
|
57
|
-
// get key
|
|
58
|
-
const key = this.table.config.columns[0].property || this.table.config.columns[0].name;
|
|
59
|
-
// loop items
|
|
60
|
-
for (const element of removeItems) {
|
|
61
|
-
const tr = this.table.dataTable.rows(':has(input[data-id="' + element[key] + '"])').nodes().to$();
|
|
62
|
-
// if row is marked as added
|
|
63
|
-
if (tr.hasClass('added')) {
|
|
64
|
-
// remove this dirty row
|
|
65
|
-
this.table.dataTable.rows(tr).remove();
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
// otherwise unmarked row
|
|
69
|
-
tr.toggleClass('removed text-gray-400 text-decoration-line-through');
|
|
70
|
-
}
|
|
71
|
-
// check if item is selected
|
|
72
|
-
const selectedIndex = this.table.selected.findIndex((item) => {
|
|
73
|
-
return item[key] === element[key];
|
|
74
|
-
});
|
|
75
|
-
// and remove it from selected collection
|
|
76
|
-
if (selectedIndex >= 0) {
|
|
77
|
-
this.table.selected.splice(selectedIndex, 1);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// re-draw table
|
|
81
|
-
this.table.dataTable.draw();
|
|
82
|
-
// get number of table items
|
|
83
|
-
const items = this.table.dataTable.rows().data();
|
|
84
|
-
// get number of removed items
|
|
85
|
-
const removedLength = this.table.dataTable.rows('.removed')[0].length;
|
|
86
|
-
// get number of added items
|
|
87
|
-
const addedLength = this.table.dataTable.rows('.added')[0].length;
|
|
88
|
-
// refresh
|
|
89
|
-
this.table.load.emit({
|
|
90
|
-
data: items,
|
|
91
|
-
recordsFiltered: items.length - removedLength,
|
|
92
|
-
recordsTotal: items.length - removedLength,
|
|
93
|
-
});
|
|
94
|
-
this.dirty = (removedLength > 0 || addedLength > 0);
|
|
95
|
-
this.dirtyChange.emit(this.dirty);
|
|
96
|
-
}
|
|
97
|
-
set(items) {
|
|
98
|
-
if (this.table == null) {
|
|
99
|
-
throw new AdvancedTableNotNullError();
|
|
100
|
-
}
|
|
101
|
-
// clear rows
|
|
102
|
-
this.table.selected = [];
|
|
103
|
-
this.table.dataTable.clear();
|
|
104
|
-
// set items
|
|
105
|
-
this.table.dataTable.rows.add(items).draw();
|
|
106
|
-
this.table.load.emit({
|
|
107
|
-
data: items,
|
|
108
|
-
recordsFiltered: items.length,
|
|
109
|
-
recordsTotal: items.length,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Undo changes
|
|
114
|
-
*/
|
|
115
|
-
undo() {
|
|
116
|
-
if (this.table == null) {
|
|
117
|
-
throw new AdvancedTableNotNullError();
|
|
118
|
-
}
|
|
119
|
-
// reset removed rows
|
|
120
|
-
this.table.dataTable.rows('.removed').nodes().to$().toggleClass('removed text-gray-400 text-decoration-line-through');
|
|
121
|
-
// remove added rows
|
|
122
|
-
this.table.dataTable.rows('.added').remove();
|
|
123
|
-
// clear selected items
|
|
124
|
-
this.table.selected = [];
|
|
125
|
-
const items = this.table.dataTable.rows().data();
|
|
126
|
-
this.table.dataTable.draw();
|
|
127
|
-
this.table.load.emit({
|
|
128
|
-
data: items,
|
|
129
|
-
recordsFiltered: items.length,
|
|
130
|
-
recordsTotal: items.length,
|
|
131
|
-
});
|
|
132
|
-
this.dirty = false;
|
|
133
|
-
this.dirtyChange.emit(this.dirty);
|
|
134
|
-
}
|
|
135
|
-
rows() {
|
|
136
|
-
if (this.table == null) {
|
|
137
|
-
throw new AdvancedTableNotNullError();
|
|
138
|
-
}
|
|
139
|
-
return Array.from(this.table.dataTable.rows(':not(.removed)').data());
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
AdvancedTableEditorDirective.decorators = [
|
|
143
|
-
{ type: Directive, args: [{
|
|
144
|
-
// tslint:disable-next-line: directive-selector
|
|
145
|
-
selector: '[tableEditor]',
|
|
146
|
-
},] }
|
|
147
|
-
];
|
|
148
|
-
/** @nocollapse */
|
|
149
|
-
AdvancedTableEditorDirective.ctorParameters = () => [
|
|
150
|
-
{ type: AdvancedTableComponent }
|
|
151
|
-
];
|
|
152
|
-
AdvancedTableEditorDirective.propDecorators = {
|
|
153
|
-
dirtyChange: [{ type: Output }]
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUtZWRpdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2FkdmFuY2VkLXRhYmxlLWVkaXRvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUNoQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUUvRixNQUFNLGdDQUFpQyxTQUFRLEtBQUs7SUFDbEQ7UUFDRSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFRRCxNQUFNO0lBS0osWUFBb0IsS0FBNkI7UUFBN0IsVUFBSyxHQUFMLEtBQUssQ0FBd0I7UUFIMUMsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNKLGdCQUFXLEdBQTBCLElBQUksWUFBWSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBR3JGLEVBQUU7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxHQUFHLENBQUMsR0FBRyxRQUFlO1FBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxJQUFJLHlCQUF5QixFQUFFLENBQUM7U0FDdkM7UUFDRCxpQkFBaUI7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZGLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzlCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxz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QUFFLENBQUM7UUFDN0MsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSSxFQUFFLEtBQUs7WUFDWCxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDN0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNO1NBQzNCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxJQUFJLHlCQUF5QixFQUFFLENBQUM7U0FDdkM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDOzs7WUE5SUYsU0FBUyxTQUNUO2dCQUNFLCtDQUErQztnQkFDL0MsUUFBUSxFQUFFLGVBQWU7YUFDMUI7Ozs7WUFaTyxzQkFBc0I7OzswQkFpQjVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsIE91dHB1dCwgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFkdmFuY2VkVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlTm90TnVsbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignQWR2YW5jZWQgdGFibGUgY29tcG9uZW50IGNhbm5vdCBiZSBlbXB0eSBhdCB0aGlzIGNvbnRleHQuJyk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZShcbiB7XG4gICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRpcmVjdGl2ZS1zZWxlY3RvclxuICAgc2VsZWN0b3I6ICdbdGFibGVFZGl0b3JdJyxcbiB9LFxuKVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVGFibGVFZGl0b3JEaXJlY3RpdmUge1xuXG4gIHB1YmxpYyBkaXJ0eSA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcHVibGljIGRpcnR5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhYmxlOiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50KSB7XG4gICAgLy9cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcm93cyB0byB0YWJsZSBhbmQgbWFyayB0aGVtIGFzIGFkZGVkIHJvd3NcbiAgICovXG4gIHB1YmxpYyBhZGQoLi4uYWRkSXRlbXM6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEFkdmFuY2VkVGFibGVOb3ROdWxsRXJyb3IoKTtcbiAgICB9XG4gICAgLy8gZGVjb3JhdGUgaXRlbXNcbiAgICBjb25zdCBrZXkgPSB0aGlzLnRhYmxlLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMudGFibGUuY29uZmlnLmNvbHVtbnNbMF0ubmFtZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWRkSXRlbXMpIHtcbiAgICAgIGxldCB0ciA9IHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoJzpoYXMoaW5wdXRbZGF0YS1pZD1cIicgKyBlbGVtZW50W2tleV0gKyAnXCJdKScpLm5vZGVzKCkudG8kKCk7XG4gICAgICBpZiAodHIuaGFzQ2xhc3MoJ3JlbW92ZWQnKSkge1xuICAgICAgICB0ci50b2dnbGVDbGFzcygncmVtb3ZlZCB0ZXh0LWdyYXktNDAwIHRleHQtZGVjb3JhdGlvbi1saW5lLXRocm91Z2gnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MuYWRkKFtlbGVtZW50XSk7XG4gICAgICAgIHRyID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnOmhhcyhpbnB1dFtkYXRhLWlkPVwiJyArIGVsZW1lbnRba2V5XSArICdcIl0pJykubm9kZXMoKS50byQoKTtcbiAgICAgICAgdHIudG9nZ2xlQ2xhc3MoJ2FkZGVkIGZvbnQtd2VpZ2h0LWJvbGQgdGV4dC1zdWNjZXNzJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICAvLyBmaW5kIHJlbW92ZWRcbiAgICBjb25zdCByZW1vdmVkTGVuZ3RoID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnLnJlbW92ZWQnKVswXS5sZW5ndGg7XG4gICAgLy8gZmluZCBhZGRlZFxuICAgIGNvbnN0IGFkZGVkTGVuZ3RoID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnLmFkZGVkJylbMF0ubGVuZ3RoO1xuICAgIC8vIGFuZCBlbWl0IGV2ZW50XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCkuZGF0YSgpO1xuICAgIHRoaXMudGFibGUubG9hZC5lbWl0KHtcbiAgICAgIGRhdGE6IGl0ZW1zLFxuICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy5sZW5ndGggLSByZW1vdmVkTGVuZ3RoLFxuICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy5sZW5ndGggLSByZW1vdmVkTGVuZ3RoLFxuICAgIH0pO1xuICAgIHRoaXMuZGlydHkgPSAocmVtb3ZlZExlbmd0aCA+IDAgfHwgYWRkZWRMZW5ndGggPiAwKTtcbiAgICB0aGlzLmRpcnR5Q2hhbmdlLmVtaXQodGhpcy5kaXJ0eSk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3Mgcm93cyBhcyByZW1vdmVkIHJvd3NcbiAgICovXG4gIHB1YmxpYyByZW1vdmUoLi4ucmVtb3ZlSXRlbXM6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEFkdmFuY2VkVGFibGVOb3ROdWxsRXJyb3IoKTtcbiAgICB9XG4gICAgLy8gZ2V0IGtleVxuICAgIGNvbnN0IGtleSA9IHRoaXMudGFibGUuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHkgfHwgdGhpcy50YWJsZS5jb25maWcuY29sdW1uc1swXS5uYW1lO1xuICAgIC8vIGxvb3AgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVtb3ZlSXRlbXMpIHtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCc6aGFzKGlucHV0W2RhdGEtaWQ9XCInICsgZWxlbWVudFtrZXldICsgJ1wiXSknKS5ub2RlcygpLnRvJCgpO1xuICAgICAgICAvLyBpZiByb3cgaXMgbWFya2VkIGFzIGFkZGVkXG4gICAgICAgIGlmICh0ci5oYXNDbGFzcygnYWRkZWQnKSkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGlzIGRpcnR5IHJvd1xuICAgICAgICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3ModHIpLnJlbW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSB1bm1hcmtlZCByb3dcbiAgICAgICAgICB0ci50b2dnbGVDbGFzcygncmVtb3ZlZCB0ZXh0LWdyYXktNDAwIHRleHQtZGVjb3JhdGlvbi1saW5lLXRocm91Z2gnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBpZiBpdGVtIGlzIHNlbGVjdGVkXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSB0aGlzLnRhYmxlLnNlbGVjdGVkLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtW2tleV0gPT09IGVsZW1lbnRba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFuZCByZW1vdmUgaXQgZnJvbSBzZWxlY3RlZCBjb2xsZWN0aW9uXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGlzLnRhYmxlLnNlbGVjdGVkLnNwbGljZShzZWxlY3RlZEluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gcmUtZHJhdyB0YWJsZVxuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICAgIC8vIGdldCBudW1iZXIgb2YgdGFibGUgaXRlbXNcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCk7XG4gICAgICAvLyBnZXQgbnVtYmVyIG9mIHJlbW92ZWQgaXRlbXNcbiAgICBjb25zdCByZW1vdmVkTGVuZ3RoID0gdGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnLnJlbW92ZWQnKVswXS5sZW5ndGg7XG4gICAgICAvLyBnZXQgbnVtYmVyIG9mIGFkZGVkIGl0ZW1zXG4gICAgY29uc3QgYWRkZWRMZW5ndGggPSB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCcuYWRkZWQnKVswXS5sZW5ndGg7XG4gICAgICAvLyByZWZyZXNoXG4gICAgdGhpcy50YWJsZS5sb2FkLmVtaXQoe1xuICAgICAgICBkYXRhOiBpdGVtcyxcbiAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy5sZW5ndGggLSByZW1vdmVkTGVuZ3RoLFxuICAgICAgICByZWNvcmRzVG90YWw6IGl0ZW1zLmxlbmd0aCAtIHJlbW92ZWRMZW5ndGgsXG4gICAgICB9KTtcbiAgICB0aGlzLmRpcnR5ID0gKHJlbW92ZWRMZW5ndGggPiAwIHx8IGFkZGVkTGVuZ3RoID4gMCk7XG4gICAgdGhpcy5kaXJ0eUNoYW5nZS5lbWl0KHRoaXMuZGlydHkpO1xuICB9XG5cbiAgcHVibGljIHNldChpdGVtczogYW55W10pIHtcbiAgICBpZiAodGhpcy50YWJsZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgQWR2YW5jZWRUYWJsZU5vdE51bGxFcnJvcigpO1xuICAgIH1cbiAgICAvLyBjbGVhciByb3dzXG4gICAgdGhpcy50YWJsZS5zZWxlY3RlZCA9IFtdO1xuICAgIHRoaXMudGFibGUuZGF0YVRhYmxlLmNsZWFyKCk7XG4gICAgLy8gc2V0IGl0ZW1zXG4gICAgdGhpcy50YWJsZS5kYXRhVGFibGUucm93cy5hZGQoaXRlbXMpLmRyYXcoKTtcbiAgICB0aGlzLnRhYmxlLmxvYWQuZW1pdCh7XG4gICAgICBkYXRhOiBpdGVtcyxcbiAgICAgIHJlY29yZHNGaWx0ZXJlZDogaXRlbXMubGVuZ3RoLFxuICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgdW5kbygpIHtcbiAgICBpZiAodGhpcy50YWJsZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgQWR2YW5jZWRUYWJsZU5vdE51bGxFcnJvcigpO1xuICAgIH1cbiAgICAvLyByZXNldCByZW1vdmVkIHJvd3NcbiAgICB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCcucmVtb3ZlZCcpLm5vZGVzKCkudG8kKCkudG9nZ2xlQ2xhc3MoJ3JlbW92ZWQgdGV4dC1ncmF5LTQwMCB0ZXh0LWRlY29yYXRpb24tbGluZS10aHJvdWdoJyk7XG4gICAgLy8gcmVtb3ZlIGFkZGVkIHJvd3NcbiAgICB0aGlzLnRhYmxlLmRhdGFUYWJsZS5yb3dzKCcuYWRkZWQnKS5yZW1vdmUoKTtcbiAgICAvLyBjbGVhciBzZWxlY3RlZCBpdGVtc1xuICAgIHRoaXMudGFibGUuc2VsZWN0ZWQgPSBbXTtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFibGUuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCk7XG4gICAgdGhpcy50YWJsZS5kYXRhVGFibGUuZHJhdygpO1xuICAgIHRoaXMudGFibGUubG9hZC5lbWl0KHtcbiAgICAgIGRhdGE6IGl0ZW1zLFxuICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy5sZW5ndGgsXG4gICAgICByZWNvcmRzVG90YWw6IGl0ZW1zLmxlbmd0aCxcbiAgICB9KTtcbiAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgdGhpcy5kaXJ0eUNoYW5nZS5lbWl0KHRoaXMuZGlydHkpO1xuICB9XG5cbiAgcHVibGljIHJvd3MoKSB7XG4gICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEFkdmFuY2VkVGFibGVOb3ROdWxsRXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50YWJsZS5kYXRhVGFibGUucm93cygnOm5vdCgucmVtb3ZlZCknKS5kYXRhKCkpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import * as tslib_1 from "tslib";
|
|
2
|
-
import { Directive, HostListener } from '@angular/core';
|
|
3
|
-
import { ActivatedTableService } from '../tables.activated-table.service';
|
|
4
|
-
import { AngularDataContext } from '@themost/angular';
|
|
5
|
-
import { ConfigurationService, ErrorService, LoadingService } from '@universis/common';
|
|
6
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
7
|
-
import { ResponseError } from '@themost/client';
|
|
8
|
-
export const MAX_EXPORT_ITEMS = 500;
|
|
9
|
-
export class BtnExpDirective {
|
|
10
|
-
constructor(_activatedTable, _context, _config, _translate, _loadingService, _errorService) {
|
|
11
|
-
this._activatedTable = _activatedTable;
|
|
12
|
-
this._context = _context;
|
|
13
|
-
this._config = _config;
|
|
14
|
-
this._translate = _translate;
|
|
15
|
-
this._loadingService = _loadingService;
|
|
16
|
-
this._errorService = _errorService;
|
|
17
|
-
}
|
|
18
|
-
clickEvent(event) {
|
|
19
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
20
|
-
event.preventDefault();
|
|
21
|
-
event.stopPropagation();
|
|
22
|
-
if (this._activatedTable.activeTable) {
|
|
23
|
-
return this._activatedTable.activeTable.exportView();
|
|
24
|
-
/*
|
|
25
|
-
const lastQuery = this._activatedTable.activeTable.lastQuery;
|
|
26
|
-
const tableConfig = this._activatedTable.activeTable.config;
|
|
27
|
-
const serviceHeaders = this._context.getService().getHeaders();
|
|
28
|
-
const queryModel = lastQuery.getModel();
|
|
29
|
-
let query = this._context.model(queryModel).asQueryable();
|
|
30
|
-
const queryParams = lastQuery.getParams();
|
|
31
|
-
query = this.constructQuery(query, queryParams, tableConfig, serviceHeaders);
|
|
32
|
-
// get export settings
|
|
33
|
-
const exportSettings = this._config.settings as ExportLimitConfiguration;
|
|
34
|
-
// get export limit
|
|
35
|
-
const maxExportItems = exportSettings && exportSettings.tables && exportSettings.tables.exportLimit;
|
|
36
|
-
if (maxExportItems && typeof maxExportItems === 'number' && maxExportItems > 0) {
|
|
37
|
-
query.skip(0).take(maxExportItems);
|
|
38
|
-
} else {
|
|
39
|
-
query.skip(0).take(MAX_EXPORT_ITEMS);
|
|
40
|
-
}
|
|
41
|
-
// This constructs the URI based on the way @themost does
|
|
42
|
-
const url = this.constructURL(query);
|
|
43
|
-
this.downloadFile(url, query.getService().getHeaders(), query.getModel()); */
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Sets the parameters to the query based on
|
|
49
|
-
* the active filters of the activated table
|
|
50
|
-
* @param {ClientDataQueryable} query
|
|
51
|
-
* @param params: The filters of the last query of the activated table
|
|
52
|
-
* @return ClientDataQueryable
|
|
53
|
-
*/
|
|
54
|
-
setParams(query, params) {
|
|
55
|
-
if (params && typeof params === 'object') {
|
|
56
|
-
Object.keys(params).forEach((key) => {
|
|
57
|
-
query.setParam(key, params[key]);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
return query;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Sets the headers to the query based on
|
|
64
|
-
* the default headers of the DataContext
|
|
65
|
-
* and appending the accept header to get
|
|
66
|
-
* an xlsx file from the API
|
|
67
|
-
* @param {ClientDataQueryable} query
|
|
68
|
-
* @param {Headers} headers: The headers to append to the query
|
|
69
|
-
* @return ClientDataQueryable
|
|
70
|
-
*/
|
|
71
|
-
setHeaders(query, headers) {
|
|
72
|
-
Object.keys(headers).forEach((key) => {
|
|
73
|
-
if (headers.hasOwnProperty(key)) {
|
|
74
|
-
query.getService().setHeader(key, headers[key]);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
// sets a header to accept xlsx files
|
|
78
|
-
query.getService().setHeader('Accept', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
|
79
|
-
return query;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Constructs the select parameter of the
|
|
83
|
-
* ClientDataQuery by replacing the target name
|
|
84
|
-
* of the field based on the localized translation
|
|
85
|
-
* of that property on the advanced tabled
|
|
86
|
-
* @param {ClientDataQueryable} query
|
|
87
|
-
* @param tableConfig: The configuration of the activated table
|
|
88
|
-
* @return ClientDataQueryable
|
|
89
|
-
*/
|
|
90
|
-
constructQueryParam(query, tableConfig) {
|
|
91
|
-
let selectQuery = query.getParams().$select;
|
|
92
|
-
let selectQueryArray = selectQuery.split(',');
|
|
93
|
-
selectQueryArray = selectQueryArray.map((select) => {
|
|
94
|
-
const words = select.split(' ');
|
|
95
|
-
if (words.length === 3) {
|
|
96
|
-
if (tableConfig && tableConfig.columns) {
|
|
97
|
-
for (const column of tableConfig.columns) {
|
|
98
|
-
if (column.property === words[2] && column.title) {
|
|
99
|
-
words[2] = `"${this._translate.instant(column.title)}"`;
|
|
100
|
-
}
|
|
101
|
-
else if (column.property === words[2]) {
|
|
102
|
-
words[2] = `"${this._translate.instant(words[2])}"`;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
if (words.length === 1) {
|
|
108
|
-
if (tableConfig && tableConfig.columns) {
|
|
109
|
-
for (const column of tableConfig.columns) {
|
|
110
|
-
if (column.name === words[0] && column.title) {
|
|
111
|
-
words[0] = `${words[0]} as "${this._translate.instant(column.title)}"`;
|
|
112
|
-
break;
|
|
113
|
-
}
|
|
114
|
-
else if (column.name === words[0] && column.property) {
|
|
115
|
-
words[0] = `${words[0]} as "${this._translate.instant(column.property)}"`;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
else if (words[0] === column.name && words[0] === "id" && column.hidden) {
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
else if (words[0] == column.name || words[0] === column.property) {
|
|
122
|
-
words[0] = `${words[0]} as "${this._translate.instant(words[0])}"`;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return words[0];
|
|
127
|
-
}
|
|
128
|
-
return words.join(' ');
|
|
129
|
-
});
|
|
130
|
-
selectQuery = selectQueryArray.join(',');
|
|
131
|
-
query.setParam('$select', selectQuery);
|
|
132
|
-
return query;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Constructs the fetch URL based the query parameters
|
|
136
|
-
* @param {ClientDataQueryable} query
|
|
137
|
-
* @return String
|
|
138
|
-
*/
|
|
139
|
-
constructURL(query) {
|
|
140
|
-
const baseURL = query.getService().getBase();
|
|
141
|
-
let url = baseURL.endsWith('/') ? (baseURL + query.getModel() + '?') : (baseURL + '/' + query.getModel() + '?');
|
|
142
|
-
Object.keys(query.getParams()).forEach((key, index) => {
|
|
143
|
-
if (index === 0) {
|
|
144
|
-
url += key + '=' + query.getParams()[key];
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
url += '&' + key + '=' + query.getParams()[key];
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
return url;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Constructs the query by setting the parameters of the
|
|
154
|
-
* advanced table's active filters, sets the necessary headers
|
|
155
|
-
* and build the select parameter of the query
|
|
156
|
-
* @param {ClientDataQueryable} query
|
|
157
|
-
* @param params: The filters of the last query of the activated table
|
|
158
|
-
* @param tableConfig: The configuration of the activated table
|
|
159
|
-
* @param {Headers} headers: The headers to append to the query
|
|
160
|
-
* @return ClientDataQueryable
|
|
161
|
-
*/
|
|
162
|
-
constructQuery(query, params, tableConfig, headers) {
|
|
163
|
-
let _query = this.setParams(query, params);
|
|
164
|
-
_query = this.setHeaders(_query, headers);
|
|
165
|
-
_query = this.constructQueryParam(_query, tableConfig);
|
|
166
|
-
return _query;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Fetches and saves the xlsx file
|
|
170
|
-
* @param {String} url
|
|
171
|
-
* @param {Headers} serviceHeaders: The headers to append to the query
|
|
172
|
-
* @param modelName: The model name of the advanced table
|
|
173
|
-
*/
|
|
174
|
-
downloadFile(url, serviceHeaders, modelName) {
|
|
175
|
-
this._loadingService.showLoading();
|
|
176
|
-
fetch(encodeURI(url), {
|
|
177
|
-
headers: serviceHeaders,
|
|
178
|
-
credentials: 'include'
|
|
179
|
-
}).then(response => {
|
|
180
|
-
if (response && !response.ok) {
|
|
181
|
-
throw new ResponseError(response.statusText, response.status);
|
|
182
|
-
}
|
|
183
|
-
return response.blob();
|
|
184
|
-
}).then(blob => {
|
|
185
|
-
const objectUrl = window.URL.createObjectURL(blob);
|
|
186
|
-
const a = document.createElement('a');
|
|
187
|
-
document.body.appendChild(a);
|
|
188
|
-
a.setAttribute('style', 'display: none');
|
|
189
|
-
a.href = objectUrl;
|
|
190
|
-
const downloadName = `${modelName}.xlsx`;
|
|
191
|
-
a.download = downloadName;
|
|
192
|
-
// this adds support for IE and MS Edge (up to version 44.19041)
|
|
193
|
-
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
|
|
194
|
-
window.navigator.msSaveOrOpenBlob(blob, downloadName);
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
// for all other browsers
|
|
198
|
-
a.click();
|
|
199
|
-
}
|
|
200
|
-
window.URL.revokeObjectURL(objectUrl);
|
|
201
|
-
a.remove();
|
|
202
|
-
this._loadingService.hideLoading();
|
|
203
|
-
}).catch(err => {
|
|
204
|
-
this._loadingService.hideLoading();
|
|
205
|
-
this._errorService.showError(err, {
|
|
206
|
-
continueLink: '.'
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
BtnExpDirective.decorators = [
|
|
212
|
-
{ type: Directive, args: [{
|
|
213
|
-
selector: '.universis-btn-export'
|
|
214
|
-
},] }
|
|
215
|
-
];
|
|
216
|
-
/** @nocollapse */
|
|
217
|
-
BtnExpDirective.ctorParameters = () => [
|
|
218
|
-
{ type: ActivatedTableService },
|
|
219
|
-
{ type: AngularDataContext },
|
|
220
|
-
{ type: ConfigurationService },
|
|
221
|
-
{ type: TranslateService },
|
|
222
|
-
{ type: LoadingService },
|
|
223
|
-
{ type: ErrorService }
|
|
224
|
-
];
|
|
225
|
-
BtnExpDirective.propDecorators = {
|
|
226
|
-
clickEvent: [{ type: HostListener, args: ['click', ['$event'],] }]
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnRuZXhwLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2J0bmV4cC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDckYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFzQixhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFXcEMsTUFBTTtJQUNKLFlBQW9CLGVBQXNDLEVBQ3RDLFFBQTRCLEVBQzVCLE9BQTZCLEVBQzdCLFVBQTRCLEVBQzVCLGVBQStCLEVBQy9CLGFBQTJCO1FBTDNCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUN0QyxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM1QixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQUM3QixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUM1QixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0Isa0JBQWEsR0FBYixhQUFhLENBQWM7SUFDL0MsQ0FBQztJQUdLLFVBQVUsQ0FBQyxLQUFLOztZQUNwQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BDLE9BQU8sSUFBSSxD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TUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDdkQ7aUJBQU07Z0JBQ0wseUJBQXlCO2dCQUN6QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDWDtZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLFlBQVksRUFBRSxHQUFHO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O1lBMU1GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2FBQ2xDOzs7O1lBakJPLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLGdCQUFnQjtZQURvQixjQUFjO1lBQTVCLFlBQVk7Ozt5QkF5QnZDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSG9zdExpc3RlbmVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkVGFibGVTZXJ2aWNlfSBmcm9tICcuLi90YWJsZXMuYWN0aXZhdGVkLXRhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHtBbmd1bGFyRGF0YUNvbnRleHR9IGZyb20gJ0B0aGVtb3N0L2FuZ3VsYXInO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uU2VydmljZSwgRXJyb3JTZXJ2aWNlLCBMb2FkaW5nU2VydmljZX0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Q2xpZW50RGF0YVF1ZXJ5YWJsZSwgUmVzcG9uc2VFcnJvcn0gZnJvbSAnQHRoZW1vc3QvY2xpZW50JztcbmltcG9ydCB7IFRhYmxlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjb25zdCBNQVhfRVhQT1JUX0lURU1TID0gNTAwO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRXhwb3J0TGltaXRDb25maWd1cmF0aW9uIHtcbiAgdGFibGVzPzoge1xuICAgIGV4cG9ydExpbWl0PzogbnVtYmVyXG4gIH07XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJy51bml2ZXJzaXMtYnRuLWV4cG9ydCdcbn0pXG5leHBvcnQgY2xhc3MgQnRuRXhwRGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYWN0aXZhdGVkVGFibGU6IEFjdGl2YXRlZFRhYmxlU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29udGV4dDogQW5ndWxhckRhdGFDb250ZXh0LFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb25maWc6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2xvYWRpbmdTZXJ2aWNlOiBMb2FkaW5nU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2UpIHtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgYXN5bmMgY2xpY2tFdmVudChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFRhYmxlLmFjdGl2ZVRhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUuZXhwb3J0VmlldygpO1xuICAgICAgLypcbiAgICAgIGNvbnN0IGxhc3RRdWVyeSA9IHRoaXMuX2FjdGl2YXRlZFRhYmxlLmFjdGl2ZVRhYmxlLmxhc3RRdWVyeTtcbiAgICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gdGhpcy5fYWN0aXZhdGVkVGFibGUuYWN0aXZlVGFibGUuY29uZmlnO1xuICAgICAgY29uc3Qgc2VydmljZUhlYWRlcnMgPSB0aGlzLl9jb250ZXh0LmdldFNlcnZpY2UoKS5nZXRIZWFkZXJzKCk7XG4gICAgICBjb25zdCBxdWVyeU1vZGVsID0gbGFzdFF1ZXJ5LmdldE1vZGVsKCk7XG4gICAgICBsZXQgcXVlcnkgPSB0aGlzLl9jb250ZXh0Lm1vZGVsKHF1ZXJ5TW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGxhc3RRdWVyeS5nZXRQYXJhbXMoKTtcbiAgICAgIHF1ZXJ5ID0gdGhpcy5jb25zdHJ1Y3RRdWVyeShxdWVyeSwgcXVlcnlQYXJhbXMsIHRhYmxlQ29uZmlnLCBzZXJ2aWNlSGVhZGVycyk7XG4gICAgICAvLyBnZXQgZXhwb3J0IHNldHRpbmdzXG4gICAgICBjb25zdCBleHBvcnRTZXR0aW5ncyA9IHRoaXMuX2NvbmZpZy5zZXR0aW5ncyBhcyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb247XG4gICAgICAvLyBnZXQgZXhwb3J0IGxpbWl0XG4gICAgICBjb25zdCBtYXhFeHBvcnRJdGVtcyA9IGV4cG9ydFNldHRpbmdzICYmIGV4cG9ydFNldHRpbmdzLnRhYmxlcyAmJiBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQ7XG4gICAgICBpZiAobWF4RXhwb3J0SXRlbXMgJiYgdHlwZW9mIG1heEV4cG9ydEl0ZW1zID09PSAnbnVtYmVyJyAmJiBtYXhFeHBvcnRJdGVtcyA+IDApIHtcbiAgICAgICAgcXVlcnkuc2tpcCgwKS50YWtlKG1heEV4cG9ydEl0ZW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5LnNraXAoMCkudGFrZShNQVhfRVhQT1JUX0lURU1TKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY29uc3RydWN0cyB0aGUgVVJJIGJhc2VkIG9uIHRoZSB3YXkgQHRoZW1vc3QgZG9lc1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5jb25zdHJ1Y3RVUkwocXVlcnkpO1xuICAgICAgdGhpcy5kb3dubG9hZEZpbGUodXJsLCBxdWVyeS5nZXRTZXJ2aWNlKCkuZ2V0SGVhZGVycygpLCBxdWVyeS5nZXRNb2RlbCgpKTsgKi9cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGFyYW1ldGVycyB0byB0aGUgcXVlcnkgYmFzZWQgb25cbiAgICogdGhlIGFjdGl2ZSBmaWx0ZXJzIG9mIHRoZSBhY3RpdmF0ZWQgdGFibGVcbiAgICogQHBhcmFtIHtDbGllbnREYXRhUXVlcnlhYmxlfSBxdWVyeVxuICAgKiBAcGFyYW0gcGFyYW1zOiBUaGUgZmlsdGVycyBvZiB0aGUgbGFzdCBxdWVyeSBvZiB0aGUgYWN0aXZhdGVkIHRhYmxlXG4gICAqIEByZXR1cm4gQ2xpZW50RGF0YVF1ZXJ5YWJsZVxuICAgKi9cbiAgc2V0UGFyYW1zKHF1ZXJ5OiBDbGllbnREYXRhUXVlcnlhYmxlLCBwYXJhbXMpOiBDbGllbnREYXRhUXVlcnlhYmxlIHtcbiAgICBpZiAocGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBxdWVyeS5zZXRQYXJhbShrZXksIHBhcmFtc1trZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgaGVhZGVycyB0byB0aGUgcXVlcnkgYmFzZWQgb25cbiAgICogdGhlIGRlZmF1bHQgaGVhZGVycyBvZiB0aGUgRGF0YUNvbnRleHRcbiAgICogYW5kIGFwcGVuZGluZyB0aGUgYWNjZXB0IGhlYWRlciB0byBnZXRcbiAgICogYW4geGxzeCBmaWxlIGZyb20gdGhlIEFQSVxuICAgKiBAcGFyYW0ge0NsaWVudERhdGFRdWVyeWFibGV9IHF1ZXJ5XG4gICAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyczogVGhlIGhlYWRlcnMgdG8gYXBwZW5kIHRvIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJuIENsaWVudERhdGFRdWVyeWFibGVcbiAgICovXG4gIHNldEhlYWRlcnMocXVlcnk6IENsaWVudERhdGFRdWVyeWFibGUsIGhlYWRlcnM6IEhlYWRlcnMpOiBDbGllbnREYXRhUXVlcnlhYmxlIHtcbiAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcXVlcnkuZ2V0U2VydmljZSgpLnNldEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gc2V0cyBhIGhlYWRlciB0byBhY2NlcHQgeGxzeCBmaWxlc1xuICAgIHF1ZXJ5LmdldFNlcnZpY2UoKS5zZXRIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzZWxlY3QgcGFyYW1ldGVyIG9mIHRoZVxuICAgKiBDbGllbnREYXRhUXVlcnkgYnkgcmVwbGFjaW5nIHRoZSB0YXJnZXQgbmFtZVxuICAgKiBvZiB0aGUgZmllbGQgYmFzZWQgb24gdGhlIGxvY2FsaXplZCB0cmFuc2xhdGlvblxuICAgKiBvZiB0aGF0IHByb3BlcnR5IG9uIHRoZSBhZHZhbmNlZCB0YWJsZWRcbiAgICogQHBhcmFtIHtDbGllbnREYXRhUXVlcnlhYmxlfSBxdWVyeVxuICAgKiBAcGFyYW0gdGFibGVDb25maWc6IFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBhY3RpdmF0ZWQgdGFibGVcbiAgICogQHJldHVybiBDbGllbnREYXRhUXVlcnlhYmxlXG4gICAqL1xuICBjb25zdHJ1Y3RRdWVyeVBhcmFtKHF1ZXJ5OiBDbGllbnREYXRhUXVlcnlhYmxlLCB0YWJsZUNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uKTogQ2xpZW50RGF0YVF1ZXJ5YWJsZSB7XG4gICAgbGV0IHNlbGVjdFF1ZXJ5ID0gcXVlcnkuZ2V0UGFyYW1zKCkuJHNlbGVjdDtcbiAgICBsZXQgc2VsZWN0UXVlcnlBcnJheSA9IHNlbGVjdFF1ZXJ5LnNwbGl0KCcsJyk7XG4gICAgc2VsZWN0UXVlcnlBcnJheSA9IHNlbGVjdFF1ZXJ5QXJyYXkubWFwKChzZWxlY3QpID0+IHtcbiAgICAgIGNvbnN0IHdvcmRzID0gc2VsZWN0LnNwbGl0KCcgJyk7XG4gICAgICBpZiAod29yZHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGlmICh0YWJsZUNvbmZpZyAmJiB0YWJsZUNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgICAgZm9yKGNvbnN0IGNvbHVtbiBvZiB0YWJsZUNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnByb3BlcnR5ID09PSB3b3Jkc1syXSAmJiBjb2x1bW4udGl0bGUpIHtcbiAgICAgICAgICAgICAgd29yZHNbMl0gPSBgXCIke3RoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGNvbHVtbi50aXRsZSl9XCJgO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucHJvcGVydHkgPT09IHdvcmRzWzJdKSB7XG4gICAgICAgICAgICAgIHdvcmRzWzJdID0gYFwiJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCh3b3Jkc1syXSl9XCJgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAod29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmICh0YWJsZUNvbmZpZyAmJiB0YWJsZUNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgICAgZm9yKGNvbnN0IGNvbHVtbiBvZiB0YWJsZUNvbmZpZy5jb2x1bW5zKXtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ubmFtZSA9PT0gd29yZHNbMF0gJiYgY29sdW1uLnRpdGxlKSB7XG4gICAgICAgICAgICAgIHdvcmRzWzBdID0gYCR7d29yZHNbMF19IGFzIFwiJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudChjb2x1bW4udGl0bGUpfVwiYDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5uYW1lID09PSB3b3Jkc1swXSAmJiBjb2x1bW4ucHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgd29yZHNbMF0gPSBgJHt3b3Jkc1swXX0gYXMgXCIke3RoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGNvbHVtbi5wcm9wZXJ0eSl9XCJgO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod29yZHNbMF0gPT09IGNvbHVtbi5uYW1lICYmIHdvcmRzWzBdPT09IFwiaWRcIiAmJiBjb2x1bW4uaGlkZGVuKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHdvcmRzWzBdID09IGNvbHVtbi5uYW1lIHx8IHdvcmRzWzBdPT09IGNvbHVtbi5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICB3b3Jkc1swXSA9IGAke3dvcmRzWzBdfSBhcyBcIiR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQod29yZHNbMF0pfVwiYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdvcmRzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmRzLmpvaW4oJyAnKTtcbiAgICB9KTtcbiAgICBzZWxlY3RRdWVyeSA9IHNlbGVjdFF1ZXJ5QXJyYXkuam9pbignLCcpO1xuICAgIHF1ZXJ5LnNldFBhcmFtKCckc2VsZWN0Jywgc2VsZWN0UXVlcnkgKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgZmV0Y2ggVVJMIGJhc2VkIHRoZSBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7Q2xpZW50RGF0YVF1ZXJ5YWJsZX0gcXVlcnlcbiAgICogQHJldHVybiBTdHJpbmdcbiAgICovXG4gIGNvbnN0cnVjdFVSTChxdWVyeSk6IFN0cmluZyB7XG4gICAgY29uc3QgYmFzZVVSTCA9IHF1ZXJ5LmdldFNlcnZpY2UoKS5nZXRCYXNlKCk7XG4gICAgbGV0IHVybCA9IGJhc2VVUkwuZW5kc1dpdGgoJy8nKSA/IChiYXNlVVJMICsgcXVlcnkuZ2V0TW9kZWwoKSArICc/JykgOiAoYmFzZVVSTCArICcvJyArIHF1ZXJ5LmdldE1vZGVsKCkgKyAnPycpO1xuICAgIE9iamVjdC5rZXlzKHF1ZXJ5LmdldFBhcmFtcygpKS5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgdXJsICs9IGtleSArICc9JyArIHF1ZXJ5LmdldFBhcmFtcygpW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwgKz0gJyYnICsga2V5ICsgJz0nICsgcXVlcnkuZ2V0UGFyYW1zKClba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIHF1ZXJ5IGJ5IHNldHRpbmcgdGhlIHBhcmFtZXRlcnMgb2YgdGhlXG4gICAqIGFkdmFuY2VkIHRhYmxlJ3MgYWN0aXZlIGZpbHRlcnMsIHNldHMgdGhlIG5lY2Vzc2FyeSBoZWFkZXJzXG4gICAqIGFuZCBidWlsZCB0aGUgc2VsZWN0IHBhcmFtZXRlciBvZiB0aGUgcXVlcnlcbiAgICogQHBhcmFtIHtDbGllbnREYXRhUXVlcnlhYmxlfSBxdWVyeVxuICAgKiBAcGFyYW0gcGFyYW1zOiBUaGUgZmlsdGVycyBvZiB0aGUgbGFzdCBxdWVyeSBvZiB0aGUgYWN0aXZhdGVkIHRhYmxlXG4gICAqIEBwYXJhbSB0YWJsZUNvbmZpZzogVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFjdGl2YXRlZCB0YWJsZVxuICAgKiBAcGFyYW0ge0hlYWRlcnN9IGhlYWRlcnM6IFRoZSBoZWFkZXJzIHRvIGFwcGVuZCB0byB0aGUgcXVlcnlcbiAgICogQHJldHVybiBDbGllbnREYXRhUXVlcnlhYmxlXG4gICAqL1xuICBjb25zdHJ1Y3RRdWVyeShxdWVyeSwgcGFyYW1zLCB0YWJsZUNvbmZpZywgaGVhZGVyczogSGVhZGVycykge1xuICAgIGxldCBfcXVlcnkgPSB0aGlzLnNldFBhcmFtcyhxdWVyeSwgcGFyYW1zKTtcbiAgICBfcXVlcnkgPSB0aGlzLnNldEhlYWRlcnMoX3F1ZXJ5LCBoZWFkZXJzKTtcbiAgICBfcXVlcnkgPSB0aGlzLmNvbnN0cnVjdFF1ZXJ5UGFyYW0oX3F1ZXJ5LCB0YWJsZUNvbmZpZyk7XG4gICAgcmV0dXJuIF9xdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuZCBzYXZlcyB0aGUgeGxzeCBmaWxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtIZWFkZXJzfSBzZXJ2aWNlSGVhZGVyczogVGhlIGhlYWRlcnMgdG8gYXBwZW5kIHRvIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0gbW9kZWxOYW1lOiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgYWR2YW5jZWQgdGFibGVcbiAgICovXG4gIGRvd25sb2FkRmlsZSh1cmwsIHNlcnZpY2VIZWFkZXJzOiBIZWFkZXJzLCBtb2RlbE5hbWUpIHtcbiAgICB0aGlzLl9sb2FkaW5nU2VydmljZS5zaG93TG9hZGluZygpO1xuICAgIGZldGNoKGVuY29kZVVSSSh1cmwpLCB7XG4gICAgICBoZWFkZXJzOiBzZXJ2aWNlSGVhZGVycyxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZSdcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiAhcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgfSkudGhlbihibG9iID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICBhLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZScpO1xuICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xuICAgICAgY29uc3QgZG93bmxvYWROYW1lID0gYCR7bW9kZWxOYW1lfS54bHN4YDtcbiAgICAgIGEuZG93bmxvYWQgPSBkb3dubG9hZE5hbWU7XG4gICAgICAvLyB0aGlzIGFkZHMgc3VwcG9ydCBmb3IgSUUgYW5kIE1TIEVkZ2UgKHVwIHRvIHZlcnNpb24gNDQuMTkwNDEpXG4gICAgICBpZiAod2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpIHtcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIGRvd25sb2FkTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmb3IgYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgICAgIGEuY2xpY2soKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgICBhLnJlbW92ZSgpO1xuICAgICAgdGhpcy5fbG9hZGluZ1NlcnZpY2UuaGlkZUxvYWRpbmcoKTtcbiAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgdGhpcy5fbG9hZGluZ1NlcnZpY2UuaGlkZUxvYWRpbmcoKTtcbiAgICAgIHRoaXMuX2Vycm9yU2VydmljZS5zaG93RXJyb3IoZXJyLCB7XG4gICAgICAgIGNvbnRpbnVlTGluazogJy4nXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// tslint:disable: quotemark
|
|
2
|
-
// tslint:disable: max-line-length
|
|
3
|
-
export const TABLES_EL = {
|
|
4
|
-
"Tables": {
|
|
5
|
-
"Export": "Εξαγωγή",
|
|
6
|
-
"More": "Περισσότερα",
|
|
7
|
-
"Search": "Αναζήτηση",
|
|
8
|
-
"SearchPlaceholder": "Αναζήτηση...",
|
|
9
|
-
"GroupBy": "Ομαδοποίηση ανά",
|
|
10
|
-
"NotDefined": "Μη προσδιορισμένο",
|
|
11
|
-
"DataTable": {
|
|
12
|
-
"paginate": {
|
|
13
|
-
"first": "Πρώτη σελίδα",
|
|
14
|
-
"last": "Τελεταία σελίδα",
|
|
15
|
-
"next": "Επόμενη",
|
|
16
|
-
"previous": "Προηγούμενη"
|
|
17
|
-
},
|
|
18
|
-
"info": "Εμφάνιση _START_ έως _END_ από _TOTAL_ εγγραφές",
|
|
19
|
-
"infoEmpty": "Δεν βρέθηκαν εγγραφές",
|
|
20
|
-
"loading": "Εμφάνιση δεδομένων...",
|
|
21
|
-
"processing": "Παραλαβή δεδομένων...",
|
|
22
|
-
"emptyTable": "Δεν βρέθηκαν αποτελέσματα."
|
|
23
|
-
},
|
|
24
|
-
"ColumnDisplay": "Επιλογή Εμφάνισης στηλών",
|
|
25
|
-
"ColumnDisplayInfo": "Επιλέξτε τις στήλες που θέλετε να εμφανίζονται.",
|
|
26
|
-
"Save": "Εφαρμογή",
|
|
27
|
-
"Apply": "Εφαρμογή",
|
|
28
|
-
"Cancel": "Ακύρωση",
|
|
29
|
-
"RecordsPerPage": "Εγγραφές ανά σελίδα",
|
|
30
|
-
"PageInfo": "{{start}}-{{end}} από {{recordsTotal}}",
|
|
31
|
-
"SearchListPlaceholder": "Αναζητήστε στη λίστα...",
|
|
32
|
-
"Filters": "Φίλτρα",
|
|
33
|
-
"All": "Όλα",
|
|
34
|
-
"AddItem": "Προσθήκη στοιχείου",
|
|
35
|
-
"EmptyTableTitle": "Δεν βρέθηκαν αποτελέσματα.",
|
|
36
|
-
"EmptyTableMessage": "Προσπαθήστε να χρησιμοποιήσετε άλλες λέξεις κλειδιά.",
|
|
37
|
-
"RemoveItem": "Διαγραφή στοιχείου",
|
|
38
|
-
"Items": "στοιχεία",
|
|
39
|
-
"Item": "στοιχείο",
|
|
40
|
-
"AddItemMessage": {
|
|
41
|
-
"title": "Προσθήκη στοιχείων",
|
|
42
|
-
"one": "Ένα νέο στοιχείο προστέθηκε με επιτυχία.",
|
|
43
|
-
"many": "{{value}} νέα στοιχεία προστέθηκαν με επιτυχία."
|
|
44
|
-
},
|
|
45
|
-
"RemoveItemMessage": {
|
|
46
|
-
"title": "Αφαίρεση στοιχείων",
|
|
47
|
-
"one": "Ένα στοιχείο αφαιρέθηκε με επιτυχία.",
|
|
48
|
-
"many": "{{value}} στοιχεία αφαιρέθηκαν με επιτυχία."
|
|
49
|
-
},
|
|
50
|
-
"RemoveItemsTitle": "Διαγραφή στοιχείου",
|
|
51
|
-
"RemoveItemsMessage": "Πρόκειται να διαγράψετε ένα ή περισσότερα στοιχεία. Θέλετε να προχωρήσετε?",
|
|
52
|
-
"SelectAll": "Επιλογή όλων",
|
|
53
|
-
"ClearSelection": "Αναίρεση επιλογής",
|
|
54
|
-
"Actions": {
|
|
55
|
-
"Label": "Επεξεργασία",
|
|
56
|
-
"Start": "Έναρξη",
|
|
57
|
-
"ActionMessage": {
|
|
58
|
-
"None": "Δεν έχετε επιλέξει κανένα στοιχείο που να ακολουθεί τις προϋποθέσεις της ενέργειας.",
|
|
59
|
-
"One": "Έχετε επιλέξει ένα στοιχείο που ακολουθεί τις προϋποθέσεις της ενέργειας. Πατήστε το πλήκτρο Έναρξη για να ξεκινήσει η διαδικασία.",
|
|
60
|
-
"Many": "Έχετε επιλέξει {{length}} στοιχεία που ακολουθούν τις προϋποθέσεις της ενέργειας. Πατήστε το πλήκτρο Έναρξη για να ξεκινήσει η διαδικασία."
|
|
61
|
-
},
|
|
62
|
-
"CompletedWithErrors": {
|
|
63
|
-
"Title": "Η διαδικασία ολοκληρώθηκε με σφάλματα.",
|
|
64
|
-
"Description": {
|
|
65
|
-
"One": "Ένα στοιχείο δεν ανανεώθηκε λόγω ενός σφάλματος που συνέβη κατά την εκτέλεση της διαδικασίας.",
|
|
66
|
-
"Many": "{{errors}} στοιχεία δεν ανανεώθηκαν λόγω ενός σφάλματος που συνέβη κατά την εκτέλεση της διαδικασίας."
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
"CompletedWithSuccess": {
|
|
70
|
-
"Title": "Η διαδικασία ολοκληρώθηκε με επιτυχία."
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
"SelectColumns": "Επιλογή στηλών",
|
|
74
|
-
"MoveUp": "Επάνω",
|
|
75
|
-
"MoveDown": "Κάτω",
|
|
76
|
-
"AddColumn": "Επιλογή",
|
|
77
|
-
"RemoveColumn": "Αφαίρεση",
|
|
78
|
-
"SelectColumnHelp": "Επιλέξτε μία ή περισσότερες από τις διαθέσιμες στήλες και πατήστε το πλήκτρο 'Επιλογή' για να τις εμφανίσετε. Χρησιμοποιήστε το πλήκτρο 'Αφαίρεση' για να αφαιρέσετε τις επιλεγμένες στήλες.",
|
|
79
|
-
"MoveColumnHelp": "Χρησιμοποιήστε τα πλήκτρα 'Επάνω' και 'Κάτω' για να αλλάξετε την σειρά εμφάνισης των στηλών του πίνακα.",
|
|
80
|
-
"UnknownColumn": "Άγνωστο",
|
|
81
|
-
"SelectColumn": "Επιλογή",
|
|
82
|
-
"ActionLinkColumn": "Ενέργειες",
|
|
83
|
-
"DataError": {
|
|
84
|
-
"Title": "Σφάλμα κατά την παραλαβή των δεδομένων",
|
|
85
|
-
"Message": "Συνέβη σφάλμα κατά την παραλαβή των δεδομένων. Προσπαθήστε ξανά ή τροποποιήστε τα στοιχεία αναζήτησης."
|
|
86
|
-
},
|
|
87
|
-
"ExportList": "Εξαγωγή λίστας",
|
|
88
|
-
"ExportLimitExceeded": "Το πλήθος των στοιχείων προς εξαγωγή ({{dataLength}}) ξεπερνάει το μέγιστο επιτρεπτό ({{exportLimit}}). Παρακαλούμε προσαρμόστε τα φίλτρα της αναζήτησης και προσπαθήστε ξανά.",
|
|
89
|
-
"ExportResults": "Δεδομένα λίστας"
|
|
90
|
-
},
|
|
91
|
-
"TrueFalse": {
|
|
92
|
-
"long": {
|
|
93
|
-
"Yes": "Ναι",
|
|
94
|
-
"No": "Όχι"
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
"Settings": {
|
|
98
|
-
"OperationCompleted": "Η διαδικασία ολοκληρώθηκε με επιτυχία."
|
|
99
|
-
},
|
|
100
|
-
"AdvancedSearch": {
|
|
101
|
-
"Choose": "<Επιλέξτε μια αναζήτηση>",
|
|
102
|
-
"ChooseDate": "Επιλογή ημερομηνίας",
|
|
103
|
-
"SavedSearches": "Αποθηκευμένες αναζητήσεις",
|
|
104
|
-
"ToggleDropdown": "Εμφάνιση λίστας",
|
|
105
|
-
"SaveCurrentSearch": "Αποθήκευση αναζήτησης",
|
|
106
|
-
"SaveAs": "Αποθήκευση ως",
|
|
107
|
-
"Save": "Αποθήκευση",
|
|
108
|
-
"Delete": "Διαγραφή",
|
|
109
|
-
"More": "Περισσότερα",
|
|
110
|
-
"Less": "Λιγότερα",
|
|
111
|
-
"Modal": {
|
|
112
|
-
"Title": "Αποθήκευση κριτηρίων αναζήτησης",
|
|
113
|
-
"Help": "Ορίστε έναν τίτλο για τα επιλεγμένα κριτήρια αναζήτησης. Αυτός ο τίτλος θα σας βοηθήσει να τα χρησιμοποιήσετε ξανά στο μέλλον.",
|
|
114
|
-
"TitleOnUserError": "Παρακαλώ εισάγετε έναν τίτλο",
|
|
115
|
-
"TitleOnListAlreadyCreated": "Το όνομα αυτό χρησιμοποιείται ήδη. Διαλέξτε ένα διαφορετικό.",
|
|
116
|
-
"NoListDefined": "Δεν έχει οριστεί το σημείο αποθήκευσης της λίστας",
|
|
117
|
-
"EmptyCriteriaList": "Δεν έχετε καθορίσει κανένα κριτήριο για αποθήκευση",
|
|
118
|
-
"SaveNameLabel": "Ονομασία λίστας",
|
|
119
|
-
"SaveNamePlaceholder": "Εισάγετε έναν τίτλο",
|
|
120
|
-
"Accept": "Αποθήκευση",
|
|
121
|
-
"Decline": "Απόρριψη",
|
|
122
|
-
"Close": "Κλείσιμο"
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
"AddItems": {
|
|
126
|
-
"SelectItems": "Επιλέξτε στοιχεία",
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVzLmVsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2kxOG4vdGFibGVzLmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixrQ0FBa0M7QUFDbEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHO0lBQ3JCLFFBQVEsRUFBRTtRQUNOLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE1BQU0sRUFBRSxhQUFhO1FBQ3JCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLG1CQUFtQixFQUFFLGNBQWM7UUFDbkMsU0FBUyxFQUFFLGlCQUFpQjtRQUM1QixZQUFZLEVBQUUsbUJBQW1CO1FBQ2pDLFdBQVcsRUFBRTtZQUNULFVBQVUsRUFBRTtnQkFDUixPQUFPLEVBQUUsY0FBYztnQkFDdkIsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLFVBQVUsRUFBRSxhQUFhO2FBQzVCO1lBQ0QsTUFBTSxFQUFFLGlEQUFpRDtZQUN6RCxXQUFXLEVBQUUsdUJBQXVCO1lBQ3BDLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsWUFBWSxFQUFFLHVCQUF1QjtZQUNyQyxZQUFZLEVBQUUsNEJBQTRCO1NBQzdDO1FBQ0gsZUFBZSxFQUFFLDBCQUEwQjtRQUMzQyxtQkFBbUIsRUFBRSxpREFBaUQ7UUFDdEUsTUFBTSxFQUFFLFVBQVU7UUFDbEIsT0FBTyxFQUFFLFVBQVU7UUFDbkIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsZ0JBQWdCLEVBQUUscUJBQXFCO1FBQ3ZDLFVBQVUsRUFBRSx3Q0FBd0M7UUFDcEQsdUJBQXVCLEVBQUUseUJBQXlCO1FBQ2xELFNBQVMsRUFBRSxRQUFRO1FBQ25CLEtBQUssRUFBRSxLQUFLO1FBQ1YsU0FBUyxFQUFFLG9CQUFvQjtRQUMvQixpQkFBaUIsRUFBRSw0QkFBNEI7UUFDL0MsbUJBQW1CLEVBQUUsc0RBQXNEO1FBQzNFLFlBQVksRUFBRSxvQkFBb0I7UUFDbEMsT0FBTyxFQUFFLFVBQVU7UUFDbkIsTUFBTSxFQUFFLFVBQVU7UUFDbEIsZ0JBQWdCLEVBQUU7WUFDZCxPQUFPLEVBQUUsb0JBQW9CO1lBQzdCLEtBQUssRUFBRSwwQ0FBMEM7WUFDakQsTUFBTSxFQUFFLGlEQUFpRDtTQUMxRDtRQUNILG1CQUFtQixFQUFFO1lBQ2pCLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsS0FBSyxFQUFFLHNDQUFzQztZQUM3QyxNQUFNLEVBQUUsNkNBQTZDO1NBQ3hEO1FBQ0Qsa0JBQWtCLEVBQUUsb0JBQW9CO1FBQ3hDLG9CQUFvQixFQUFFLDRFQUE0RTtRQUNsRyxXQUFXLEVBQUUsY0FBYztRQUMzQixnQkFBZ0IsRUFBRSxtQkFBbUI7UUFDdkMsU0FBUyxFQUFFO1lBQ1QsT0FBTyxFQUFFLGFBQWE7WUFDdEIsT0FBTyxFQUFFLFFBQVE7WUFDakIsZUFBZSxFQUFFO2dCQUNmLE1BQU0sRUFBRSxxRkFBcUY7Z0JBQzdGLEtBQUssRUFBRSxvSUFBb0k7Z0JBQzNJLE1BQU0sRUFBRSw0SUFBNEk7YUFDcko7WUFDRCxxQkFBcUIsRUFBRTtnQkFDckIsT0FBTyxFQUFFLHdDQUF3QztnQkFDakQsYUFBYSxFQUFFO29CQUNiLEtBQUssRUFBRSwrRkFBK0Y7b0JBQ3RHLE1BQU0sRUFBRSx1R0FBdUc7aUJBQ2hIO2FBQ0Y7WUFDRCxzQkFBc0IsRUFBRTtnQkFDdEIsT0FBTyxFQUFFLHdDQUF3QzthQUNsRDtTQUNGO1FBQ0QsZUFBZSxFQUFFLGdCQUFnQjtRQUNqQyxRQUFRLEVBQUUsT0FBTztRQUNqQixVQUFVLEVBQUUsTUFBTTtRQUNsQixXQUFXLEVBQUUsU0FBUztRQUN0QixjQUFjLEVBQUUsVUFBVTtRQUMxQixrQkFBa0IsRUFBRSw4TEFBOEw7UUFDbE4sZ0JBQWdCLEVBQUUseUdBQXlHO1FBQzNILGVBQWUsRUFBRSxTQUFTO1FBQzFCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLGtCQUFrQixFQUFFLFdBQVc7UUFDL0IsV0FBVyxFQUFFO1lBQ1gsT0FBTyxFQUFFLHdDQUF3QztZQUNqRCxTQUFTLEVBQUUsd0dBQXdHO1NBQ3BIO1FBQ0QsWUFBWSxFQUFFLGdCQUFnQjtRQUM5QixxQkFBcUIsRUFBRSxnTEFBZ0w7UUFDdk0sZUFBZSxFQUFFLGlCQUFpQjtLQUNuQztJQUNELFdBQVcsRUFBRTtRQUNULE1BQU0sRUFBRTtZQUNKLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLEtBQUs7U0FDZDtLQUNKO0lBQ0QsVUFBVSxFQUFFO1FBQ1Ysb0JBQW9CLEVBQUUsd0NBQXdDO0tBQy9EO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDZCxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLFlBQVksRUFBRSxxQkFBcUI7UUFDbkMsZUFBZSxFQUFFLDJCQUEyQjtRQUM1QyxnQkFBZ0IsRUFBRyxpQkFBaUI7UUFDcEMsbUJBQW1CLEVBQUUsdUJBQXVCO1FBQzVDLFFBQVEsRUFBRyxlQUFlO1FBQzFCLE1BQU0sRUFBRyxZQUFZO1FBQ3JCLFFBQVEsRUFBRyxVQUFVO1FBQ3JCLE1BQU0sRUFBRSxhQUFhO1FBQ3JCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU8sRUFBRztZQUNOLE9BQU8sRUFBRyxpQ0FBaUM7WUFDM0MsTUFBTSxFQUFHLGdJQUFnSTtZQUN6SSxrQkFBa0IsRUFBRyw4QkFBOEI7WUFDbkQsMkJBQTJCLEVBQUcsOERBQThEO1lBQzVGLGVBQWUsRUFBRyxtREFBbUQ7WUFDckUsbUJBQW1CLEVBQUcsb0RBQW9EO1lBQzFFLGVBQWUsRUFBRyxpQkFBaUI7WUFDbkMscUJBQXFCLEVBQUcscUJBQXFCO1lBQzdDLFFBQVEsRUFBRyxZQUFZO1lBQ3ZCLFNBQVMsRUFBRyxVQUFVO1lBQ3RCLE9BQU8sRUFBRyxVQUFVO1NBQ3ZCO0tBQ0o7SUFDRCxVQUFVLEVBQUc7UUFDWCxhQUFhLEVBQUUsbUJBQW1CO0tBQ25DO0NBQ0osQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOiBxdW90ZW1hcmtcbi8vIHRzbGludDpkaXNhYmxlOiBtYXgtbGluZS1sZW5ndGhcbmV4cG9ydCBjb25zdCBUQUJMRVNfRUwgPSB7XG4gICAgXCJUYWJsZXNcIjoge1xuICAgICAgICBcIkV4cG9ydFwiOiBcIs6Vzr7Osc6zz4nOs86uXCIsXG4gICAgICAgIFwiTW9yZVwiOiBcIs6gzrXPgc65z4PPg8+Mz4TOtc+BzrFcIixcbiAgICAgICAgXCJTZWFyY2hcIjogXCLOkc69zrHOts6uz4TOt8+DzrdcIixcbiAgICAgICAgXCJTZWFyY2hQbGFjZWhvbGRlclwiOiBcIs6Rzr3Osc62zq7PhM63z4POty4uLlwiLFxuICAgICAgICBcIkdyb3VwQnlcIjogXCLOn868zrHOtM6/z4DOv86vzrfPg863IM6xzr3OrFwiLFxuICAgICAgICBcIk5vdERlZmluZWRcIjogXCLOnM63IM+Az4HOv8+DzrTOuc6/z4HOuc+DzrzOrc69zr9cIixcbiAgICAgICAgXCJEYXRhVGFibGVcIjoge1xuICAgICAgICAgICAgXCJwYWdpbmF0ZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaXJzdFwiOiBcIs6gz4HPjs+Ezrcgz4POtc67zq/OtM6xXCIsXG4gICAgICAgICAgICAgICAgXCJsYXN0XCI6IFwizqTOtc67zrXPhM6xzq/OsSDPg861zrvOr860zrFcIixcbiAgICAgICAgICAgICAgICBcIm5leHRcIjogXCLOlc+Az4zOvM61zr3Ot1wiLFxuICAgICAgICAgICAgICAgIFwicHJldmlvdXNcIjogXCLOoM+Bzr/Ot86zzr/Pjc68zrXOvc63XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImluZm9cIjogXCLOlc68z4bOrM69zrnPg863IF9TVEFSVF8gzq3Pic+CIF9FTkRfIM6xz4DPjCBfVE9UQUxfIM61zrPOs8+BzrHPhs6tz4JcIixcbiAgICAgICAgICAgIFwiaW5mb0VtcHR5XCI6IFwizpTOtc69IM6yz4HOrc64zrfOus6xzr0gzrXOs86zz4HOsc+Gzq3PglwiLFxuICAgICAgICAgICAgXCJsb2FkaW5nXCI6IFwizpXOvM+GzqzOvc65z4POtyDOtM61zrTOv868zq3Ovc+Jzr0uLi5cIixcbiAgICAgICAgICAgIFwicHJvY2Vzc2luZ1wiOiBcIs6gzrHPgc6xzrvOsc6yzq4gzrTOtc60zr/OvM6tzr3Pic69Li4uXCIsXG4gICAgICAgICAgICBcImVtcHR5VGFibGVcIjogXCLOlM61zr0gzrLPgc6tzrjOt866zrHOvSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEuXCJcbiAgICAgICAgfSxcbiAgICAgIFwiQ29sdW1uRGlzcGxheVwiOiBcIs6Vz4DOuc67zr/Os86uIM6VzrzPhs6szr3Ouc+DzrfPgiDPg8+EzrfOu8+Ozr1cIixcbiAgICAgIFwiQ29sdW1uRGlzcGxheUluZm9cIjogXCLOlc+AzrnOu86tzr7PhM61IM+EzrnPgiDPg8+Ezq7Ou861z4Igz4DOv8+FIM64zq3Ou861z4TOtSDOvc6xIM61zrzPhs6xzr3Or862zr/Ovc+EzrHOuS5cIixcbiAgICAgIFwiU2F2ZVwiOiBcIs6Vz4bOsc+BzrzOv86zzq5cIixcbiAgICAgIFwiQXBwbHlcIjogXCLOlc+GzrHPgc68zr/Os86uXCIsXG4gICAgICBcIkNhbmNlbFwiOiBcIs6RzrrPjc+Bz4nPg863XCIsXG4gICAgICBcIlJlY29yZHNQZXJQYWdlXCI6IFwizpXOs86zz4HOsc+Gzq3PgiDOsc69zqwgz4POtc67zq/OtM6xXCIsXG4gICAgICBcIlBhZ2VJbmZvXCI6IFwie3tzdGFydH19LXt7ZW5kfX0gzrHPgM+MIHt7cmVjb3Jkc1RvdGFsfX1cIixcbiAgICAgIFwiU2VhcmNoTGlzdFBsYWNlaG9sZGVyXCI6IFwizpHOvc6xzrbOt8+Ezq7Pg8+EzrUgz4PPhM63IM67zq/Pg8+EzrEuLi5cIixcbiAgICAgIFwiRmlsdGVyc1wiOiBcIs6mzq/Ou8+Ez4HOsVwiLFxuICAgICAgXCJBbGxcIjogXCLOjM67zrFcIixcbiAgICAgICAgXCJBZGRJdGVtXCI6IFwizqDPgc6/z4POuM6uzrrOtyDPg8+Ezr/Ouc+HzrXOr86/z4VcIixcbiAgICAgICAgXCJFbXB0eVRhYmxlVGl0bGVcIjogXCLOlM61zr0gzrLPgc6tzrjOt866zrHOvSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEuXCIsXG4gICAgICAgIFwiRW1wdHlUYWJsZU1lc3NhZ2VcIjogXCLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM69zrEgz4fPgc63z4POuc68zr/PgM6/zrnOrs+DzrXPhM61IM6szrvOu861z4IgzrvOrc6+zrXOuc+CIM66zrvOtc65zrTOuc6sLlwiLFxuICAgICAgICBcIlJlbW92ZUl0ZW1cIjogXCLOlM65zrHOs8+BzrHPhs6uIM+Dz4TOv865z4fOtc6vzr/PhVwiLFxuICAgICAgICBcIkl0ZW1zXCI6IFwiz4PPhM6/zrnPh861zq/OsVwiLFxuICAgICAgICBcIkl0ZW1cIjogXCLPg8+Ezr/Ouc+HzrXOr86/XCIsXG4gICAgICAgIFwiQWRkSXRlbU1lc3NhZ2VcIjoge1xuICAgICAgICAgICAgXCJ0aXRsZVwiOiBcIs6gz4HOv8+DzrjOrs66zrcgz4PPhM6/zrnPh861zq/Pic69XCIsXG4gICAgICAgICAgICBcIm9uZVwiOiBcIs6Izr3OsSDOvc6tzr8gz4PPhM6/zrnPh861zq/OvyDPgM+Bzr/Pg8+Ezq3OuM63zrrOtSDOvM61IM61z4DOuc+Ez4XPh86vzrEuXCIsXG4gICAgICAgICAgICBcIm1hbnlcIjogXCJ7e3ZhbHVlfX0gzr3Orc6xIM+Dz4TOv865z4fOtc6vzrEgz4DPgc6/z4PPhM6tzrjOt866zrHOvSDOvM61IM61z4DOuc+Ez4XPh86vzrEuXCJcbiAgICAgICAgICB9LFxuICAgICAgICBcIlJlbW92ZUl0ZW1NZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwidGl0bGVcIjogXCLOkc+GzrHOr8+BzrXPg863IM+Dz4TOv865z4fOtc6vz4nOvVwiLFxuICAgICAgICAgICAgXCJvbmVcIjogXCLOiM69zrEgz4PPhM6/zrnPh861zq/OvyDOsc+GzrHOuc+Bzq3OuM63zrrOtSDOvM61IM61z4DOuc+Ez4XPh86vzrEuXCIsXG4gICAgICAgICAgICBcIm1hbnlcIjogXCJ7e3ZhbHVlfX0gz4PPhM6/zrnPh861zq/OsSDOsc+GzrHOuc+Bzq3OuM63zrrOsc69IM68zrUgzrXPgM65z4TPhc+Hzq/OsS5cIlxuICAgICAgICB9LFxuICAgICAgICBcIlJlbW92ZUl0ZW1zVGl0bGVcIjogXCLOlM65zrHOs8+BzrHPhs6uIM+Dz4TOv865z4fOtc6vzr/PhVwiLFxuICAgICAgICBcIlJlbW92ZUl0ZW1zTWVzc2FnZVwiOiBcIs6gz4HPjM66zrXOuc+EzrHOuSDOvc6xIM60zrnOsc6zz4HOrM+IzrXPhM61IM6tzr3OsSDOriDPgM61z4HOuc+Dz4PPjM+EzrXPgc6xIM+Dz4TOv865z4fOtc6vzrEuIM6Yzq3Ou861z4TOtSDOvc6xIM+Az4HOv8+Hz4nPgc6uz4POtc+EzrU/XCIsXG4gICAgICAgIFwiU2VsZWN0QWxsXCI6IFwizpXPgM65zrvOv86zzq4gz4zOu8+Jzr1cIixcbiAgICAgICAgXCJDbGVhclNlbGVjdGlvblwiOiBcIs6Rzr3Osc6vz4HOtc+DzrcgzrXPgM65zrvOv86zzq7PglwiLFxuICAgICAgXCJBY3Rpb25zXCI6IHtcbiAgICAgICAgXCJMYWJlbFwiOiBcIs6Vz4DOtc6+zrXPgc6zzrHPg86vzrFcIixcbiAgICAgICAgXCJTdGFydFwiOiBcIs6Izr3Osc+Bzr7Ot1wiLFxuICAgICAgICBcIkFjdGlvbk1lc3NhZ2VcIjoge1xuICAgICAgICAgIFwiTm9uZVwiOiBcIs6UzrXOvSDOrc+HzrXPhM61IM61z4DOuc67zq3Ovs61zrkgzrrOsc69zq3Ovc6xIM+Dz4TOv865z4fOtc6vzr8gz4DOv8+FIM69zrEgzrHOus6/zrvOv8+FzrjOtc6vIM+EzrnPgiDPgM+Bzr/Pi8+Azr/OuM6tz4POtc65z4Igz4TOt8+CIM61zr3Orc+BzrPOtc65zrHPgi5cIixcbiAgICAgICAgICBcIk9uZVwiOiBcIs6Iz4fOtc+EzrUgzrXPgM65zrvOrc6+zrXOuSDOrc69zrEgz4PPhM6/zrnPh861zq/OvyDPgM6/z4UgzrHOus6/zrvOv8+FzrjOtc6vIM+EzrnPgiDPgM+Bzr/Pi8+Azr/OuM6tz4POtc65z4Igz4TOt8+CIM61zr3Orc+BzrPOtc65zrHPgi4gzqDOsc+Ezq7Pg8+EzrUgz4TOvyDPgM67zq7Ous+Ez4HOvyDOiM69zrHPgc6+zrcgzrPOuc6xIM69zrEgzr7Otc66zrnOvc6uz4POtc65IM63IM60zrnOsc60zrnOus6xz4POr86xLlwiLFxuICAgICAgICAgIFwiTWFueVwiOiBcIs6Iz4fOtc+EzrUgzrXPgM65zrvOrc6+zrXOuSB7e2xlbmd0aH19IM+Dz4TOv865z4fOtc6vzrEgz4DOv8+FIM6xzrrOv867zr/Phc64zr/Pjc69IM+EzrnPgiDPgM+Bzr/Pi8+Azr/OuM6tz4POtc65z4Igz4TOt8+CIM61zr3Orc+BzrPOtc65zrHPgi4gzqDOsc+Ezq7Pg8+EzrUgz4TOvyDPgM67zq7Ous+Ez4HOvyDOiM69zrHPgc6+zrcgzrPOuc6xIM69zrEgzr7Otc66zrnOvc6uz4POtc65IM63IM60zrnOsc60zrnOus6xz4POr86xLlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiQ29tcGxldGVkV2l0aEVycm9yc1wiOiB7XG4gICAgICAgICAgXCJUaXRsZVwiOiBcIs6XIM60zrnOsc60zrnOus6xz4POr86xIM6/zrvOv866zrvOt8+Bz47OuM63zrrOtSDOvM61IM+Dz4bOrM67zrzOsc+EzrEuXCIsXG4gICAgICAgICAgXCJEZXNjcmlwdGlvblwiOiB7XG4gICAgICAgICAgICBcIk9uZVwiOiBcIs6Izr3OsSDPg8+Ezr/Ouc+HzrXOr86/IM60zrXOvSDOsc69zrHOvc61z47OuM63zrrOtSDOu8+MzrPPiSDOtc69z4zPgiDPg8+GzqzOu868zrHPhM6/z4Igz4DOv8+FIM+Dz4XOvc6tzrLOtyDOus6xz4TOrCDPhM63zr0gzrXOus+Ezq3Ou861z4POtyDPhM63z4IgzrTOuc6xzrTOuc66zrHPg86vzrHPgi5cIixcbiAgICAgICAgICAgIFwiTWFueVwiOiBcInt7ZXJyb3JzfX0gz4PPhM6/zrnPh861zq/OsSDOtM61zr0gzrHOvc6xzr3Otc+OzrjOt866zrHOvSDOu8+MzrPPiSDOtc69z4zPgiDPg8+GzqzOu868zrHPhM6/z4Igz4DOv8+FIM+Dz4XOvc6tzrLOtyDOus6xz4TOrCDPhM63zr0gzrXOus+Ezq3Ou861z4POtyDPhM63z4IgzrTOuc6xzrTOuc66zrHPg86vzrHPgi5cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJDb21wbGV0ZWRXaXRoU3VjY2Vzc1wiOiB7XG4gICAgICAgICAgXCJUaXRsZVwiOiBcIs6XIM60zrnOsc60zrnOus6xz4POr86xIM6/zrvOv866zrvOt8+Bz47OuM63zrrOtSDOvM61IM61z4DOuc+Ez4XPh86vzrEuXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiU2VsZWN0Q29sdW1uc1wiOiBcIs6Vz4DOuc67zr/Os86uIM+Dz4TOt867z47OvVwiLFxuICAgICAgXCJNb3ZlVXBcIjogXCLOlc+AzqzOvc+JXCIsXG4gICAgICBcIk1vdmVEb3duXCI6IFwizprOrM+Ez4lcIixcbiAgICAgIFwiQWRkQ29sdW1uXCI6IFwizpXPgM65zrvOv86zzq5cIixcbiAgICAgIFwiUmVtb3ZlQ29sdW1uXCI6IFwizpHPhs6xzq/Pgc61z4POt1wiLFxuICAgICAgXCJTZWxlY3RDb2x1bW5IZWxwXCI6IFwizpXPgM65zrvOrc6+z4TOtSDOvM6vzrEgzq4gz4DOtc+BzrnPg8+Dz4zPhM61z4HOtc+CIM6xz4DPjCDPhM65z4IgzrTOuc6xzrjOrc+DzrnOvM61z4Igz4PPhM6uzrvOtc+CIM66zrHOuSDPgM6xz4TOrs+Dz4TOtSDPhM6/IM+AzrvOrs66z4TPgc6/ICfOlc+AzrnOu86/zrPOricgzrPOuc6xIM69zrEgz4TOuc+CIM61zrzPhs6xzr3Or8+DzrXPhM61LiDOp8+BzrfPg865zrzOv8+Azr/Ouc6uz4PPhM61IM+Ezr8gz4DOu86uzrrPhM+Bzr8gJ86Rz4bOsc6vz4HOtc+DzrcnIM6zzrnOsSDOvc6xIM6xz4bOsc65z4HOrc+DzrXPhM61IM+EzrnPgiDOtc+AzrnOu861zrPOvM6tzr3Otc+CIM+Dz4TOrs67zrXPgi5cIixcbiAgICAgIFwiTW92ZUNvbHVtbkhlbHBcIjogXCLOp8+BzrfPg865zrzOv8+Azr/Ouc6uz4PPhM61IM+EzrEgz4DOu86uzrrPhM+BzrEgJ86Vz4DOrM69z4knIM66zrHOuSAnzprOrM+Ez4knIM6zzrnOsSDOvc6xIM6xzrvOu86szr7Otc+EzrUgz4TOt869IM+DzrXOuc+BzqwgzrXOvM+GzqzOvc65z4POt8+CIM+Ez4nOvSDPg8+EzrfOu8+Ozr0gz4TOv8+FIM+Azq/Ovc6xzrrOsS5cIixcbiAgICAgIFwiVW5rbm93bkNvbHVtblwiOiBcIs6GzrPOvc+Jz4PPhM6/XCIsXG4gICAgICBcIlNlbGVjdENvbHVtblwiOiBcIs6Vz4DOuc67zr/Os86uXCIsXG4gICAgICBcIkFjdGlvbkxpbmtDb2x1bW5cIjogXCLOlc69zq3Pgc6zzrXOuc61z4JcIixcbiAgICAgIFwiRGF0YUVycm9yXCI6IHtcbiAgICAgICAgXCJUaXRsZVwiOiBcIs6jz4bOrM67zrzOsSDOus6xz4TOrCDPhM63zr0gz4DOsc+BzrHOu86xzrLOriDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69XCIsXG4gICAgICAgIFwiTWVzc2FnZVwiOiBcIs6jz4XOvc6tzrLOtyDPg8+GzqzOu868zrEgzrrOsc+Ezqwgz4TOt869IM+AzrHPgc6xzrvOsc6yzq4gz4TPic69IM60zrXOtM6/zrzOrc69z4nOvS4gzqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDOriDPhM+Bzr/PgM6/z4DOv865zq7Pg8+EzrUgz4TOsSDPg8+Ezr/Ouc+HzrXOr86xIM6xzr3Osc62zq7PhM63z4POt8+CLlwiXG4gICAgICB9LFxuICAgICAgXCJFeHBvcnRMaXN0XCI6IFwizpXOvs6xzrPPic6zzq4gzrvOr8+Dz4TOsc+CXCIsXG4gICAgICBcIkV4cG9ydExpbWl0RXhjZWVkZWRcIjogXCLOpM6/IM+AzrvOrs64zr/PgiDPhM+Jzr0gz4PPhM6/zrnPh861zq/Pic69IM+Az4HOv8+CIM61zr7Osc6zz4nOs86uICh7e2RhdGFMZW5ndGh9fSkgzr7Otc+AzrXPgc69zqzOtc65IM+Ezr8gzrzOrc6zzrnPg8+Ezr8gzrXPgM65z4TPgc61z4DPhM+MICh7e2V4cG9ydExpbWl0fX0pLiDOoM6xz4HOsc66zrHOu86/z43OvM61IM+Az4HOv8+DzrHPgc68z4zPg8+EzrUgz4TOsSDPhs6vzrvPhM+BzrEgz4TOt8+CIM6xzr3Osc62zq7PhM63z4POt8+CIM66zrHOuSDPgM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sLlwiLFxuICAgICAgXCJFeHBvcnRSZXN1bHRzXCI6IFwizpTOtc60zr/OvM6tzr3OsSDOu86vz4PPhM6xz4JcIlxuICAgIH0sXG4gICAgXCJUcnVlRmFsc2VcIjoge1xuICAgICAgICBcImxvbmdcIjoge1xuICAgICAgICAgICAgXCJZZXNcIjogXCLOnc6xzrlcIixcbiAgICAgICAgICAgIFwiTm9cIjogXCLOjM+HzrlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIlNldHRpbmdzXCI6IHtcbiAgICAgIFwiT3BlcmF0aW9uQ29tcGxldGVkXCI6IFwizpcgzrTOuc6xzrTOuc66zrHPg86vzrEgzr/Ou86/zrrOu863z4HPjs64zrfOus61IM68zrUgzrXPgM65z4TPhc+Hzq/OsS5cIlxuICAgIH0sXG4gICAgXCJBZHZhbmNlZFNlYXJjaFwiOiB7XG4gICAgICAgIFwiQ2hvb3NlXCI6IFwiPM6Vz4DOuc67zq3Ovs+EzrUgzrzOuc6xIM6xzr3Osc62zq7PhM63z4POtz5cIixcbiAgICAgICAgXCJDaG9vc2VEYXRlXCI6IFwizpXPgM65zrvOv86zzq4gzrfOvM61z4HOv868zrfOvc6vzrHPglwiLFxuICAgICAgICBcIlNhdmVkU2VhcmNoZXNcIjogXCLOkc+Azr/OuM63zrrOtc+FzrzOrc69zrXPgiDOsc69zrHOts63z4TOrs+DzrXOuc+CXCIsXG4gICAgICAgIFwiVG9nZ2xlRHJvcGRvd25cIiA6IFwizpXOvM+GzqzOvc65z4POtyDOu86vz4PPhM6xz4JcIixcbiAgICAgICAgXCJTYXZlQ3VycmVudFNlYXJjaFwiOiBcIs6Rz4DOv864zq7Ous61z4XPg863IM6xzr3Osc62zq7PhM63z4POt8+CXCIsXG4gICAgICAgIFwiU2F2ZUFzXCIgOiBcIs6Rz4DOv864zq7Ous61z4XPg863IM+Jz4JcIixcbiAgICAgICAgXCJTYXZlXCIgOiBcIs6Rz4DOv864zq7Ous61z4XPg863XCIsXG4gICAgICAgIFwiRGVsZXRlXCIgOiBcIs6UzrnOsc6zz4HOsc+Gzq5cIixcbiAgICAgICAgXCJNb3JlXCI6IFwizqDOtc+BzrnPg8+Dz4zPhM61z4HOsVwiLFxuICAgICAgICBcIkxlc3NcIjogXCLOm865zrPPjM+EzrXPgc6xXCIsXG4gICAgICAgIFwiTW9kYWxcIiA6IHtcbiAgICAgICAgICAgIFwiVGl0bGVcIiA6IFwizpHPgM6/zrjOrs66zrXPhc+DzrcgzrrPgc65z4TOt8+Bzq/Pic69IM6xzr3Osc62zq7PhM63z4POt8+CXCIsXG4gICAgICAgICAgICBcIkhlbHBcIiA6IFwizp/Pgc6vz4PPhM61IM6tzr3Osc69IM+Ezq/PhM67zr8gzrPOuc6xIM+EzrEgzrXPgM65zrvOtc6zzrzOrc69zrEgzrrPgc65z4TOrs+BzrnOsSDOsc69zrHOts6uz4TOt8+DzrfPgi4gzpHPhc+Ez4zPgiDOvyDPhM6vz4TOu86/z4IgzrjOsSDPg86xz4IgzrLOv863zrjOrs+DzrXOuSDOvc6xIM+EzrEgz4fPgc63z4POuc68zr/PgM6/zrnOrs+DzrXPhM61IM6+zrHOvc6sIM+Dz4TOvyDOvM6tzrvOu86/zr0uXCIsXG4gICAgICAgICAgICBcIlRpdGxlT25Vc2VyRXJyb3JcIiA6IFwizqDOsc+BzrHOus6xzrvPjiDOtc65z4POrM6zzrXPhM61IM6tzr3Osc69IM+Ezq/PhM67zr9cIixcbiAgICAgICAgICAgIFwiVGl0bGVPbkxpc3RBbHJlYWR5Q3JlYXRlZFwiIDogXCLOpM6/IM+Mzr3Ov868zrEgzrHPhc+Ez4wgz4fPgc63z4POuc68zr/PgM6/zrnOtc6vz4TOsc65IM6uzrTOty4gzpTOuc6xzrvOrc6+z4TOtSDOrc69zrEgzrTOuc6xz4bOv8+BzrXPhM65zrrPjC5cIixcbiAgICAgICAgICAgIFwiTm9MaXN0RGVmaW5lZFwiIDogXCLOlM61zr0gzq3Ph861zrkgzr/Pgc65z4PPhM61zq8gz4TOvyDPg863zrzOtc6vzr8gzrHPgM6/zrjOrs66zrXPhc+DzrfPgiDPhM63z4IgzrvOr8+Dz4TOsc+CXCIsXG4gICAgICAgICAgICBcIkVtcHR5Q3JpdGVyaWFMaXN0XCIgOiBcIs6UzrXOvSDOrc+HzrXPhM61IM66zrHOuM6/z4HOr8+DzrXOuSDOus6xzr3Orc69zrEgzrrPgc65z4TOrs+BzrnOvyDOs865zrEgzrHPgM6/zrjOrs66zrXPhc+DzrdcIixcbiAgICAgICAgICAgIFwiU2F2ZU5hbWVMYWJlbFwiIDogXCLOn869zr/OvM6xz4POr86xIM67zq/Pg8+EzrHPglwiLFxuICAgICAgICAgICAgXCJTYXZlTmFtZVBsYWNlaG9sZGVyXCIgOiBcIs6VzrnPg86szrPOtc+EzrUgzq3Ovc6xzr0gz4TOr8+EzrvOv1wiLFxuICAgICAgICAgICAgXCJBY2NlcHRcIiA6IFwizpHPgM6/zrjOrs66zrXPhc+DzrdcIixcbiAgICAgICAgICAgIFwiRGVjbGluZVwiIDogXCLOkc+Az4zPgc+BzrnPiM63XCIsXG4gICAgICAgICAgICBcIkNsb3NlXCIgOiBcIs6azrvOtc6vz4POuc68zr9cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIkFkZEl0ZW1zXCIgOiB7XG4gICAgICBcIlNlbGVjdEl0ZW1zXCI6IFwizpXPgM65zrvOrc6+z4TOtSDPg8+Ezr/Ouc+HzrXOr86xXCIsXG4gICAgfVxufVxuIl19
|