@one-paragon/angular-utilities 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +7 -7
  2. package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +5 -5
  3. package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +6 -6
  4. package/esm2022/action-state/ngrx.mjs +6 -1
  5. package/esm2022/http-request-state/HttpRequestStateFactory.mjs +6 -7
  6. package/esm2022/http-request-state/HttpRequestStateStore.mjs +41 -37
  7. package/esm2022/http-request-state/directives/HttpStateDirectiveBase.mjs +17 -21
  8. package/esm2022/http-request-state/directives/http-error-state-directive.mjs +12 -18
  9. package/esm2022/http-request-state/directives/http-inProgress-state-directive.mjs +12 -18
  10. package/esm2022/http-request-state/directives/http-notStarted-state-directive.mjs +12 -18
  11. package/esm2022/http-request-state/directives/http-success-state-directive.mjs +13 -18
  12. package/esm2022/http-request-state/directives/request-state-directive.mjs +20 -19
  13. package/esm2022/http-request-state/http-state-module.mjs +6 -6
  14. package/esm2022/ngrx/actionable-selector.mjs +12 -14
  15. package/esm2022/rxjs/subjectifier.mjs +6 -6
  16. package/esm2022/rxjs/subscriber.directive.mjs +11 -13
  17. package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +3 -1
  18. package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +10 -8
  19. package/esm2022/table-builder/classes/TableState.mjs +13 -15
  20. package/esm2022/table-builder/classes/table-builder-general-settings.mjs +46 -54
  21. package/esm2022/table-builder/classes/table-builder.mjs +4 -1
  22. package/esm2022/table-builder/classes/table-store.mjs +280 -282
  23. package/esm2022/table-builder/components/array-column.component.mjs +15 -19
  24. package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +44 -35
  25. package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +7 -7
  26. package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +7 -7
  27. package/esm2022/table-builder/components/filter/filter.component.mjs +24 -24
  28. package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +19 -18
  29. package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +15 -15
  30. package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +100 -86
  31. package/esm2022/table-builder/components/generic-table/paginator.component.mjs +20 -18
  32. package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +5 -7
  33. package/esm2022/table-builder/components/header-menu/header-menu.component.mjs +24 -21
  34. package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +14 -13
  35. package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +11 -4
  36. package/esm2022/table-builder/components/link-column.component.mjs +19 -23
  37. package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +8 -8
  38. package/esm2022/table-builder/components/profiles-menu/profiles-menu.component.mjs +26 -28
  39. package/esm2022/table-builder/components/scroll-strategy.mjs +11 -7
  40. package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +31 -31
  41. package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +23 -22
  42. package/esm2022/table-builder/components/table-container/table-container.mjs +90 -80
  43. package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +49 -51
  44. package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +8 -10
  45. package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +17 -15
  46. package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +14 -14
  47. package/esm2022/table-builder/directives/custom-cell-directive.mjs +24 -20
  48. package/esm2022/table-builder/directives/multi-sort.directive.mjs +10 -10
  49. package/esm2022/table-builder/directives/resize-column.directive.mjs +13 -14
  50. package/esm2022/table-builder/directives/table-wrapper.directive.mjs +5 -7
  51. package/esm2022/table-builder/directives/tb-filter.directive.mjs +105 -110
  52. package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +124 -124
  53. package/esm2022/table-builder/pipes/column-total.pipe.mjs +4 -4
  54. package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +4 -4
  55. package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +10 -12
  56. package/esm2022/table-builder/pipes/key-display.mjs +8 -10
  57. package/esm2022/table-builder/services/export-to-csv.service.mjs +57 -63
  58. package/esm2022/table-builder/services/table-template-service.mjs +11 -8
  59. package/esm2022/table-builder/services/transform-creator.mjs +35 -40
  60. package/esm2022/table-builder/table-builder.module.mjs +7 -7
  61. package/esm2022/utilities/directives/auto-focus.directive.mjs +8 -10
  62. package/esm2022/utilities/directives/clickEmitterDirective.mjs +4 -4
  63. package/esm2022/utilities/directives/clickSubject.mjs +5 -4
  64. package/esm2022/utilities/directives/conditional-classes.directive.mjs +11 -11
  65. package/esm2022/utilities/directives/dialog-service.mjs +5 -7
  66. package/esm2022/utilities/directives/dialog.mjs +38 -39
  67. package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +7 -8
  68. package/esm2022/utilities/directives/prevent-enter.directive.mjs +4 -4
  69. package/esm2022/utilities/directives/stop-propagation.directive.mjs +4 -4
  70. package/esm2022/utilities/directives/styler.mjs +10 -11
  71. package/esm2022/utilities/directives/trim-whitespace.directive.mjs +7 -9
  72. package/esm2022/utilities/module.mjs +7 -7
  73. package/esm2022/utilities/pipes/function.pipe.mjs +4 -4
  74. package/esm2022/utilities/pipes/phone.pipe.mjs +4 -4
  75. package/esm2022/utilities/pipes/space-case.pipes.mjs +4 -4
  76. package/fesm2022/one-paragon-angular-utilities.mjs +1666 -1678
  77. package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -1
  78. package/http-request-state/HttpRequestStateStore.d.ts +2 -2
  79. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +5 -7
  80. package/http-request-state/directives/http-error-state-directive.d.ts +1 -4
  81. package/http-request-state/directives/http-inProgress-state-directive.d.ts +3 -6
  82. package/http-request-state/directives/http-notStarted-state-directive.d.ts +1 -4
  83. package/http-request-state/directives/http-success-state-directive.d.ts +1 -6
  84. package/http-request-state/directives/request-state-directive.d.ts +0 -1
  85. package/package.json +8 -8
  86. package/rxjs/subjectifier.d.ts +0 -1
  87. package/table-builder/classes/TableBuilderDataSource.d.ts +0 -1
  88. package/table-builder/classes/table-store.d.ts +1 -2
  89. package/table-builder/components/column-builder/column-builder.component.d.ts +2 -6
  90. package/table-builder/components/filter/filter.component.d.ts +1 -2
  91. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +0 -3
  92. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +1 -2
  93. package/table-builder/components/generic-table/generic-table.component.d.ts +4 -4
  94. package/table-builder/components/generic-table/paginator.component.d.ts +0 -2
  95. package/table-builder/components/header-menu/header-menu.component.d.ts +1 -2
  96. package/table-builder/components/in-filter/in-filter.component.d.ts +1 -2
  97. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +1 -2
  98. package/table-builder/components/sort-menu/sort-menu.component.d.ts +2 -3
  99. package/table-builder/components/table-container/table-container-imports.d.ts +1 -1
  100. package/table-builder/components/table-container/virtual-scroll-container.d.ts +0 -2
  101. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +3 -3
  102. package/table-builder/directives/custom-cell-directive.d.ts +3 -3
  103. package/table-builder/directives/multi-sort.directive.d.ts +1 -2
  104. package/table-builder/directives/resize-column.directive.d.ts +1 -2
  105. package/table-builder/directives/tb-filter.directive.d.ts +19 -23
  106. package/table-builder/pipes/format-filter-value.pipe.d.ts +0 -2
  107. package/table-builder/pipes/key-display.d.ts +0 -1
  108. package/table-builder/services/export-to-csv.service.d.ts +0 -3
  109. package/table-builder/services/table-template-service.d.ts +1 -2
  110. package/table-builder/services/transform-creator.d.ts +0 -5
  111. package/utilities/directives/auto-focus.directive.d.ts +1 -2
  112. package/utilities/directives/conditional-classes.directive.d.ts +1 -2
  113. package/utilities/directives/dialog.d.ts +2 -5
  114. package/utilities/directives/styler.d.ts +0 -2
  115. package/utilities/directives/trim-whitespace.directive.d.ts +0 -2
@@ -1,7 +1,7 @@
1
1
  import { FieldType } from '../interfaces/report-def';
2
2
  import { v4 as uuid } from 'uuid';
3
3
  import { defaultTableState, InitializationState, keysToDelete } from './TableState';
4
- import { Injectable, Inject, computed } from '@angular/core';
4
+ import { Injectable, computed, inject } from '@angular/core';
5
5
  import { TableBuilderConfigToken } from './TableBuilderConfig';
6
6
  import { isCustomFilter, isFilterInfo } from './filter-info';
7
7
  import { ComponentStore } from '@ngrx/component-store';
@@ -16,289 +16,152 @@ export function stateIs(initializationState) {
16
16
  return (state) => state.initializationState === initializationState;
17
17
  }
