@one-paragon/angular-utilities 0.1.31 → 0.1.32-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +12 -12
  2. package/action-state/action-state-ui/action-state-ui.module.d.ts +9 -9
  3. package/action-state/index.d.ts +4 -4
  4. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +8 -8
  5. package/action-state/ngrx.d.ts +31 -31
  6. package/esm2020/action-state/action-state-spinner/action-state-spinner.component.mjs +23 -23
  7. package/esm2020/action-state/action-state-ui/action-state-ui.module.mjs +28 -28
  8. package/esm2020/action-state/index.mjs +8 -8
  9. package/esm2020/action-state/ngrx-ext/ngrx-ext.module.mjs +23 -23
  10. package/esm2020/action-state/ngrx.mjs +42 -42
  11. package/esm2020/http-request-state/HttpRequestStateFactory.mjs +26 -26
  12. package/esm2020/http-request-state/HttpRequestStateStore.mjs +96 -96
  13. package/esm2020/http-request-state/directives/HttpStateDirectiveBase.mjs +33 -33
  14. package/esm2020/http-request-state/directives/http-error-state-directive.mjs +28 -28
  15. package/esm2020/http-request-state/directives/http-inProgress-state-directive.mjs +28 -28
  16. package/esm2020/http-request-state/directives/http-notStarted-state-directive.mjs +28 -28
  17. package/esm2020/http-request-state/directives/http-success-state-directive.mjs +33 -33
  18. package/esm2020/http-request-state/directives/index.mjs +5 -5
  19. package/esm2020/http-request-state/directives/request-state-directive.mjs +59 -59
  20. package/esm2020/http-request-state/helpers.mjs +21 -21
  21. package/esm2020/http-request-state/http-request-state.mjs +38 -38
  22. package/esm2020/http-request-state/http-state-module.mjs +40 -40
  23. package/esm2020/http-request-state/index.mjs +6 -6
  24. package/esm2020/http-request-state/rxjs/getRequestorBody.mjs +3 -3
  25. package/esm2020/http-request-state/rxjs/getRequestorState.mjs +2 -2
  26. package/esm2020/http-request-state/rxjs/index.mjs +4 -4
  27. package/esm2020/http-request-state/rxjs/tapError.mjs +11 -11
  28. package/esm2020/http-request-state/rxjs/tapSuccess.mjs +11 -11
  29. package/esm2020/http-request-state/types.mjs +15 -15
  30. package/esm2020/ngrx/actionable-selector.mjs +75 -75
  31. package/esm2020/ngrx/index.mjs +1 -1
  32. package/esm2020/one-paragon-angular-utilities.mjs +4 -4
  33. package/esm2020/public-api.mjs +19 -19
  34. package/esm2020/rxjs/defaultShareReplay.mjs +6 -6
  35. package/esm2020/rxjs/index.mjs +5 -5
  36. package/esm2020/rxjs/mapError.mjs +7 -7
  37. package/esm2020/rxjs/rxjs-operators.mjs +91 -91
  38. package/esm2020/rxjs/subjectifier.mjs +15 -15
  39. package/esm2020/table-builder/classes/DefaultSettings.mjs +6 -6
  40. package/esm2020/table-builder/classes/GenericTableDataSource.mjs +13 -13
  41. package/esm2020/table-builder/classes/MatTableObservableDataSource.mjs +41 -21
  42. package/esm2020/table-builder/classes/TableBuilderConfig.mjs +3 -3
  43. package/esm2020/table-builder/classes/TableState.mjs +31 -31
  44. package/esm2020/table-builder/classes/data-filter.mjs +26 -26
  45. package/esm2020/table-builder/classes/display-col.mjs +1 -1
  46. package/esm2020/table-builder/classes/filter-info.mjs +73 -73
  47. package/esm2020/table-builder/classes/table-builder-general-settings.mjs +67 -67
  48. package/esm2020/table-builder/classes/table-builder.mjs +76 -76
  49. package/esm2020/table-builder/classes/table-store.mjs +292 -292
  50. package/esm2020/table-builder/components/array-column.component.mjs +32 -32
  51. package/esm2020/table-builder/components/column-builder/column-builder.component.mjs +112 -112
  52. package/esm2020/table-builder/components/date-filter/date-filter.component.mjs +25 -25
  53. package/esm2020/table-builder/components/date-time-filter/date-time-filter.component.mjs +22 -22
  54. package/esm2020/table-builder/components/filter/filter.component.mjs +54 -54
  55. package/esm2020/table-builder/components/filter/in-list/in-list-filter.component.mjs +79 -79
  56. package/esm2020/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +45 -45
  57. package/esm2020/table-builder/components/generic-table/generic-table.component.mjs +204 -202
  58. package/esm2020/table-builder/components/generic-table/paginator.component.mjs +60 -60
  59. package/esm2020/table-builder/components/group-by-list/group-by-list.component.mjs +22 -22
  60. package/esm2020/table-builder/components/header-menu/header-menu.component.mjs +90 -90
  61. package/esm2020/table-builder/components/in-filter/in-filter.component.mjs +63 -63
  62. package/esm2020/table-builder/components/index.mjs +10 -10
  63. package/esm2020/table-builder/components/initialization-component/initialization-component.mjs +33 -33
  64. package/esm2020/table-builder/components/link-column.component.mjs +30 -30
  65. package/esm2020/table-builder/components/number-filter/number-filter.component.mjs +26 -26
  66. package/esm2020/table-builder/components/sort-menu/sort-menu.component-store.mjs +41 -41
  67. package/esm2020/table-builder/components/sort-menu/sort-menu.component.mjs +75 -75
  68. package/esm2020/table-builder/components/table-container/table-container.mjs +322 -322
  69. package/esm2020/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +42 -42
  70. package/esm2020/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +30 -30
  71. package/esm2020/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +24 -24
  72. package/esm2020/table-builder/directives/custom-cell-directive.mjs +58 -58
  73. package/esm2020/table-builder/directives/index.mjs +6 -6
  74. package/esm2020/table-builder/directives/multi-sort.directive.mjs +42 -42
  75. package/esm2020/table-builder/directives/resize-column.directive.mjs +85 -85
  76. package/esm2020/table-builder/directives/table-wrapper.directive.mjs +26 -26
  77. package/esm2020/table-builder/directives/tb-filter.directive.mjs +403 -403
  78. package/esm2020/table-builder/enums/filterTypes.mjs +72 -72
  79. package/esm2020/table-builder/functions/boolean-filter-function.mjs +9 -9
  80. package/esm2020/table-builder/functions/date-filter-function.mjs +58 -58
  81. package/esm2020/table-builder/functions/download-data.mjs +11 -11
  82. package/esm2020/table-builder/functions/null-filter-function.mjs +7 -7
  83. package/esm2020/table-builder/functions/number-filter-function.mjs +31 -31
  84. package/esm2020/table-builder/functions/sort-data-function.mjs +4 -4
  85. package/esm2020/table-builder/functions/string-filter-function.mjs +40 -40
  86. package/esm2020/table-builder/interfaces/ColumnInfo.mjs +1 -1
  87. package/esm2020/table-builder/interfaces/dictionary.mjs +1 -1
  88. package/esm2020/table-builder/interfaces/report-def.mjs +35 -35
  89. package/esm2020/table-builder/material.module.mjs +207 -207
  90. package/esm2020/table-builder/ngrx/actions.mjs +4 -4
  91. package/esm2020/table-builder/ngrx/effects.mjs +47 -47
  92. package/esm2020/table-builder/ngrx/reducer.mjs +51 -51
  93. package/esm2020/table-builder/ngrx/selectors.mjs +23 -23
  94. package/esm2020/table-builder/pipes/column-total.pipe.mjs +19 -19
  95. package/esm2020/table-builder/pipes/format-filter-type.pipe.mjs +17 -17
  96. package/esm2020/table-builder/pipes/format-filter-value.pipe.mjs +45 -45
  97. package/esm2020/table-builder/pipes/key-display.mjs +19 -19
  98. package/esm2020/table-builder/services/export-to-csv.service.mjs +88 -88
  99. package/esm2020/table-builder/services/link-creator.service.mjs +42 -42
  100. package/esm2020/table-builder/services/table-template-service.mjs +44 -44
  101. package/esm2020/table-builder/services/transform-creator.mjs +75 -75
  102. package/esm2020/table-builder/table-builder.module.mjs +215 -207
  103. package/esm2020/utilities/directives/auto-focus.directive.mjs +25 -25
  104. package/esm2020/utilities/directives/clickEmitterDirective.mjs +20 -20
  105. package/esm2020/utilities/directives/clickSubject.mjs +26 -26
  106. package/esm2020/utilities/directives/conditional-classes.directive.mjs +35 -35
  107. package/esm2020/utilities/directives/dialog-service.mjs +25 -25
  108. package/esm2020/utilities/directives/dialog.mjs +137 -137
  109. package/esm2020/utilities/directives/mat-toggle-group-directive.mjs +59 -59
  110. package/esm2020/utilities/directives/prevent-enter.directive.mjs +18 -18
  111. package/esm2020/utilities/directives/stop-propagation.directive.mjs +24 -24
  112. package/esm2020/utilities/directives/styler.mjs +25 -25
  113. package/esm2020/utilities/directives/trim-whitespace.directive.mjs +29 -29
  114. package/esm2020/utilities/index.mjs +16 -16
  115. package/esm2020/utilities/module.mjs +91 -91
  116. package/esm2020/utilities/pipes/function.pipe.mjs +20 -20
  117. package/esm2020/utilities/pipes/phone.pipe.mjs +19 -19
  118. package/esm2020/utilities/pipes/space-case.pipes.mjs +28 -28
  119. package/fesm2015/one-paragon-angular-utilities.mjs +4442 -4413
  120. package/fesm2015/one-paragon-angular-utilities.mjs.map +1 -1
  121. package/fesm2020/one-paragon-angular-utilities.mjs +4422 -4393
  122. package/fesm2020/one-paragon-angular-utilities.mjs.map +1 -1
  123. package/http-request-state/HttpRequestStateFactory.d.ts +14 -14
  124. package/http-request-state/HttpRequestStateStore.d.ts +48 -48
  125. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +16 -16
  126. package/http-request-state/directives/http-error-state-directive.d.ts +12 -12
  127. package/http-request-state/directives/http-inProgress-state-directive.d.ts +12 -12
  128. package/http-request-state/directives/http-notStarted-state-directive.d.ts +12 -12
  129. package/http-request-state/directives/http-success-state-directive.d.ts +21 -21
  130. package/http-request-state/directives/index.d.ts +5 -5
  131. package/http-request-state/directives/request-state-directive.d.ts +35 -35
  132. package/http-request-state/helpers.d.ts +9 -9
  133. package/http-request-state/http-request-state.d.ts +12 -12
  134. package/http-request-state/http-state-module.d.ts +11 -11
  135. package/http-request-state/index.d.ts +6 -6
  136. package/http-request-state/rxjs/getRequestorBody.d.ts +3 -3
  137. package/http-request-state/rxjs/getRequestorState.d.ts +3 -3
  138. package/http-request-state/rxjs/index.d.ts +4 -4
  139. package/http-request-state/rxjs/tapError.d.ts +3 -3
  140. package/http-request-state/rxjs/tapSuccess.d.ts +3 -3
  141. package/http-request-state/types.d.ts +36 -36
  142. package/index.d.ts +5 -5
  143. package/ngrx/actionable-selector.d.ts +15 -15
  144. package/ngrx/index.d.ts +1 -1
  145. package/package.json +1 -1
  146. package/public-api.d.ts +15 -15
  147. package/rxjs/defaultShareReplay.d.ts +2 -2
  148. package/rxjs/index.d.ts +4 -4
  149. package/rxjs/mapError.d.ts +2 -2
  150. package/rxjs/rxjs-operators.d.ts +12 -12
  151. package/rxjs/subjectifier.d.ts +9 -9
  152. package/table-builder/classes/DefaultSettings.d.ts +9 -9
  153. package/table-builder/classes/GenericTableDataSource.d.ts +8 -8
  154. package/table-builder/classes/MatTableObservableDataSource.d.ts +17 -9
  155. package/table-builder/classes/TableBuilderConfig.d.ts +20 -20
  156. package/table-builder/classes/TableState.d.ts +46 -46
  157. package/table-builder/classes/data-filter.d.ts +9 -9
  158. package/table-builder/classes/display-col.d.ts +5 -5
  159. package/table-builder/classes/filter-info.d.ts +40 -40
  160. package/table-builder/classes/table-builder-general-settings.d.ts +43 -43
  161. package/table-builder/classes/table-builder.d.ts +14 -14
  162. package/table-builder/classes/table-store.d.ts +114 -114
  163. package/table-builder/components/array-column.component.d.ts +14 -14
  164. package/table-builder/components/column-builder/column-builder.component.d.ts +50 -50
  165. package/table-builder/components/date-filter/date-filter.component.d.ts +10 -10
  166. package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +10 -10
  167. package/table-builder/components/filter/filter.component.d.ts +371 -371
  168. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +27 -27
  169. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +16 -16
  170. package/table-builder/components/generic-table/generic-table.component.d.ts +73 -73
  171. package/table-builder/components/generic-table/paginator.component.d.ts +28 -28
  172. package/table-builder/components/group-by-list/group-by-list.component.d.ts +10 -10
  173. package/table-builder/components/header-menu/header-menu.component.d.ts +25 -25
  174. package/table-builder/components/in-filter/in-filter.component.d.ts +21 -21
  175. package/table-builder/components/index.d.ts +9 -9
  176. package/table-builder/components/initialization-component/initialization-component.d.ts +12 -12
  177. package/table-builder/components/link-column.component.d.ts +17 -17
  178. package/table-builder/components/number-filter/number-filter.component.d.ts +12 -12
  179. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +24 -24
  180. package/table-builder/components/sort-menu/sort-menu.component.d.ts +25 -25
  181. package/table-builder/components/table-container/table-container.d.ts +68 -68
  182. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +17 -17
  183. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +14 -14
  184. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +14 -14
  185. package/table-builder/directives/custom-cell-directive.d.ts +19 -19
  186. package/table-builder/directives/index.d.ts +5 -5
  187. package/table-builder/directives/multi-sort.directive.d.ts +11 -11
  188. package/table-builder/directives/resize-column.directive.d.ts +43 -43
  189. package/table-builder/directives/table-wrapper.directive.d.ts +11 -11
  190. package/table-builder/directives/tb-filter.directive.d.ts +120 -120
  191. package/table-builder/enums/filterTypes.d.ts +37 -37
  192. package/table-builder/functions/boolean-filter-function.d.ts +3 -3
  193. package/table-builder/functions/date-filter-function.d.ts +4 -4
  194. package/table-builder/functions/download-data.d.ts +1 -1
  195. package/table-builder/functions/null-filter-function.d.ts +2 -2
  196. package/table-builder/functions/number-filter-function.d.ts +4 -4
  197. package/table-builder/functions/sort-data-function.d.ts +3 -3
  198. package/table-builder/functions/string-filter-function.d.ts +7 -7
  199. package/table-builder/interfaces/ColumnInfo.d.ts +6 -6
  200. package/table-builder/interfaces/dictionary.d.ts +3 -3
  201. package/table-builder/interfaces/report-def.d.ts +142 -142
  202. package/table-builder/material.module.d.ts +32 -32
  203. package/table-builder/ngrx/actions.d.ts +23 -23
  204. package/table-builder/ngrx/effects.d.ts +19 -19
  205. package/table-builder/ngrx/reducer.d.ts +15 -15
  206. package/table-builder/ngrx/selectors.d.ts +22 -22
  207. package/table-builder/pipes/column-total.pipe.d.ts +8 -8
  208. package/table-builder/pipes/format-filter-type.pipe.d.ts +8 -8
  209. package/table-builder/pipes/format-filter-value.pipe.d.ts +14 -14
  210. package/table-builder/pipes/key-display.d.ts +11 -11
  211. package/table-builder/services/export-to-csv.service.d.ts +22 -22
  212. package/table-builder/services/link-creator.service.d.ts +12 -12
  213. package/table-builder/services/table-template-service.d.ts +14 -14
  214. package/table-builder/services/transform-creator.d.ts +19 -19
  215. package/table-builder/table-builder.module.d.ts +48 -46
  216. package/utilities/directives/auto-focus.directive.d.ts +10 -10
  217. package/utilities/directives/clickEmitterDirective.d.ts +7 -7
  218. package/utilities/directives/clickSubject.d.ts +9 -9
  219. package/utilities/directives/conditional-classes.directive.d.ts +14 -14
  220. package/utilities/directives/dialog-service.d.ts +10 -10
  221. package/utilities/directives/dialog.d.ts +46 -46
  222. package/utilities/directives/mat-toggle-group-directive.d.ts +21 -21
  223. package/utilities/directives/prevent-enter.directive.d.ts +6 -6
  224. package/utilities/directives/stop-propagation.directive.d.ts +7 -7
  225. package/utilities/directives/styler.d.ts +9 -9
  226. package/utilities/directives/trim-whitespace.directive.d.ts +9 -9
  227. package/utilities/index.d.ts +15 -15
  228. package/utilities/module.d.ts +19 -19
  229. package/utilities/pipes/function.pipe.d.ts +7 -7
  230. package/utilities/pipes/phone.pipe.d.ts +7 -7
  231. package/utilities/pipes/space-case.pipes.d.ts +17 -17