18
18
  export class TableStore extends ComponentStore {
19
- constructor(config) {
19
+ constructor() {
20
+ const config = inject(TableBuilderConfigToken);
20
21
  super({ ...defaultTableState, ...config.defaultTableState });
21
- this.selectStateReady = this.select(state => state.initializationState).pipe(filter(i => i === InitializationState.Ready));
22
- this.getSavableStateSignal = computed(() => {
23
- const state = this.state();
24
- return this.mapSaveableState(state);
25
- });
26
- this.mapSaveableState = (s) => {
27
- const savableState = { ...s };
28
- keysToDelete.forEach(key => delete savableState[key]);
29
- return savableState;
30
- };
31
- this.on = (srcObservable, func) => {
32
- this.effect(() => srcObservable.pipe(tap(func)));
33
- return this;
34
- };
35
- this.metaData$ = this.select(state => state.metaData);
36
- this.metaDataArray = this.selectSignal(this.state, orderMetaData);
37
- this.metaDataArray$ = this.select(this.state$, orderMetaData);
38
- this.getMetaData$ = (key) => {
39
- return this.select(state => state.metaData[key]).pipe(tap(meta => { if (!meta)
40
- console.warn(`Meta data with key ${key} not found`); }), notNull());
41
- };
42
- this.getUserDefinedWidth$ = (key) => this.select(state => state.userDefined.widths[key]);
43
- this.getUserDefinedWidth = (key) => this.selectSignal(state => state.userDefined.widths[key]);
44
- this.getUserDefinedWidths$ = this.select(state => state.userDefined.widths);
45
- this.getUserDefinedWidths = this.selectSignal(state => state.userDefined.widths);
46
- this.displayedColumns$ = this.select(orderedVisibleColumns);
47
- this.resetState = this.updater((state) => {
48
- const sorted = this.createPreSort(state.metaData);
49
- return ({ ...state, hiddenKeys: [], sorted, filters: {}, groupBy: [], userDefined: { widths: {}, order: {}, table: {} } });
50
- });
51
- this.showColumn = this.updater((state, key) => ({
52
- ...state,
53
- hiddenKeys: state.hiddenKeys.filter(k => k !== key),
54
- }));
55
- this.hideColumn = this.updater((state, key) => ({
56
- ...state,
57
- hiddenKeys: [...state.hiddenKeys.filter(k => k !== key), key],
58
- }));
59
- this.setHiddenColumns = this.updater((state, displayCols) => {
60
- return ({ ...state, hiddenKeys: displayCols.filter(d => !d.visible).map(d => d.key) });
61
- });
62
- this.setUserDefinedWidth = this.updater((state, colWidths) => {
63
- const userDefinedWidths = { ...state.userDefined.widths };
64
- colWidths.forEach(cw => {
65
- userDefinedWidths[cw.key] = cw.widthInPixel;
66
- });
67
- return { ...state, userDefined: { ...state.userDefined, widths: userDefinedWidths } };
68
- });
69
- this.setUserDefinedOrder = this.updater((state, moved) => {
70
- const { newOrder, oldOrder } = moved;
71
- const mdsArr = orderedVisibleMetaData(state);
72
- moveItemInArray(mdsArr, oldOrder, newOrder);
73
- const userDefinedOrder = mdsArr.reduce((aggregate, current, index) => {
74
- aggregate[current.key] = index;
75
- return aggregate;
76
- }, {});
77
- return ({ ...state, userDefined: { ...state.userDefined, order: userDefinedOrder } });
78
- });
79
- this.filters$ = this.select(state => state.filters);
80
- this.getFilter$ = (filterId) => {
81
- return this.select(state => state.filters[filterId]);
82
- };
83
- this.addFilter = this.updater((state, filter) => {
84
- return this.addFiltersToState(state, [filter]);
85
- });
86
- this.addFilters = this.updater((state, filters) => {
87
- return this.addFiltersToState(state, filters);
88
- });
89
- this.addFiltersToState = (state, filters) => {
90
- var customFilters = filters.filter(isCustomFilter);
91
- var filterInfos = filters.filter(isFilterInfo);
92
- const filtersObj = filterInfos
93
- .filter(fltr => Object.keys(state.metaData).some(key => key === fltr.key) || console.warn(`Meta data with key ${fltr.key} not found`))
94
- .reduce((filtersObj, filter) => {
95
- if (!filter.filterId) {
96
- filter.filterId = uuid();
97
- }
98
- filtersObj[filter.filterId] = filter;
99
- return filtersObj;
100
- }, {});
101
- customFilters.forEach(fltr => {
102
- if (!fltr.filterId) {
103
- fltr.filterId = uuid();
104
- }
105
- filtersObj[fltr.filterId] = fltr;
106
- });
107
- return {
108
- ...state,
109
- filters: { ...state.filters, ...filtersObj }
110
- };
111
- };
112
- this.removeFilter = this.updater((state, filterId) => {
113
- const filtersCopy = { ...state.filters };
114
- delete filtersCopy[filterId];
115
- return ({ ...state, filters: filtersCopy });
116
- });
117
- this.removeFilters = this.updater((state, filterIds) => {
118
- const filtersCopy = { ...state.filters };
119
- filterIds.forEach(id => { delete filtersCopy[id]; });
120
- return ({ ...state, filters: filtersCopy });
121
- });
122
- this.clearFilters = this.updater((state) => ({ ...state, filters: {} }));
123
- this.selectSorted = this.select(state => state.sorted).pipe(distinctUntilChanged((f, s) => !isDifferent(f, s)));
124
- this.sort$ = this.select(this.selectStateReady, this.selectSorted, (_, s) => s);
125
- this.createPreSort = (metaDatas) => {
126
- return Object.values(metaDatas).filter((metaData) => !!metaData.preSort)
127
- .sort(({ preSort: ps1 }, { preSort: ps2 }) => (ps1.precedence || Number.MAX_VALUE) - (ps2.precedence || Number.MAX_VALUE))
128
- .map(({ key, preSort }) => ({ active: key, direction: preSort.direction }));
129
- };
130
- this.setSort = this.updater((state, { key, direction }) => {
131
- const sortArray = state.sorted.filter(s => s.active !== key);
132
- if (direction) {
133
- sortArray.unshift({ active: key, direction });
134
- }
135
- return {
136
- ...state,
137
- sorted: sortArray,
138
- };
139
- });
140
- this.setAllSort = this.updater((state, sortArray) => {
141
- return {
142
- ...state,
143
- sorted: sortArray,
144
- };
145
- });
146
- this.updateStateFunc = (state, incomingTableState) => {
147
- const metaData = state.metaData;
148
- const sorted = incomingTableState.sorted?.length ? incomingTableState.sorted
149
- : state.initializationState === InitializationState.Created ? this.createPreSort(metaData) : state.sorted;
150
- return { ...state, ...incomingTableState, metaData, sorted };
151
- };
152
- this.setPageSize = this.updater((state, pageSize) => ({ ...state, pageSize, userDefined: { ...state.userDefined, pageSize } }));
153
- this.getPageSize = this.select(state => state.userDefined.pageSize || state.pageSize);
154
- this.updateState = this.updater(this.updateStateFunc);
155
- this.updateStateFromPersistedState = this.updater((state, persistedState) => {
156
- const incomingTableState = this.cleanPersistedState(state, persistedState);
157
- const newState = this.updateStateFunc(state, incomingTableState);
158
- newState.initializationState = state.initializationState === InitializationState.MetaDataLoaded ? InitializationState.LoadedFromStore : state.initializationState;
159
- return newState;
160
- });
161
- this.getUserDefinedTableSize = this.selectSignal(state => state.userDefined.table.width);
162
- this.getUserDefinedTableSize$ = this.select(state => state.userDefined.table.width);
163
- this.setTableWidth = this.updater((state, widthInPixels) => ({ ...state, userDefined: { ...state.userDefined, table: { width: widthInPixels } } }));
164
- this.mergeMeta = (orig, merge) => {
165
- return {
166
- key: orig.key,
167
- displayName: merge.displayName ?? orig.displayName,
168
- fieldType: merge.fieldType || orig.fieldType,
169
- additional: { ...orig.additional, ...merge.additional },
170
- order: merge.order ?? orig.order,
171
- preSort: merge.preSort ?? orig.preSort,
172
- width: merge.width ?? orig.width,
173
- noExport: merge.noExport || orig.noExport,
174
- noFilter: merge.noFilter || orig.noFilter,
175
- customCell: merge.customCell ?? orig.customCell,
176
- transform: merge.transform ?? orig.transform,
177
- map: merge.map ?? orig.map,
178
- click: merge.click ?? orig.click,
179
- classes: merge.classes ?? orig.classes,
180
- noSort: merge.noSort ?? orig.noSort,
181
- template: merge.template ?? orig.template,
182
- toolTip: merge.toolTip ?? orig.toolTip,
183
- useIcon: merge.useIcon ?? orig.useIcon,
184
- };
185
- };
186
- this.setInitializationState = this.updater((state, initializationState) => {
187
- return { ...state, initializationState };
188
- });
189
- this.setMetaData = this.updater((state, md) => {
190
- const metaData = (Array.isArray(md) ? [...md] : [md])
191
- .reduce((prev, curr) => {
192
- if (prev[curr.key]) {
193
- prev[curr.key] = this.mergeMeta(prev[curr.key], curr);
194
- }
195
- else {
196
- prev[curr.key] = curr;
197
- }
198
- return prev;
199
- }, {});
200
- let sorted = state.sorted;
201
- if (sorted.length === 0) {
202
- sorted = this.createPreSort(metaData);
203
- }
204
- const order = this.initializeOrder(state, metaData);
205
- const initializationState = state.initializationState == InitializationState.Created ? InitializationState.MetaDataLoaded : state.initializationState;
206
- return { ...state, initializationState, metaData, sorted, userDefined: { ...state.userDefined, order: order } };
207
- });
208
- this.initializeOrder = (state, mds) => {
209
- const viewableMetaDataArr = Object.values(mds).filter(a => a.fieldType !== FieldType.Hidden);
210
- let userDefinedOrder = state.userDefined.order;
211
- if (viewableMetaDataArr.some(meta => userDefinedOrder[meta.key] == null)) {
212
- return {};
213
- }
214
- return userDefinedOrder;
215
- };
216
- this.toggleCollapseHeader = this.updater((state) => {
217
- const tableSettings = { ...state.persistedTableSettings };
218
- tableSettings.collapseHeader = !tableSettings.collapseHeader;
219
- return ({ ...state, persistedTableSettings: new PersistedTableSettings(tableSettings) });
220
- });
221
- this.toggleCollapseFooter = this.updater((state) => {
222
- const tableSettings = { ...state.persistedTableSettings };
223
- tableSettings.collapseFooter = !tableSettings.collapseFooter;
224
- return ({ ...state, persistedTableSettings: new PersistedTableSettings(tableSettings) });
225
- });
226
- this.addGroupByKey = this.updater((state, metaDataKey) => ({
227
- ...state,
228
- groupBy: [...state.groupBy, { key: metaDataKey, expandedHeaders: [] }]
229
- }));
230
- this.removeGroupByKey = this.updater((state, groupByKey) => ({
231
- ...state,
232
- groupBy: state.groupBy.filter(key => groupByKey !== key.key)
233
- }));
234
- this.updateExpandedGroups = this.updater((state, data) => {
235
- const gbk = replaceInArrayWithClone(state.groupBy, k => k.key === data.key, gk => {
236
- gk.expandedHeaders = data.isExpanded ? [...gk.expandedHeaders, data.groupKey] : gk.expandedHeaders.filter(g => g !== data.groupKey);
237
- });
238
- return ({
239
- ...state,
240
- groupBy: gbk
241
- });
242
- });
243
- this.expandAllOfGroup = this.updater((state, data) => {
244
- const newGroupedData = state.groupBy.map(gb => ({
245
- key: gb.key,
246
- expandedHeaders: data.groupHeadersByKey[gb.key]?.map(g => g.groupName) ?? gb.expandedHeaders
247
- }));
248
- return ({ ...state, groupBy: newGroupedData });
249
- });
250
- this.collapseAll = this.updater((state) => ({
251
- ...state,
252
- groupBy: state.groupBy.map(gb => ({ key: gb.key, expandedHeaders: [] }))
253
- }));
254
- this.collapseAllOfKey = this.updater((state, data) => ({
255
- ...state,
256
- groupBy: state.groupBy.map(gb => ({
257
- key: gb.key,
258
- expandedHeaders: data.keys.includes(gb.key) ? [] : gb.expandedHeaders
259
- }))
260
- }));
261
- this.groupByKeys$ = this.select(state => state.groupBy.map(gbk => gbk.key))
262
- .pipe(distinctUntilChanged((prev, curr) => prev.length === curr.length && curr.every((k, i) => prev[i] === k)));
263
- this.expandedGroups$ = this.select(state => state.groupBy).pipe(distinctUntilChanged((a, b) => {
264
- const aa = a.flatMap(g => g.expandedHeaders);
265
- const bb = b.flatMap(g => g.expandedHeaders);
266
- return aa.length === bb.length && aa.every((k) => bb.includes(k));
267
- }));
268
- this.setTableSettings = this.updater((state, settings) => {
269
- const s = {
270
- ...state,
271
- persistedTableSettings: new PersistedTableSettings(settings),
272
- notPersistedTableSettings: new NotPersistedTableSettings(settings)
273
- };
274
- return s;
275
- });
276
- this.tableSettings = this.selectSignal(state => {
277
- const ts = { ...state.persistedTableSettings, ...state.notPersistedTableSettings };
278
- return ts;
279
- });
280
- this.tableSettings$ = this.select(state => {
281
- const ts = { ...state.persistedTableSettings, ...state.notPersistedTableSettings };
282
- return ts;
283
- });
284
- this.props = this.selectSignal(s => s.props);
285
- this.setLinkMaps = this.updater((state, maps) => {
286
- return { ...state, linkMaps: maps };
287
- });
288
- this.getLinkInfo = (md) => this.selectSignal(state => state.linkMaps[md.key]);
289
- this.getIsExpanded = (columnKey, groupHeaderKey) => {
290
- return this.select(state => !!state.groupBy.filter(g => g.key === columnKey && g.expandedHeaders.includes(groupHeaderKey)).length);
291
- };
292
- this.$isVirtual = this.selectSignal(state => state.notPersistedTableSettings.useVirtualScroll === true || state.notPersistedTableSettings.useVirtualScroll?.virtualAsDefault || state.showAll);
293
22
  }
23
+ selectStateReady = this.select(state => state.initializationState).pipe(filter(i => i === InitializationState.Ready));
294
24
  getSavableState() {
295
25
  return this.state$.pipe(map(s => {
296
26
  return this.mapSaveableState(s);
297
27
  }));
298
28
  }
29
+ getSavableStateSignal = computed(() => {
30
+ const state = this.state();
31
+ return this.mapSaveableState(state);
32
+ });
33
+ mapSaveableState = (s) => {
34
+ const savableState = { ...s };
35
+ keysToDelete.forEach(key => delete savableState[key]);
36
+ return savableState;
37
+ };
38
+ on = (srcObservable, func) => {
39
+ this.effect(() => srcObservable.pipe(tap(func)));
40
+ return this;
41
+ };
299
42
  onLast(callback) {
300
43
  this.on(this.state$.pipe(last()), callback);
301
44
  }
45
+ metaData$ = this.select(state => state.metaData);
46
+ metaDataArray = this.selectSignal(this.state, orderMetaData);
47
+ metaDataArray$ = this.select(this.state$, orderMetaData);
48
+ getMetaData$ = (key) => {
49
+ return this.select(state => state.metaData[key]).pipe(tap(meta => { if (!meta)
50
+ console.warn(`Meta data with key ${key} not found`); }), notNull());
51
+ };
52
+ getUserDefinedWidth$ = (key) => this.select(state => state.userDefined.widths[key]);
53
+ getUserDefinedWidth = (key) => this.selectSignal(state => state.userDefined.widths[key]);
54
+ getUserDefinedWidths$ = this.select(state => state.userDefined.widths);
55
+ getUserDefinedWidths = this.selectSignal(state => state.userDefined.widths);
56
+ displayedColumns$ = this.select(orderedVisibleColumns);
57
+ resetState = this.updater((state) => {
58
+ const sorted = this.createPreSort(state.metaData);
59
+ return ({ ...state, hiddenKeys: [], sorted, filters: {}, groupBy: [], userDefined: { widths: {}, order: {}, table: {} } });
60
+ });
61
+ showColumn = this.updater((state, key) => ({
62
+ ...state,
63
+ hiddenKeys: state.hiddenKeys.filter(k => k !== key),
64
+ }));
65
+ hideColumn = this.updater((state, key) => ({
66
+ ...state,
67
+ hiddenKeys: [...state.hiddenKeys.filter(k => k !== key), key],
68
+ }));
69
+ setHiddenColumns = this.updater((state, displayCols) => {
70
+ return ({ ...state, hiddenKeys: displayCols.filter(d => !d.visible).map(d => d.key) });
71
+ });
72
+ setUserDefinedWidth = this.updater((state, colWidths) => {
73
+ const userDefinedWidths = { ...state.userDefined.widths };
74
+ colWidths.forEach(cw => {
75
+ userDefinedWidths[cw.key] = cw.widthInPixel;
76
+ });
77
+ return { ...state, userDefined: { ...state.userDefined, widths: userDefinedWidths } };
78
+ });
79
+ setUserDefinedOrder = this.updater((state, moved) => {
80
+ const { newOrder, oldOrder } = moved;
81
+ const mdsArr = orderedVisibleMetaData(state);
82
+ moveItemInArray(mdsArr, oldOrder, newOrder);
83
+ const userDefinedOrder = mdsArr.reduce((aggregate, current, index) => {
84
+ aggregate[current.key] = index;
85
+ return aggregate;
86
+ }, {});
87
+ return ({ ...state, userDefined: { ...state.userDefined, order: userDefinedOrder } });
88
+ });
89
+ filters$ = this.select(state => state.filters);
90
+ getFilter$ = (filterId) => {
91
+ return this.select(state => state.filters[filterId]);
92
+ };
93
+ addFilter = this.updater((state, filter) => {
94
+ return this.addFiltersToState(state, [filter]);
95
+ });
96
+ addFilters = this.updater((state, filters) => {
97
+ return this.addFiltersToState(state, filters);
98
+ });
99
+ addFiltersToState = (state, filters) => {
100
+ var customFilters = filters.filter(isCustomFilter);
101
+ var filterInfos = filters.filter(isFilterInfo);
102
+ const filtersObj = filterInfos
103
+ .filter(fltr => Object.keys(state.metaData).some(key => key === fltr.key) || console.warn(`Meta data with key ${fltr.key} not found`))
104
+ .reduce((filtersObj, filter) => {
105
+ if (!filter.filterId) {
106
+ filter.filterId = uuid();
107
+ }
108
+ filtersObj[filter.filterId] = filter;
109
+ return filtersObj;
110
+ }, {});
111
+ customFilters.forEach(fltr => {
112
+ if (!fltr.filterId) {
113
+ fltr.filterId = uuid();
114
+ }
115
+ filtersObj[fltr.filterId] = fltr;
116
+ });
117
+ return {
118
+ ...state,
119
+ filters: { ...state.filters, ...filtersObj }
120
+ };
121
+ };
122
+ removeFilter = this.updater((state, filterId) => {
123
+ const filtersCopy = { ...state.filters };
124
+ delete filtersCopy[filterId];
125
+ return ({ ...state, filters: filtersCopy });
126
+ });
127
+ removeFilters = this.updater((state, filterIds) => {
128
+ const filtersCopy = { ...state.filters };
129
+ filterIds.forEach(id => { delete filtersCopy[id]; });
130
+ return ({ ...state, filters: filtersCopy });
131
+ });
132
+ clearFilters = this.updater((state) => ({ ...state, filters: {} }));
133
+ selectSorted = this.select(state => state.sorted).pipe(distinctUntilChanged((f, s) => !isDifferent(f, s)));
134
+ sort$ = this.select(this.selectStateReady, this.selectSorted, (_, s) => s);
135
+ createPreSort = (metaDatas) => {
136
+ return Object.values(metaDatas).filter((metaData) => !!metaData.preSort)
137
+ .sort(({ preSort: ps1 }, { preSort: ps2 }) => (ps1.precedence || Number.MAX_VALUE) - (ps2.precedence || Number.MAX_VALUE))
138
+ .map(({ key, preSort }) => ({ active: key, direction: preSort.direction }));
139
+ };
140
+ setSort = this.updater((state, { key, direction }) => {
141
+ const sortArray = state.sorted.filter(s => s.active !== key);
142
+ if (direction) {
143
+ sortArray.unshift({ active: key, direction });
144
+ }
145
+ return {
146
+ ...state,
147
+ sorted: sortArray,
148
+ };
149
+ });
150
+ setAllSort = this.updater((state, sortArray) => {
151
+ return {
152
+ ...state,
153
+ sorted: sortArray,
154
+ };
155
+ });
156
+ updateStateFunc = (state, incomingTableState) => {
157
+ const metaData = state.metaData;
158
+ const sorted = incomingTableState.sorted?.length ? incomingTableState.sorted
159
+ : state.initializationState === InitializationState.Created ? this.createPreSort(metaData) : state.sorted;
160
+ return { ...state, ...incomingTableState, metaData, sorted };
161
+ };
162
+ setPageSize = this.updater((state, pageSize) => ({ ...state, pageSize, userDefined: { ...state.userDefined, pageSize } }));
163
+ getPageSize = this.select(state => state.userDefined.pageSize || state.pageSize);
164
+ updateState = this.updater(this.updateStateFunc);
302
165
  cleanPersistedState(state, pState) {
303
166
  const metas = Object.values(state.metaData);
304
167
  const filters = Object.values(pState.filters).filter(fltr => isCustomFilter(fltr) || metas.some(m => m.key === fltr.key)).reduce((obj, filter) => {
@@ -308,6 +171,40 @@ export class TableStore extends ComponentStore {
308
171
  const sorted = pState.sorted.filter(s => metas.some(m => m.key === s.active));
309
172
  return ({ ...pState, filters, sorted });
310
173
  }
174
+ updateStateFromPersistedState = this.updater((state, persistedState) => {
175
+ const incomingTableState = this.cleanPersistedState(state, persistedState);
176
+ const newState = this.updateStateFunc(state, incomingTableState);
177
+ newState.initializationState = state.initializationState === InitializationState.MetaDataLoaded ? InitializationState.LoadedFromStore : state.initializationState;
178
+ return newState;
179
+ });
180
+ getUserDefinedTableSize = this.selectSignal(state => state.userDefined.table.width);
181
+ getUserDefinedTableSize$ = this.select(state => state.userDefined.table.width);
182
+ setTableWidth = this.updater((state, widthInPixels) => ({ ...state, userDefined: { ...state.userDefined, table: { width: widthInPixels } } }));
183
+ mergeMeta = (orig, merge) => {
184
+ return {
185
+ key: orig.key,
186
+ displayName: merge.displayName ?? orig.displayName,
187
+ fieldType: merge.fieldType || orig.fieldType,
188
+ additional: { ...orig.additional, ...merge.additional },
189
+ order: merge.order ?? orig.order,
190
+ preSort: merge.preSort ?? orig.preSort,
191
+ width: merge.width ?? orig.width,
192
+ noExport: merge.noExport || orig.noExport,
193
+ noFilter: merge.noFilter || orig.noFilter,
194
+ customCell: merge.customCell ?? orig.customCell,
195
+ transform: merge.transform ?? orig.transform,
196
+ map: merge.map ?? orig.map,
197
+ click: merge.click ?? orig.click,
198
+ classes: merge.classes ?? orig.classes,
199
+ noSort: merge.noSort ?? orig.noSort,
200
+ template: merge.template ?? orig.template,
201
+ toolTip: merge.toolTip ?? orig.toolTip,
202
+ useIcon: merge.useIcon ?? orig.useIcon,
203
+ };
204
+ };
205
+ setInitializationState = this.updater((state, initializationState) => {
206
+ return { ...state, initializationState };
207
+ });
311
208
  runOnceWhen(predicate, func) {
312
209
  const obs = this.state$.pipe(onceWhen(predicate));
313
210
  this.on(obs, (state) => {
@@ -317,15 +214,116 @@ export class TableStore extends ComponentStore {
317
214
  onReady(func) {
318
215
  this.runOnceWhen(stateIs(InitializationState.Ready), func);
319
216
  }
320
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: TableStore, deps: [{ token: TableBuilderConfigToken }], target: i0.ɵɵFactoryTarget.Injectable }); }
321
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: TableStore }); }
217
+ setMetaData = this.updater((state, md) => {
218
+ const metaData = (Array.isArray(md) ? [...md] : [md])
219
+ .reduce((prev, curr) => {
220
+ if (prev[curr.key]) {
221
+ prev[curr.key] = this.mergeMeta(prev[curr.key], curr);
222
+ }
223
+ else {
224
+ prev[curr.key] = curr;
225
+ }
226
+ return prev;
227
+ }, {});
228
+ let sorted = state.sorted;
229
+ if (sorted.length === 0) {
230
+ sorted = this.createPreSort(metaData);
231
+ }
232
+ const order = this.initializeOrder(state, metaData);
233
+ const initializationState = state.initializationState == InitializationState.Created ? InitializationState.MetaDataLoaded : state.initializationState;
234
+ return { ...state, initializationState, metaData, sorted, userDefined: { ...state.userDefined, order: order } };
235
+ });
236
+ initializeOrder = (state, mds) => {
237
+ const viewableMetaDataArr = Object.values(mds).filter(a => a.fieldType !== FieldType.Hidden);
238
+ let userDefinedOrder = state.userDefined.order;
239
+ if (viewableMetaDataArr.some(meta => userDefinedOrder[meta.key] == null)) {
240
+ return {};
241
+ }
242
+ return userDefinedOrder;
243
+ };
244
+ toggleCollapseHeader = this.updater((state) => {
245
+ const tableSettings = { ...state.persistedTableSettings };
246
+ tableSettings.collapseHeader = !tableSettings.collapseHeader;
247
+ return ({ ...state, persistedTableSettings: new PersistedTableSettings(tableSettings) });
248
+ });
249
+ toggleCollapseFooter = this.updater((state) => {
250
+ const tableSettings = { ...state.persistedTableSettings };
251
+ tableSettings.collapseFooter = !tableSettings.collapseFooter;
252
+ return ({ ...state, persistedTableSettings: new PersistedTableSettings(tableSettings) });
253
+ });
254
+ addGroupByKey = this.updater((state, metaDataKey) => ({
255
+ ...state,
256
+ groupBy: [...state.groupBy, { key: metaDataKey, expandedHeaders: [] }]
257
+ }));
258
+ removeGroupByKey = this.updater((state, groupByKey) => ({
259
+ ...state,
260
+ groupBy: state.groupBy.filter(key => groupByKey !== key.key)
261
+ }));
262
+ updateExpandedGroups = this.updater((state, data) => {
263
+ const gbk = replaceInArrayWithClone(state.groupBy, k => k.key === data.key, gk => {
264
+ gk.expandedHeaders = data.isExpanded ? [...gk.expandedHeaders, data.groupKey] : gk.expandedHeaders.filter(g => g !== data.groupKey);
265
+ });
266
+ return ({
267
+ ...state,
268
+ groupBy: gbk
269
+ });
270
+ });
271
+ expandAllOfGroup = this.updater((state, data) => {
272
+ const newGroupedData = state.groupBy.map(gb => ({
273
+ key: gb.key,
274
+ expandedHeaders: data.groupHeadersByKey[gb.key]?.map(g => g.groupName) ?? gb.expandedHeaders
275
+ }));
276
+ return ({ ...state, groupBy: newGroupedData });
277
+ });
278
+ collapseAll = this.updater((state) => ({
279
+ ...state,
280
+ groupBy: state.groupBy.map(gb => ({ key: gb.key, expandedHeaders: [] }))
281
+ }));
282
+ collapseAllOfKey = this.updater((state, data) => ({
283
+ ...state,
284
+ groupBy: state.groupBy.map(gb => ({
285
+ key: gb.key,
286
+ expandedHeaders: data.keys.includes(gb.key) ? [] : gb.expandedHeaders
287
+ }))
288
+ }));
289
+ groupByKeys$ = this.select(state => state.groupBy.map(gbk => gbk.key))
290
+ .pipe(distinctUntilChanged((prev, curr) => prev.length === curr.length && curr.every((k, i) => prev[i] === k)));
291
+ expandedGroups$ = this.select(state => state.groupBy).pipe(distinctUntilChanged((a, b) => {
292
+ const aa = a.flatMap(g => g.expandedHeaders);
293
+ const bb = b.flatMap(g => g.expandedHeaders);
294
+ return aa.length === bb.length && aa.every((k) => bb.includes(k));
295
+ }));
296
+ setTableSettings = this.updater((state, settings) => {
297
+ const s = {
298
+ ...state,
299
+ persistedTableSettings: new PersistedTableSettings(settings),
300
+ notPersistedTableSettings: new NotPersistedTableSettings(settings)
301
+ };
302
+ return s;
303
+ });
304
+ tableSettings = this.selectSignal(state => {
305
+ const ts = { ...state.persistedTableSettings, ...state.notPersistedTableSettings };
306
+ return ts;
307
+ });
308
+ tableSettings$ = this.select(state => {
309
+ const ts = { ...state.persistedTableSettings, ...state.notPersistedTableSettings };
310
+ return ts;
311
+ });
312
+ props = this.selectSignal(s => s.props);
313
+ setLinkMaps = this.updater((state, maps) => {
314
+ return { ...state, linkMaps: maps };
315
+ });
316
+ getLinkInfo = (md) => this.selectSignal(state => state.linkMaps[md.key]);
317
+ getIsExpanded = (columnKey, groupHeaderKey) => {
318
+ return this.select(state => !!state.groupBy.filter(g => g.key === columnKey && g.expandedHeaders.includes(groupHeaderKey)).length);
319
+ };
320
+ $isVirtual = this.selectSignal(state => state.notPersistedTableSettings.useVirtualScroll === true || state.notPersistedTableSettings.useVirtualScroll?.virtualAsDefault || state.showAll);
321
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: TableStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
322
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: TableStore });
322
323
  }
323
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: TableStore, decorators: [{
324
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: TableStore, decorators: [{
324
325
  type: Injectable
325
- }], ctorParameters: () => [{ type: undefined, decorators: [{
326
- type: Inject,
327
- args: [TableBuilderConfigToken]
328
- }] }] });
326
+ }], ctorParameters: () => [] });
329
327
  export const orderedVisibleColumns = (state) => orderedVisibleMetaData(state).map(md => md.key);
330
328
  export const orderedVisibleMetaData = (state) => {
331
329
  const ordered = orderMetaData(state);
@@ -354,4 +352,4 @@ export const orderMetaData = (state) => {
354
352
  :
355
353
  Object.values(state.metaData).sort((a, b) => a.order - b.order);
356
354
  };
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jbGFzc2VzL3RhYmxlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFlLG1CQUFtQixFQUFFLFlBQVksRUFBbUMsTUFBTSxjQUFjLENBQUM7QUFDbEksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBc0IsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRixPQUFPLEVBQTRCLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFHO0FBRXpELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQXdCLHlCQUF5QixFQUFFLHNCQUFzQixFQUF3QixNQUFNLGtDQUFrQyxDQUFDO0FBQ2pKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTVDLE1BQU0sVUFBVSxPQUFPLENBQUMsbUJBQXdDO0lBQzlE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Z0JBQ2xCLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDWixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3hFLENBQUMsQ0FBQztRQUNELENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBTSxHQUFHLENBQUMsQ0FBQyxLQUFNLENBQUMsQ0FBQTtBQUNsRSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWVsZFR5cGUsIE1ldGFEYXRhLCBTb3J0RGVmIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmJztcclxuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlZmF1bHRUYWJsZVN0YXRlLCBHcm91cGVkRGF0YSwgSW5pdGlhbGl6YXRpb25TdGF0ZSwga2V5c1RvRGVsZXRlLCBQZXJzaXN0ZWRUYWJsZVN0YXRlLCBUYWJsZVN0YXRlIH0gZnJvbSAnLi9UYWJsZVN0YXRlJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBQcmVkaWNhdGUsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRhYmxlQnVpbGRlckNvbmZpZywgVGFibGVCdWlsZGVyQ29uZmlnVG9rZW4gfSBmcm9tICcuL1RhYmxlQnVpbGRlckNvbmZpZyc7XHJcbmltcG9ydCB7IEN1c3RvbUZpbHRlciwgRmlsdGVySW5mbywgaXNDdXN0b21GaWx0ZXIsIGlzRmlsdGVySW5mbyB9IGZyb20gJy4vZmlsdGVyLWluZm8nO1xyXG5pbXBvcnQgeyBTb3J0LCBTb3J0RGlyZWN0aW9uIH0gIGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnIDtcclxuaW1wb3J0IHsgQ29tcG9uZW50U3RvcmUgfSBmcm9tICdAbmdyeC9jb21wb25lbnQtc3RvcmUnICA7XHJcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBsYXN0LCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgbm90TnVsbCwgb25jZVdoZW4gfSBmcm9tICcuLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgR2VuZXJhbFRhYmxlU2V0dGluZ3MsIE5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MsIFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MsIFZpcnR1YWxTY3JvbGxPcHRpb25zIH0gZnJvbSAnLi90YWJsZS1idWlsZGVyLWdlbmVyYWwtc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyByZXBsYWNlSW5BcnJheVdpdGhDbG9uZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9hcnJheS1oZWxwZXJzJztcclxuaW1wb3J0IHsgaXNEaWZmZXJlbnQgfSBmcm9tICcuLi9kaXJlY3RpdmVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZUlzKGluaXRpYWxpemF0aW9uU3RhdGU6IEluaXRpYWxpemF0aW9uU3RhdGUpIHtcclxuICByZXR1cm4gKHN0YXRlOiBUYWJsZVN0YXRlKSA9PiBzdGF0ZS5pbml0aWFsaXphdGlvblN0YXRlID09PSBpbml0aWFsaXphdGlvblN0YXRlO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUYWJsZVN0b3JlIGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8VGFibGVTdGF0ZT4ge1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFRhYmxlQnVpbGRlckNvbmZpZ1Rva2VuKSBjb25maWc6IFRhYmxlQnVpbGRlckNvbmZpZykge1xyXG4gICBzdXBlciggeyAuLi5kZWZhdWx0VGFibGVTdGF0ZSwgLi4uY29uZmlnLmRlZmF1bHRUYWJsZVN0YXRlfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdGF0ZVJlYWR5ID0gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuaW5pdGlhbGl6YXRpb25TdGF0ZSkucGlwZShmaWx0ZXIoaSA9PiBpID09PSBJbml0aWFsaXphdGlvblN0YXRlLlJlYWR5KSk7XHJcbiAgZ2V0U2F2YWJsZVN0YXRlKCkgOiBPYnNlcnZhYmxlPFBlcnNpc3RlZFRhYmxlU3RhdGU+IHtcclxuICAgIHJldHVybiAgdGhpcy5zdGF0ZSQucGlwZShcclxuICAgICAgbWFwKCBzID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tYXBTYXZlYWJsZVN0YXRlKHMpO1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRTYXZhYmxlU3RhdGVTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcclxuICAgIHJldHVybiB0aGlzLm1hcFNhdmVhYmxlU3RhdGUoc3RhdGUpO1xyXG4gIH0pXHJcbiAgcHJpdmF0ZSBtYXBTYXZlYWJsZVN0YXRlID0gKHM6IFBlcnNpc3RlZFRhYmxlU3RhdGUpID0+IHtcclxuICAgIGNvbnN0IHNhdmFibGVTdGF0ZSA9IHsuLi5zfSBhcyBQYXJ0aWFsPFRhYmxlU3RhdGU+O1xyXG4gICAga2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IGRlbGV0ZSBzYXZhYmxlU3RhdGVba2V5XSk7XHJcbiAgICByZXR1cm4gc2F2YWJsZVN0YXRlIGFzIFBlcnNpc3RlZFRhYmxlU3RhdGU7XHJcbiAgfVxyXG5cclxuICBvbiA9IDxWPihzcmNPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFY+LCBmdW5jOiAob2JqOiBWKSA9PiB2b2lkKSA9PiB7XHJcbiAgICB0aGlzLmVmZmVjdCgoKSA9PiBzcmNPYnNlcnZhYmxlLnBpcGUoXHJcbiAgICAgIHRhcChmdW5jKVxyXG4gICAgKSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIG9uTGFzdChjYWxsYmFjazogKHN0YXRlOiBUYWJsZVN0YXRlKSA9PiB2b2lkICkge1xyXG4gICAgdGhpcy5vbih0aGlzLnN0YXRlJC5waXBlKGxhc3QoKSksY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgbWV0YURhdGEkID0gdGhpcy5zZWxlY3QoIHN0YXRlID0+IHN0YXRlLm1ldGFEYXRhKTtcclxuXHJcbiAgbWV0YURhdGFBcnJheSA9IHRoaXMuc2VsZWN0U2lnbmFsKFxyXG4gICAgdGhpcy5zdGF0ZSxcclxuICAgIG9yZGVyTWV0YURhdGFcclxuICApXHJcbiAgcmVhZG9ubHkgbWV0YURhdGFBcnJheSQgPSB0aGlzLnNlbGVjdChcclxuICAgIHRoaXMuc3RhdGUkLFxyXG4gICAgb3JkZXJNZXRhRGF0YVxyXG4gICk7XHJcblxyXG4gIGdldE1ldGFEYXRhJCA9IChrZXk6IHN0cmluZykgOiBPYnNlcnZhYmxlPE1ldGFEYXRhPiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoIHN0YXRlID0+IHN0YXRlLm1ldGFEYXRhW2tleV0gICkucGlwZShcclxuICAgICAgdGFwKG1ldGEgPT4ge2lmKCFtZXRhKWNvbnNvbGUud2FybihgTWV0YSBkYXRhIHdpdGgga2V5ICR7a2V5fSBub3QgZm91bmRgKX0pLFxyXG4gICAgICBub3ROdWxsKCkpXHJcbiAgfVxyXG5cclxuICBnZXRVc2VyRGVmaW5lZFdpZHRoJCA9IChrZXk6c3RyaW5nKSA9PiB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS51c2VyRGVmaW5lZC53aWR0aHNba2V5XSk7XHJcbiAgZ2V0VXNlckRlZmluZWRXaWR0aCA9IChrZXk6c3RyaW5nKSA9PiB0aGlzLnNlbGVjdFNpZ25hbChzdGF0ZSA9PiBzdGF0ZS51c2VyRGVmaW5lZC53aWR0aHNba2V5XSk7XHJcbiAgZ2V0VXNlckRlZmluZWRXaWR0aHMkID0gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudXNlckRlZmluZWQud2lkdGhzKTtcclxuICBnZXRVc2VyRGVmaW5lZFdpZHRocyA9IHRoaXMuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLnVzZXJEZWZpbmVkLndpZHRocyk7XHJcbiAgcmVhZG9ubHkgZGlzcGxheWVkQ29sdW1ucyQgPSB0aGlzLnNlbGVjdChvcmRlcmVkVmlzaWJsZUNvbHVtbnMpO1xyXG5cclxuXHJcbiAgcmVhZG9ubHkgcmVzZXRTdGF0ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHtcclxuICAgIGNvbnN0IHNvcnRlZCA9IHRoaXMuY3JlYXRlUHJlU29ydChzdGF0ZS5tZXRhRGF0YSk7XHJcbiAgICByZXR1cm4gKHsuLi5zdGF0ZSwgaGlkZGVuS2V5czogW10sIHNvcnRlZCwgZmlsdGVyczoge30gLCBncm91cEJ5OiBbXSwgIHVzZXJEZWZpbmVkOiB7IHdpZHRoczoge30sIG9yZGVyOiB7fSwgdGFibGU6IHt9IH0gfSk7XHJcbiAgfSk7XHJcblxyXG4gIHJlYWRvbmx5IHNob3dDb2x1bW4gPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBrZXk6IHN0cmluZykgPT4gKHtcclxuICAgIC4uLnN0YXRlLFxyXG4gICAgaGlkZGVuS2V5czogc3RhdGUuaGlkZGVuS2V5cy5maWx0ZXIoIGsgPT4gayAhPT0ga2V5KSxcclxuICB9KSk7XHJcblxyXG4gIHJlYWRvbmx5IGhpZGVDb2x1bW4gPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBrZXk6IHN0cmluZykgPT4gKHtcclxuICAgIC4uLnN0YXRlLFxyXG4gICAgaGlkZGVuS2V5czogWy4uLnN0YXRlLmhpZGRlbktleXMuZmlsdGVyKCBrID0+IGsgIT09IGtleSksIGtleV0sXHJcbiAgfSkpO1xyXG5cclxuICByZWFkb25seSBzZXRIaWRkZW5Db2x1bW5zID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZGlzcGxheUNvbHM6IHtrZXk6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbn1bXSkgPT4ge1xyXG4gICAgcmV0dXJuICh7Li4uc3RhdGUsIGhpZGRlbktleXM6IGRpc3BsYXlDb2xzLmZpbHRlcihkID0+ICFkLnZpc2libGUpLm1hcChkID0+IGQua2V5KX0pXHJcbiAgfSk7XHJcblxyXG5cclxuICBzZXRVc2VyRGVmaW5lZFdpZHRoID0gdGhpcy51cGRhdGVyKChzdGF0ZSxjb2xXaWR0aHM6e2tleTogc3RyaW5nLCB3aWR0aEluUGl4ZWw6bnVtYmVyfVtdKSA9PiB7XHJcbiAgICBjb25zdCB1c2VyRGVmaW5lZFdpZHRocyA9IHsuLi5zdGF0ZS51c2VyRGVmaW5lZC53aWR0aHN9O1xyXG4gICAgY29sV2lkdGhzLmZvckVhY2goY3cgPT4ge1xyXG4gICAgICB1c2VyRGVmaW5lZFdpZHRoc1tjdy5rZXldID0gY3cud2lkdGhJblBpeGVsO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gey4uLnN0YXRlLCB1c2VyRGVmaW5lZDogey4uLnN0YXRlLnVzZXJEZWZpbmVkLCB3aWR0aHM6dXNlckRlZmluZWRXaWR0aHN9fTtcclxuICB9KTtcclxuXHJcbiAgc2V0VXNlckRlZmluZWRPcmRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUsbW92ZWQ6IHsgbmV3T3JkZXI6IG51bWJlciwgb2xkT3JkZXI6IG51bWJlciB9KT0+e1xyXG4gICAgY29uc3QgeyBuZXdPcmRlciwgb2xkT3JkZXIgfSA9IG1vdmVkO1xyXG4gICAgY29uc3QgbWRzQXJyID0gb3JkZXJlZFZpc2libGVNZXRhRGF0YShzdGF0ZSk7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkobWRzQXJyLCBvbGRPcmRlciwgbmV3T3JkZXIpO1xyXG5cclxuICAgIGNvbnN0IHVzZXJEZWZpbmVkT3JkZXIgPSBtZHNBcnIucmVkdWNlKChhZ2dyZWdhdGU6IGFueSxjdXJyZW50LGluZGV4KSA9PiB7XHJcbiAgICAgIGFnZ3JlZ2F0ZVtjdXJyZW50LmtleV0gPSBpbmRleDtcclxuICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZVxyXG4gICAgfSx7fSk7XHJcbiAgICByZXR1cm4oeyAuLi5zdGF0ZSwgdXNlckRlZmluZWQ6IHsgLi4uc3RhdGUudXNlckRlZmluZWQsIG9yZGVyOiB1c2VyRGVmaW5lZE9yZGVyIH0gfSlcclxuICB9KVxyXG5cclxuXHJcbiAgcmVhZG9ubHkgZmlsdGVycyQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5maWx0ZXJzICk7XHJcblxyXG4gIHJlYWRvbmx5IGdldEZpbHRlciQgPSAoZmlsdGVySWQ6IHN0cmluZykgOiBPYnNlcnZhYmxlPEZpbHRlckluZm8gfCBDdXN0b21GaWx0ZXIgfCB1bmRlZmluZWQ+ID0+IHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdCggc3RhdGUgPT4gc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZF0gKTtcclxuICB9XHJcbiAgcmVhZG9ubHkgYWRkRmlsdGVyID0gdGhpcy51cGRhdGVyKCAoc3RhdGUsIGZpbHRlcjogRmlsdGVySW5mbyB8IEN1c3RvbUZpbHRlciApID0+IHtcclxuICAgIHJldHVybiB0aGlzLmFkZEZpbHRlcnNUb1N0YXRlKHN0YXRlLCBbZmlsdGVyXSk7XHJcbiAgfSk7XHJcblxyXG4gIHJlYWRvbmx5IGFkZEZpbHRlcnMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLGZpbHRlcnM6KEZpbHRlckluZm8gfCBDdXN0b21GaWx0ZXIgKVtdKT0+e1xyXG4gICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyc1RvU3RhdGUoc3RhdGUsIGZpbHRlcnMpO1xyXG4gIH0pXHJcblxyXG5cclxuICBwcml2YXRlIGFkZEZpbHRlcnNUb1N0YXRlID0gKHN0YXRlOlRhYmxlU3RhdGUsIGZpbHRlcnM6KEZpbHRlckluZm8gfCBDdXN0b21GaWx0ZXIpW10pIDogVGFibGVTdGF0ZSA9PiB7XHJcblxyXG4gICAgdmFyIGN1c3RvbUZpbHRlcnMgPSBmaWx0ZXJzLmZpbHRlciggIGlzQ3VzdG9tRmlsdGVyICk7XHJcblxyXG4gICAgdmFyIGZpbHRlckluZm9zID0gZmlsdGVycy5maWx0ZXIoaXNGaWx0ZXJJbmZvKTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJzT2JqID0gZmlsdGVySW5mb3NcclxuICAgICAgLmZpbHRlcihmbHRyID0+IE9iamVjdC5rZXlzKHN0YXRlLm1ldGFEYXRhKS5zb21lKGtleSA9PiBrZXkgPT09IGZsdHIua2V5KSB8fCBjb25zb2xlLndhcm4oYE1ldGEgZGF0YSB3aXRoIGtleSAke2ZsdHIua2V5fSBub3QgZm91bmRgKSlcclxuICAgICAgLnJlZHVjZSgoZmlsdGVyc09iajoge1trOiBzdHJpbmddOiBhbnl9LGZpbHRlcik9PntcclxuICAgICAgICBpZiAoIWZpbHRlci5maWx0ZXJJZCkge1xyXG4gICAgICAgICAgZmlsdGVyLmZpbHRlcklkID0gdXVpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaWx0ZXJzT2JqW2ZpbHRlci5maWx0ZXJJZF0gPSBmaWx0ZXI7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcnNPYmo7XHJcbiAgICAgIH0se30pO1xyXG5cclxuICAgIGN1c3RvbUZpbHRlcnMuZm9yRWFjaCggZmx0ciA9PiB7XHJcbiAgICAgIGlmKCFmbHRyLmZpbHRlcklkKSB7XHJcbiAgICAgICAgZmx0ci5maWx0ZXJJZCA9IHV1aWQoKTtcclxuICAgICAgfVxyXG4gICAgICBmaWx0ZXJzT2JqW2ZsdHIuZmlsdGVySWRdID0gZmx0cjtcclxuICAgIH0pXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgZmlsdGVycyA6IHsuLi5zdGF0ZS5maWx0ZXJzLCAuLi5maWx0ZXJzT2JqIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZWFkb25seSByZW1vdmVGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIoIChzdGF0ZSwgZmlsdGVySWQ6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgZmlsdGVyc0NvcHkgPSB7IC4uLnN0YXRlLmZpbHRlcnMgfTtcclxuICAgIGRlbGV0ZSBmaWx0ZXJzQ29weVtmaWx0ZXJJZF07XHJcbiAgICByZXR1cm4gKHsuLi5zdGF0ZSwgZmlsdGVyczogZmlsdGVyc0NvcHkgfSk7XHJcbiAgfSk7XHJcblxyXG4gIHJlYWRvbmx5IHJlbW92ZUZpbHRlcnMgPSB0aGlzLnVwZGF0ZXIoIChzdGF0ZSwgZmlsdGVySWRzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgY29uc3QgZmlsdGVyc0NvcHkgPSB7IC4uLnN0YXRlLmZpbHRlcnMgfTtcclxuICAgIGZpbHRlcklkcy5mb3JFYWNoKGlkID0+IHsgZGVsZXRlIGZpbHRlcnNDb3B5W2lkXSB9KVxyXG4gICAgcmV0dXJuICh7Li4uc3RhdGUsIGZpbHRlcnM6IGZpbHRlcnNDb3B5IH0pO1xyXG4gIH0pO1xyXG5cclxuICByZWFkb25seSBjbGVhckZpbHRlcnMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKT0+XHJcbiAgICAoey4uLnN0YXRlLGZpbHRlcnM6e319KSlcclxuXHJcblxyXG4gIHNlbGVjdFNvcnRlZCA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLnNvcnRlZCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoZixzKSA9PiAhaXNEaWZmZXJlbnQoZixzKSkpO1xyXG4gIHJlYWRvbmx5IHNvcnQkID0gdGhpcy5zZWxlY3QodGhpcy5zZWxlY3RTdGF0ZVJlYWR5LCB0aGlzLnNlbGVjdFNvcnRlZCwgKF8scykgPT4gcyApO1xyXG4gIFxyXG4gIGNyZWF0ZVByZVNvcnQgPSAobWV0YURhdGFzOiBEaWN0aW9uYXJ5PE1ldGFEYXRhPik6IFNvcnRbXSA9PiB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhtZXRhRGF0YXMpLmZpbHRlcigoIG1ldGFEYXRhICkgOiBtZXRhRGF0YSBpcyBNZXRhRGF0YSAmIHtwcmVTb3J0OiBTb3J0RGVmfSA9PiAhIW1ldGFEYXRhLnByZVNvcnQpXHJcbiAgICAgIC5zb3J0KCh7ICBwcmVTb3J0OiBwczEgIH0sIHsgcHJlU29ydDogcHMyIH0gKSA9PiAocHMxLnByZWNlZGVuY2UgfHwgTnVtYmVyLk1BWF9WQUxVRSkgLSAoIHBzMi5wcmVjZWRlbmNlIHx8IE51bWJlci5NQVhfVkFMVUUpKVxyXG4gICAgICAubWFwKCgge2tleSwgcHJlU29ydH0gKSA9PiAoeyBhY3RpdmU6IGtleSwgZGlyZWN0aW9uOiBwcmVTb3J0LmRpcmVjdGlvbiB9KSlcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IHNldFNvcnQgPSB0aGlzLnVwZGF0ZXI8e2tleTogc3RyaW5nLCBkaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9ufT4oKHN0YXRlLCB7a2V5LCBkaXJlY3Rpb259ICkgPT4ge1xyXG4gICAgY29uc3Qgc29ydEFycmF5ID0gc3RhdGUuc29ydGVkLmZpbHRlciggcyA9PiBzLmFjdGl2ZSAhPT0ga2V5ICk7XHJcbiAgICBpZihkaXJlY3Rpb24pIHtcclxuICAgICAgc29ydEFycmF5LnVuc2hpZnQoe2FjdGl2ZToga2V5LCBkaXJlY3Rpb259KTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnN0YXRlLFxyXG4gICAgICBzb3J0ZWQ6IHNvcnRBcnJheSxcclxuICAgIH07XHJcbiAgfSk7XHJcblxyXG4gIHJlYWRvbmx5IHNldEFsbFNvcnQgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLHNvcnRBcnJheTpTb3J0W10pPT57XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgc29ydGVkOiBzb3J0QXJyYXksXHJcbiAgICB9O1xyXG4gIH0pO1xyXG5cclxuICB1cGRhdGVTdGF0ZUZ1bmMgPSAoc3RhdGU6IFRhYmxlU3RhdGUsIGluY29taW5nVGFibGVTdGF0ZTogUGFydGlhbDxUYWJsZVN0YXRlPikgOiBUYWJsZVN0YXRlID0+IHtcclxuICAgIGNvbnN0IG1ldGFEYXRhID0gc3RhdGUubWV0YURhdGE7XHJcbiAgICBjb25zdCBzb3J0ZWQgPSBpbmNvbWluZ1RhYmxlU3RhdGUuc29ydGVkPy5sZW5ndGggPyBpbmNvbWluZ1RhYmxlU3RhdGUuc29ydGVkXHJcbiAgICAgIDogc3RhdGUuaW5pdGlhbGl6YXRpb25TdGF0ZSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0ZS5DcmVhdGVkID8gdGhpcy5jcmVhdGVQcmVTb3J0KG1ldGFEYXRhKSA6IHN0YXRlLnNvcnRlZDtcclxuICAgIHJldHVybiB7Li4uc3RhdGUsIC4uLmluY29taW5nVGFibGVTdGF0ZSwgbWV0YURhdGEgLCBzb3J0ZWR9O1xyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgc2V0UGFnZVNpemUgPSB0aGlzLnVwZGF0ZXIoIChzdGF0ZSwgcGFnZVNpemU6IG51bWJlcik9PiAoeyAuLi5zdGF0ZSwgcGFnZVNpemUsIHVzZXJEZWZpbmVkOiB7IC4uLnN0YXRlLnVzZXJEZWZpbmVkLCBwYWdlU2l6ZSB9IH0pKTtcclxuICBnZXRQYWdlU2l6ZSA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLnVzZXJEZWZpbmVkLnBhZ2VTaXplIHx8IHN0YXRlLnBhZ2VTaXplKTtcclxuICByZWFkb25seSB1cGRhdGVTdGF0ZSA9IHRoaXMudXBkYXRlcjxQYXJ0aWFsPFRhYmxlU3RhdGU+Pih0aGlzLnVwZGF0ZVN0YXRlRnVuYyk7XHJcblxyXG4gIGNsZWFuUGVyc2lzdGVkU3RhdGUoc3RhdGU6IFRhYmxlU3RhdGUscFN0YXRlOiBQZXJzaXN0ZWRUYWJsZVN0YXRlKSB7XHJcbiAgICBjb25zdCBtZXRhcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUubWV0YURhdGEpO1xyXG4gICAgY29uc3QgZmlsdGVycyA9IE9iamVjdC52YWx1ZXMocFN0YXRlLmZpbHRlcnMpLmZpbHRlcihmbHRyID0+IGlzQ3VzdG9tRmlsdGVyKGZsdHIpIHx8IG1ldGFzLnNvbWUobSA9PiBtLmtleSA9PT0gZmx0ci5rZXkpKS5yZWR1Y2UoKG9iajogYW55LCBmaWx0ZXIpID0+IHtcclxuICAgICAgb2JqW2ZpbHRlci5maWx0ZXJJZCFdID0gcFN0YXRlLmZpbHRlcnNbZmlsdGVyLmZpbHRlcklkIV07XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9LCB7fSk7XHJcbiAgICBjb25zdCBzb3J0ZWQgPSBwU3RhdGUuc29ydGVkLmZpbHRlcihzID0+IG1ldGFzLnNvbWUobSA9PiBtLmtleSA9PT0gcy5hY3RpdmUpKTtcclxuICAgIHJldHVybiAoey4uLnBTdGF0ZSxmaWx0ZXJzLHNvcnRlZH0pXHJcbiAgfVxyXG5cclxuICByZWFkb25seSB1cGRhdGVTdGF0ZUZyb21QZXJzaXN0ZWRTdGF0ZSA9IHRoaXMudXBkYXRlciggKCBzdGF0ZTogVGFibGVTdGF0ZSwgcGVyc2lzdGVkU3RhdGU6IFBlcnNpc3RlZFRhYmxlU3RhdGUpIDogVGFibGVTdGF0ZSA9PiB7XHJcbiAgICBjb25zdCBpbmNvbWluZ1RhYmxlU3RhdGU6IFBhcnRpYWw8VGFibGVTdGF0ZT4gPSB0aGlzLmNsZWFuUGVyc2lzdGVkU3RhdGUoc3RhdGUscGVyc2lzdGVkU3RhdGUpO1xyXG4gICAgY29uc3QgbmV3U3RhdGUgPSAgdGhpcy51cGRhdGVTdGF0ZUZ1bmMoc3RhdGUsaW5jb21pbmdUYWJsZVN0YXRlKTtcclxuICAgIG5ld1N0YXRlLmluaXRpYWxpemF0aW9uU3RhdGUgPSBzdGF0ZS5pbml0aWFsaXphdGlvblN0YXRlID09PSBJbml0aWFsaXphdGlvblN0YXRlLk1ldGFEYXRhTG9hZGVkID8gSW5pdGlhbGl6YXRpb25TdGF0ZS5Mb2FkZWRGcm9tU3RvcmUgOiBzdGF0ZS5pbml0aWFsaXphdGlvblN0YXRlO1xyXG4gICAgcmV0dXJuIG5ld1N0YXRlO1xyXG4gIH0pO1xyXG5cclxuICBnZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSA9IHRoaXMuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLnVzZXJEZWZpbmVkLnRhYmxlLndpZHRoKTtcclxuICBnZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS51c2VyRGVmaW5lZC50YWJsZS53aWR0aCk7XHJcbiAgc2V0VGFibGVXaWR0aCA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHdpZHRoSW5QaXhlbHM6bnVtYmVyKSA9PiAoey4uLnN0YXRlLCB1c2VyRGVmaW5lZDogeyAuLi5zdGF0ZS51c2VyRGVmaW5lZCwgdGFibGU6IHsgd2lkdGg6IHdpZHRoSW5QaXhlbHMgfSB9IH0pKSA7XHJcblxyXG4gIG1lcmdlTWV0YSA9IChvcmlnOiBNZXRhRGF0YSwgbWVyZ2U6IE1ldGFEYXRhKTogTWV0YURhdGEgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBrZXk6IG9yaWcua2V5LFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBtZXJnZS5kaXNwbGF5TmFtZSA/PyBvcmlnLmRpc3BsYXlOYW1lLFxyXG4gICAgICAgIGZpZWxkVHlwZTogbWVyZ2UuZmllbGRUeXBlIHx8IG9yaWcuZmllbGRUeXBlLFxyXG4gICAgICAgIGFkZGl0aW9uYWw6IHsuLi5vcmlnLmFkZGl0aW9uYWwsIC4uLm1lcmdlLmFkZGl0aW9uYWx9LFxyXG4gICAgICAgIG9yZGVyOiBtZXJnZS5vcmRlciA/PyBvcmlnLm9yZGVyLFxyXG4gICAgICAgIHByZVNvcnQ6IG1lcmdlLnByZVNvcnQgPz8gb3JpZy5wcmVTb3J0LFxyXG4gICAgICAgIHdpZHRoOiBtZXJnZS53aWR0aCA/PyBvcmlnLndpZHRoLFxyXG4gICAgICAgIG5vRXhwb3J0OiBtZXJnZS5ub0V4cG9ydCB8fCBvcmlnLm5vRXhwb3J0LFxyXG4gICAgICAgIG5vRmlsdGVyOiBtZXJnZS5ub0ZpbHRlciB8fCBvcmlnLm5vRmlsdGVyLFxyXG4gICAgICAgIGN1c3RvbUNlbGw6IG1lcmdlLmN1c3RvbUNlbGwgPz8gb3JpZy5jdXN0b21DZWxsLFxyXG4gICAgICAgIHRyYW5zZm9ybTogbWVyZ2UudHJhbnNmb3JtID8/IG9yaWcudHJhbnNmb3JtLFxyXG4gICAgICAgIG1hcDogbWVyZ2UubWFwID8/IG9yaWcubWFwLFxyXG4gICAgICAgIGNsaWNrOiBtZXJnZS5jbGljayA/PyBvcmlnLmNsaWNrLFxyXG4gICAgICAgIGNsYXNzZXM6IG1lcmdlLmNsYXNzZXMgPz8gb3JpZy5jbGFzc2VzLFxyXG4gICAgICAgIG5vU29ydDogbWVyZ2Uubm9Tb3J0ID8/IG9yaWcubm9Tb3J0LFxyXG4gICAgICAgIHRlbXBsYXRlOiBtZXJnZS50ZW1wbGF0ZSA/PyBvcmlnLnRlbXBsYXRlLFxyXG4gICAgICAgIHRvb2xUaXA6IG1lcmdlLnRvb2xUaXAgPz8gb3JpZy50b29sVGlwLFxyXG4gICAgICAgIHVzZUljb246IG1lcmdlLnVzZUljb24gPz8gb3JpZy51c2VJY29uLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IHNldEluaXRpYWxpemF0aW9uU3RhdGUgPSB0aGlzLnVwZGF0ZXIoIChzdGF0ZSwgaW5pdGlhbGl6YXRpb25TdGF0ZTogIEluaXRpYWxpemF0aW9uU3RhdGUpID0+IHtcclxuICAgIHJldHVybiB7Li4uc3RhdGUsIGluaXRpYWxpemF0aW9uU3RhdGV9O1xyXG4gIH0pO1xyXG5cclxuICBydW5PbmNlV2hlbihwcmVkaWNhdGU6IFByZWRpY2F0ZTxUYWJsZVN0YXRlPiwgZnVuYzogKHN0YXRlOlRhYmxlU3RhdGUpID0+IHZvaWQpIHtcclxuICAgIGNvbnN0IG9icyA9IHRoaXMuc3RhdGUkLnBpcGUob25jZVdoZW4ocHJlZGljYXRlKSk7XHJcbiAgICB0aGlzLm9uKG9icywgKHN0YXRlKSA9PiB7XHJcbiAgICAgIGZ1bmMoc3RhdGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblJlYWR5KCBmdW5jOiAoc3RhdGU6IFRhYmxlU3RhdGUpID0+IHZvaWQgKSB7XHJcbiAgICB0aGlzLnJ1bk9uY2VXaGVuKHN0YXRlSXMoSW5pdGlhbGl6YXRpb25TdGF0ZS5SZWFkeSksZnVuYyk7XHJcbiAgfVxyXG5cclxuICByZWFkb25seSBzZXRNZXRhRGF0YSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIG1kOiBNZXRhRGF0YVtdIHwgTWV0YURhdGEgKSA9PiB7XHJcbiAgICBjb25zdCBtZXRhRGF0YSA9ICggQXJyYXkuaXNBcnJheShtZCkgPyBbLi4ubWRdIDogW21kXSApXHJcbiAgICAgIC5yZWR1Y2UoKHByZXY6IERpY3Rpb25hcnk8TWV0YURhdGE+LGN1cnIpID0+IHtcclxuICAgICAgICBpZihwcmV2W2N1cnIua2V5XSkge1xyXG4gICAgICAgICAgcHJldltjdXJyLmtleV0gPSB0aGlzLm1lcmdlTWV0YShwcmV2W2N1cnIua2V5XSxjdXJyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHJldltjdXJyLmtleV0gPSBjdXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJldjtcclxuICAgICAgfSAse30pO1xyXG4gICAgbGV0IHNvcnRlZCA9IHN0YXRlLnNvcnRlZDtcclxuICAgIGlmKHNvcnRlZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgc29ydGVkID0gdGhpcy5jcmVhdGVQcmVTb3J0KG1ldGFEYXRhKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5pbml0aWFsaXplT3JkZXIoc3RhdGUsIG1ldGFEYXRhKTtcclxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uU3RhdGUgPSBzdGF0ZS5pbml0aWFsaXphdGlvblN0YXRlID09IEluaXRpYWxpemF0aW9uU3RhdGUuQ3JlYXRlZCA/ICBJbml0aWFsaXphdGlvblN0YXRlLk1ldGFEYXRhTG9hZGVkIDogc3RhdGUuaW5pdGlhbGl6YXRpb25TdGF0ZTtcclxuICAgIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsaXphdGlvblN0YXRlLCBtZXRhRGF0YSwgc29ydGVkLCB1c2VyRGVmaW5lZDogeyAuLi5zdGF0ZS51c2VyRGVmaW5lZCwgb3JkZXI6IG9yZGVyfSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVPcmRlciA9IChzdGF0ZTpUYWJsZVN0YXRlLG1kczogRGljdGlvbmFyeTxNZXRhRGF0YT4pIDogRGljdGlvbmFyeTxudW1iZXI+ID0+IHtcclxuICAgIGNvbnN0IHZpZXdhYmxlTWV0YURhdGFBcnIgPSBPYmplY3QudmFsdWVzKG1kcykuZmlsdGVyKGEgPT4gYS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pO1xyXG4gICAgbGV0IHVzZXJEZWZpbmVkT3JkZXIgPSBzdGF0ZS51c2VyRGVmaW5lZC5vcmRlcjtcclxuICAgIGlmKHZpZXdhYmxlTWV0YURhdGFBcnIuc29tZShtZXRhID0+IHVzZXJEZWZpbmVkT3JkZXJbbWV0YS5rZXldID09IG51bGwpKXtcclxuICAgICAgcmV0dXJuIHt9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlckRlZmluZWRPcmRlcjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvbGxhcHNlSGVhZGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSk9PntcclxuICAgIGNvbnN0IHRhYmxlU2V0dGluZ3MgPSB7Li4uc3RhdGUucGVyc2lzdGVkVGFibGVTZXR0aW5nc307XHJcbiAgICB0YWJsZVNldHRpbmdzLmNvbGxhcHNlSGVhZGVyID0gIXRhYmxlU2V0dGluZ3MuY29sbGFwc2VIZWFkZXI7XHJcbiAgICByZXR1cm4gKHsuLi5zdGF0ZSxwZXJzaXN0ZWRUYWJsZVNldHRpbmdzIDogbmV3IFBlcnNpc3RlZFRhYmxlU2V0dGluZ3ModGFibGVTZXR0aW5ncyl9KTtcclxuICB9KVxyXG5cclxuICB0b2dnbGVDb2xsYXBzZUZvb3RlciA9IHRoaXMudXBkYXRlcigoc3RhdGUpPT57XHJcbiAgICBjb25zdCB0YWJsZVNldHRpbmdzID0gey4uLnN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3N9O1xyXG4gICAgdGFibGVTZXR0aW5ncy5jb2xsYXBzZUZvb3RlciA9ICF0YWJsZVNldHRpbmdzLmNvbGxhcHNlRm9vdGVyO1xyXG4gICAgcmV0dXJuICh7Li4uc3RhdGUscGVyc2lzdGVkVGFibGVTZXR0aW5ncyA6IG5ldyBQZXJzaXN0ZWRUYWJsZVNldHRpbmdzKHRhYmxlU2V0dGluZ3MpfSk7XHJcbiAgfSlcclxuXHJcbiAgYWRkR3JvdXBCeUtleSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIG1ldGFEYXRhS2V5OiBzdHJpbmcpID0+ICh7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIGdyb3VwQnk6IFsuLi5zdGF0ZS5ncm91cEJ5LCB7IGtleTogbWV0YURhdGFLZXksIGV4cGFuZGVkSGVhZGVyczogW10gfV1cclxuICB9KSk7XHJcblxyXG4gIHJlbW92ZUdyb3VwQnlLZXkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBncm91cEJ5S2V5OiBzdHJpbmcpID0+ICh7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIGdyb3VwQnk6IHN0YXRlLmdyb3VwQnkuZmlsdGVyKGtleSA9PiBncm91cEJ5S2V5ICE9PSBrZXkua2V5KVxyXG4gIH0pKTtcclxuXHJcbiAgdXBkYXRlRXhwYW5kZWRHcm91cHMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBkYXRhOiB7a2V5OiBzdHJpbmcsIGdyb3VwS2V5OiBzdHJpbmcsIGlzRXhwYW5kZWQ6IGJvb2xlYW59KSA9PiB7XHJcbiAgICBjb25zdCBnYmsgPSByZXBsYWNlSW5BcnJheVdpdGhDbG9uZShzdGF0ZS5ncm91cEJ5LCBrID0+IGsua2V5ID09PSBkYXRhLmtleSwgZ2sgPT4ge1xyXG4gICAgICBnay5leHBhbmRlZEhlYWRlcnMgPSBkYXRhLmlzRXhwYW5kZWQgPyBbLi4uZ2suZXhwYW5kZWRIZWFkZXJzLCBkYXRhLmdyb3VwS2V5XSA6IGdrLmV4cGFuZGVkSGVhZGVycy5maWx0ZXIoZyA9PiBnICE9PSBkYXRhLmdyb3VwS2V5KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuICh7XHJcbiAgICAgIC4uLnN0YXRlLFxyXG4gICAgICBncm91cEJ5OiBnYmtcclxuICAgIH0pfVxyXG4gICk7XHJcblxyXG4gIGV4cGFuZEFsbE9mR3JvdXAgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBkYXRhOiB7IGdyb3VwSGVhZGVyc0J5S2V5OiBEaWN0aW9uYXJ5PHsgZ3JvdXBOYW1lOiBzdHJpbmcgfVtdPiB9KSA9PiB7XHJcbiAgICBjb25zdCBuZXdHcm91cGVkRGF0YSA9IHN0YXRlLmdyb3VwQnkubWFwKGdiID0+ICh7XHJcbiAgICAgIGtleTogZ2Iua2V5LFxyXG4gICAgICBleHBhbmRlZEhlYWRlcnM6IGRhdGEuZ3JvdXBIZWFkZXJzQnlLZXlbZ2Iua2V5XT8ubWFwKGcgPT4gZy5ncm91cE5hbWUpID8/IGdiLmV4cGFuZGVkSGVhZGVyc1xyXG4gICAgfSBhcyBHcm91cGVkRGF0YSkpO1xyXG4gICAgcmV0dXJuICh7IC4uLnN0YXRlLCBncm91cEJ5OiBuZXdHcm91cGVkRGF0YSB9KTtcclxuICB9KTtcclxuXHJcbiAgY29sbGFwc2VBbGwgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiAoe1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICBncm91cEJ5OiBzdGF0ZS5ncm91cEJ5Lm1hcChnYiA9PiAoeyBrZXk6IGdiLmtleSwgZXhwYW5kZWRIZWFkZXJzOiBbXSB9KSlcclxuICB9KSk7XHJcblxyXG4gIGNvbGxhcHNlQWxsT2ZLZXkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBkYXRhOiB7IGtleXM6IHN0cmluZ1tdIH0pID0+ICh7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIGdyb3VwQnk6IHN0YXRlLmdyb3VwQnkubWFwKGdiID0+ICh7XHJcbiAgICAgIGtleTogZ2Iua2V5LFxyXG4gICAgICBleHBhbmRlZEhlYWRlcnM6IGRhdGEua2V5cy5pbmNsdWRlcyhnYi5rZXkpID8gW10gOiBnYi5leHBhbmRlZEhlYWRlcnNcclxuICAgIH0pKVxyXG4gIH0pKTtcclxuXHJcbiAgZ3JvdXBCeUtleXMkID0gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZ3JvdXBCeS5tYXAoZ2JrID0+IGdiay5rZXkpKVxyXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQ8c3RyaW5nW10+KChwcmV2LCBjdXJyKSA9PiBwcmV2Lmxlbmd0aCA9PT0gY3Vyci5sZW5ndGggJiYgY3Vyci5ldmVyeSgoayxpKSA9PiBwcmV2W2ldID09PSBrKSkpO1xyXG5cclxuICBleHBhbmRlZEdyb3VwcyQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5ncm91cEJ5KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiB7XHJcbiAgICBjb25zdCBhYSA9IGEuZmxhdE1hcChnID0+IGcuZXhwYW5kZWRIZWFkZXJzKTtcclxuICAgIGNvbnN0IGJiID0gYi5mbGF0TWFwKGcgPT4gZy5leHBhbmRlZEhlYWRlcnMpO1xyXG4gICAgcmV0dXJuIGFhLmxlbmd0aCA9PT0gYmIubGVuZ3RoICYmIGFhLmV2ZXJ5KChrKSA9PiBiYi5pbmNsdWRlcyhrKSk7XHJcbiAgfSkpO1xyXG4gIFxyXG4gIHNldFRhYmxlU2V0dGluZ3MgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLHNldHRpbmdzOkdlbmVyYWxUYWJsZVNldHRpbmdzKT0+e1xyXG4gICAgY29uc3QgczpUYWJsZVN0YXRlID0ge1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgcGVyc2lzdGVkVGFibGVTZXR0aW5ncyA6IG5ldyBQZXJzaXN0ZWRUYWJsZVNldHRpbmdzKHNldHRpbmdzKSxcclxuICAgICAgbm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncyA6IG5ldyBOb3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzKHNldHRpbmdzKVxyXG4gICAgICB9O1xyXG4gICAgcmV0dXJuIHM7XHJcbiAgfSk7XHJcblxyXG4gIHRhYmxlU2V0dGluZ3MgPSB0aGlzLnNlbGVjdFNpZ25hbChzdGF0ZSA9PiB7XHJcbiAgICBjb25zdCB0cyA6IFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MgJiBOb3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzID1cclxuICAgICAgey4uLnN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3MsIC4uLnN0YXRlLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3N9O1xyXG4gICAgcmV0dXJuIHRzO1xyXG4gIH0pO1xyXG5cclxuICB0YWJsZVNldHRpbmdzJCA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHtcclxuICAgIGNvbnN0IHRzIDogUGVyc2lzdGVkVGFibGVTZXR0aW5ncyAmIE5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MgPVxyXG4gICAgICB7Li4uc3RhdGUucGVyc2lzdGVkVGFibGVTZXR0aW5ncywuLi5zdGF0ZS5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzfTtcclxuICAgIHJldHVybiB0cztcclxuICB9KVxyXG5cclxuICBwcm9wcyA9IHRoaXMuc2VsZWN0U2lnbmFsKHMgPT4gcy5wcm9wcyk7XHJcblxyXG4gIHNldExpbmtNYXBzID0gdGhpcy51cGRhdGVyKChzdGF0ZSxtYXBzOiBhbnkpPT57XHJcbiAgICByZXR1cm4gey4uLnN0YXRlLGxpbmtNYXBzOm1hcHN9O1xyXG4gIH0pO1xyXG5cclxuICBnZXRMaW5rSW5mbyA9IChtZDpNZXRhRGF0YSkgPT4gdGhpcy5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUubGlua01hcHNbbWQua2V5XSk7XHJcblxyXG4gIGdldElzRXhwYW5kZWQgPSAoY29sdW1uS2V5OiBzdHJpbmcsIGdyb3VwSGVhZGVyS2V5OiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdChzdGF0ZSA9PiAhIXN0YXRlLmdyb3VwQnkuZmlsdGVyKGcgPT4gZy5rZXkgPT09IGNvbHVtbktleSAmJiBnLmV4cGFuZGVkSGVhZGVycy5pbmNsdWRlcyhncm91cEhlYWRlcktleSkpLmxlbmd0aCk7XHJcbiAgfVxyXG4gICRpc1ZpcnR1YWwgPSB0aGlzLnNlbGVjdFNpZ25hbChzdGF0ZSA9PiBzdGF0ZS5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwgPT09IHRydWUgfHwgKHN0YXRlLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MudXNlVmlydHVhbFNjcm9sbCBhcyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucyk/LnZpcnR1YWxBc0RlZmF1bHQgfHwgc3RhdGUuc2hvd0FsbCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBvcmRlcmVkVmlzaWJsZUNvbHVtbnMgPSAoc3RhdGU6IFRhYmxlU3RhdGUpID0+IG9yZGVyZWRWaXNpYmxlTWV0YURhdGEoc3RhdGUpLm1hcChtZCA9PiBtZC5rZXkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IG9yZGVyZWRWaXNpYmxlTWV0YURhdGEgPSAoc3RhdGU6IFRhYmxlU3RhdGUpID0+IHtcclxuICBjb25zdCBvcmRlcmVkID0gb3JkZXJNZXRhRGF0YShzdGF0ZSk7XHJcbiAgY29uc3Qgb3JkZXJlZFZpc2libGUgPSBvcmRlcmVkXHJcbiAgICAuZmlsdGVyKG1ldGFEYXRhID0+ICFzdGF0ZS5oaWRkZW5LZXlzLmluY2x1ZGVzKG1ldGFEYXRhLmtleSkgJiYgc3RhdGUubWV0YURhdGFbbWV0YURhdGEua2V5XS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pO1xyXG4gIHJldHVybiBvcmRlcmVkVmlzaWJsZTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IG9yZGVyZWRDb2RlVmlzaWJsZU1ldGFEYXRhID0gKHN0YXRlOiBUYWJsZVN0YXRlKSA9PlxyXG4gIG9yZGVyTWV0YURhdGEoc3RhdGUpLmZpbHRlcihtZCA9PiBtZC5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pO1xyXG5cclxuZXhwb3J0IGNvbnN0IG9yZGVyTWV0YURhdGEgPSAoc3RhdGU6VGFibGVTdGF0ZSkgPT4ge1xyXG4gIGNvbnN0IHVzZXJPcmRlckFyciA9IE9iamVjdC5lbnRyaWVzKHN0YXRlLnVzZXJEZWZpbmVkLm9yZGVyKTtcclxuICByZXR1cm4gdXNlck9yZGVyQXJyLmxlbmd0aCA/XHJcbiAgIE9iamVjdC52YWx1ZXMoc3RhdGUubWV0YURhdGEpLnNvcnQoKGEsYik9PiB7XHJcbiAgICBjb25zdCBvcmRlckEgPSBzdGF0ZS51c2VyRGVmaW5lZC5vcmRlclthLmtleV07XHJcbiAgICBjb25zdCBvcmRlckIgPSBzdGF0ZS51c2VyRGVmaW5lZC5vcmRlcltiLmtleV07XHJcbiAgICBpZihvcmRlckEgPT0gbnVsbCAmJiBvcmRlckIgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGlmKG9yZGVyQSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgaWYob3JkZXJCID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0YXRlLnVzZXJEZWZpbmVkLm9yZGVyW2Eua2V5XSAtIHN0YXRlLnVzZXJEZWZpbmVkLm9yZGVyW2Iua2V5XVxyXG4gIH0pXHJcbiAgIDpcclxuICAgT2JqZWN0LnZhbHVlcyhzdGF0ZS5tZXRhRGF0YSkuc29ydCgoYSxiKT0+IGEub3JkZXIhIC0gYi5vcmRlciEpXHJcbn0iXX0=
355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jbGFzc2VzL3RhYmxlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFlLG1CQUFtQixFQUFFLFlBQVksRUFBbUMsTUFBTSxjQUFjLENBQUM7QUFDbEksT0FBTyxFQUFFLFVBQVUsRUFBYSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBNEIsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUc7QUFFekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBd0IseUJBQXlCLEVBQUUsc0JBQXNCLEVBQXdCLE1BQU0sa0NBQWtDLENBQUM7QUFDakosT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFNUMsTUFBTSxVQUFVLE9BQU8sQ0FBQyxtQkFBd0M7SUFDOUQs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Q0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN4RSxDQUFDLENBQUM7UUFDRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQU0sR0FBRyxDQUFDLENBQUMsS0FBTSxDQUFDLENBQUE7QUFDbEUsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmllbGRUeXBlLCBNZXRhRGF0YSwgU29ydERlZiB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWRlZic7XHJcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWZhdWx0VGFibGVTdGF0ZSwgR3JvdXBlZERhdGEsIEluaXRpYWxpemF0aW9uU3RhdGUsIGtleXNUb0RlbGV0ZSwgUGVyc2lzdGVkVGFibGVTdGF0ZSwgVGFibGVTdGF0ZSB9IGZyb20gJy4vVGFibGVTdGF0ZSc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIFByZWRpY2F0ZSwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUYWJsZUJ1aWxkZXJDb25maWdUb2tlbiB9IGZyb20gJy4vVGFibGVCdWlsZGVyQ29uZmlnJztcclxuaW1wb3J0IHsgQ3VzdG9tRmlsdGVyLCBGaWx0ZXJJbmZvLCBpc0N1c3RvbUZpbHRlciwgaXNGaWx0ZXJJbmZvIH0gZnJvbSAnLi9maWx0ZXItaW5mbyc7XHJcbmltcG9ydCB7IFNvcnQsIFNvcnREaXJlY3Rpb24gfSAgZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCcgO1xyXG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gJ0BuZ3J4L2NvbXBvbmVudC1zdG9yZScgIDtcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGljdGlvbmFyeSc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGxhc3QsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBub3ROdWxsLCBvbmNlV2hlbiB9IGZyb20gJy4uLy4uL3J4anMvcnhqcy1vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBHZW5lcmFsVGFibGVTZXR0aW5ncywgTm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncywgUGVyc2lzdGVkVGFibGVTZXR0aW5ncywgVmlydHVhbFNjcm9sbE9wdGlvbnMgfSBmcm9tICcuL3RhYmxlLWJ1aWxkZXItZ2VuZXJhbC1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IHJlcGxhY2VJbkFycmF5V2l0aENsb25lIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2FycmF5LWhlbHBlcnMnO1xyXG5pbXBvcnQgeyBpc0RpZmZlcmVudCB9IGZyb20gJy4uL2RpcmVjdGl2ZXMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlSXMoaW5pdGlhbGl6YXRpb25TdGF0ZTogSW5pdGlhbGl6YXRpb25TdGF0ZSkge1xyXG4gIHJldHVybiAoc3RhdGU6IFRhYmxlU3RhdGUpID0+IHN0YXRlLmluaXRpYWxpemF0aW9uU3RhdGUgPT09IGluaXRpYWxpemF0aW9uU3RhdGU7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRhYmxlU3RvcmUgZXh0ZW5kcyBDb21wb25lbnRTdG9yZTxUYWJsZVN0YXRlPiB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICBjb25zdCBjb25maWcgPSBpbmplY3QoVGFibGVCdWlsZGVyQ29uZmlnVG9rZW4pO1xyXG5cclxuICAgc3VwZXIoIHsgLi4uZGVmYXVsdFRhYmxlU3RhdGUsIC4uLmNvbmZpZy5kZWZhdWx0VGFibGVTdGF0ZX0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RhdGVSZWFkeSA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLmluaXRpYWxpemF0aW9uU3RhdGUpLnBpcGUoZmlsdGVyKGkgPT4gaSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0ZS5SZWFkeSkpO1xyXG4gIGdldFNhdmFibGVTdGF0ZSgpIDogT2JzZXJ2YWJsZTxQZXJzaXN0ZWRUYWJsZVN0YXRlPiB7XHJcbiAgICByZXR1cm4gIHRoaXMuc3RhdGUkLnBpcGUoXHJcbiAgICAgIG1hcCggcyA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwU2F2ZWFibGVTdGF0ZShzKTtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2F2YWJsZVN0YXRlU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5tYXBTYXZlYWJsZVN0YXRlKHN0YXRlKTtcclxuICB9KVxyXG4gIHByaXZhdGUgbWFwU2F2ZWFibGVTdGF0ZSA9IChzOiBQZXJzaXN0ZWRUYWJsZVN0YXRlKSA9PiB7XHJcbiAgICBjb25zdCBzYXZhYmxlU3RhdGUgPSB7Li4uc30gYXMgUGFydGlhbDxUYWJsZVN0YXRlPjtcclxuICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiBkZWxldGUgc2F2YWJsZVN0YXRlW2tleV0pO1xyXG4gICAgcmV0dXJuIHNhdmFibGVTdGF0ZSBhcyBQZXJzaXN0ZWRUYWJsZVN0YXRlO1xyXG4gIH1cclxuXHJcbiAgb24gPSA8Vj4oc3JjT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxWPiwgZnVuYzogKG9iajogVikgPT4gdm9pZCkgPT4ge1xyXG4gICAgdGhpcy5lZmZlY3QoKCkgPT4gc3JjT2JzZXJ2YWJsZS5waXBlKFxyXG4gICAgICB0YXAoZnVuYylcclxuICAgICkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBvbkxhc3QoY2FsbGJhY2s6IChzdGF0ZTogVGFibGVTdGF0ZSkgPT4gdm9pZCApIHtcclxuICAgIHRoaXMub24odGhpcy5zdGF0ZSQucGlwZShsYXN0KCkpLGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IG1ldGFEYXRhJCA9IHRoaXMuc2VsZWN0KCBzdGF0ZSA9PiBzdGF0ZS5tZXRhRGF0YSk7XHJcblxyXG4gIG1ldGFEYXRhQXJyYXkgPSB0aGlzLnNlbGVjdFNpZ25hbChcclxuICAgIHRoaXMuc3RhdGUsXHJcbiAgICBvcmRlck1ldGFEYXRhXHJcbiAgKVxyXG4gIHJlYWRvbmx5IG1ldGFEYXRhQXJyYXkkID0gdGhpcy5zZWxlY3QoXHJcbiAgICB0aGlzLnN0YXRlJCxcclxuICAgIG9yZGVyTWV0YURhdGFcclxuICApO1xyXG5cclxuICBnZXRNZXRhRGF0YSQgPSAoa2V5OiBzdHJpbmcpIDogT2JzZXJ2YWJsZTxNZXRhRGF0YT4gPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KCBzdGF0ZSA9PiBzdGF0ZS5tZXRhRGF0YVtrZXldICApLnBpcGUoXHJcbiAgICAgIHRhcChtZXRhID0+IHtpZighbWV0YSljb25zb2xlLndhcm4oYE1ldGEgZGF0YSB3aXRoIGtleSAke2tleX0gbm90IGZvdW5kYCl9KSxcclxuICAgICAgbm90TnVsbCgpKVxyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckRlZmluZWRXaWR0aCQgPSAoa2V5OnN0cmluZykgPT4gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudXNlckRlZmluZWQud2lkdGhzW2tleV0pO1xyXG4gIGdldFVzZXJEZWZpbmVkV2lkdGggPSAoa2V5OnN0cmluZykgPT4gdGhpcy5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUudXNlckRlZmluZWQud2lkdGhzW2tleV0pO1xyXG4gIGdldFVzZXJEZWZpbmVkV2lkdGhzJCA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLnVzZXJEZWZpbmVkLndpZHRocyk7XHJcbiAgZ2V0VXNlckRlZmluZWRXaWR0aHMgPSB0aGlzLnNlbGVjdFNpZ25hbChzdGF0ZSA9PiBzdGF0ZS51c2VyRGVmaW5lZC53aWR0aHMpO1xyXG4gIHJlYWRvbmx5IGRpc3BsYXllZENvbHVtbnMkID0gdGhpcy5zZWxlY3Qob3JkZXJlZFZpc2libGVDb2x1bW5zKTtcclxuXHJcblxyXG4gIHJlYWRvbmx5IHJlc2V0U3RhdGUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB7XHJcbiAgICBjb25zdCBzb3J0ZWQgPSB0aGlzLmNyZWF0ZVByZVNvcnQoc3RhdGUubWV0YURhdGEpO1xyXG4gICAgcmV0dXJuICh7Li4uc3RhdGUsIGhpZGRlbktleXM6IFtdLCBzb3J0ZWQsIGZpbHRlcnM6IHt9ICwgZ3JvdXBCeTogW10sICB1c2VyRGVmaW5lZDogeyB3aWR0aHM6IHt9LCBvcmRlcjoge30sIHRhYmxlOiB7fSB9IH0pO1xyXG4gIH0pO1xyXG5cclxuICByZWFkb25seSBzaG93Q29sdW1uID0gdGhpcy51cGRhdGVyKChzdGF0ZSwga2V5OiBzdHJpbmcpID0+ICh7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIGhpZGRlbktleXM6IHN0YXRlLmhpZGRlbktleXMuZmlsdGVyKCBrID0+IGsgIT09IGtleSksXHJcbiAgfSkpO1xyXG5cclxuICByZWFkb25seSBoaWRlQ29sdW1uID0gdGhpcy51cGRhdGVyKChzdGF0ZSwga2V5OiBzdHJpbmcpID0+ICh7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIGhpZGRlbktleXM6IFsuLi5zdGF0ZS5oaWRkZW5LZXlzLmZpbHRlciggayA9PiBrICE9PSBrZXkpLCBrZXldLFxyXG4gIH0pKTtcclxuXHJcbiAgcmVhZG9ubHkgc2V0SGlkZGVuQ29sdW1ucyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGRpc3BsYXlDb2xzOiB7a2V5OiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW59W10pID0+IHtcclxuICAgIHJldHVybiAoey4uLnN0YXRlLCBoaWRkZW5LZXlzOiBkaXNwbGF5Q29scy5maWx0ZXIoZCA9PiAhZC52aXNpYmxlKS5tYXAoZCA9PiBkLmtleSl9KVxyXG4gIH0pO1xyXG5cclxuXHJcbiAgc2V0VXNlckRlZmluZWRXaWR0aCA9IHRoaXMudXBkYXRlcigoc3RhdGUsY29sV2lkdGhzOntrZXk6IHN0cmluZywgd2lkdGhJblBpeGVsOm51bWJlcn1bXSkgPT4ge1xyXG4gICAgY29uc3QgdXNlckRlZmluZWRXaWR0aHMgPSB7Li4uc3RhdGUudXNlckRlZmluZWQud2lkdGhzfTtcclxuICAgIGNvbFdpZHRocy5mb3JFYWNoKGN3ID0+IHtcclxuICAgICAgdXNlckRlZmluZWRXaWR0aHNbY3cua2V5XSA9IGN3LndpZHRoSW5QaXhlbDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsuLi5zdGF0ZSwgdXNlckRlZmluZWQ6IHsuLi5zdGF0ZS51c2VyRGVmaW5lZCwgd2lkdGhzOnVzZXJEZWZpbmVkV2lkdGhzfX07XHJcbiAgfSk7XHJcblxyXG4gIHNldFVzZXJEZWZpbmVkT3JkZXIgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLG1vdmVkOiB7IG5ld09yZGVyOiBudW1iZXIsIG9sZE9yZGVyOiBudW1iZXIgfSk9PntcclxuICAgIGNvbnN0IHsgbmV3T3JkZXIsIG9sZE9yZGVyIH0gPSBtb3ZlZDtcclxuICAgIGNvbnN0IG1kc0FyciA9IG9yZGVyZWRWaXNpYmxlTWV0YURhdGEoc3RhdGUpO1xyXG4gICAgbW92ZUl0ZW1JbkFycmF5KG1kc0Fyciwgb2xkT3JkZXIsIG5ld09yZGVyKTtcclxuXHJcbiAgICBjb25zdCB1c2VyRGVmaW5lZE9yZGVyID0gbWRzQXJyLnJlZHVjZSgoYWdncmVnYXRlOiBhbnksY3VycmVudCxpbmRleCkgPT4ge1xyXG4gICAgICBhZ2dyZWdhdGVbY3VycmVudC5rZXldID0gaW5kZXg7XHJcbiAgICAgIHJldHVybiBhZ2dyZWdhdGVcclxuICAgIH0se30pO1xyXG4gICAgcmV0dXJuKHsgLi4uc3RhdGUsIHVzZXJEZWZpbmVkOiB7IC4uLnN0YXRlLnVzZXJEZWZpbmVkLCBvcmRlcjogdXNlckRlZmluZWRPcmRlciB9IH0pXHJcbiAgfSlcclxuXHJcblxyXG4gIHJlYWRvbmx5IGZpbHRlcnMkID0gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZmlsdGVycyApO1xyXG5cclxuICByZWFkb25seSBnZXRGaWx0ZXIkID0gKGZpbHRlcklkOiBzdHJpbmcpIDogT2JzZXJ2YWJsZTxGaWx0ZXJJbmZvIHwgQ3VzdG9tRmlsdGVyIHwgdW5kZWZpbmVkPiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoIHN0YXRlID0+IHN0YXRlLmZpbHRlcnNbZmlsdGVySWRdICk7XHJcbiAgfVxyXG4gIHJlYWRvbmx5IGFkZEZpbHRlciA9IHRoaXMudXBkYXRlciggKHN0YXRlLCBmaWx0ZXI6IEZpbHRlckluZm8gfCBDdXN0b21GaWx0ZXIgKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJzVG9TdGF0ZShzdGF0ZSwgW2ZpbHRlcl0pO1xyXG4gIH0pO1xyXG5cclxuICByZWFkb25seSBhZGRGaWx0ZXJzID0gdGhpcy51cGRhdGVyKChzdGF0ZSxmaWx0ZXJzOihGaWx0ZXJJbmZvIHwgQ3VzdG9tRmlsdGVyIClbXSk9PntcclxuICAgIHJldHVybiB0aGlzLmFkZEZpbHRlcnNUb1N0YXRlKHN0YXRlLCBmaWx0ZXJzKTtcclxuICB9KVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhZGRGaWx0ZXJzVG9TdGF0ZSA9IChzdGF0ZTpUYWJsZVN0YXRlLCBmaWx0ZXJzOihGaWx0ZXJJbmZvIHwgQ3VzdG9tRmlsdGVyKVtdKSA6IFRhYmxlU3RhdGUgPT4ge1xyXG5cclxuICAgIHZhciBjdXN0b21GaWx0ZXJzID0gZmlsdGVycy5maWx0ZXIoICBpc0N1c3RvbUZpbHRlciApO1xyXG5cclxuICAgIHZhciBmaWx0ZXJJbmZvcyA9IGZpbHRlcnMuZmlsdGVyKGlzRmlsdGVySW5mbyk7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyc09iaiA9IGZpbHRlckluZm9zXHJcbiAgICAgIC5maWx0ZXIoZmx0ciA9PiBPYmplY3Qua2V5cyhzdGF0ZS5tZXRhRGF0YSkuc29tZShrZXkgPT4ga2V5ID09PSBmbHRyLmtleSkgfHwgY29uc29sZS53YXJuKGBNZXRhIGRhdGEgd2l0aCBrZXkgJHtmbHRyLmtleX0gbm90IGZvdW5kYCkpXHJcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcnNPYmo6IHtbazogc3RyaW5nXTogYW55fSxmaWx0ZXIpPT57XHJcbiAgICAgICAgaWYgKCFmaWx0ZXIuZmlsdGVySWQpIHtcclxuICAgICAgICAgIGZpbHRlci5maWx0ZXJJZCA9IHV1aWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmlsdGVyc09ialtmaWx0ZXIuZmlsdGVySWRdID0gZmlsdGVyO1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXJzT2JqO1xyXG4gICAgICB9LHt9KTtcclxuXHJcbiAgICBjdXN0b21GaWx0ZXJzLmZvckVhY2goIGZsdHIgPT4ge1xyXG4gICAgICBpZighZmx0ci5maWx0ZXJJZCkge1xyXG4gICAgICAgIGZsdHIuZmlsdGVySWQgPSB1dWlkKCk7XHJcbiAgICAgIH1cclxuICAgICAgZmlsdGVyc09ialtmbHRyLmZpbHRlcklkXSA9IGZsdHI7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uc3RhdGUsXHJcbiAgICAgIGZpbHRlcnMgOiB7Li4uc3RhdGUuZmlsdGVycywgLi4uZmlsdGVyc09iaiB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgcmVtb3ZlRmlsdGVyID0gdGhpcy51cGRhdGVyKCAoc3RhdGUsIGZpbHRlcklkOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGZpbHRlcnNDb3B5ID0geyAuLi5zdGF0ZS5maWx0ZXJzIH07XHJcbiAgICBkZWxldGUgZmlsdGVyc0NvcHlbZmlsdGVySWRdO1xyXG4gICAgcmV0dXJuICh7Li4uc3RhdGUsIGZpbHRlcnM6IGZpbHRlcnNDb3B5IH0pO1xyXG4gIH0pO1xyXG5cclxuICByZWFkb25seSByZW1vdmVGaWx0ZXJzID0gdGhpcy51cGRhdGVyKCAoc3RhdGUsIGZpbHRlcklkczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IGZpbHRlcnNDb3B5ID0geyAuLi5zdGF0ZS5maWx0ZXJzIH07XHJcbiAgICBmaWx0ZXJJZHMuZm9yRWFjaChpZCA9PiB7IGRlbGV0ZSBmaWx0ZXJzQ29weVtpZF0gfSlcclxuICAgIHJldHVybiAoey4uLnN0YXRlLCBmaWx0ZXJzOiBmaWx0ZXJzQ29weSB9KTtcclxuICB9KTtcclxuXHJcbiAgcmVhZG9ubHkgY2xlYXJGaWx0ZXJzID0gdGhpcy51cGRhdGVyKChzdGF0ZSk9PlxyXG4gICAgKHsuLi5zdGF0ZSxmaWx0ZXJzOnt9fSkpXHJcblxyXG5cclxuICBzZWxlY3RTb3J0ZWQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zb3J0ZWQpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKGYscykgPT4gIWlzRGlmZmVyZW50KGYscykpKTtcclxuICByZWFkb25seSBzb3J0JCA9IHRoaXMuc2VsZWN0KHRoaXMuc2VsZWN0U3RhdGVSZWFkeSwgdGhpcy5zZWxlY3RTb3J0ZWQsIChfLHMpID0+IHMgKTtcclxuICBcclxuICBjcmVhdGVQcmVTb3J0ID0gKG1ldGFEYXRhczogRGljdGlvbmFyeTxNZXRhRGF0YT4pOiBTb3J0W10gPT4ge1xyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobWV0YURhdGFzKS5maWx0ZXIoKCBtZXRhRGF0YSApIDogbWV0YURhdGEgaXMgTWV0YURhdGEgJiB7cHJlU29ydDogU29ydERlZn0gPT4gISFtZXRhRGF0YS5wcmVTb3J0KVxyXG4gICAgICAuc29ydCgoeyAgcHJlU29ydDogcHMxICB9LCB7IHByZVNvcnQ6IHBzMiB9ICkgPT4gKHBzMS5wcmVjZWRlbmNlIHx8IE51bWJlci5NQVhfVkFMVUUpIC0gKCBwczIucHJlY2VkZW5jZSB8fCBOdW1iZXIuTUFYX1ZBTFVFKSlcclxuICAgICAgLm1hcCgoIHtrZXksIHByZVNvcnR9ICkgPT4gKHsgYWN0aXZlOiBrZXksIGRpcmVjdGlvbjogcHJlU29ydC5kaXJlY3Rpb24gfSkpXHJcbiAgfVxyXG5cclxuICByZWFkb25seSBzZXRTb3J0ID0gdGhpcy51cGRhdGVyPHtrZXk6IHN0cmluZywgZGlyZWN0aW9uPzogU29ydERpcmVjdGlvbn0+KChzdGF0ZSwge2tleSwgZGlyZWN0aW9ufSApID0+IHtcclxuICAgIGNvbnN0IHNvcnRBcnJheSA9IHN0YXRlLnNvcnRlZC5maWx0ZXIoIHMgPT4gcy5hY3RpdmUgIT09IGtleSApO1xyXG4gICAgaWYoZGlyZWN0aW9uKSB7XHJcbiAgICAgIHNvcnRBcnJheS51bnNoaWZ0KHthY3RpdmU6IGtleSwgZGlyZWN0aW9ufSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgc29ydGVkOiBzb3J0QXJyYXksXHJcbiAgICB9O1xyXG4gIH0pO1xyXG5cclxuICByZWFkb25seSBzZXRBbGxTb3J0ID0gdGhpcy51cGRhdGVyKChzdGF0ZSxzb3J0QXJyYXk6U29ydFtdKT0+e1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uc3RhdGUsXHJcbiAgICAgIHNvcnRlZDogc29ydEFycmF5LFxyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgdXBkYXRlU3RhdGVGdW5jID0gKHN0YXRlOiBUYWJsZVN0YXRlLCBpbmNvbWluZ1RhYmxlU3RhdGU6IFBhcnRpYWw8VGFibGVTdGF0ZT4pIDogVGFibGVTdGF0ZSA9PiB7XHJcbiAgICBjb25zdCBtZXRhRGF0YSA9IHN0YXRlLm1ldGFEYXRhO1xyXG4gICAgY29uc3Qgc29ydGVkID0gaW5jb21pbmdUYWJsZVN0YXRlLnNvcnRlZD8ubGVuZ3RoID8gaW5jb21pbmdUYWJsZVN0YXRlLnNvcnRlZFxyXG4gICAgICA6IHN0YXRlLmluaXRpYWxpemF0aW9uU3RhdGUgPT09IEluaXRpYWxpemF0aW9uU3RhdGUuQ3JlYXRlZCA/IHRoaXMuY3JlYXRlUHJlU29ydChtZXRhRGF0YSkgOiBzdGF0ZS5zb3J0ZWQ7XHJcbiAgICByZXR1cm4gey4uLnN0YXRlLCAuLi5pbmNvbWluZ1RhYmxlU3RhdGUsIG1ldGFEYXRhICwgc29ydGVkfTtcclxuICB9XHJcblxyXG4gIHJlYWRvbmx5IHNldFBhZ2VTaXplID0gdGhpcy51cGRhdGVyKCAoc3RhdGUsIHBhZ2VTaXplOiBudW1iZXIpPT4gKHsgLi4uc3RhdGUsIHBhZ2VTaXplLCB1c2VyRGVmaW5lZDogeyAuLi5zdGF0ZS51c2VyRGVmaW5lZCwgcGFnZVNpemUgfSB9KSk7XHJcbiAgZ2V0UGFnZVNpemUgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS51c2VyRGVmaW5lZC5wYWdlU2l6ZSB8fCBzdGF0ZS5wYWdlU2l6ZSk7XHJcbiAgcmVhZG9ubHkgdXBkYXRlU3RhdGUgPSB0aGlzLnVwZGF0ZXI8UGFydGlhbDxUYWJsZVN0YXRlPj4odGhpcy51cGRhdGVTdGF0ZUZ1bmMpO1xyXG5cclxuICBjbGVhblBlcnNpc3RlZFN0YXRlKHN0YXRlOiBUYWJsZVN0YXRlLHBTdGF0ZTogUGVyc2lzdGVkVGFibGVTdGF0ZSkge1xyXG4gICAgY29uc3QgbWV0YXMgPSBPYmplY3QudmFsdWVzKHN0YXRlLm1ldGFEYXRhKTtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSBPYmplY3QudmFsdWVzKHBTdGF0ZS5maWx0ZXJzKS5maWx0ZXIoZmx0ciA9PiBpc0N1c3RvbUZpbHRlcihmbHRyKSB8fCBtZXRhcy5zb21lKG0gPT4gbS5rZXkgPT09IGZsdHIua2V5KSkucmVkdWNlKChvYmo6IGFueSwgZmlsdGVyKSA9PiB7XHJcbiAgICAgIG9ialtmaWx0ZXIuZmlsdGVySWQhXSA9IHBTdGF0ZS5maWx0ZXJzW2ZpbHRlci5maWx0ZXJJZCFdO1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSwge30pO1xyXG4gICAgY29uc3Qgc29ydGVkID0gcFN0YXRlLnNvcnRlZC5maWx0ZXIocyA9PiBtZXRhcy5zb21lKG0gPT4gbS5rZXkgPT09IHMuYWN0aXZlKSk7XHJcbiAgICByZXR1cm4gKHsuLi5wU3RhdGUsZmlsdGVycyxzb3J0ZWR9KVxyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgdXBkYXRlU3RhdGVGcm9tUGVyc2lzdGVkU3RhdGUgPSB0aGlzLnVwZGF0ZXIoICggc3RhdGU6IFRhYmxlU3RhdGUsIHBlcnNpc3RlZFN0YXRlOiBQZXJzaXN0ZWRUYWJsZVN0YXRlKSA6IFRhYmxlU3RhdGUgPT4ge1xyXG4gICAgY29uc3QgaW5jb21pbmdUYWJsZVN0YXRlOiBQYXJ0aWFsPFRhYmxlU3RhdGU+ID0gdGhpcy5jbGVhblBlcnNpc3RlZFN0YXRlKHN0YXRlLHBlcnNpc3RlZFN0YXRlKTtcclxuICAgIGNvbnN0IG5ld1N0YXRlID0gIHRoaXMudXBkYXRlU3RhdGVGdW5jKHN0YXRlLGluY29taW5nVGFibGVTdGF0ZSk7XHJcbiAgICBuZXdTdGF0ZS5pbml0aWFsaXphdGlvblN0YXRlID0gc3RhdGUuaW5pdGlhbGl6YXRpb25TdGF0ZSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0ZS5NZXRhRGF0YUxvYWRlZCA/IEluaXRpYWxpemF0aW9uU3RhdGUuTG9hZGVkRnJvbVN0b3JlIDogc3RhdGUuaW5pdGlhbGl6YXRpb25TdGF0ZTtcclxuICAgIHJldHVybiBuZXdTdGF0ZTtcclxuICB9KTtcclxuXHJcbiAgZ2V0VXNlckRlZmluZWRUYWJsZVNpemUgPSB0aGlzLnNlbGVjdFNpZ25hbChzdGF0ZSA9PiBzdGF0ZS51c2VyRGVmaW5lZC50YWJsZS53aWR0aCk7XHJcbiAgZ2V0VXNlckRlZmluZWRUYWJsZVNpemUkID0gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUudXNlckRlZmluZWQudGFibGUud2lkdGgpO1xyXG4gIHNldFRhYmxlV2lkdGggPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCB3aWR0aEluUGl4ZWxzOm51bWJlcikgPT4gKHsuLi5zdGF0ZSwgdXNlckRlZmluZWQ6IHsgLi4uc3RhdGUudXNlckRlZmluZWQsIHRhYmxlOiB7IHdpZHRoOiB3aWR0aEluUGl4ZWxzIH0gfSB9KSkgO1xyXG5cclxuICBtZXJnZU1ldGEgPSAob3JpZzogTWV0YURhdGEsIG1lcmdlOiBNZXRhRGF0YSk6IE1ldGFEYXRhID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAga2V5OiBvcmlnLmtleSxcclxuICAgICAgICBkaXNwbGF5TmFtZTogbWVyZ2UuZGlzcGxheU5hbWUgPz8gb3JpZy5kaXNwbGF5TmFtZSxcclxuICAgICAgICBmaWVsZFR5cGU6IG1lcmdlLmZpZWxkVHlwZSB8fCBvcmlnLmZpZWxkVHlwZSxcclxuICAgICAgICBhZGRpdGlvbmFsOiB7Li4ub3JpZy5hZGRpdGlvbmFsLCAuLi5tZXJnZS5hZGRpdGlvbmFsfSxcclxuICAgICAgICBvcmRlcjogbWVyZ2Uub3JkZXIgPz8gb3JpZy5vcmRlcixcclxuICAgICAgICBwcmVTb3J0OiBtZXJnZS5wcmVTb3J0ID8/IG9yaWcucHJlU29ydCxcclxuICAgICAgICB3aWR0aDogbWVyZ2Uud2lkdGggPz8gb3JpZy53aWR0aCxcclxuICAgICAgICBub0V4cG9ydDogbWVyZ2Uubm9FeHBvcnQgfHwgb3JpZy5ub0V4cG9ydCxcclxuICAgICAgICBub0ZpbHRlcjogbWVyZ2Uubm9GaWx0ZXIgfHwgb3JpZy5ub0ZpbHRlcixcclxuICAgICAgICBjdXN0b21DZWxsOiBtZXJnZS5jdXN0b21DZWxsID8/IG9yaWcuY3VzdG9tQ2VsbCxcclxuICAgICAgICB0cmFuc2Zvcm06IG1lcmdlLnRyYW5zZm9ybSA/PyBvcmlnLnRyYW5zZm9ybSxcclxuICAgICAgICBtYXA6IG1lcmdlLm1hcCA/PyBvcmlnLm1hcCxcclxuICAgICAgICBjbGljazogbWVyZ2UuY2xpY2sgPz8gb3JpZy5jbGljayxcclxuICAgICAgICBjbGFzc2VzOiBtZXJnZS5jbGFzc2VzID8/IG9yaWcuY2xhc3NlcyxcclxuICAgICAgICBub1NvcnQ6IG1lcmdlLm5vU29ydCA/PyBvcmlnLm5vU29ydCxcclxuICAgICAgICB0ZW1wbGF0ZTogbWVyZ2UudGVtcGxhdGUgPz8gb3JpZy50ZW1wbGF0ZSxcclxuICAgICAgICB0b29sVGlwOiBtZXJnZS50b29sVGlwID8/IG9yaWcudG9vbFRpcCxcclxuICAgICAgICB1c2VJY29uOiBtZXJnZS51c2VJY29uID8/IG9yaWcudXNlSWNvbixcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZWFkb25seSBzZXRJbml0aWFsaXphdGlvblN0YXRlID0gdGhpcy51cGRhdGVyKCAoc3RhdGUsIGluaXRpYWxpemF0aW9uU3RhdGU6ICBJbml0aWFsaXphdGlvblN0YXRlKSA9PiB7XHJcbiAgICByZXR1cm4gey4uLnN0YXRlLCBpbml0aWFsaXphdGlvblN0YXRlfTtcclxuICB9KTtcclxuXHJcbiAgcnVuT25jZVdoZW4ocHJlZGljYXRlOiBQcmVkaWNhdGU8VGFibGVTdGF0ZT4sIGZ1bmM6IChzdGF0ZTpUYWJsZVN0YXRlKSA9PiB2b2lkKSB7XHJcbiAgICBjb25zdCBvYnMgPSB0aGlzLnN0YXRlJC5waXBlKG9uY2VXaGVuKHByZWRpY2F0ZSkpO1xyXG4gICAgdGhpcy5vbihvYnMsIChzdGF0ZSkgPT4ge1xyXG4gICAgICBmdW5jKHN0YXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25SZWFkeSggZnVuYzogKHN0YXRlOiBUYWJsZVN0YXRlKSA9PiB2b2lkICkge1xyXG4gICAgdGhpcy5ydW5PbmNlV2hlbihzdGF0ZUlzKEluaXRpYWxpemF0aW9uU3RhdGUuUmVhZHkpLGZ1bmMpO1xyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgc2V0TWV0YURhdGEgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBtZDogTWV0YURhdGFbXSB8IE1ldGFEYXRhICkgPT4ge1xyXG4gICAgY29uc3QgbWV0YURhdGEgPSAoIEFycmF5LmlzQXJyYXkobWQpID8gWy4uLm1kXSA6IFttZF0gKVxyXG4gICAgICAucmVkdWNlKChwcmV2OiBEaWN0aW9uYXJ5PE1ldGFEYXRhPixjdXJyKSA9PiB7XHJcbiAgICAgICAgaWYocHJldltjdXJyLmtleV0pIHtcclxuICAgICAgICAgIHByZXZbY3Vyci5rZXldID0gdGhpcy5tZXJnZU1ldGEocHJldltjdXJyLmtleV0sY3Vycik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHByZXZbY3Vyci5rZXldID0gY3VycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByZXY7XHJcbiAgICAgIH0gLHt9KTtcclxuICAgIGxldCBzb3J0ZWQgPSBzdGF0ZS5zb3J0ZWQ7XHJcbiAgICBpZihzb3J0ZWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHNvcnRlZCA9IHRoaXMuY3JlYXRlUHJlU29ydChtZXRhRGF0YSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcmRlciA9IHRoaXMuaW5pdGlhbGl6ZU9yZGVyKHN0YXRlLCBtZXRhRGF0YSk7XHJcbiAgICBjb25zdCBpbml0aWFsaXphdGlvblN0YXRlID0gc3RhdGUuaW5pdGlhbGl6YXRpb25TdGF0ZSA9PSBJbml0aWFsaXphdGlvblN0YXRlLkNyZWF0ZWQgPyAgSW5pdGlhbGl6YXRpb25TdGF0ZS5NZXRhRGF0YUxvYWRlZCA6IHN0YXRlLmluaXRpYWxpemF0aW9uU3RhdGU7XHJcbiAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5pdGlhbGl6YXRpb25TdGF0ZSwgbWV0YURhdGEsIHNvcnRlZCwgdXNlckRlZmluZWQ6IHsgLi4uc3RhdGUudXNlckRlZmluZWQsIG9yZGVyOiBvcmRlcn0gfTtcclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplT3JkZXIgPSAoc3RhdGU6VGFibGVTdGF0ZSxtZHM6IERpY3Rpb25hcnk8TWV0YURhdGE+KSA6IERpY3Rpb25hcnk8bnVtYmVyPiA9PiB7XHJcbiAgICBjb25zdCB2aWV3YWJsZU1ldGFEYXRhQXJyID0gT2JqZWN0LnZhbHVlcyhtZHMpLmZpbHRlcihhID0+IGEuZmllbGRUeXBlICE9PSBGaWVsZFR5cGUuSGlkZGVuKTtcclxuICAgIGxldCB1c2VyRGVmaW5lZE9yZGVyID0gc3RhdGUudXNlckRlZmluZWQub3JkZXI7XHJcbiAgICBpZih2aWV3YWJsZU1ldGFEYXRhQXJyLnNvbWUobWV0YSA9PiB1c2VyRGVmaW5lZE9yZGVyW21ldGEua2V5XSA9PSBudWxsKSl7XHJcbiAgICAgIHJldHVybiB7fVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZXJEZWZpbmVkT3JkZXI7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDb2xsYXBzZUhlYWRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUpPT57XHJcbiAgICBjb25zdCB0YWJsZVNldHRpbmdzID0gey4uLnN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3N9O1xyXG4gICAgdGFibGVTZXR0aW5ncy5jb2xsYXBzZUhlYWRlciA9ICF0YWJsZVNldHRpbmdzLmNvbGxhcHNlSGVhZGVyO1xyXG4gICAgcmV0dXJuICh7Li4uc3RhdGUscGVyc2lzdGVkVGFibGVTZXR0aW5ncyA6IG5ldyBQZXJzaXN0ZWRUYWJsZVNldHRpbmdzKHRhYmxlU2V0dGluZ3MpfSk7XHJcbiAgfSlcclxuXHJcbiAgdG9nZ2xlQ29sbGFwc2VGb290ZXIgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKT0+e1xyXG4gICAgY29uc3QgdGFibGVTZXR0aW5ncyA9IHsuLi5zdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzfTtcclxuICAgIHRhYmxlU2V0dGluZ3MuY29sbGFwc2VGb290ZXIgPSAhdGFibGVTZXR0aW5ncy5jb2xsYXBzZUZvb3RlcjtcclxuICAgIHJldHVybiAoey4uLnN0YXRlLHBlcnNpc3RlZFRhYmxlU2V0dGluZ3MgOiBuZXcgUGVyc2lzdGVkVGFibGVTZXR0aW5ncyh0YWJsZVNldHRpbmdzKX0pO1xyXG4gIH0pXHJcblxyXG4gIGFkZEdyb3VwQnlLZXkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBtZXRhRGF0YUtleTogc3RyaW5nKSA9PiAoe1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICBncm91cEJ5OiBbLi4uc3RhdGUuZ3JvdXBCeSwgeyBrZXk6IG1ldGFEYXRhS2V5LCBleHBhbmRlZEhlYWRlcnM6IFtdIH1dXHJcbiAgfSkpO1xyXG5cclxuICByZW1vdmVHcm91cEJ5S2V5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZ3JvdXBCeUtleTogc3RyaW5nKSA9PiAoe1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICBncm91cEJ5OiBzdGF0ZS5ncm91cEJ5LmZpbHRlcihrZXkgPT4gZ3JvdXBCeUtleSAhPT0ga2V5LmtleSlcclxuICB9KSk7XHJcblxyXG4gIHVwZGF0ZUV4cGFuZGVkR3JvdXBzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZGF0YToge2tleTogc3RyaW5nLCBncm91cEtleTogc3RyaW5nLCBpc0V4cGFuZGVkOiBib29sZWFufSkgPT4ge1xyXG4gICAgY29uc3QgZ2JrID0gcmVwbGFjZUluQXJyYXlXaXRoQ2xvbmUoc3RhdGUuZ3JvdXBCeSwgayA9PiBrLmtleSA9PT0gZGF0YS5rZXksIGdrID0+IHtcclxuICAgICAgZ2suZXhwYW5kZWRIZWFkZXJzID0gZGF0YS5pc0V4cGFuZGVkID8gWy4uLmdrLmV4cGFuZGVkSGVhZGVycywgZGF0YS5ncm91cEtleV0gOiBnay5leHBhbmRlZEhlYWRlcnMuZmlsdGVyKGcgPT4gZyAhPT0gZGF0YS5ncm91cEtleSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAoe1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgZ3JvdXBCeTogZ2JrXHJcbiAgICB9KX1cclxuICApO1xyXG5cclxuICBleHBhbmRBbGxPZkdyb3VwID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZGF0YTogeyBncm91cEhlYWRlcnNCeUtleTogRGljdGlvbmFyeTx7IGdyb3VwTmFtZTogc3RyaW5nIH1bXT4gfSkgPT4ge1xyXG4gICAgY29uc3QgbmV3R3JvdXBlZERhdGEgPSBzdGF0ZS5ncm91cEJ5Lm1hcChnYiA9PiAoe1xyXG4gICAgICBrZXk6IGdiLmtleSxcclxuICAgICAgZXhwYW5kZWRIZWFkZXJzOiBkYXRhLmdyb3VwSGVhZGVyc0J5S2V5W2diLmtleV0/Lm1hcChnID0+IGcuZ3JvdXBOYW1lKSA/PyBnYi5leHBhbmRlZEhlYWRlcnNcclxuICAgIH0gYXMgR3JvdXBlZERhdGEpKTtcclxuICAgIHJldHVybiAoeyAuLi5zdGF0ZSwgZ3JvdXBCeTogbmV3R3JvdXBlZERhdGEgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGNvbGxhcHNlQWxsID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gKHtcclxuICAgIC4uLnN0YXRlLFxyXG4gICAgZ3JvdXBCeTogc3RhdGUuZ3JvdXBCeS5tYXAoZ2IgPT4gKHsga2V5OiBnYi5rZXksIGV4cGFuZGVkSGVhZGVyczogW10gfSkpXHJcbiAgfSkpO1xyXG5cclxuICBjb2xsYXBzZUFsbE9mS2V5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZGF0YTogeyBrZXlzOiBzdHJpbmdbXSB9KSA9PiAoe1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICBncm91cEJ5OiBzdGF0ZS5ncm91cEJ5Lm1hcChnYiA9PiAoe1xyXG4gICAgICBrZXk6IGdiLmtleSxcclxuICAgICAgZXhwYW5kZWRIZWFkZXJzOiBkYXRhLmtleXMuaW5jbHVkZXMoZ2Iua2V5KSA/IFtdIDogZ2IuZXhwYW5kZWRIZWFkZXJzXHJcbiAgICB9KSlcclxuICB9KSk7XHJcblxyXG4gIGdyb3VwQnlLZXlzJCA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLmdyb3VwQnkubWFwKGdiayA9PiBnYmsua2V5KSlcclxuICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkPHN0cmluZ1tdPigocHJldiwgY3VycikgPT4gcHJldi5sZW5ndGggPT09IGN1cnIubGVuZ3RoICYmIGN1cnIuZXZlcnkoKGssaSkgPT4gcHJldltpXSA9PT0gaykpKTtcclxuXHJcbiAgZXhwYW5kZWRHcm91cHMkID0gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuZ3JvdXBCeSkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4ge1xyXG4gICAgY29uc3QgYWEgPSBhLmZsYXRNYXAoZyA9PiBnLmV4cGFuZGVkSGVhZGVycyk7XHJcbiAgICBjb25zdCBiYiA9IGIuZmxhdE1hcChnID0+IGcuZXhwYW5kZWRIZWFkZXJzKTtcclxuICAgIHJldHVybiBhYS5sZW5ndGggPT09IGJiLmxlbmd0aCAmJiBhYS5ldmVyeSgoaykgPT4gYmIuaW5jbHVkZXMoaykpO1xyXG4gIH0pKTtcclxuICBcclxuICBzZXRUYWJsZVNldHRpbmdzID0gdGhpcy51cGRhdGVyKChzdGF0ZSxzZXR0aW5nczpHZW5lcmFsVGFibGVTZXR0aW5ncyk9PntcclxuICAgIGNvbnN0IHM6VGFibGVTdGF0ZSA9IHtcclxuICAgICAgLi4uc3RhdGUsXHJcbiAgICAgIHBlcnNpc3RlZFRhYmxlU2V0dGluZ3MgOiBuZXcgUGVyc2lzdGVkVGFibGVTZXR0aW5ncyhzZXR0aW5ncyksXHJcbiAgICAgIG5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MgOiBuZXcgTm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncyhzZXR0aW5ncylcclxuICAgICAgfTtcclxuICAgIHJldHVybiBzO1xyXG4gIH0pO1xyXG5cclxuICB0YWJsZVNldHRpbmdzID0gdGhpcy5zZWxlY3RTaWduYWwoc3RhdGUgPT4ge1xyXG4gICAgY29uc3QgdHMgOiBQZXJzaXN0ZWRUYWJsZVNldHRpbmdzICYgTm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncyA9XHJcbiAgICAgIHsuLi5zdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzLCAuLi5zdGF0ZS5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzfTtcclxuICAgIHJldHVybiB0cztcclxuICB9KTtcclxuXHJcbiAgdGFibGVTZXR0aW5ncyQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiB7XHJcbiAgICBjb25zdCB0cyA6IFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MgJiBOb3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzID1cclxuICAgICAgey4uLnN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3MsLi4uc3RhdGUubm90UGVyc2lzdGVkVGFibGVTZXR0aW5nc307XHJcbiAgICByZXR1cm4gdHM7XHJcbiAgfSlcclxuXHJcbiAgcHJvcHMgPSB0aGlzLnNlbGVjdFNpZ25hbChzID0+IHMucHJvcHMpO1xyXG5cclxuICBzZXRMaW5rTWFwcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsbWFwczogYW55KT0+e1xyXG4gICAgcmV0dXJuIHsuLi5zdGF0ZSxsaW5rTWFwczptYXBzfTtcclxuICB9KTtcclxuXHJcbiAgZ2V0TGlua0luZm8gPSAobWQ6TWV0YURhdGEpID0+IHRoaXMuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLmxpbmtNYXBzW21kLmtleV0pO1xyXG5cclxuICBnZXRJc0V4cGFuZGVkID0gKGNvbHVtbktleTogc3RyaW5nLCBncm91cEhlYWRlcktleTogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Qoc3RhdGUgPT4gISFzdGF0ZS5ncm91cEJ5LmZpbHRlcihnID0+IGcua2V5ID09PSBjb2x1bW5LZXkgJiYgZy5leHBhbmRlZEhlYWRlcnMuaW5jbHVkZXMoZ3JvdXBIZWFkZXJLZXkpKS5sZW5ndGgpO1xyXG4gIH1cclxuICAkaXNWaXJ0dWFsID0gdGhpcy5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsID09PSB0cnVlIHx8IChzdGF0ZS5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnVzZVZpcnR1YWxTY3JvbGwgYXMgVmlydHVhbFNjcm9sbE9wdGlvbnMpPy52aXJ0dWFsQXNEZWZhdWx0IHx8IHN0YXRlLnNob3dBbGwpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgb3JkZXJlZFZpc2libGVDb2x1bW5zID0gKHN0YXRlOiBUYWJsZVN0YXRlKSA9PiBvcmRlcmVkVmlzaWJsZU1ldGFEYXRhKHN0YXRlKS5tYXAobWQgPT4gbWQua2V5KTtcclxuXHJcbmV4cG9ydCBjb25zdCBvcmRlcmVkVmlzaWJsZU1ldGFEYXRhID0gKHN0YXRlOiBUYWJsZVN0YXRlKSA9PiB7XHJcbiAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTWV0YURhdGEoc3RhdGUpO1xyXG4gIGNvbnN0IG9yZGVyZWRWaXNpYmxlID0gb3JkZXJlZFxyXG4gICAgLmZpbHRlcihtZXRhRGF0YSA9PiAhc3RhdGUuaGlkZGVuS2V5cy5pbmNsdWRlcyhtZXRhRGF0YS5rZXkpICYmIHN0YXRlLm1ldGFEYXRhW21ldGFEYXRhLmtleV0uZmllbGRUeXBlICE9PSBGaWVsZFR5cGUuSGlkZGVuKTtcclxuICByZXR1cm4gb3JkZXJlZFZpc2libGU7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBvcmRlcmVkQ29kZVZpc2libGVNZXRhRGF0YSA9IChzdGF0ZTogVGFibGVTdGF0ZSkgPT5cclxuICBvcmRlck1ldGFEYXRhKHN0YXRlKS5maWx0ZXIobWQgPT4gbWQuZmllbGRUeXBlICE9PSBGaWVsZFR5cGUuSGlkZGVuKTtcclxuXHJcbmV4cG9ydCBjb25zdCBvcmRlck1ldGFEYXRhID0gKHN0YXRlOlRhYmxlU3RhdGUpID0+IHtcclxuICBjb25zdCB1c2VyT3JkZXJBcnIgPSBPYmplY3QuZW50cmllcyhzdGF0ZS51c2VyRGVmaW5lZC5vcmRlcik7XHJcbiAgcmV0dXJuIHVzZXJPcmRlckFyci5sZW5ndGggP1xyXG4gICBPYmplY3QudmFsdWVzKHN0YXRlLm1ldGFEYXRhKS5zb3J0KChhLGIpPT4ge1xyXG4gICAgY29uc3Qgb3JkZXJBID0gc3RhdGUudXNlckRlZmluZWQub3JkZXJbYS5rZXldO1xyXG4gICAgY29uc3Qgb3JkZXJCID0gc3RhdGUudXNlckRlZmluZWQub3JkZXJbYi5rZXldO1xyXG4gICAgaWYob3JkZXJBID09IG51bGwgJiYgb3JkZXJCID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBpZihvcmRlckEgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGlmKG9yZGVyQiA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0ZS51c2VyRGVmaW5lZC5vcmRlclthLmtleV0gLSBzdGF0ZS51c2VyRGVmaW5lZC5vcmRlcltiLmtleV1cclxuICB9KVxyXG4gICA6XHJcbiAgIE9iamVjdC52YWx1ZXMoc3RhdGUubWV0YURhdGEpLnNvcnQoKGEsYik9PiBhLm9yZGVyISAtIGIub3JkZXIhKVxyXG59Il19