@@ -1,322 +1,322 @@
1
- import { Component, Input, EventEmitter, Output, ContentChildren, ChangeDetectionStrategy, Inject, Optional, ViewChild, } from '@angular/core';
2
- import { BehaviorSubject, from, ReplaySubject } from 'rxjs';
3
- import { FieldType } from '../../interfaces/report-def';
4
- import { first, last, map, switchMap, tap, withLatestFrom, mergeAll, scan } from 'rxjs/operators';
5
- import { MatRowDef } from '@angular/material/table';
6
- import { CustomCellDirective, TableCustomFilterDirective, TableFilterDirective } from '../../directives';
7
- import { stateIs, TableStore } from '../../classes/table-store';
8
- import { DataFilter } from '../../classes/data-filter';
9
- import { combineArrays, mapArray, notNull } from '../../../rxjs/rxjs-operators';
10
- import { ExportToCsvService } from '../../services/export-to-csv.service';
11
- import { ArrayDefaults } from '../../classes/DefaultSettings';
12
- import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
13
- import * as selectors from '../../ngrx/selectors';
14
- import { select } from '@ngrx/store';
15
- import { deleteLocalProfilesState, setLocalProfile, setLocalProfilesState } from '../../ngrx/actions';
16
- import { InitializationState } from '../../classes/TableState';
17
- import { sortData } from '../../functions/sort-data-function';
18
- import { WrapperFilterStore } from '../table-container-filter/table-wrapper-filter-store';
19
- import { cloneDeep, groupBy } from 'lodash';
20
- import { defaultShareReplay } from '../../../rxjs';
21
- import { flattenDeep } from 'lodash';
22
- import { createFilterFunc, isCustomFilter, isFilterInfo } from '../../classes/filter-info';
23
- import { createLinkCreator } from '../../services/link-creator.service';
24
- import { GenericTableComponent } from '../generic-table/generic-table.component';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "../../classes/table-store";
27
- import * as i2 from "../../services/export-to-csv.service";
28
- import * as i3 from "@ngrx/store";
29
- import * as i4 from "../../directives/table-wrapper.directive";
30
- import * as i5 from "@angular/common";
31
- import * as i6 from "@angular/material/form-field";
32
- import * as i7 from "@angular/material/button";
33
- import * as i8 from "@angular/material/tooltip";
34
- import * as i9 from "@angular/material/input";
35
- import * as i10 from "@angular/material/menu";
36
- import * as i11 from "@angular/material/icon";
37
- import * as i12 from "@ngrx/component";
38
- import * as i13 from "../../../utilities/directives/stop-propagation.directive";
39
- import * as i14 from "../../../utilities/directives/clickEmitterDirective";
40
- import * as i15 from "../../../utilities/directives/dialog";
41
- import * as i16 from "../generic-table/generic-table.component";
42
- import * as i17 from "../gen-col-displayer/gen-col-displayer.component";
43
- import * as i18 from "../table-container-filter/gen-filter-displayer/gen-filter-displayer.component";
44
- import * as i19 from "../../directives/multi-sort.directive";
45
- import * as i20 from "../sort-menu/sort-menu.component";
46
- import * as i21 from "../table-container-filter/filter-list/filter-list.component";
47
- import * as i22 from "../group-by-list/group-by-list.component";
48
- export class TableContainerComponent {
49
- constructor(state, exportToCsvService, config, store, wrapper) {
50
- this.state = state;
51
- this.exportToCsvService = exportToCsvService;
52
- this.config = config;
53
- this.store = store;
54
- this.wrapper = wrapper;
55
- this.IndexColumn = false;
56
- this.SelectionColumn = false;
57
- this.isSticky = true;
58
- this.selection$ = new EventEmitter();
59
- this.dataSubject = new ReplaySubject(1);
60
- this.data = this.dataSubject.pipe(switchMap(d => d), defaultShareReplay());
61
- this.OnStateReset = new EventEmitter();
62
- this.OnSaveState = new EventEmitter();
63
- this.customFilters$ = new BehaviorSubject([]);
64
- this.mapMetaDatas = (meta) => {
65
- if (meta.fieldType === FieldType.Array) {
66
- const additional = { ...meta.additional };
67
- additional.arrayStyle = additional?.arrayStyle ?? ArrayDefaults.arrayStyle;
68
- additional.limit = additional.limit ?? this.config.arrayInfo?.limit ?? ArrayDefaults.limit;
69
- return { ...meta, additional };
70
- }
71
- return meta;
72
- };
73
- this.collapseHeader$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseHeader));
74
- this.tbGroupBy = (data, groupByKeys, parentGroupName) => {
75
- let res = {};
76
- res = groupBy(data, groupByKeys[0]);
77
- const remainingGroupByKeys = groupByKeys.slice(1);
78
- if (remainingGroupByKeys.length) {
79
- Object.keys(res).forEach(key => res[key] = this.tbGroupBy(res[key], remainingGroupByKeys, key));
80
- }
81
- return flattenDeep(Object.keys(res).map(groupName => {
82
- const uniqName = parentGroupName ? `${parentGroupName}-${groupName}` : `${groupName}`;
83
- return [
84
- {
85
- isGroupHeader: true,
86
- groupHeaderName: `${groupName} (${res[groupName]?.filter(row => !row.isGroupHeader)?.length})`,
87
- data: res[groupName],
88
- groupName: uniqName,
89
- padding: 0
90
- },
91
- res[groupName]?.map(d => ({ ...d, parentGroupName: d.parentGroupName || uniqName }))
92
- ];
93
- })).map(this.addIndentation);
94
- };
95
- this.addIndentation = (d) => {
96
- if (d.isGroupHeader) {
97
- if (d.padding) {
98
- d.padding += 20;
99
- }
100
- else {
101
- d.padding = 1;
102
- }
103
- }
104
- return d;
105
- };
106
- this.setDisplay = (data, groups) => data
107
- .map(d => ({
108
- ...d,
109
- shouldDisplay: !d.parentGroupName || this.shouldDisplay(groups.find(g => g.groupName == d.parentGroupName), groups),
110
- isExpanded: groups.find(g => g.groupName == d.groupName)?.isExpanded
111
- }))
112
- .filter(d => d.shouldDisplay);
113
- this.shouldDisplay = (currentGroup, groups) => {
114
- if (!currentGroup?.isExpanded) {
115
- return false;
116
- }
117
- const parentGroup = groups?.find(g => g.groupName == currentGroup.parentGroupName);
118
- if (parentGroup) {
119
- return this.shouldDisplay(parentGroup, groups);
120
- }
121
- return true;
122
- };
123
- this.state.on(this.state.getSavableState().pipe(last()), finalState => {
124
- if (this.tableId) {
125
- this.store.dispatch(setLocalProfile({ key: this.tableId, value: finalState }));
126
- }
127
- });
128
- this.state$ = this.state.getSavableState().pipe(map(state => cloneDeep(state)), defaultShareReplay());
129
- }
130
- set pageSize(value) {
131
- this.state.setPageSize(value);
132
- }
133
- firstPage() {
134
- this.genericTableComponent?.paginatorComponent?.paginator?.firstPage();
135
- }
136
- lastPage() {
137
- this.genericTableComponent?.paginatorComponent?.paginator?.lastPage();
138
- }
139
- resetState() {
140
- this.customFilters.forEach(cf => cf.reset());
141
- this.filters.forEach(cf => cf.reset());
142
- this.state.resetState();
143
- this.OnStateReset.next(null);
144
- }
145
- initializeState() {
146
- this.state.setTableSettings(this.tableBuilder.settings);
147
- this.state.runOnceWhen(stateIs(InitializationState.MetaDataLoaded), state => {
148
- if (this.tableId) {
149
- const persistedState$ = this.store.pipe(select(selectors.selectLocalProfileState(this.tableId)), tap(persistedState => {
150
- if (!persistedState) {
151
- this.state.setIntializationState(InitializationState.LoadedFromStore);
152
- }
153
- }), notNull());
154
- this.state.updateStateFromPersistedState(persistedState$);
155
- }
156
- else {
157
- this.state.setIntializationState(InitializationState.LoadedFromStore);
158
- }
159
- });
160
- }
161
- initializeData() {
162
- var allFilters = this.inputFilters ? combineArrays([
163
- this.customFilters$,
164
- this.inputFilters
165
- ]) : this.customFilters$;
166
- const filters$ = this.state.filters$.pipe(map(filters => Object.values(filters)));
167
- const data = new DataFilter(allFilters)
168
- .appendFilters(filters$)
169
- .filterData(this.tableBuilder.getData$()).pipe(switchMap(data => this.state.groupByKeys$.pipe(map(groupBy => this.getData(data, groupBy))).pipe(switchMap(data => this.state.groups$.pipe(map(groups => this.setDisplay(data, groups)))))));
170
- this.dataSubject.next(data);
171
- }
172
- ngOnInit() {
173
- this.initializeState();
174
- this.initializeData();
175
- if (this.tableId) {
176
- this.stateKeys$ = this.store.select(selectors.selectLocalProfileKeys(this.tableId));
177
- this.currentStateKey$ = this.store.select(selectors.selectLocalProfileCurrentKey(this.tableId));
178
- }
179
- }
180
- exportToCsv() {
181
- const sorted = this.data.pipe(withLatestFrom(this.state.sorted$), map(([data, sorted]) => sortData(data, sorted)));
182
- this.exportToCsvService.exportToCsv(sorted);
183
- }
184
- saveState() {
185
- this.state.getSavableState().pipe(first()).subscribe(tableState => {
186
- this.OnSaveState.next(null);
187
- this.store.dispatch(setLocalProfile({ key: this.tableId, value: tableState, persist: true }));
188
- });
189
- }
190
- setProfileState(val) {
191
- this.store.dispatch(setLocalProfilesState({ key: this.tableId, current: val }));
192
- }
193
- deleteProfileState(stateKey) {
194
- this.store.dispatch(deleteLocalProfilesState({ key: this.tableId, stateKey }));
195
- }
196
- ngAfterContentInit() {
197
- this.InitializeColumns();
198
- this.state.runOnceWhen(stateIs(InitializationState.LoadedFromStore), state => {
199
- var allFilters = [...this.filters, ...this.customFilters];
200
- if (this.wrapper) {
201
- allFilters = [...allFilters, ...this.wrapper.customFilters, ...this.wrapper.filters, ...this.wrapper.registerations];
202
- }
203
- var customFilters = [];
204
- allFilters.filter(f => !f.used).forEach(f => {
205
- f.used = true;
206
- if (f.savable) {
207
- var filter = state.filters[f.filterId];
208
- if (isFilterInfo(filter)) {
209
- const filterDirective = f;
210
- filterDirective.fieldType = filter.fieldType;
211
- filterDirective.filterType = filter.filterType;
212
- filterDirective.setFilterValue(filter.filterValue);
213
- filterDirective.key = filter.key;
214
- filterDirective.update();
215
- }
216
- if (isCustomFilter(filter)) {
217
- f.active = filter.active ?? false;
218
- }
219
- this.state.addFilter(f.filter$);
220
- }
221
- else {
222
- customFilters.push(f);
223
- }
224
- });
225
- const filters$ = from(customFilters.map(cf => cf.filter$)).pipe(mergeAll(), scan((a, b) => {
226
- if (b.active) {
227
- a[b.filterId] = isCustomFilter(b) ? b.predicate : createFilterFunc(b);
228
- }
229
- else {
230
- delete a[b.filterId];
231
- }
232
- return a;
233
- }, {}), map(f => Object.values(f)));
234
- this.state.on(filters$, (f) => {
235
- this.customFilters$.next(f);
236
- });
237
- this.state.updateState({ initializationState: InitializationState.Ready });
238
- });
239
- }
240
- InitializeColumns() {
241
- const customCellMap = new Map(this.customCells.map(cc => [cc.customCell, cc]));
242
- this.state.setMetaData(this.tableBuilder.metaData$.pipe(map((mds) => {
243
- mds = mds.map(this.mapMetaDatas);
244
- return [
245
- ...mds,
246
- ...this.customCells.map(cc => cc.getMetaData(mds.find(item => item.key === cc.customCell)))
247
- ];
248
- })));
249
- this.state.setLinkMaps(this.tableBuilder.metaData$.pipe(map((mds) => {
250
- return mds.reduce((acc, md) => {
251
- if (md.fieldType === FieldType.Link) {
252
- acc[md.key] = createLinkCreator(md);
253
- }
254
- return acc;
255
- }, {});
256
- })));
257
- this.myColumns$ = this.state.metaDataArray$.pipe(mapArray(metaData => ({ metaData, customCell: customCellMap.get(metaData.key) })));
258
- }
259
- getData(data, groupByKeys) {
260
- if (!groupByKeys.length) {
261
- this.disableSort = false;
262
- return data;
263
- }
264
- this.disableSort = true;
265
- return this.tbGroupBy(data, groupByKeys);
266
- }
267
- }
268
- TableContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableContainerComponent, deps: [{ token: i1.TableStore }, { token: i2.ExportToCsvService }, { token: TableBuilderConfigToken }, { token: i3.Store }, { token: i4.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
269
- TableContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: TableContainerComponent, selector: "tb-table-container", inputs: { tableId: "tableId", tableBuilder: "tableBuilder", IndexColumn: "IndexColumn", SelectionColumn: "SelectionColumn", trackBy: "trackBy", isSticky: "isSticky", pageSize: "pageSize", inputFilters: "inputFilters", groupHeaderTemplate: "groupHeaderTemplate" }, outputs: { selection$: "selection$", data: "data", OnStateReset: "OnStateReset", OnSaveState: "OnSaveState", state$: "state$" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore], queries: [{ propertyName: "customFilters", predicate: TableCustomFilterDirective, descendants: true }, { propertyName: "filters", predicate: TableFilterDirective, descendants: true }, { propertyName: "customRows", predicate: MatRowDef }, { propertyName: "customCells", predicate: CustomCellDirective }], viewQueries: [{ propertyName: "genericTableComponent", first: true, predicate: GenericTableComponent, descendants: true }], ngImport: i0, template: "<ng-content select=\"[before]\" >\r\n</ng-content>\r\n\r\n<ng-container multiSort [matSortDisabled]=\"disableSort\">\r\n <ng-container *ngrxLet=\"state.tableSettings$ as tableSettings\">\r\n\r\n\r\n <div class=\"header-wrapper\">\r\n <div class=\"title\">\r\n <ng-content select=\".tb-header-title\"\r\n *ngIf=\"(!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed\">\r\n\r\n </ng-content>\r\n <group-by-list></group-by-list>\r\n </div>\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list></lib-filter-list>\r\n <ng-container *ngIf=\"!tableSettings.hideHeader\">\r\n <ng-container *ngIf=\"!(collapseHeader$ | async); else allMenu\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\r\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\r\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-template #allMenu>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\r\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\r\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\r\n </mat-menu>\r\n </ng-template>\r\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div style=\"clear: both;\">\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [IndexColumn]='IndexColumn'\r\n [SelectionColumn]='SelectionColumn' (selection$)='selection$.emit($event)' [trackBy]='trackBy'\r\n [isSticky]='isSticky' [columnInfos]='myColumns$' [disableSort]=\"disableSort\" [groupHeaderTemplate]=\"groupHeaderTemplate\">\r\n </tb-generic-table>\r\n </div>\r\n\r\n\r\n\r\n <ng-template #headerMenu>\r\n <ng-container>\r\n <tb-filter-displayer *ngIf=\"!tableSettings.hideFilter\">\r\n </tb-filter-displayer>\r\n <tb-col-displayer *ngIf=\"!tableSettings.hideColumnSettings\"></tb-col-displayer>\r\n <tb-sort-menu *ngIf=\"!tableSettings.hideSort\"></tb-sort-menu>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #headerMenuExtra>\r\n <button mat-menu-item (click)=\"resetState()\">\r\n <mat-icon color=\"primary\">autorenew</mat-icon>\r\n <span>Reset table</span>\r\n </button>\r\n <button mat-menu-item (click)=\"exportToCsv()\" *ngIf=\"!tableSettings.hideExport\">\r\n <mat-icon color=\"primary\">file_download</mat-icon>\r\n <span>Export Table</span>\r\n </button>\r\n <ng-container *ngIf=\"currentStateKey$ | async as currentKey\">\r\n <button mat-menu-item *ngIf=\"tableId\" (click)=\"saveState()\">\r\n <mat-icon color=\"primary\">save</mat-icon>\r\n <span>Save to {{currentKey}}</span>\r\n </button>\r\n <button *ngIf='tableId' mat-menu-item [matMenuTriggerFor]=\"savedNames\">\r\n <span>Choose Profile</span>\r\n </button>\r\n </ng-container>\r\n\r\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\r\n <button mat-menu-item clickEmitter #add='clickEmitter'>\r\n <mat-icon>add</mat-icon>\r\n <span>New</span>\r\n </button>\r\n <ng-container *ngFor='let key of stateKeys$ | async'>\r\n <button mat-menu-item (click)='setProfileState(key)'>\r\n <div style='display: flex; align-items: center; justify-content: space-between;'>\r\n <span style='display:flex;'>{{key}}</span>\r\n <span style='display:flex;'>\r\n <span style=\"width: 120px;\"></span>\r\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\r\n </span>\r\n </div>\r\n </button>\r\n </ng-container>\r\n </mat-menu>\r\n <ng-container *opDialog='add'>\r\n <mat-form-field>\r\n <input style='width:90%' matInput #addedKey />\r\n </mat-form-field>\r\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);'\r\n [disabled]=\"!addedKey.value\">Add</button>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-container>\r\n\r\n</ng-container>\r\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.LetDirective, selector: "[ngrxLet]", inputs: ["ngrxLet", "ngrxLetSuspenseTpl"] }, { kind: "directive", type: i13.StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "directive", type: i14.ClickEmitterDirective, selector: "[clickEmitter]", exportAs: ["clickEmitter"] }, { kind: "directive", type: i15.DialogDirective, selector: "[opDialog]", inputs: ["add_opDialog_Class", "opDialogConfig", "opDialog", "opDialogOrigin"], outputs: ["opDialogClosed"] }, { kind: "component", type: i16.GenericTableComponent, selector: "tb-generic-table", inputs: ["data$", "IndexColumn", "SelectionColumn", "trackBy", "rows", "isSticky", "columnBuilders", "columnInfos", "groupHeaderTemplate", "disableSort"], outputs: ["selection$"] }, { kind: "component", type: i17.GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: i18.GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "directive", type: i19.MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: i20.SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: i21.FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: i22.GroupByListComponent, selector: "group-by-list" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
270
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableContainerComponent, decorators: [{
271
- type: Component,
272
- args: [{ selector: 'tb-table-container', changeDetection: ChangeDetectionStrategy.OnPush, providers: [TableStore, ExportToCsvService, WrapperFilterStore], template: "<ng-content select=\"[before]\" >\r\n</ng-content>\r\n\r\n<ng-container multiSort [matSortDisabled]=\"disableSort\">\r\n <ng-container *ngrxLet=\"state.tableSettings$ as tableSettings\">\r\n\r\n\r\n <div class=\"header-wrapper\">\r\n <div class=\"title\">\r\n <ng-content select=\".tb-header-title\"\r\n *ngIf=\"(!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed\">\r\n\r\n </ng-content>\r\n <group-by-list></group-by-list>\r\n </div>\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list></lib-filter-list>\r\n <ng-container *ngIf=\"!tableSettings.hideHeader\">\r\n <ng-container *ngIf=\"!(collapseHeader$ | async); else allMenu\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\r\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\r\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\r\n </mat-menu>\r\n </ng-container>\r\n <ng-template #allMenu>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\r\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\r\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\r\n </mat-menu>\r\n </ng-template>\r\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div style=\"clear: both;\">\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [IndexColumn]='IndexColumn'\r\n [SelectionColumn]='SelectionColumn' (selection$)='selection$.emit($event)' [trackBy]='trackBy'\r\n [isSticky]='isSticky' [columnInfos]='myColumns$' [disableSort]=\"disableSort\" [groupHeaderTemplate]=\"groupHeaderTemplate\">\r\n </tb-generic-table>\r\n </div>\r\n\r\n\r\n\r\n <ng-template #headerMenu>\r\n <ng-container>\r\n <tb-filter-displayer *ngIf=\"!tableSettings.hideFilter\">\r\n </tb-filter-displayer>\r\n <tb-col-displayer *ngIf=\"!tableSettings.hideColumnSettings\"></tb-col-displayer>\r\n <tb-sort-menu *ngIf=\"!tableSettings.hideSort\"></tb-sort-menu>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #headerMenuExtra>\r\n <button mat-menu-item (click)=\"resetState()\">\r\n <mat-icon color=\"primary\">autorenew</mat-icon>\r\n <span>Reset table</span>\r\n </button>\r\n <button mat-menu-item (click)=\"exportToCsv()\" *ngIf=\"!tableSettings.hideExport\">\r\n <mat-icon color=\"primary\">file_download</mat-icon>\r\n <span>Export Table</span>\r\n </button>\r\n <ng-container *ngIf=\"currentStateKey$ | async as currentKey\">\r\n <button mat-menu-item *ngIf=\"tableId\" (click)=\"saveState()\">\r\n <mat-icon color=\"primary\">save</mat-icon>\r\n <span>Save to {{currentKey}}</span>\r\n </button>\r\n <button *ngIf='tableId' mat-menu-item [matMenuTriggerFor]=\"savedNames\">\r\n <span>Choose Profile</span>\r\n </button>\r\n </ng-container>\r\n\r\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\r\n <button mat-menu-item clickEmitter #add='clickEmitter'>\r\n <mat-icon>add</mat-icon>\r\n <span>New</span>\r\n </button>\r\n <ng-container *ngFor='let key of stateKeys$ | async'>\r\n <button mat-menu-item (click)='setProfileState(key)'>\r\n <div style='display: flex; align-items: center; justify-content: space-between;'>\r\n <span style='display:flex;'>{{key}}</span>\r\n <span style='display:flex;'>\r\n <span style=\"width: 120px;\"></span>\r\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\r\n </span>\r\n </div>\r\n </button>\r\n </ng-container>\r\n </mat-menu>\r\n <ng-container *opDialog='add'>\r\n <mat-form-field>\r\n <input style='width:90%' matInput #addedKey />\r\n </mat-form-field>\r\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);'\r\n [disabled]=\"!addedKey.value\">Add</button>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-container>\r\n\r\n</ng-container>\r\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"] }]
273
- }], ctorParameters: function () { return [{ type: i1.TableStore }, { type: i2.ExportToCsvService }, { type: undefined, decorators: [{
274
- type: Inject,
275
- args: [TableBuilderConfigToken]
276
- }] }, { type: i3.Store }, { type: i4.TableWrapperDirective, decorators: [{
277
- type: Optional
278
- }] }]; }, propDecorators: { genericTableComponent: [{
279
- type: ViewChild,
280
- args: [GenericTableComponent]
281
- }], customFilters: [{
282
- type: ContentChildren,
283
- args: [TableCustomFilterDirective, { descendants: true }]
284
- }], filters: [{
285
- type: ContentChildren,
286
- args: [TableFilterDirective, { descendants: true }]
287
- }], tableId: [{
288
- type: Input
289
- }], tableBuilder: [{
290
- type: Input
291
- }], IndexColumn: [{
292
- type: Input
293
- }], SelectionColumn: [{
294
- type: Input
295
- }], trackBy: [{
296
- type: Input
297
- }], isSticky: [{
298
- type: Input
299
- }], pageSize: [{
300
- type: Input
301
- }], inputFilters: [{
302
- type: Input
303
- }], groupHeaderTemplate: [{
304
- type: Input
305
- }], selection$: [{
306
- type: Output
307
- }], data: [{
308
- type: Output
309
- }], customRows: [{
310
- type: ContentChildren,
311
- args: [MatRowDef]
312
- }], customCells: [{
313
- type: ContentChildren,
314
- args: [CustomCellDirective]
315
- }], OnStateReset: [{
316
- type: Output
317
- }], OnSaveState: [{
318
- type: Output
319
- }], state$: [{
320
- type: Output
321
- }] } });
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBRWYsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFFTixRQUFRLEVBRVIsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsSUFBSSxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFtQixTQUFTLEVBQVksTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RyxPQUFPLEVBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFB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O2dCQUNPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxJQUFJO3NCQUFiLE1BQU07Z0JBS3FCLFVBQVU7c0JBQXJDLGVBQWU7dUJBQUMsU0FBUztnQkFFWSxXQUFXO3NCQUFoRCxlQUFlO3VCQUFDLG1CQUFtQjtnQkFDMUIsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPdXRwdXQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBJbmplY3QsXHJcbiAgUHJlZGljYXRlLFxyXG4gIE9wdGlvbmFsLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBmcm9tLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXJyYXlBZGRpdGlvbmFsLCBGaWVsZFR5cGUsIE1ldGFEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmJztcclxuaW1wb3J0IHsgZmlyc3QsIGxhc3QsIG1hcCwgc3dpdGNoTWFwLCB0YXAsIHdpdGhMYXRlc3RGcm9tLCBtZXJnZUFsbCwgc2NhbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVGFibGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1idWlsZGVyJztcclxuaW1wb3J0IHsgTWF0Um93RGVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBDdXN0b21DZWxsRGlyZWN0aXZlLCBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwgVGFibGVGaWx0ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzJztcclxuaW1wb3J0IHsgIHN0YXRlSXMsIFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuaW1wb3J0IHsgRGF0YUZpbHRlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZGF0YS1maWx0ZXInO1xyXG5pbXBvcnQgeyBjb21iaW5lQXJyYXlzLCBtYXBBcnJheSwgbm90TnVsbCB9IGZyb20gJy4uLy4uLy4uL3J4anMvcnhqcy1vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBFeHBvcnRUb0NzdlNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHBvcnQtdG8tY3N2LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcnJheURlZmF1bHRzIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9EZWZhdWx0U2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBUYWJsZUJ1aWxkZXJDb25maWcsIFRhYmxlQnVpbGRlckNvbmZpZ1Rva2VuIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9UYWJsZUJ1aWxkZXJDb25maWcnO1xyXG5pbXBvcnQgKiBhcyBzZWxlY3RvcnMgZnJvbSAnLi4vLi4vbmdyeC9zZWxlY3RvcnMnO1xyXG5pbXBvcnQgeyBzZWxlY3QsIFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBkZWxldGVMb2NhbFByb2ZpbGVzU3RhdGUsIHNldExvY2FsUHJvZmlsZSwgc2V0TG9jYWxQcm9maWxlc1N0YXRlIH0gZnJvbSAnLi4vLi4vbmdyeC9hY3Rpb25zJztcclxuaW1wb3J0IHsgR3JvdXAsIEluaXRpYWxpemF0aW9uU3RhdGUsIFBlcnNpc3RlZFRhYmxlU3RhdGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RhYmxlU3RhdGUnO1xyXG5pbXBvcnQgeyBzb3J0RGF0YSB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9zb3J0LWRhdGEtZnVuY3Rpb24nO1xyXG5pbXBvcnQgeyBXcmFwcGVyRmlsdGVyU3RvcmUgfSBmcm9tICcuLi90YWJsZS1jb250YWluZXItZmlsdGVyL3RhYmxlLXdyYXBwZXItZmlsdGVyLXN0b3JlJztcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBncm91cEJ5IH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XHJcbmltcG9ydCB7IGRlZmF1bHRTaGFyZVJlcGxheSB9IGZyb20gJy4uLy4uLy4uL3J4anMnO1xyXG5pbXBvcnQgeyBmbGF0dGVuRGVlcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IGNyZWF0ZUZpbHRlckZ1bmMsIGlzQ3VzdG9tRmlsdGVyLCBpc0ZpbHRlckluZm8gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2ZpbHRlci1pbmZvJztcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGljdGlvbmFyeSc7XHJcbmltcG9ydCB7IFRhYmxlV3JhcHBlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdGFibGUtd3JhcHBlci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBjcmVhdGVMaW5rQ3JlYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xpbmstY3JlYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2VuZXJpY1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VuZXJpYy10YWJsZS9nZW5lcmljLXRhYmxlLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RiLXRhYmxlLWNvbnRhaW5lcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWNvbnRhaW5lci5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb250YWluZXIuY3NzJywnLi4vLi4vc3R5bGVzL2NvbGxhcHNlci5zdHlsZXMuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1RhYmxlU3RvcmUsRXhwb3J0VG9Dc3ZTZXJ2aWNlLFdyYXBwZXJGaWx0ZXJTdG9yZV1cclxufSkgZXhwb3J0IGNsYXNzIFRhYmxlQ29udGFpbmVyQ29tcG9uZW50PFQgPSBhbnk+IHtcclxuXHJcbiAgQFZpZXdDaGlsZChHZW5lcmljVGFibGVDb21wb25lbnQpIHByaXZhdGUgZ2VuZXJpY1RhYmxlQ29tcG9uZW50ITogR2VuZXJpY1RhYmxlQ29tcG9uZW50O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBjdXN0b21GaWx0ZXJzITogUXVlcnlMaXN0PFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlPjtcclxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlRmlsdGVyRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBmaWx0ZXJzITogUXVlcnlMaXN0PFRhYmxlRmlsdGVyRGlyZWN0aXZlPjtcclxuXHJcbiAgQElucHV0KCkgdGFibGVJZCE6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZUJ1aWxkZXIhOiBUYWJsZUJ1aWxkZXI7XHJcbiAgQElucHV0KCkgSW5kZXhDb2x1bW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBTZWxlY3Rpb25Db2x1bW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB0cmFja0J5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzU3RpY2t5ID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5zdGF0ZS5zZXRQYWdlU2l6ZSh2YWx1ZSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGlucHV0RmlsdGVycz86IE9ic2VydmFibGU8QXJyYXk8UHJlZGljYXRlPFQ+Pj47XHJcbiAgQElucHV0KCkgZ3JvdXBIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbiQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgZGF0YVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxPYnNlcnZhYmxlPFRbXT4+KDEpO1xyXG4gIEBPdXRwdXQoKSBkYXRhID0gdGhpcy5kYXRhU3ViamVjdC5waXBlKFxyXG4gICAgc3dpdGNoTWFwKCBkID0+IGQpLFxyXG4gICAgZGVmYXVsdFNoYXJlUmVwbGF5KCksXHJcbiAgKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRSb3dEZWYpIGN1c3RvbVJvd3MhOiBRdWVyeUxpc3Q8TWF0Um93RGVmPGFueT4+O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKEN1c3RvbUNlbGxEaXJlY3RpdmUpIGN1c3RvbUNlbGxzITogUXVlcnlMaXN0PEN1c3RvbUNlbGxEaXJlY3RpdmU+O1xyXG4gIEBPdXRwdXQoKSBPblN0YXRlUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIE9uU2F2ZVN0YXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBzdGF0ZSQgOiBPYnNlcnZhYmxlPFBlcnNpc3RlZFRhYmxlU3RhdGU+O1xyXG5cclxuICBteUNvbHVtbnMkITogT2JzZXJ2YWJsZTxDb2x1bW5JbmZvW10+O1xyXG5cclxuICBzdGF0ZUtleXMkPzogT2JzZXJ2YWJsZTxzdHJpbmdbXSB8IG51bGw+O1xyXG4gIGN1cnJlbnRTdGF0ZUtleSQ/OiBPYnNlcnZhYmxlPHN0cmluZz47XHJcblxyXG4gIGRpc2FibGVTb3J0ITogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgc3RhdGU6IFRhYmxlU3RvcmUsXHJcbiAgICBwdWJsaWMgZXhwb3J0VG9Dc3ZTZXJ2aWNlOiBFeHBvcnRUb0NzdlNlcnZpY2U8VD4sXHJcbiAgICBASW5qZWN0KFRhYmxlQnVpbGRlckNvbmZpZ1Rva2VuKSBwcml2YXRlIGNvbmZpZzogVGFibGVCdWlsZGVyQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8YW55PixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgd3JhcHBlcjogVGFibGVXcmFwcGVyRGlyZWN0aXZlLFxyXG4gICkge1xyXG4gICAgIHRoaXMuc3RhdGUub24oIHRoaXMuc3RhdGUuZ2V0U2F2YWJsZVN0YXRlKCkucGlwZShsYXN0KCkpLCBmaW5hbFN0YXRlID0+IHtcclxuICAgICAgaWYodGhpcy50YWJsZUlkKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzZXRMb2NhbFByb2ZpbGUoe2tleTp0aGlzLnRhYmxlSWQsdmFsdWU6IGZpbmFsU3RhdGV9KSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUoXHJcbiAgICAgIG1hcChzdGF0ZSA9PiBjbG9uZURlZXAoc3RhdGUpKSxcclxuICAgICAgZGVmYXVsdFNoYXJlUmVwbGF5KCksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmlyc3RQYWdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZW5lcmljVGFibGVDb21wb25lbnQ/LnBhZ2luYXRvckNvbXBvbmVudD8ucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcclxuICB9XHJcblxyXG4gIGxhc3RQYWdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZW5lcmljVGFibGVDb21wb25lbnQ/LnBhZ2luYXRvckNvbXBvbmVudD8ucGFnaW5hdG9yPy5sYXN0UGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTdGF0ZSgpIHtcclxuICAgIHRoaXMuY3VzdG9tRmlsdGVycy5mb3JFYWNoKCBjZiA9PiBjZi5yZXNldCgpKTtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKCBjZiA9PiBjZi5yZXNldCgpICk7XHJcbiAgICB0aGlzLnN0YXRlLnJlc2V0U3RhdGUoKTtcclxuICAgIHRoaXMuT25TdGF0ZVJlc2V0Lm5leHQobnVsbClcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVTdGF0ZSgpIHtcclxuICAgIHRoaXMuc3RhdGUuc2V0VGFibGVTZXR0aW5ncyh0aGlzLnRhYmxlQnVpbGRlci5zZXR0aW5ncyk7XHJcbiAgICB0aGlzLnN0YXRlLnJ1bk9uY2VXaGVuKHN0YXRlSXMoSW5pdGlhbGl6YXRpb25TdGF0ZS5NZXRhRGF0YUxvYWRlZCksIHN0YXRlID0+IHtcclxuICAgICAgaWYodGhpcy50YWJsZUlkKSB7XHJcbiAgICAgICAgY29uc3QgcGVyc2lzdGVkU3RhdGUkID0gdGhpcy5zdG9yZS5waXBlKFxyXG4gICAgICAgICAgc2VsZWN0KHNlbGVjdG9ycy5zZWxlY3RMb2NhbFByb2ZpbGVTdGF0ZTxhbnk+KHRoaXMudGFibGVJZCkgKSxcclxuICAgICAgICAgIHRhcCggcGVyc2lzdGVkU3RhdGUgPT4ge1xyXG4gICAgICAgICAgICBpZighcGVyc2lzdGVkU3RhdGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNldEludGlhbGl6YXRpb25TdGF0ZShJbml0aWFsaXphdGlvblN0YXRlLkxvYWRlZEZyb21TdG9yZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbm90TnVsbCgpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZUZyb21QZXJzaXN0ZWRTdGF0ZShwZXJzaXN0ZWRTdGF0ZSQpO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0YXRlLnNldEludGlhbGl6YXRpb25TdGF0ZShJbml0aWFsaXphdGlvblN0YXRlLkxvYWRlZEZyb21TdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBjdXN0b21GaWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJlZGljYXRlPGFueT5bXT4oW10pO1xyXG4gIGluaXRpYWxpemVEYXRhKCkge1xyXG5cclxuXHJcbiAgICB2YXIgYWxsRmlsdGVycyA9IHRoaXMuaW5wdXRGaWx0ZXJzID8gY29tYmluZUFycmF5cyhbXHJcbiAgICAgIHRoaXMuY3VzdG9tRmlsdGVycyQsXHJcbiAgICAgIHRoaXMuaW5wdXRGaWx0ZXJzXHJcbiAgICBdKSA6IHRoaXMuY3VzdG9tRmlsdGVycyQ7XHJcblxyXG4gICAgY29uc3QgZmlsdGVycyQgPSB0aGlzLnN0YXRlLmZpbHRlcnMkLnBpcGUobWFwKCBmaWx0ZXJzID0+IE9iamVjdC52YWx1ZXMoZmlsdGVycykgKSlcclxuXHJcbiAgICBjb25zdCBkYXRhID0gbmV3IERhdGFGaWx0ZXIoYWxsRmlsdGVycylcclxuICAgICAgLmFwcGVuZEZpbHRlcnMoZmlsdGVycyQpXHJcbiAgICAgIC5maWx0ZXJEYXRhKHRoaXMudGFibGVCdWlsZGVyLmdldERhdGEkKCkpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKGRhdGEgPT4gdGhpcy5zdGF0ZS5ncm91cEJ5S2V5cyQucGlwZShcclxuICAgICAgICAgIG1hcChncm91cEJ5ID0+IHRoaXMuZ2V0RGF0YShkYXRhLCBncm91cEJ5KSksXHJcbiAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKGRhdGEgPT4gdGhpcy5zdGF0ZS5ncm91cHMkLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcChncm91cHMgPT4gdGhpcy5zZXREaXNwbGF5KGRhdGEsIGdyb3VwcykpXHJcbiAgICAgICAgICApKVxyXG4gICAgICAgICkpXHJcbiAgICAgICk7XHJcblxyXG4gICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVTdGF0ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplRGF0YSgpO1xyXG5cclxuICAgIGlmKHRoaXMudGFibGVJZCkge1xyXG4gICAgICB0aGlzLnN0YXRlS2V5cyQgPSB0aGlzLnN0b3JlLnNlbGVjdChzZWxlY3RvcnMuc2VsZWN0TG9jYWxQcm9maWxlS2V5cyh0aGlzLnRhYmxlSWQpKTtcclxuICAgICAgdGhpcy5jdXJyZW50U3RhdGVLZXkkID0gdGhpcy5zdG9yZS5zZWxlY3Qoc2VsZWN0b3JzLnNlbGVjdExvY2FsUHJvZmlsZUN1cnJlbnRLZXkodGhpcy50YWJsZUlkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0NzdigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNvcnRlZCA9IHRoaXMuZGF0YS5waXBlKFxyXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0YXRlLnNvcnRlZCQpLFxyXG4gICAgICBtYXAoKFtkYXRhLCBzb3J0ZWRdKSA9PiBzb3J0RGF0YShkYXRhLCBzb3J0ZWQpKVxyXG4gICAgKTtcclxuICAgIHRoaXMuZXhwb3J0VG9Dc3ZTZXJ2aWNlLmV4cG9ydFRvQ3N2KHNvcnRlZCk7XHJcbiAgfVxyXG5cclxuICBzYXZlU3RhdGUoKSB7XHJcbiAgICB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUoXHJcbiAgICAgIGZpcnN0KClcclxuICAgICkuc3Vic2NyaWJlKCB0YWJsZVN0YXRlID0+IHtcclxuICAgICAgdGhpcy5PblNhdmVTdGF0ZS5uZXh0KG51bGwpO1xyXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNldExvY2FsUHJvZmlsZSh7IGtleTogdGhpcy50YWJsZUlkLCB2YWx1ZTp0YWJsZVN0YXRlLCBwZXJzaXN0OiB0cnVlfSApKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UHJvZmlsZVN0YXRlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNldExvY2FsUHJvZmlsZXNTdGF0ZSh7a2V5OnRoaXMudGFibGVJZCwgY3VycmVudDogdmFsfSkpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUHJvZmlsZVN0YXRlKHN0YXRlS2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZGVsZXRlTG9jYWxQcm9maWxlc1N0YXRlKHtrZXk6dGhpcy50YWJsZUlkLCBzdGF0ZUtleX0pKTtcclxuICB9XHJcblxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLkluaXRpYWxpemVDb2x1bW5zKCk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5ydW5PbmNlV2hlbihzdGF0ZUlzKEluaXRpYWxpemF0aW9uU3RhdGUuTG9hZGVkRnJvbVN0b3JlKSwgc3RhdGUgPT4ge1xyXG5cclxuICAgICAgdmFyIGFsbEZpbHRlcnMgPSBbLi4udGhpcy5maWx0ZXJzLCAuLi50aGlzLmN1c3RvbUZpbHRlcnNdO1xyXG4gICAgICBpZih0aGlzLndyYXBwZXIpIHtcclxuICAgICAgICBhbGxGaWx0ZXJzID0gWy4uLmFsbEZpbHRlcnMsIC4uLnRoaXMud3JhcHBlci5jdXN0b21GaWx0ZXJzLCAuLi50aGlzLndyYXBwZXIuZmlsdGVycywgLi4udGhpcy53cmFwcGVyLnJlZ2lzdGVyYXRpb25zXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIGN1c3RvbUZpbHRlcnM6IChUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZXxUYWJsZUZpbHRlckRpcmVjdGl2ZSApW10gPSBbXTtcclxuXHJcbiAgICAgIGFsbEZpbHRlcnMuZmlsdGVyKCBmID0+ICFmLnVzZWQpLmZvckVhY2goIGYgPT4ge1xyXG4gICAgICAgIGYudXNlZCA9IHRydWU7XHJcbiAgICAgICAgaWYoZi5zYXZhYmxlKSB7XHJcbiAgICAgICAgICB2YXIgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmLmZpbHRlcklkXTtcclxuICAgICAgICAgIGlmKGlzRmlsdGVySW5mbyhmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckRpcmVjdGl2ZTogVGFibGVGaWx0ZXJEaXJlY3RpdmUgPSBmIGFzIFRhYmxlRmlsdGVyRGlyZWN0aXZlO1xyXG4gICAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUuZmllbGRUeXBlID0gZmlsdGVyLmZpZWxkVHlwZTtcclxuICAgICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLmZpbHRlclR5cGUgPSBmaWx0ZXIuZmlsdGVyVHlwZTtcclxuICAgICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLnNldEZpbHRlclZhbHVlKGZpbHRlci5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgIGZpbHRlckRpcmVjdGl2ZS5rZXkgPSBmaWx0ZXIua2V5O1xyXG4gICAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUudXBkYXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihpc0N1c3RvbUZpbHRlcihmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgIGYuYWN0aXZlID0gZmlsdGVyLmFjdGl2ZSA/PyBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc3RhdGUuYWRkRmlsdGVyKGYuZmlsdGVyJCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN1c3RvbUZpbHRlcnMucHVzaChmKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZmlsdGVycyQgPSAgZnJvbSggY3VzdG9tRmlsdGVycy5tYXAoIGNmID0+IGNmLmZpbHRlciQgICkpLnBpcGUoXHJcbiAgICAgICAgbWVyZ2VBbGwoKSxcclxuICAgICAgICBzY2FuKCAoYSxiKT0+IHtcclxuICAgICAgICAgICAgaWYoYi5hY3RpdmUpIHtcclxuICAgICAgICAgICAgICBhW2IuZmlsdGVySWRdID0gaXNDdXN0b21GaWx0ZXIoYikgPyBiLnByZWRpY2F0ZSA6IGNyZWF0ZUZpbHRlckZ1bmMoYik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGVsZXRlIGFbYi5maWx0ZXJJZF0gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgIHJldHVybiBhO1xyXG4gICAgICAgIH0sIHt9IGFzIERpY3Rpb25hcnk8UHJlZGljYXRlPGFueT4+KSxcclxuICAgICAgICBtYXAoIGYgPT4gT2JqZWN0LnZhbHVlcyhmKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdGF0ZS5vbihmaWx0ZXJzJCwgKGYpID0+IHtcclxuICAgICAgICB0aGlzLmN1c3RvbUZpbHRlcnMkLm5leHQoZik7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZVN0YXRlKHtpbml0aWFsaXphdGlvblN0YXRlOiBJbml0aWFsaXphdGlvblN0YXRlLlJlYWR5fSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBJbml0aWFsaXplQ29sdW1ucygpIHtcclxuICAgIGNvbnN0IGN1c3RvbUNlbGxNYXAgPSBuZXcgTWFwKHRoaXMuY3VzdG9tQ2VsbHMubWFwKGNjID0+IFtjYy5jdXN0b21DZWxsLGNjXSkpO1xyXG4gICAgdGhpcy5zdGF0ZS5zZXRNZXRhRGF0YSh0aGlzLnRhYmxlQnVpbGRlci5tZXRhRGF0YSQhLnBpcGUoXHJcbiAgICAgIG1hcCgobWRzKSA9PiB7XHJcbiAgICAgICAgbWRzID0gbWRzLm1hcCh0aGlzLm1hcE1ldGFEYXRhcyk7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgIC4uLm1kcyxcclxuICAgICAgICAgIC4uLnRoaXMuY3VzdG9tQ2VsbHMubWFwKCBjYyA9PiBjYy5nZXRNZXRhRGF0YShtZHMuZmluZCggaXRlbSA9PiBpdGVtLmtleSA9PT0gY2MuY3VzdG9tQ2VsbCApKSApXHJcbiAgICAgICAgXVxyXG4gICAgICB9KVxyXG4gICAgKSk7XHJcbiAgICB0aGlzLnN0YXRlLnNldExpbmtNYXBzKHRoaXMudGFibGVCdWlsZGVyLm1ldGFEYXRhJCEucGlwZShcclxuICAgICAgbWFwKChtZHMpID0+IHtcclxuICAgICAgICByZXR1cm4gbWRzLnJlZHVjZSgoYWNjLCBtZCkgPT4ge1xyXG4gICAgICAgICAgaWYobWQuZmllbGRUeXBlID09PSBGaWVsZFR5cGUuTGluayl7IGFjY1ttZC5rZXldPSBjcmVhdGVMaW5rQ3JlYXRvcihtZCl9XHJcbiAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0se30pXHJcbiAgICAgIH0pXHJcbiAgICApKVxyXG5cclxuICAgIHRoaXMubXlDb2x1bW5zJCA9IHRoaXMuc3RhdGUubWV0YURhdGFBcnJheSQucGlwZShcclxuICAgICAgbWFwQXJyYXkoIG1ldGFEYXRhID0+ICh7bWV0YURhdGEsIGN1c3RvbUNlbGw6IGN1c3RvbUNlbGxNYXAuZ2V0KG1ldGFEYXRhLmtleSkhfSkpXHJcbiAgICApO1xyXG4gIH1cclxuICBtYXBNZXRhRGF0YXMgPSAobWV0YSA6IE1ldGFEYXRhPFQ+KSA9PiB7XHJcbiAgICBpZihtZXRhLmZpZWxkVHlwZSA9PT0gRmllbGRUeXBlLkFycmF5KXtcclxuICAgICAgY29uc3QgYWRkaXRpb25hbCA9IHsuLi5tZXRhLmFkZGl0aW9uYWx9IGFzIEFycmF5QWRkaXRpb25hbDtcclxuICAgICAgYWRkaXRpb25hbC5hcnJheVN0eWxlID0gYWRkaXRpb25hbD8uYXJyYXlTdHlsZSA/PyBBcnJheURlZmF1bHRzLmFycmF5U3R5bGU7XHJcbiAgICAgIGFkZGl0aW9uYWwubGltaXQgPSBhZGRpdGlvbmFsLmxpbWl0ID8/IHRoaXMuY29uZmlnLmFycmF5SW5mbz8ubGltaXQgPz8gQXJyYXlEZWZhdWx0cy5saW1pdDtcclxuICAgICAgcmV0dXJuIHsuLi5tZXRhLGFkZGl0aW9uYWx9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWV0YTtcclxuICB9XHJcblxyXG4gIGNvbGxhcHNlSGVhZGVyJCA9IHRoaXMuc3RhdGUuc3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuY29sbGFwc2VIZWFkZXIpKTtcclxuXHJcbiAgZ2V0RGF0YShkYXRhOiBhbnlbXSwgZ3JvdXBCeUtleXM6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgaWYgKCFncm91cEJ5S2V5cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlU29ydCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlzYWJsZVNvcnQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMudGJHcm91cEJ5KGRhdGEsIGdyb3VwQnlLZXlzKTtcclxuICB9XHJcblxyXG4gIHRiR3JvdXBCeSA9IChkYXRhOiBhbnlbXSwgZ3JvdXBCeUtleXM6IHN0cmluZ1tdLCBwYXJlbnRHcm91cE5hbWU/OiBhbnkpOiBhbnlbXSA9PiB7XHJcbiAgICBsZXQgcmVzID0ge307XHJcbiAgICByZXMgPSBncm91cEJ5KGRhdGEsIGdyb3VwQnlLZXlzWzBdKTtcclxuICAgIGNvbnN0IHJlbWFpbmluZ0dyb3VwQnlLZXlzID0gZ3JvdXBCeUtleXMuc2xpY2UoMSk7XHJcbiAgICBpZiAocmVtYWluaW5nR3JvdXBCeUtleXMubGVuZ3RoKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHJlcykuZm9yRWFjaChrZXkgPT4gcmVzW2tleV0gPSB0aGlzLnRiR3JvdXBCeShyZXNba2V5XSwgcmVtYWluaW5nR3JvdXBCeUtleXMsIGtleSkpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmxhdHRlbkRlZXAoT2JqZWN0LmtleXMocmVzKS5tYXAoZ3JvdXBOYW1lID0+IHtcclxuICAgICAgY29uc3QgdW5pcU5hbWUgPSBwYXJlbnRHcm91cE5hbWUgPyBgJHtwYXJlbnRHcm91cE5hbWV9LSR7Z3JvdXBOYW1lfWAgOiBgJHtncm91cE5hbWV9YDtcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpc0dyb3VwSGVhZGVyOiB0cnVlLFxyXG4gICAgICAgICAgZ3JvdXBIZWFkZXJOYW1lOiBgJHtncm91cE5hbWV9ICgke3Jlc1tncm91cE5hbWVdPy5maWx0ZXIocm93ID0+ICFyb3cuaXNHcm91cEhlYWRlcik/Lmxlbmd0aH0pYCxcclxuICAgICAgICAgIGRhdGE6IHJlc1tncm91cE5hbWVdLFxyXG4gICAgICAgICAgZ3JvdXBOYW1lOiB1bmlxTmFtZSxcclxuICAgICAgICAgIHBhZGRpbmc6IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIChyZXNbZ3JvdXBOYW1lXSBhcyBhbnlbXSk/Lm1hcChkID0+ICh7IC4uLmQsIHBhcmVudEdyb3VwTmFtZTogZC5wYXJlbnRHcm91cE5hbWUgfHwgdW5pcU5hbWUgfSkpXHJcbiAgICAgIF07XHJcbiAgICB9KSkubWFwKHRoaXMuYWRkSW5kZW50YXRpb24pO1xyXG4gIH1cclxuXHJcbiAgYWRkSW5kZW50YXRpb24gPSAoZDogYW55KSA9PiB7XHJcbiAgICBpZiAoZC5pc0dyb3VwSGVhZGVyKSB7XHJcbiAgICAgIGlmIChkLnBhZGRpbmcpIHtcclxuICAgICAgICBkLnBhZGRpbmcgKz0gMjA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZC5wYWRkaW5nID0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGQ7XHJcbiAgfVxyXG5cclxuICBzZXREaXNwbGF5ID0gKGRhdGE6IGFueVtdLCBncm91cHM6IEdyb3VwW10pOiBhbnlbXSA9PiBkYXRhXHJcbiAgICAubWFwKGQgPT4gKHtcclxuICAgICAgLi4uZCxcclxuICAgICAgc2hvdWxkRGlzcGxheTogIWQucGFyZW50R3JvdXBOYW1lIHx8IHRoaXMuc2hvdWxkRGlzcGxheShncm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09IGQucGFyZW50R3JvdXBOYW1lKSwgZ3JvdXBzKSxcclxuICAgICAgaXNFeHBhbmRlZDogZ3JvdXBzLmZpbmQoZyA9PiBnLmdyb3VwTmFtZSA9PSBkLmdyb3VwTmFtZSk/LmlzRXhwYW5kZWRcclxuICAgIH0pKVxyXG4gICAgLmZpbHRlcihkID0+IGQuc2hvdWxkRGlzcGxheSk7XHJcblxyXG5cclxuICBzaG91bGREaXNwbGF5ID0gKGN1cnJlbnRHcm91cD86IEdyb3VwLCBncm91cHM/OiBHcm91cFtdKTogYm9vbGVhbiA9PiB7XHJcbiAgICBpZiAoIWN1cnJlbnRHcm91cD8uaXNFeHBhbmRlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFyZW50R3JvdXAgPSBncm91cHM/LmZpbmQoZyA9PiBnLmdyb3VwTmFtZSA9PSBjdXJyZW50R3JvdXAucGFyZW50R3JvdXBOYW1lKTtcclxuXHJcbiAgICBpZiAocGFyZW50R3JvdXApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkRGlzcGxheShwYXJlbnRHcm91cCwgZ3JvdXBzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2JlZm9yZV1cIiA+XHJcbjwvbmctY29udGVudD5cclxuXHJcbjxuZy1jb250YWluZXIgbXVsdGlTb3J0IFttYXRTb3J0RGlzYWJsZWRdPVwiZGlzYWJsZVNvcnRcIj5cclxuICA8bmctY29udGFpbmVyICpuZ3J4TGV0PVwic3RhdGUudGFibGVTZXR0aW5ncyQgYXMgdGFibGVTZXR0aW5nc1wiPlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLnRiLWhlYWRlci10aXRsZVwiXHJcbiAgICAgICAgICAqbmdJZj1cIighKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSkgfHwgdGFibGVTZXR0aW5ncy5zaG93VGl0bGVXaGVuSGVhZGVyQ29sbGFwc2VkXCI+XHJcblxyXG4gICAgICAgIDwvbmctY29udGVudD5cclxuICAgICAgICA8Z3JvdXAtYnktbGlzdD48L2dyb3VwLWJ5LWxpc3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmx4LXJvdy1lbmRcIj5cclxuICAgICAgICA8bGliLWZpbHRlci1saXN0PjwvbGliLWZpbHRlci1saXN0PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlSGVhZGVyXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShjb2xsYXBzZUhlYWRlciQgfCBhc3luYyk7IGVsc2UgYWxsTWVudVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj0ncHJpbWFyeScgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1haW5NZW51XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZsYXQtbWVudSc6KGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKX1cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+e3soY29sbGFwc2VIZWFkZXIkIHwgYXN5bmMpID8gJ21vcmVfaG9yaXonIDogJ21vcmVfdmVydCd9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21haW5NZW51PSdtYXRNZW51Jz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudUV4dHJhXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWxsTWVudT5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9J3ByaW1hcnknIFttYXRNZW51VHJpZ2dlckZvcl09XCJtYWluTWVudVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydmbGF0LW1lbnUnOihjb2xsYXBzZUhlYWRlciQgfCBhc3luYyl9XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPnt7KGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdtb3JlX2hvcml6JyA6ICdtb3JlX3ZlcnQnfX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1tZW51ICNtYWluTWVudT0nbWF0TWVudSc+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJNZW51RXh0cmFcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bWF0LWljb24gW21hdFRvb2x0aXBdPVwiKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdleHBhbmQnIDogJ2NvbGxhcHNlJ1wiIGNsYXNzPVwiY29sbGFwc2UtaWNvbiBoZWFkZXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhdGUudG9nZ2xlQ29sbGFwc2VIZWFkZXIoKVwiPlxyXG4gICAgICAgICAgICB7eyhjb2xsYXBzZUhlYWRlciQgfCBhc3luYykgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJ319XHJcbiAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgc3R5bGU9XCJjbGVhcjogYm90aDtcIj5cclxuICAgICAgPHRiLWdlbmVyaWMtdGFibGUgW3Jvd3NdPSdjdXN0b21Sb3dzJyBbZGF0YSRdPVwiZGF0YVwiIFtJbmRleENvbHVtbl09J0luZGV4Q29sdW1uJ1xyXG4gICAgICAgIFtTZWxlY3Rpb25Db2x1bW5dPSdTZWxlY3Rpb25Db2x1bW4nIChzZWxlY3Rpb24kKT0nc2VsZWN0aW9uJC5lbWl0KCRldmVudCknIFt0cmFja0J5XT0ndHJhY2tCeSdcclxuICAgICAgICBbaXNTdGlja3ldPSdpc1N0aWNreScgW2NvbHVtbkluZm9zXT0nbXlDb2x1bW5zJCcgW2Rpc2FibGVTb3J0XT1cImRpc2FibGVTb3J0XCIgW2dyb3VwSGVhZGVyVGVtcGxhdGVdPVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICA8L3RiLWdlbmVyaWMtdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjaGVhZGVyTWVudT5cclxuICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGItZmlsdGVyLWRpc3BsYXllciAqbmdJZj1cIiF0YWJsZVNldHRpbmdzLmhpZGVGaWx0ZXJcIj5cclxuICAgICAgICA8L3RiLWZpbHRlci1kaXNwbGF5ZXI+XHJcbiAgICAgICAgPHRiLWNvbC1kaXNwbGF5ZXIgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlQ29sdW1uU2V0dGluZ3NcIj48L3RiLWNvbC1kaXNwbGF5ZXI+XHJcbiAgICAgICAgPHRiLXNvcnQtbWVudSAqbmdJZj1cIiF0YWJsZVNldHRpbmdzLmhpZGVTb3J0XCI+PC90Yi1zb3J0LW1lbnU+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjaGVhZGVyTWVudUV4dHJhPlxyXG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlc2V0U3RhdGUoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5hdXRvcmVuZXc8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPlJlc2V0IHRhYmxlPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHBvcnRUb0NzdigpXCIgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlRXhwb3J0XCI+XHJcbiAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPmZpbGVfZG93bmxvYWQ8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuPkV4cG9ydCBUYWJsZTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50U3RhdGVLZXkkIHwgYXN5bmMgYXMgY3VycmVudEtleVwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdJZj1cInRhYmxlSWRcIiAoY2xpY2spPVwic2F2ZVN0YXRlKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5zYXZlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxzcGFuPlNhdmUgdG8ge3tjdXJyZW50S2V5fX08L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj0ndGFibGVJZCcgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwic2F2ZWROYW1lc1wiPlxyXG4gICAgICAgICAgPHNwYW4+Q2hvb3NlIFByb2ZpbGU8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG1hdC1tZW51ICNzYXZlZE5hbWVzPSdtYXRNZW51JyBwYW5lbENsYXNzPSd3aWRlLW1lbnUnPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBjbGlja0VtaXR0ZXIgICNhZGQ9J2NsaWNrRW1pdHRlcic+XHJcbiAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxzcGFuPk5ldzwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj0nbGV0IGtleSBvZiBzdGF0ZUtleXMkIHwgYXN5bmMnPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9J3NldFByb2ZpbGVTdGF0ZShrZXkpJz5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT0nZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyc+XHJcbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9J2Rpc3BsYXk6ZmxleDsnPnt7a2V5fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9J2Rpc3BsYXk6ZmxleDsnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogMTIwcHg7XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPSd3YXJuJyAoY2xpY2spPSdkZWxldGVQcm9maWxlU3RhdGUoa2V5KScgc3RvcC1wcm9wYWdhdGlvbj5kZWxldGVfZm9yZXZlcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1tZW51PlxyXG4gICAgICA8bmctY29udGFpbmVyICpvcERpYWxvZz0nYWRkJz5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8aW5wdXQgc3R5bGU9J3dpZHRoOjkwJScgbWF0SW5wdXQgI2FkZGVkS2V5IC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT0nc2V0UHJvZmlsZVN0YXRlKGFkZGVkS2V5LnZhbHVlKTsgYWRkLm5leHQoZmFsc2UpOydcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhYWRkZWRLZXkudmFsdWVcIj5BZGQ8L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=
1
+ import { Component, Input, EventEmitter, Output, ContentChildren, ChangeDetectionStrategy, Inject, Optional, ViewChild, } from '@angular/core';
2
+ import { BehaviorSubject, from, ReplaySubject } from 'rxjs';
3
+ import { FieldType } from '../../interfaces/report-def';
4
+ import { first, last, map, switchMap, tap, withLatestFrom, mergeAll, scan } from 'rxjs/operators';
5
+ import { MatRowDef } from '@angular/material/table';
6
+ import { CustomCellDirective, TableCustomFilterDirective, TableFilterDirective } from '../../directives';
7
+ import { stateIs, TableStore } from '../../classes/table-store';
8
+ import { DataFilter } from '../../classes/data-filter';
9
+ import { combineArrays, mapArray, notNull } from '../../../rxjs/rxjs-operators';
10
+ import { ExportToCsvService } from '../../services/export-to-csv.service';
11
+ import { ArrayDefaults } from '../../classes/DefaultSettings';
12
+ import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
13
+ import * as selectors from '../../ngrx/selectors';
14
+ import { select } from '@ngrx/store';
15
+ import { deleteLocalProfilesState, setLocalProfile, setLocalProfilesState } from '../../ngrx/actions';
16
+ import { InitializationState } from '../../classes/TableState';
17
+ import { sortData } from '../../functions/sort-data-function';
18
+ import { WrapperFilterStore } from '../table-container-filter/table-wrapper-filter-store';
19
+ import { cloneDeep, groupBy } from 'lodash';
20
+ import { defaultShareReplay } from '../../../rxjs';
21
+ import { flattenDeep } from 'lodash';
22
+ import { createFilterFunc, isCustomFilter, isFilterInfo } from '../../classes/filter-info';
23
+ import { createLinkCreator } from '../../services/link-creator.service';
24
+ import { GenericTableComponent } from '../generic-table/generic-table.component';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "../../classes/table-store";
27
+ import * as i2 from "../../services/export-to-csv.service";
28
+ import * as i3 from "@ngrx/store";
29
+ import * as i4 from "../../directives/table-wrapper.directive";
30
+ import * as i5 from "@angular/common";
31
+ import * as i6 from "@angular/material/form-field";
32
+ import * as i7 from "@angular/material/button";
33
+ import * as i8 from "@angular/material/tooltip";
34
+ import * as i9 from "@angular/material/input";
35
+ import * as i10 from "@angular/material/menu";
36
+ import * as i11 from "@angular/material/icon";
37
+ import * as i12 from "@ngrx/component";
38
+ import * as i13 from "../../../utilities/directives/stop-propagation.directive";
39
+ import * as i14 from "../../../utilities/directives/clickEmitterDirective";
40
+ import * as i15 from "../../../utilities/directives/dialog";
41
+ import * as i16 from "../generic-table/generic-table.component";
42
+ import * as i17 from "../gen-col-displayer/gen-col-displayer.component";
43
+ import * as i18 from "../table-container-filter/gen-filter-displayer/gen-filter-displayer.component";
44
+ import * as i19 from "../../directives/multi-sort.directive";
45
+ import * as i20 from "../sort-menu/sort-menu.component";
46
+ import * as i21 from "../table-container-filter/filter-list/filter-list.component";
47
+ import * as i22 from "../group-by-list/group-by-list.component";
48
+ export class TableContainerComponent {
49
+ constructor(state, exportToCsvService, config, store, wrapper) {
50
+ this.state = state;
51
+ this.exportToCsvService = exportToCsvService;
52
+ this.config = config;
53
+ this.store = store;
54
+ this.wrapper = wrapper;
55
+ this.IndexColumn = false;
56
+ this.SelectionColumn = false;
57
+ this.isSticky = true;
58
+ this.selection$ = new EventEmitter();
59
+ this.dataSubject = new ReplaySubject(1);
60
+ this.data = this.dataSubject.pipe(switchMap(d => d), defaultShareReplay());
61
+ this.OnStateReset = new EventEmitter();
62
+ this.OnSaveState = new EventEmitter();
63
+ this.customFilters$ = new BehaviorSubject([]);
64
+ this.mapMetaDatas = (meta) => {
65
+ if (meta.fieldType === FieldType.Array) {
66
+ const additional = { ...meta.additional };
67
+ additional.arrayStyle = additional?.arrayStyle ?? ArrayDefaults.arrayStyle;
68
+ additional.limit = additional.limit ?? this.config.arrayInfo?.limit ?? ArrayDefaults.limit;
69
+ return { ...meta, additional };
70
+ }
71
+ return meta;
72
+ };
73
+ this.collapseHeader$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseHeader));
74
+ this.tbGroupBy = (data, groupByKeys, parentGroupName) => {
75
+ let res = {};
76
+ res = groupBy(data, groupByKeys[0]);
77
+ const remainingGroupByKeys = groupByKeys.slice(1);
78
+ if (remainingGroupByKeys.length) {
79
+ Object.keys(res).forEach(key => res[key] = this.tbGroupBy(res[key], remainingGroupByKeys, key));
80
+ }
81
+ return flattenDeep(Object.keys(res).map(groupName => {
82
+ const uniqName = parentGroupName ? `${parentGroupName}-${groupName}` : `${groupName}`;
83
+ return [
84
+ {
85
+ isGroupHeader: true,
86
+ groupHeaderName: `${groupName} (${res[groupName]?.filter(row => !row.isGroupHeader)?.length})`,
87
+ data: res[groupName],
88
+ groupName: uniqName,
89
+ padding: 0
90
+ },
91
+ res[groupName]?.map(d => ({ ...d, parentGroupName: d.parentGroupName || uniqName }))
92
+ ];
93
+ })).map(this.addIndentation);
94
+ };
95
+ this.addIndentation = (d) => {
96
+ if (d.isGroupHeader) {
97
+ if (d.padding) {
98
+ d.padding += 20;
99
+ }
100
+ else {
101
+ d.padding = 1;
102
+ }
103
+ }
104
+ return d;
105
+ };
106
+ this.setDisplay = (data, groups) => data
107
+ .map(d => ({
108
+ ...d,
109
+ shouldDisplay: !d.parentGroupName || this.shouldDisplay(groups.find(g => g.groupName == d.parentGroupName), groups),
110
+ isExpanded: groups.find(g => g.groupName == d.groupName)?.isExpanded
111
+ }))
112
+ .filter(d => d.shouldDisplay);
113
+ this.shouldDisplay = (currentGroup, groups) => {
114
+ if (!currentGroup?.isExpanded) {
115
+ return false;
116
+ }
117
+ const parentGroup = groups?.find(g => g.groupName == currentGroup.parentGroupName);
118
+ if (parentGroup) {
119
+ return this.shouldDisplay(parentGroup, groups);
120
+ }
121
+ return true;
122
+ };
123
+ this.state.on(this.state.getSavableState().pipe(last()), finalState => {
124
+ if (this.tableId) {
125
+ this.store.dispatch(setLocalProfile({ key: this.tableId, value: finalState }));
126
+ }
127
+ });
128
+ this.state$ = this.state.getSavableState().pipe(map(state => cloneDeep(state)), defaultShareReplay());
129
+ }
130
+ set pageSize(value) {
131
+ this.state.setPageSize(value);
132
+ }
133
+ firstPage() {
134
+ this.genericTableComponent?.paginatorComponent?.paginator?.firstPage();
135
+ }
136
+ lastPage() {
137
+ this.genericTableComponent?.paginatorComponent?.paginator?.lastPage();
138
+ }
139
+ resetState() {
140
+ this.customFilters.forEach(cf => cf.reset());
141
+ this.filters.forEach(cf => cf.reset());
142
+ this.state.resetState();
143
+ this.OnStateReset.next(null);
144
+ }
145
+ initializeState() {
146
+ this.state.setTableSettings(this.tableBuilder.settings);
147
+ this.state.runOnceWhen(stateIs(InitializationState.MetaDataLoaded), state => {
148
+ if (this.tableId) {
149
+ const persistedState$ = this.store.pipe(select(selectors.selectLocalProfileState(this.tableId)), tap(persistedState => {
150
+ if (!persistedState) {
151
+ this.state.setIntializationState(InitializationState.LoadedFromStore);
152
+ }
153
+ }), notNull());
154
+ this.state.updateStateFromPersistedState(persistedState$);
155
+ }
156
+ else {
157
+ this.state.setIntializationState(InitializationState.LoadedFromStore);
158
+ }
159
+ });
160
+ }
161
+ initializeData() {
162
+ var allFilters = this.inputFilters ? combineArrays([
163
+ this.customFilters$,
164
+ this.inputFilters
165
+ ]) : this.customFilters$;
166
+ const filters$ = this.state.filters$.pipe(map(filters => Object.values(filters)));
167
+ const data = new DataFilter(allFilters)
168
+ .appendFilters(filters$)
169
+ .filterData(this.tableBuilder.getData$()).pipe(switchMap(data => this.state.groupByKeys$.pipe(map(groupBy => this.getData(data, groupBy))).pipe(switchMap(data => this.state.groups$.pipe(map(groups => this.setDisplay(data, groups)))))));
170
+ this.dataSubject.next(data);
171
+ }
172
+ ngOnInit() {
173
+ this.initializeState();
174
+ this.initializeData();
175
+ if (this.tableId) {
176
+ this.stateKeys$ = this.store.select(selectors.selectLocalProfileKeys(this.tableId));
177
+ this.currentStateKey$ = this.store.select(selectors.selectLocalProfileCurrentKey(this.tableId));
178
+ }
179
+ }
180
+ exportToCsv() {
181
+ const sorted = this.data.pipe(withLatestFrom(this.state.sorted$), map(([data, sorted]) => sortData(data, sorted)));
182
+ this.exportToCsvService.exportToCsv(sorted);
183
+ }
184
+ saveState() {
185
+ this.state.getSavableState().pipe(first()).subscribe(tableState => {
186
+ this.OnSaveState.next(null);
187
+ this.store.dispatch(setLocalProfile({ key: this.tableId, value: tableState, persist: true }));
188
+ });
189
+ }
190
+ setProfileState(val) {
191
+ this.store.dispatch(setLocalProfilesState({ key: this.tableId, current: val }));
192
+ }
193
+ deleteProfileState(stateKey) {
194
+ this.store.dispatch(deleteLocalProfilesState({ key: this.tableId, stateKey }));
195
+ }
196
+ ngAfterContentInit() {
197
+ this.InitializeColumns();
198
+ this.state.runOnceWhen(stateIs(InitializationState.LoadedFromStore), state => {
199
+ var allFilters = [...this.filters, ...this.customFilters];
200
+ if (this.wrapper) {
201
+ allFilters = [...allFilters, ...this.wrapper.customFilters, ...this.wrapper.filters, ...this.wrapper.registerations];
202
+ }
203
+ var customFilters = [];
204
+ allFilters.filter(f => !f.used).forEach(f => {
205
+ f.used = true;
206
+ if (f.savable) {
207
+ var filter = state.filters[f.filterId];
208
+ if (isFilterInfo(filter)) {
209
+ const filterDirective = f;
210
+ filterDirective.fieldType = filter.fieldType;
211
+ filterDirective.filterType = filter.filterType;
212
+ filterDirective.setFilterValue(filter.filterValue);
213
+ filterDirective.key = filter.key;
214
+ filterDirective.update();
215
+ }
216
+ if (isCustomFilter(filter)) {
217
+ f.active = filter.active ?? false;
218
+ }
219
+ this.state.addFilter(f.filter$);
220
+ }
221
+ else {
222
+ customFilters.push(f);
223
+ }
224
+ });
225
+ const filters$ = from(customFilters.map(cf => cf.filter$)).pipe(mergeAll(), scan((a, b) => {
226
+ if (b.active) {
227
+ a[b.filterId] = isCustomFilter(b) ? b.predicate : createFilterFunc(b);
228
+ }
229
+ else {
230
+ delete a[b.filterId];
231
+ }
232
+ return a;
233
+ }, {}), map(f => Object.values(f)));
234
+ this.state.on(filters$, (f) => {
235
+ this.customFilters$.next(f);
236
+ });
237
+ this.state.updateState({ initializationState: InitializationState.Ready });
238
+ });
239
+ }
240
+ InitializeColumns() {
241
+ const customCellMap = new Map(this.customCells.map(cc => [cc.customCell, cc]));
242
+ this.state.setMetaData(this.tableBuilder.metaData$.pipe(map((mds) => {
243
+ mds = mds.map(this.mapMetaDatas);
244
+ return [
245
+ ...mds,
246
+ ...this.customCells.map(cc => cc.getMetaData(mds.find(item => item.key === cc.customCell)))
247
+ ];
248
+ })));
249
+ this.state.setLinkMaps(this.tableBuilder.metaData$.pipe(map((mds) => {
250
+ return mds.reduce((acc, md) => {
251
+ if (md.fieldType === FieldType.Link) {
252
+ acc[md.key] = createLinkCreator(md);
253
+ }
254
+ return acc;
255
+ }, {});
256
+ })));
257
+ this.myColumns$ = this.state.metaDataArray$.pipe(mapArray(metaData => ({ metaData, customCell: customCellMap.get(metaData.key) })));
258
+ }
259
+ getData(data, groupByKeys) {
260
+ if (!groupByKeys.length) {
261
+ this.disableSort = false;
262
+ return data;
263
+ }
264
+ this.disableSort = true;
265
+ return this.tbGroupBy(data, groupByKeys);
266
+ }
267
+ }
268
+ TableContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableContainerComponent, deps: [{ token: i1.TableStore }, { token: i2.ExportToCsvService }, { token: TableBuilderConfigToken }, { token: i3.Store }, { token: i4.TableWrapperDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
269
+ TableContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: TableContainerComponent, selector: "tb-table-container", inputs: { tableId: "tableId", tableBuilder: "tableBuilder", IndexColumn: "IndexColumn", SelectionColumn: "SelectionColumn", trackBy: "trackBy", isSticky: "isSticky", pageSize: "pageSize", inputFilters: "inputFilters", groupHeaderTemplate: "groupHeaderTemplate" }, outputs: { selection$: "selection$", data: "data", OnStateReset: "OnStateReset", OnSaveState: "OnSaveState", state$: "state$" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore], queries: [{ propertyName: "customFilters", predicate: TableCustomFilterDirective, descendants: true }, { propertyName: "filters", predicate: TableFilterDirective, descendants: true }, { propertyName: "customRows", predicate: MatRowDef }, { propertyName: "customCells", predicate: CustomCellDirective }], viewQueries: [{ propertyName: "genericTableComponent", first: true, predicate: GenericTableComponent, descendants: true }], ngImport: i0, template: "<ng-content select=\"[before]\" >\n</ng-content>\n\n<ng-container multiSort [matSortDisabled]=\"disableSort\">\n <ng-container *ngrxLet=\"state.tableSettings$ as tableSettings\">\n\n\n <div class=\"header-wrapper\">\n <div class=\"title\">\n <ng-content select=\".tb-header-title\"\n *ngIf=\"(!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed\">\n\n </ng-content>\n <group-by-list></group-by-list>\n </div>\n <div class=\"flx-row-end\">\n <lib-filter-list></lib-filter-list>\n <ng-container *ngIf=\"!tableSettings.hideHeader\">\n <ng-container *ngIf=\"!(collapseHeader$ | async); else allMenu\">\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\n </button>\n <mat-menu #mainMenu='matMenu'>\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\n </mat-menu>\n </ng-container>\n <ng-template #allMenu>\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\n </button>\n <mat-menu #mainMenu='matMenu'>\n <div class=\"flex-column\">\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\n </mat-menu>\n </ng-template>\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\n (click)=\"state.toggleCollapseHeader()\">\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\n </mat-icon>\n </ng-container>\n </div>\n </div>\n\n <div style=\"clear: both;\">\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [IndexColumn]='IndexColumn'\n [SelectionColumn]='SelectionColumn' (selection$)='selection$.emit($event)' [trackBy]='trackBy'\n [isSticky]='isSticky' [columnInfos]='myColumns$' [disableSort]=\"disableSort\" [groupHeaderTemplate]=\"groupHeaderTemplate\">\n </tb-generic-table>\n </div>\n\n\n\n <ng-template #headerMenu>\n <ng-container>\n <tb-filter-displayer *ngIf=\"!tableSettings.hideFilter\">\n </tb-filter-displayer>\n <tb-col-displayer *ngIf=\"!tableSettings.hideColumnSettings\"></tb-col-displayer>\n <tb-sort-menu *ngIf=\"!tableSettings.hideSort\"></tb-sort-menu>\n </ng-container>\n </ng-template>\n <ng-template #headerMenuExtra>\n <button mat-menu-item (click)=\"resetState()\">\n <mat-icon color=\"primary\">autorenew</mat-icon>\n <span>Reset table</span>\n </button>\n <button mat-menu-item (click)=\"exportToCsv()\" *ngIf=\"!tableSettings.hideExport\">\n <mat-icon color=\"primary\">file_download</mat-icon>\n <span>Export Table</span>\n </button>\n <ng-container *ngIf=\"currentStateKey$ | async as currentKey\">\n <button mat-menu-item *ngIf=\"tableId\" (click)=\"saveState()\">\n <mat-icon color=\"primary\">save</mat-icon>\n <span>Save to {{currentKey}}</span>\n </button>\n <button *ngIf='tableId' mat-menu-item [matMenuTriggerFor]=\"savedNames\">\n <span>Choose Profile</span>\n </button>\n </ng-container>\n\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\n <button mat-menu-item clickEmitter #add='clickEmitter'>\n <mat-icon>add</mat-icon>\n <span>New</span>\n </button>\n <ng-container *ngFor='let key of stateKeys$ | async'>\n <button mat-menu-item (click)='setProfileState(key)'>\n <div style='display: flex; align-items: center; justify-content: space-between;'>\n <span style='display:flex;'>{{key}}</span>\n <span style='display:flex;'>\n <span style=\"width: 120px;\"></span>\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\n </span>\n </div>\n </button>\n </ng-container>\n </mat-menu>\n <ng-container *opDialog='add'>\n <mat-form-field>\n <input style='width:90%' matInput #addedKey />\n </mat-form-field>\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);'\n [disabled]=\"!addedKey.value\">Add</button>\n </ng-container>\n </ng-template>\n\n </ng-container>\n\n</ng-container>\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.LetDirective, selector: "[ngrxLet]", inputs: ["ngrxLet", "ngrxLetSuspenseTpl"] }, { kind: "directive", type: i13.StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "directive", type: i14.ClickEmitterDirective, selector: "[clickEmitter]", exportAs: ["clickEmitter"] }, { kind: "directive", type: i15.DialogDirective, selector: "[opDialog]", inputs: ["add_opDialog_Class", "opDialogConfig", "opDialog", "opDialogOrigin"], outputs: ["opDialogClosed"] }, { kind: "component", type: i16.GenericTableComponent, selector: "tb-generic-table", inputs: ["data$", "IndexColumn", "SelectionColumn", "trackBy", "rows", "isSticky", "columnBuilders", "columnInfos", "groupHeaderTemplate", "disableSort"], outputs: ["selection$"] }, { kind: "component", type: i17.GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: i18.GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "directive", type: i19.MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: i20.SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: i21.FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: i22.GroupByListComponent, selector: "group-by-list" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
270
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: TableContainerComponent, decorators: [{
271
+ type: Component,
272
+ args: [{ selector: 'tb-table-container', changeDetection: ChangeDetectionStrategy.OnPush, providers: [TableStore, ExportToCsvService, WrapperFilterStore], template: "<ng-content select=\"[before]\" >\n</ng-content>\n\n<ng-container multiSort [matSortDisabled]=\"disableSort\">\n <ng-container *ngrxLet=\"state.tableSettings$ as tableSettings\">\n\n\n <div class=\"header-wrapper\">\n <div class=\"title\">\n <ng-content select=\".tb-header-title\"\n *ngIf=\"(!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed\">\n\n </ng-content>\n <group-by-list></group-by-list>\n </div>\n <div class=\"flx-row-end\">\n <lib-filter-list></lib-filter-list>\n <ng-container *ngIf=\"!tableSettings.hideHeader\">\n <ng-container *ngIf=\"!(collapseHeader$ | async); else allMenu\">\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\n </button>\n <mat-menu #mainMenu='matMenu'>\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\n </mat-menu>\n </ng-container>\n <ng-template #allMenu>\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\"\n [ngClass]=\"{'flat-menu':(collapseHeader$ | async)}\">\n <mat-icon>{{(collapseHeader$ | async) ? 'more_horiz' : 'more_vert'}}</mat-icon>\n </button>\n <mat-menu #mainMenu='matMenu'>\n <div class=\"flex-column\">\n <ng-container *ngTemplateOutlet=\"headerMenu\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"></ng-container>\n </mat-menu>\n </ng-template>\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\n (click)=\"state.toggleCollapseHeader()\">\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\n </mat-icon>\n </ng-container>\n </div>\n </div>\n\n <div style=\"clear: both;\">\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [IndexColumn]='IndexColumn'\n [SelectionColumn]='SelectionColumn' (selection$)='selection$.emit($event)' [trackBy]='trackBy'\n [isSticky]='isSticky' [columnInfos]='myColumns$' [disableSort]=\"disableSort\" [groupHeaderTemplate]=\"groupHeaderTemplate\">\n </tb-generic-table>\n </div>\n\n\n\n <ng-template #headerMenu>\n <ng-container>\n <tb-filter-displayer *ngIf=\"!tableSettings.hideFilter\">\n </tb-filter-displayer>\n <tb-col-displayer *ngIf=\"!tableSettings.hideColumnSettings\"></tb-col-displayer>\n <tb-sort-menu *ngIf=\"!tableSettings.hideSort\"></tb-sort-menu>\n </ng-container>\n </ng-template>\n <ng-template #headerMenuExtra>\n <button mat-menu-item (click)=\"resetState()\">\n <mat-icon color=\"primary\">autorenew</mat-icon>\n <span>Reset table</span>\n </button>\n <button mat-menu-item (click)=\"exportToCsv()\" *ngIf=\"!tableSettings.hideExport\">\n <mat-icon color=\"primary\">file_download</mat-icon>\n <span>Export Table</span>\n </button>\n <ng-container *ngIf=\"currentStateKey$ | async as currentKey\">\n <button mat-menu-item *ngIf=\"tableId\" (click)=\"saveState()\">\n <mat-icon color=\"primary\">save</mat-icon>\n <span>Save to {{currentKey}}</span>\n </button>\n <button *ngIf='tableId' mat-menu-item [matMenuTriggerFor]=\"savedNames\">\n <span>Choose Profile</span>\n </button>\n </ng-container>\n\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\n <button mat-menu-item clickEmitter #add='clickEmitter'>\n <mat-icon>add</mat-icon>\n <span>New</span>\n </button>\n <ng-container *ngFor='let key of stateKeys$ | async'>\n <button mat-menu-item (click)='setProfileState(key)'>\n <div style='display: flex; align-items: center; justify-content: space-between;'>\n <span style='display:flex;'>{{key}}</span>\n <span style='display:flex;'>\n <span style=\"width: 120px;\"></span>\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\n </span>\n </div>\n </button>\n </ng-container>\n </mat-menu>\n <ng-container *opDialog='add'>\n <mat-form-field>\n <input style='width:90%' matInput #addedKey />\n </mat-form-field>\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);'\n [disabled]=\"!addedKey.value\">Add</button>\n </ng-container>\n </ng-template>\n\n </ng-container>\n\n</ng-container>\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"] }]
273
+ }], ctorParameters: function () { return [{ type: i1.TableStore }, { type: i2.ExportToCsvService }, { type: undefined, decorators: [{
274
+ type: Inject,
275
+ args: [TableBuilderConfigToken]
276
+ }] }, { type: i3.Store }, { type: i4.TableWrapperDirective, decorators: [{
277
+ type: Optional
278
+ }] }]; }, propDecorators: { genericTableComponent: [{
279
+ type: ViewChild,
280
+ args: [GenericTableComponent]
281
+ }], customFilters: [{
282
+ type: ContentChildren,
283
+ args: [TableCustomFilterDirective, { descendants: true }]
284
+ }], filters: [{
285
+ type: ContentChildren,
286
+ args: [TableFilterDirective, { descendants: true }]
287
+ }], tableId: [{
288
+ type: Input
289
+ }], tableBuilder: [{
290
+ type: Input
291
+ }], IndexColumn: [{
292
+ type: Input
293
+ }], SelectionColumn: [{
294
+ type: Input
295
+ }], trackBy: [{
296
+ type: Input
297
+ }], isSticky: [{
298
+ type: Input
299
+ }], pageSize: [{
300
+ type: Input
301
+ }], inputFilters: [{
302
+ type: Input
303
+ }], groupHeaderTemplate: [{
304
+ type: Input
305
+ }], selection$: [{
306
+ type: Output
307
+ }], data: [{
308
+ type: Output
309
+ }], customRows: [{
310
+ type: ContentChildren,
311
+ args: [MatRowDef]
312
+ }], customCells: [{
313
+ type: ContentChildren,
314
+ args: [CustomCellDirective]
315
+ }], OnStateReset: [{
316
+ type: Output
317
+ }], OnSaveState: [{
318
+ type: Output
319
+ }], state$: [{
320
+ type: Output
321
+ }] } });
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBRWYsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFFTixRQUFRLEVBRVIsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsSUFBSSxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFtQixTQUFTLEVBQVksTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RyxPQUFPLEVBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFB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O2dCQUNPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxJQUFJO3NCQUFiLE1BQU07Z0JBS3FCLFVBQVU7c0JBQXJDLGVBQWU7dUJBQUMsU0FBUztnQkFFWSxXQUFXO3NCQUFoRCxlQUFlO3VCQUFDLG1CQUFtQjtnQkFDMUIsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEluamVjdCxcbiAgUHJlZGljYXRlLFxuICBPcHRpb25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGZyb20sIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXJyYXlBZGRpdGlvbmFsLCBGaWVsZFR5cGUsIE1ldGFEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmJztcbmltcG9ydCB7IGZpcnN0LCBsYXN0LCBtYXAsIHN3aXRjaE1hcCwgdGFwLCB3aXRoTGF0ZXN0RnJvbSwgbWVyZ2VBbGwsIHNjYW4gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUYWJsZUJ1aWxkZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLWJ1aWxkZXInO1xuaW1wb3J0IHsgTWF0Um93RGVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgQ3VzdG9tQ2VsbERpcmVjdGl2ZSwgVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsIFRhYmxlRmlsdGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyAgc3RhdGVJcywgVGFibGVTdG9yZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvdGFibGUtc3RvcmUnO1xuaW1wb3J0IHsgRGF0YUZpbHRlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZGF0YS1maWx0ZXInO1xuaW1wb3J0IHsgY29tYmluZUFycmF5cywgbWFwQXJyYXksIG5vdE51bGwgfSBmcm9tICcuLi8uLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcbmltcG9ydCB7IEV4cG9ydFRvQ3N2U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4cG9ydC10by1jc3Yuc2VydmljZSc7XG5pbXBvcnQgeyBBcnJheURlZmF1bHRzIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9EZWZhdWx0U2V0dGluZ3MnO1xuaW1wb3J0IHsgVGFibGVCdWlsZGVyQ29uZmlnLCBUYWJsZUJ1aWxkZXJDb25maWdUb2tlbiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGFibGVCdWlsZGVyQ29uZmlnJztcbmltcG9ydCAqIGFzIHNlbGVjdG9ycyBmcm9tICcuLi8uLi9uZ3J4L3NlbGVjdG9ycyc7XG5pbXBvcnQgeyBzZWxlY3QsIFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgZGVsZXRlTG9jYWxQcm9maWxlc1N0YXRlLCBzZXRMb2NhbFByb2ZpbGUsIHNldExvY2FsUHJvZmlsZXNTdGF0ZSB9IGZyb20gJy4uLy4uL25ncngvYWN0aW9ucyc7XG5pbXBvcnQgeyBHcm91cCwgSW5pdGlhbGl6YXRpb25TdGF0ZSwgUGVyc2lzdGVkVGFibGVTdGF0ZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGFibGVTdGF0ZSc7XG5pbXBvcnQgeyBzb3J0RGF0YSB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9zb3J0LWRhdGEtZnVuY3Rpb24nO1xuaW1wb3J0IHsgV3JhcHBlckZpbHRlclN0b3JlIH0gZnJvbSAnLi4vdGFibGUtY29udGFpbmVyLWZpbHRlci90YWJsZS13cmFwcGVyLWZpbHRlci1zdG9yZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGdyb3VwQnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBkZWZhdWx0U2hhcmVSZXBsYXkgfSBmcm9tICcuLi8uLi8uLi9yeGpzJztcbmltcG9ydCB7IGZsYXR0ZW5EZWVwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGNyZWF0ZUZpbHRlckZ1bmMsIGlzQ3VzdG9tRmlsdGVyLCBpc0ZpbHRlckluZm8gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2ZpbHRlci1pbmZvJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xuaW1wb3J0IHsgVGFibGVXcmFwcGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90YWJsZS13cmFwcGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBjcmVhdGVMaW5rQ3JlYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xpbmstY3JlYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEdlbmVyaWNUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0Yi10YWJsZS1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtY29udGFpbmVyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS1jb250YWluZXIuY3NzJywnLi4vLi4vc3R5bGVzL2NvbGxhcHNlci5zdHlsZXMuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbVGFibGVTdG9yZSxFeHBvcnRUb0NzdlNlcnZpY2UsV3JhcHBlckZpbHRlclN0b3JlXVxufSkgZXhwb3J0IGNsYXNzIFRhYmxlQ29udGFpbmVyQ29tcG9uZW50PFQgPSBhbnk+IHtcblxuICBAVmlld0NoaWxkKEdlbmVyaWNUYWJsZUNvbXBvbmVudCkgcHJpdmF0ZSBnZW5lcmljVGFibGVDb21wb25lbnQhOiBHZW5lcmljVGFibGVDb21wb25lbnQ7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgY3VzdG9tRmlsdGVycyE6IFF1ZXJ5TGlzdDxUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVGaWx0ZXJEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGZpbHRlcnMhOiBRdWVyeUxpc3Q8VGFibGVGaWx0ZXJEaXJlY3RpdmU+O1xuXG4gIEBJbnB1dCgpIHRhYmxlSWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRhYmxlQnVpbGRlciE6IFRhYmxlQnVpbGRlcjtcbiAgQElucHV0KCkgSW5kZXhDb2x1bW4gPSBmYWxzZTtcbiAgQElucHV0KCkgU2VsZWN0aW9uQ29sdW1uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyYWNrQnkhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzU3RpY2t5ID0gdHJ1ZTtcbiAgQElucHV0KCkgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YXRlLnNldFBhZ2VTaXplKHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKSBpbnB1dEZpbHRlcnM/OiBPYnNlcnZhYmxlPEFycmF5PFByZWRpY2F0ZTxUPj4+O1xuICBASW5wdXQoKSBncm91cEhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbiQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGRhdGFTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8T2JzZXJ2YWJsZTxUW10+PigxKTtcbiAgQE91dHB1dCgpIGRhdGEgPSB0aGlzLmRhdGFTdWJqZWN0LnBpcGUoXG4gICAgc3dpdGNoTWFwKCBkID0+IGQpLFxuICAgIGRlZmF1bHRTaGFyZVJlcGxheSgpLFxuICApO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Um93RGVmKSBjdXN0b21Sb3dzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcblxuICBAQ29udGVudENoaWxkcmVuKEN1c3RvbUNlbGxEaXJlY3RpdmUpIGN1c3RvbUNlbGxzITogUXVlcnlMaXN0PEN1c3RvbUNlbGxEaXJlY3RpdmU+O1xuICBAT3V0cHV0KCkgT25TdGF0ZVJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgT25TYXZlU3RhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzdGF0ZSQgOiBPYnNlcnZhYmxlPFBlcnNpc3RlZFRhYmxlU3RhdGU+O1xuXG4gIG15Q29sdW1ucyQhOiBPYnNlcnZhYmxlPENvbHVtbkluZm9bXT47XG5cbiAgc3RhdGVLZXlzJD86IE9ic2VydmFibGU8c3RyaW5nW10gfCBudWxsPjtcbiAgY3VycmVudFN0YXRlS2V5JD86IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBkaXNhYmxlU29ydCE6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXRlOiBUYWJsZVN0b3JlLFxuICAgIHB1YmxpYyBleHBvcnRUb0NzdlNlcnZpY2U6IEV4cG9ydFRvQ3N2U2VydmljZTxUPixcbiAgICBASW5qZWN0KFRhYmxlQnVpbGRlckNvbmZpZ1Rva2VuKSBwcml2YXRlIGNvbmZpZzogVGFibGVCdWlsZGVyQ29uZmlnLFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB3cmFwcGVyOiBUYWJsZVdyYXBwZXJEaXJlY3RpdmUsXG4gICkge1xuICAgICB0aGlzLnN0YXRlLm9uKCB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUobGFzdCgpKSwgZmluYWxTdGF0ZSA9PiB7XG4gICAgICBpZih0aGlzLnRhYmxlSWQpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzZXRMb2NhbFByb2ZpbGUoe2tleTp0aGlzLnRhYmxlSWQsdmFsdWU6IGZpbmFsU3RhdGV9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUoXG4gICAgICBtYXAoc3RhdGUgPT4gY2xvbmVEZWVwKHN0YXRlKSksXG4gICAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcbiAgICApO1xuICB9XG5cbiAgZmlyc3RQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJpY1RhYmxlQ29tcG9uZW50Py5wYWdpbmF0b3JDb21wb25lbnQ/LnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gIH1cblxuICBsYXN0UGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmdlbmVyaWNUYWJsZUNvbXBvbmVudD8ucGFnaW5hdG9yQ29tcG9uZW50Py5wYWdpbmF0b3I/Lmxhc3RQYWdlKCk7XG4gIH1cblxuICByZXNldFN0YXRlKCkge1xuICAgIHRoaXMuY3VzdG9tRmlsdGVycy5mb3JFYWNoKCBjZiA9PiBjZi5yZXNldCgpKTtcbiAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCggY2YgPT4gY2YucmVzZXQoKSApO1xuICAgIHRoaXMuc3RhdGUucmVzZXRTdGF0ZSgpO1xuICAgIHRoaXMuT25TdGF0ZVJlc2V0Lm5leHQobnVsbClcbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgICB0aGlzLnN0YXRlLnNldFRhYmxlU2V0dGluZ3ModGhpcy50YWJsZUJ1aWxkZXIuc2V0dGluZ3MpO1xuICAgIHRoaXMuc3RhdGUucnVuT25jZVdoZW4oc3RhdGVJcyhJbml0aWFsaXphdGlvblN0YXRlLk1ldGFEYXRhTG9hZGVkKSwgc3RhdGUgPT4ge1xuICAgICAgaWYodGhpcy50YWJsZUlkKSB7XG4gICAgICAgIGNvbnN0IHBlcnNpc3RlZFN0YXRlJCA9IHRoaXMuc3RvcmUucGlwZShcbiAgICAgICAgICBzZWxlY3Qoc2VsZWN0b3JzLnNlbGVjdExvY2FsUHJvZmlsZVN0YXRlPGFueT4odGhpcy50YWJsZUlkKSApLFxuICAgICAgICAgIHRhcCggcGVyc2lzdGVkU3RhdGUgPT4ge1xuICAgICAgICAgICAgaWYoIXBlcnNpc3RlZFN0YXRlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUuc2V0SW50aWFsaXphdGlvblN0YXRlKEluaXRpYWxpemF0aW9uU3RhdGUuTG9hZGVkRnJvbVN0b3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBub3ROdWxsKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlU3RhdGVGcm9tUGVyc2lzdGVkU3RhdGUocGVyc2lzdGVkU3RhdGUkKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbnRpYWxpemF0aW9uU3RhdGUoSW5pdGlhbGl6YXRpb25TdGF0ZS5Mb2FkZWRGcm9tU3RvcmUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGN1c3RvbUZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcmVkaWNhdGU8YW55PltdPihbXSk7XG4gIGluaXRpYWxpemVEYXRhKCkge1xuXG5cbiAgICB2YXIgYWxsRmlsdGVycyA9IHRoaXMuaW5wdXRGaWx0ZXJzID8gY29tYmluZUFycmF5cyhbXG4gICAgICB0aGlzLmN1c3RvbUZpbHRlcnMkLFxuICAgICAgdGhpcy5pbnB1dEZpbHRlcnNcbiAgICBdKSA6IHRoaXMuY3VzdG9tRmlsdGVycyQ7XG5cbiAgICBjb25zdCBmaWx0ZXJzJCA9IHRoaXMuc3RhdGUuZmlsdGVycyQucGlwZShtYXAoIGZpbHRlcnMgPT4gT2JqZWN0LnZhbHVlcyhmaWx0ZXJzKSApKVxuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhRmlsdGVyKGFsbEZpbHRlcnMpXG4gICAgICAuYXBwZW5kRmlsdGVycyhmaWx0ZXJzJClcbiAgICAgIC5maWx0ZXJEYXRhKHRoaXMudGFibGVCdWlsZGVyLmdldERhdGEkKCkpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChkYXRhID0+IHRoaXMuc3RhdGUuZ3JvdXBCeUtleXMkLnBpcGUoXG4gICAgICAgICAgbWFwKGdyb3VwQnkgPT4gdGhpcy5nZXREYXRhKGRhdGEsIGdyb3VwQnkpKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcChkYXRhID0+IHRoaXMuc3RhdGUuZ3JvdXBzJC5waXBlKFxuICAgICAgICAgICAgbWFwKGdyb3VwcyA9PiB0aGlzLnNldERpc3BsYXkoZGF0YSwgZ3JvdXBzKSlcbiAgICAgICAgICApKVxuICAgICAgICApKVxuICAgICAgKTtcblxuICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dChkYXRhKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0YXRlKCk7XG4gICAgdGhpcy5pbml0aWFsaXplRGF0YSgpO1xuXG4gICAgaWYodGhpcy50YWJsZUlkKSB7XG4gICAgICB0aGlzLnN0YXRlS2V5cyQgPSB0aGlzLnN0b3JlLnNlbGVjdChzZWxlY3RvcnMuc2VsZWN0TG9jYWxQcm9maWxlS2V5cyh0aGlzLnRhYmxlSWQpKTtcbiAgICAgIHRoaXMuY3VycmVudFN0YXRlS2V5JCA9IHRoaXMuc3RvcmUuc2VsZWN0KHNlbGVjdG9ycy5zZWxlY3RMb2NhbFByb2ZpbGVDdXJyZW50S2V5KHRoaXMudGFibGVJZCkpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydFRvQ3N2KCk6IHZvaWQge1xuICAgIGNvbnN0IHNvcnRlZCA9IHRoaXMuZGF0YS5waXBlKFxuICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5zdGF0ZS5zb3J0ZWQkKSxcbiAgICAgIG1hcCgoW2RhdGEsIHNvcnRlZF0pID0+IHNvcnREYXRhKGRhdGEsIHNvcnRlZCkpXG4gICAgKTtcbiAgICB0aGlzLmV4cG9ydFRvQ3N2U2VydmljZS5leHBvcnRUb0Nzdihzb3J0ZWQpO1xuICB9XG5cbiAgc2F2ZVN0YXRlKCkge1xuICAgIHRoaXMuc3RhdGUuZ2V0U2F2YWJsZVN0YXRlKCkucGlwZShcbiAgICAgIGZpcnN0KClcbiAgICApLnN1YnNjcmliZSggdGFibGVTdGF0ZSA9PiB7XG4gICAgICB0aGlzLk9uU2F2ZVN0YXRlLm5leHQobnVsbCk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNldExvY2FsUHJvZmlsZSh7IGtleTogdGhpcy50YWJsZUlkLCB2YWx1ZTp0YWJsZVN0YXRlLCBwZXJzaXN0OiB0cnVlfSApKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFByb2ZpbGVTdGF0ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2V0TG9jYWxQcm9maWxlc1N0YXRlKHtrZXk6dGhpcy50YWJsZUlkLCBjdXJyZW50OiB2YWx9KSk7XG4gIH1cblxuICBkZWxldGVQcm9maWxlU3RhdGUoc3RhdGVLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZGVsZXRlTG9jYWxQcm9maWxlc1N0YXRlKHtrZXk6dGhpcy50YWJsZUlkLCBzdGF0ZUtleX0pKTtcbiAgfVxuXG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuSW5pdGlhbGl6ZUNvbHVtbnMoKTtcblxuICAgIHRoaXMuc3RhdGUucnVuT25jZVdoZW4oc3RhdGVJcyhJbml0aWFsaXphdGlvblN0YXRlLkxvYWRlZEZyb21TdG9yZSksIHN0YXRlID0+IHtcblxuICAgICAgdmFyIGFsbEZpbHRlcnMgPSBbLi4udGhpcy5maWx0ZXJzLCAuLi50aGlzLmN1c3RvbUZpbHRlcnNdO1xuICAgICAgaWYodGhpcy53cmFwcGVyKSB7XG4gICAgICAgIGFsbEZpbHRlcnMgPSBbLi4uYWxsRmlsdGVycywgLi4udGhpcy53cmFwcGVyLmN1c3RvbUZpbHRlcnMsIC4uLnRoaXMud3JhcHBlci5maWx0ZXJzLCAuLi50aGlzLndyYXBwZXIucmVnaXN0ZXJhdGlvbnNdO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VzdG9tRmlsdGVyczogKFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlfFRhYmxlRmlsdGVyRGlyZWN0aXZlIClbXSA9IFtdO1xuXG4gICAgICBhbGxGaWx0ZXJzLmZpbHRlciggZiA9PiAhZi51c2VkKS5mb3JFYWNoKCBmID0+IHtcbiAgICAgICAgZi51c2VkID0gdHJ1ZTtcbiAgICAgICAgaWYoZi5zYXZhYmxlKSB7XG4gICAgICAgICAgdmFyIGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZi5maWx0ZXJJZF07XG4gICAgICAgICAgaWYoaXNGaWx0ZXJJbmZvKGZpbHRlcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckRpcmVjdGl2ZTogVGFibGVGaWx0ZXJEaXJlY3RpdmUgPSBmIGFzIFRhYmxlRmlsdGVyRGlyZWN0aXZlO1xuICAgICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLmZpZWxkVHlwZSA9IGZpbHRlci5maWVsZFR5cGU7XG4gICAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUuZmlsdGVyVHlwZSA9IGZpbHRlci5maWx0ZXJUeXBlO1xuICAgICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLnNldEZpbHRlclZhbHVlKGZpbHRlci5maWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUua2V5ID0gZmlsdGVyLmtleTtcbiAgICAgICAgICAgIGZpbHRlckRpcmVjdGl2ZS51cGRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaXNDdXN0b21GaWx0ZXIoZmlsdGVyKSkge1xuICAgICAgICAgICAgZi5hY3RpdmUgPSBmaWx0ZXIuYWN0aXZlID8/IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXRlLmFkZEZpbHRlcihmLmZpbHRlciQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1c3RvbUZpbHRlcnMucHVzaChmKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZpbHRlcnMkID0gIGZyb20oIGN1c3RvbUZpbHRlcnMubWFwKCBjZiA9PiBjZi5maWx0ZXIkICApKS5waXBlKFxuICAgICAgICBtZXJnZUFsbCgpLFxuICAgICAgICBzY2FuKCAoYSxiKT0+IHtcbiAgICAgICAgICAgIGlmKGIuYWN0aXZlKSB7XG4gICAgICAgICAgICAgIGFbYi5maWx0ZXJJZF0gPSBpc0N1c3RvbUZpbHRlcihiKSA/IGIucHJlZGljYXRlIDogY3JlYXRlRmlsdGVyRnVuYyhiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBhW2IuZmlsdGVySWRdIDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9LCB7fSBhcyBEaWN0aW9uYXJ5PFByZWRpY2F0ZTxhbnk+PiksXG4gICAgICAgIG1hcCggZiA9PiBPYmplY3QudmFsdWVzKGYpKVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RhdGUub24oZmlsdGVycyQsIChmKSA9PiB7XG4gICAgICAgIHRoaXMuY3VzdG9tRmlsdGVycyQubmV4dChmKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZSh7aW5pdGlhbGl6YXRpb25TdGF0ZTogSW5pdGlhbGl6YXRpb25TdGF0ZS5SZWFkeX0pO1xuICAgIH0pO1xuXG4gIH1cblxuICBJbml0aWFsaXplQ29sdW1ucygpIHtcbiAgICBjb25zdCBjdXN0b21DZWxsTWFwID0gbmV3IE1hcCh0aGlzLmN1c3RvbUNlbGxzLm1hcChjYyA9PiBbY2MuY3VzdG9tQ2VsbCxjY10pKTtcbiAgICB0aGlzLnN0YXRlLnNldE1ldGFEYXRhKHRoaXMudGFibGVCdWlsZGVyLm1ldGFEYXRhJCEucGlwZShcbiAgICAgIG1hcCgobWRzKSA9PiB7XG4gICAgICAgIG1kcyA9IG1kcy5tYXAodGhpcy5tYXBNZXRhRGF0YXMpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIC4uLm1kcyxcbiAgICAgICAgICAuLi50aGlzLmN1c3RvbUNlbGxzLm1hcCggY2MgPT4gY2MuZ2V0TWV0YURhdGEobWRzLmZpbmQoIGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNjLmN1c3RvbUNlbGwgKSkgKVxuICAgICAgICBdXG4gICAgICB9KVxuICAgICkpO1xuICAgIHRoaXMuc3RhdGUuc2V0TGlua01hcHModGhpcy50YWJsZUJ1aWxkZXIubWV0YURhdGEkIS5waXBlKFxuICAgICAgbWFwKChtZHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG1kcy5yZWR1Y2UoKGFjYywgbWQpID0+IHtcbiAgICAgICAgICBpZihtZC5maWVsZFR5cGUgPT09IEZpZWxkVHlwZS5MaW5rKXsgYWNjW21kLmtleV09IGNyZWF0ZUxpbmtDcmVhdG9yKG1kKX1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LHt9KVxuICAgICAgfSlcbiAgICApKVxuXG4gICAgdGhpcy5teUNvbHVtbnMkID0gdGhpcy5zdGF0ZS5tZXRhRGF0YUFycmF5JC5waXBlKFxuICAgICAgbWFwQXJyYXkoIG1ldGFEYXRhID0+ICh7bWV0YURhdGEsIGN1c3RvbUNlbGw6IGN1c3RvbUNlbGxNYXAuZ2V0KG1ldGFEYXRhLmtleSkhfSkpXG4gICAgKTtcbiAgfVxuICBtYXBNZXRhRGF0YXMgPSAobWV0YSA6IE1ldGFEYXRhPFQ+KSA9PiB7XG4gICAgaWYobWV0YS5maWVsZFR5cGUgPT09IEZpZWxkVHlwZS5BcnJheSl7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsID0gey4uLm1ldGEuYWRkaXRpb25hbH0gYXMgQXJyYXlBZGRpdGlvbmFsO1xuICAgICAgYWRkaXRpb25hbC5hcnJheVN0eWxlID0gYWRkaXRpb25hbD8uYXJyYXlTdHlsZSA/PyBBcnJheURlZmF1bHRzLmFycmF5U3R5bGU7XG4gICAgICBhZGRpdGlvbmFsLmxpbWl0ID0gYWRkaXRpb25hbC5saW1pdCA/PyB0aGlzLmNvbmZpZy5hcnJheUluZm8/LmxpbWl0ID8/IEFycmF5RGVmYXVsdHMubGltaXQ7XG4gICAgICByZXR1cm4gey4uLm1ldGEsYWRkaXRpb25hbH1cbiAgICB9XG4gICAgcmV0dXJuIG1ldGE7XG4gIH1cblxuICBjb2xsYXBzZUhlYWRlciQgPSB0aGlzLnN0YXRlLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmNvbGxhcHNlSGVhZGVyKSk7XG5cbiAgZ2V0RGF0YShkYXRhOiBhbnlbXSwgZ3JvdXBCeUtleXM6IHN0cmluZ1tdKTogYW55W10ge1xuICAgIGlmICghZ3JvdXBCeUtleXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRpc2FibGVTb3J0ID0gZmFsc2U7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlU29ydCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMudGJHcm91cEJ5KGRhdGEsIGdyb3VwQnlLZXlzKTtcbiAgfVxuXG4gIHRiR3JvdXBCeSA9IChkYXRhOiBhbnlbXSwgZ3JvdXBCeUtleXM6IHN0cmluZ1tdLCBwYXJlbnRHcm91cE5hbWU/OiBhbnkpOiBhbnlbXSA9PiB7XG4gICAgbGV0IHJlcyA9IHt9O1xuICAgIHJlcyA9IGdyb3VwQnkoZGF0YSwgZ3JvdXBCeUtleXNbMF0pO1xuICAgIGNvbnN0IHJlbWFpbmluZ0dyb3VwQnlLZXlzID0gZ3JvdXBCeUtleXMuc2xpY2UoMSk7XG4gICAgaWYgKHJlbWFpbmluZ0dyb3VwQnlLZXlzLmxlbmd0aCkge1xuICAgICAgT2JqZWN0LmtleXMocmVzKS5mb3JFYWNoKGtleSA9PiByZXNba2V5XSA9IHRoaXMudGJHcm91cEJ5KHJlc1trZXldLCByZW1haW5pbmdHcm91cEJ5S2V5cywga2V5KSlcbiAgICB9XG4gICAgcmV0dXJuIGZsYXR0ZW5EZWVwKE9iamVjdC5rZXlzKHJlcykubWFwKGdyb3VwTmFtZSA9PiB7XG4gICAgICBjb25zdCB1bmlxTmFtZSA9IHBhcmVudEdyb3VwTmFtZSA/IGAke3BhcmVudEdyb3VwTmFtZX0tJHtncm91cE5hbWV9YCA6IGAke2dyb3VwTmFtZX1gO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIGlzR3JvdXBIZWFkZXI6IHRydWUsXG4gICAgICAgICAgZ3JvdXBIZWFkZXJOYW1lOiBgJHtncm91cE5hbWV9ICgke3Jlc1tncm91cE5hbWVdPy5maWx0ZXIocm93ID0+ICFyb3cuaXNHcm91cEhlYWRlcik/Lmxlbmd0aH0pYCxcbiAgICAgICAgICBkYXRhOiByZXNbZ3JvdXBOYW1lXSxcbiAgICAgICAgICBncm91cE5hbWU6IHVuaXFOYW1lLFxuICAgICAgICAgIHBhZGRpbmc6IDBcbiAgICAgICAgfSxcbiAgICAgICAgKHJlc1tncm91cE5hbWVdIGFzIGFueVtdKT8ubWFwKGQgPT4gKHsgLi4uZCwgcGFyZW50R3JvdXBOYW1lOiBkLnBhcmVudEdyb3VwTmFtZSB8fCB1bmlxTmFtZSB9KSlcbiAgICAgIF07XG4gICAgfSkpLm1hcCh0aGlzLmFkZEluZGVudGF0aW9uKTtcbiAgfVxuXG4gIGFkZEluZGVudGF0aW9uID0gKGQ6IGFueSkgPT4ge1xuICAgIGlmIChkLmlzR3JvdXBIZWFkZXIpIHtcbiAgICAgIGlmIChkLnBhZGRpbmcpIHtcbiAgICAgICAgZC5wYWRkaW5nICs9IDIwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZC5wYWRkaW5nID0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICBzZXREaXNwbGF5ID0gKGRhdGE6IGFueVtdLCBncm91cHM6IEdyb3VwW10pOiBhbnlbXSA9PiBkYXRhXG4gICAgLm1hcChkID0+ICh7XG4gICAgICAuLi5kLFxuICAgICAgc2hvdWxkRGlzcGxheTogIWQucGFyZW50R3JvdXBOYW1lIHx8IHRoaXMuc2hvdWxkRGlzcGxheShncm91cHMuZmluZChnID0+IGcuZ3JvdXBOYW1lID09IGQucGFyZW50R3JvdXBOYW1lKSwgZ3JvdXBzKSxcbiAgICAgIGlzRXhwYW5kZWQ6IGdyb3Vwcy5maW5kKGcgPT4gZy5ncm91cE5hbWUgPT0gZC5ncm91cE5hbWUpPy5pc0V4cGFuZGVkXG4gICAgfSkpXG4gICAgLmZpbHRlcihkID0+IGQuc2hvdWxkRGlzcGxheSk7XG5cblxuICBzaG91bGREaXNwbGF5ID0gKGN1cnJlbnRHcm91cD86IEdyb3VwLCBncm91cHM/OiBHcm91cFtdKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFjdXJyZW50R3JvdXA/LmlzRXhwYW5kZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRHcm91cCA9IGdyb3Vwcz8uZmluZChnID0+IGcuZ3JvdXBOYW1lID09IGN1cnJlbnRHcm91cC5wYXJlbnRHcm91cE5hbWUpO1xuXG4gICAgaWYgKHBhcmVudEdyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG91bGREaXNwbGF5KHBhcmVudEdyb3VwLCBncm91cHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbYmVmb3JlXVwiID5cbjwvbmctY29udGVudD5cblxuPG5nLWNvbnRhaW5lciBtdWx0aVNvcnQgW21hdFNvcnREaXNhYmxlZF09XCJkaXNhYmxlU29ydFwiPlxuICA8bmctY29udGFpbmVyICpuZ3J4TGV0PVwic3RhdGUudGFibGVTZXR0aW5ncyQgYXMgdGFibGVTZXR0aW5nc1wiPlxuXG5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCIudGItaGVhZGVyLXRpdGxlXCJcbiAgICAgICAgICAqbmdJZj1cIighKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSkgfHwgdGFibGVTZXR0aW5ncy5zaG93VGl0bGVXaGVuSGVhZGVyQ29sbGFwc2VkXCI+XG5cbiAgICAgICAgPC9uZy1jb250ZW50PlxuICAgICAgICA8Z3JvdXAtYnktbGlzdD48L2dyb3VwLWJ5LWxpc3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbHgtcm93LWVuZFwiPlxuICAgICAgICA8bGliLWZpbHRlci1saXN0PjwvbGliLWZpbHRlci1saXN0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlU2V0dGluZ3MuaGlkZUhlYWRlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKTsgZWxzZSBhbGxNZW51XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9J3ByaW1hcnknIFttYXRNZW51VHJpZ2dlckZvcl09XCJtYWluTWVudVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmxhdC1tZW51JzooY29sbGFwc2VIZWFkZXIkIHwgYXN5bmMpfVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+e3soY29sbGFwc2VIZWFkZXIkIHwgYXN5bmMpID8gJ21vcmVfaG9yaXonIDogJ21vcmVfdmVydCd9fTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxtYXQtbWVudSAjbWFpbk1lbnU9J21hdE1lbnUnPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudUV4dHJhXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWxsTWVudT5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNvbG9yPSdwcmltYXJ5JyBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWFpbk1lbnVcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZsYXQtbWVudSc6KGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKX1cIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPnt7KGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdtb3JlX2hvcml6JyA6ICdtb3JlX3ZlcnQnfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI21haW5NZW51PSdtYXRNZW51Jz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlck1lbnVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJNZW51RXh0cmFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bWF0LWljb24gW21hdFRvb2x0aXBdPVwiKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdleHBhbmQnIDogJ2NvbGxhcHNlJ1wiIGNsYXNzPVwiY29sbGFwc2UtaWNvbiBoZWFkZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInN0YXRlLnRvZ2dsZUNvbGxhcHNlSGVhZGVyKClcIj5cbiAgICAgICAgICAgIHt7KGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cImNsZWFyOiBib3RoO1wiPlxuICAgICAgPHRiLWdlbmVyaWMtdGFibGUgW3Jvd3NdPSdjdXN0b21Sb3dzJyBbZGF0YSRdPVwiZGF0YVwiIFtJbmRleENvbHVtbl09J0luZGV4Q29sdW1uJ1xuICAgICAgICBbU2VsZWN0aW9uQ29sdW1uXT0nU2VsZWN0aW9uQ29sdW1uJyAoc2VsZWN0aW9uJCk9J3NlbGVjdGlvbiQuZW1pdCgkZXZlbnQpJyBbdHJhY2tCeV09J3RyYWNrQnknXG4gICAgICAgIFtpc1N0aWNreV09J2lzU3RpY2t5JyBbY29sdW1uSW5mb3NdPSdteUNvbHVtbnMkJyBbZGlzYWJsZVNvcnRdPVwiZGlzYWJsZVNvcnRcIiBbZ3JvdXBIZWFkZXJUZW1wbGF0ZV09XCJncm91cEhlYWRlclRlbXBsYXRlXCI+XG4gICAgICA8L3RiLWdlbmVyaWMtdGFibGU+XG4gICAgPC9kaXY+XG5cblxuXG4gICAgPG5nLXRlbXBsYXRlICNoZWFkZXJNZW51PlxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgPHRiLWZpbHRlci1kaXNwbGF5ZXIgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlRmlsdGVyXCI+XG4gICAgICAgIDwvdGItZmlsdGVyLWRpc3BsYXllcj5cbiAgICAgICAgPHRiLWNvbC1kaXNwbGF5ZXIgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlQ29sdW1uU2V0dGluZ3NcIj48L3RiLWNvbC1kaXNwbGF5ZXI+XG4gICAgICAgIDx0Yi1zb3J0LW1lbnUgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlU29ydFwiPjwvdGItc29ydC1tZW51PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2hlYWRlck1lbnVFeHRyYT5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVzZXRTdGF0ZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5hdXRvcmVuZXc8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5SZXNldCB0YWJsZTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHBvcnRUb0NzdigpXCIgKm5nSWY9XCIhdGFibGVTZXR0aW5ncy5oaWRlRXhwb3J0XCI+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5maWxlX2Rvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+RXhwb3J0IFRhYmxlPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFN0YXRlS2V5JCB8IGFzeW5jIGFzIGN1cnJlbnRLZXlcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0lmPVwidGFibGVJZFwiIChjbGljayk9XCJzYXZlU3RhdGUoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5zYXZlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj5TYXZlIHRvIHt7Y3VycmVudEtleX19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj0ndGFibGVJZCcgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwic2F2ZWROYW1lc1wiPlxuICAgICAgICAgIDxzcGFuPkNob29zZSBQcm9maWxlPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bWF0LW1lbnUgI3NhdmVkTmFtZXM9J21hdE1lbnUnIHBhbmVsQ2xhc3M9J3dpZGUtbWVudSc+XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBjbGlja0VtaXR0ZXIgICNhZGQ9J2NsaWNrRW1pdHRlcic+XG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+TmV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9J2xldCBrZXkgb2Ygc3RhdGVLZXlzJCB8IGFzeW5jJz5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT0nc2V0UHJvZmlsZVN0YXRlKGtleSknPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT0nZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyc+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSdkaXNwbGF5OmZsZXg7Jz57e2tleX19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0nZGlzcGxheTpmbGV4Oyc+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogMTIwcHg7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj0nd2FybicgKGNsaWNrKT0nZGVsZXRlUHJvZmlsZVN0YXRlKGtleSknIHN0b3AtcHJvcGFnYXRpb24+ZGVsZXRlX2ZvcmV2ZXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC1tZW51PlxuICAgICAgPG5nLWNvbnRhaW5lciAqb3BEaWFsb2c9J2FkZCc+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXQgc3R5bGU9J3dpZHRoOjkwJScgbWF0SW5wdXQgI2FkZGVkS2V5IC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPSdzZXRQcm9maWxlU3RhdGUoYWRkZWRLZXkudmFsdWUpOyBhZGQubmV4dChmYWxzZSk7J1xuICAgICAgICAgIFtkaXNhYmxlZF09XCIhYWRkZWRLZXkudmFsdWVcIj5BZGQ8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgPC9uZy1jb250YWluZXI+XG5cbjwvbmctY29udGFpbmVyPlxuIl19