@firestitch/list 14.0.1 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +71 -71
  3. package/app/classes/data-controller.d.ts +88 -88
  4. package/app/classes/external-params-controller.d.ts +32 -32
  5. package/app/classes/index.d.ts +2 -2
  6. package/app/classes/list-controller.d.ts +188 -188
  7. package/app/classes/pagination-controller.d.ts +197 -197
  8. package/app/classes/persistance-controller.d.ts +10 -10
  9. package/app/classes/reorder-controller.d.ts +67 -67
  10. package/app/classes/selection-controller.d.ts +155 -155
  11. package/app/classes/sorting-controller.d.ts +70 -70
  12. package/app/components/body/body.component.d.ts +28 -28
  13. package/app/components/body/row/actions/actions.component.d.ts +36 -36
  14. package/app/components/body/row/cell/cell.component.d.ts +22 -22
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +13 -13
  16. package/app/components/body/row/menu-action/menu-action.component.d.ts +20 -20
  17. package/app/components/body/row/row.component.d.ts +85 -85
  18. package/app/components/customize-cols/customize-cols.component.d.ts +17 -17
  19. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -7
  20. package/app/components/footer/footer-row/footer-row.component.d.ts +14 -14
  21. package/app/components/footer/footer.component.d.ts +15 -15
  22. package/app/components/head/head-cell/head-cell.component.d.ts +14 -14
  23. package/app/components/head/head.component.d.ts +49 -49
  24. package/app/components/list/list.component.d.ts +127 -127
  25. package/app/components/loader/loader.component.d.ts +14 -14
  26. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +13 -13
  27. package/app/components/pagination/pagination.component.d.ts +14 -14
  28. package/app/components/saved-filters/saved-filters.component.d.ts +15 -15
  29. package/app/components/status/status.component.d.ts +20 -20
  30. package/app/directives/cell/cell.directive.d.ts +8 -8
  31. package/app/directives/column/column.directive.d.ts +37 -37
  32. package/app/directives/content/content.directive.d.ts +5 -5
  33. package/app/directives/content-init/content-init.directive.d.ts +9 -9
  34. package/app/directives/draggable-list/draggable-list.directive.d.ts +95 -95
  35. package/app/directives/draggable-row/draggable-row.directive.d.ts +23 -23
  36. package/app/directives/empty-state/empty-state.directive.d.ts +5 -5
  37. package/app/directives/footer/footer.directive.d.ts +8 -8
  38. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +10 -10
  39. package/app/directives/group-footer/group-footer.directive.d.ts +6 -6
  40. package/app/directives/group-header/group-header.directive.d.ts +6 -6
  41. package/app/directives/header/header.directive.d.ts +8 -8
  42. package/app/directives/heading/heading.directive.d.ts +5 -5
  43. package/app/directives/heading-container/heading-container.directive.d.ts +5 -5
  44. package/app/directives/index.d.ts +3 -3
  45. package/app/directives/subheading/subheading.directive.d.ts +5 -5
  46. package/app/enums/action-type.enum.d.ts +7 -7
  47. package/app/enums/page-change-type.enum.d.ts +4 -4
  48. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  49. package/app/enums/row-type.enum.d.ts +6 -6
  50. package/app/enums/state.enum.d.ts +9 -9
  51. package/app/fs-list.module.d.ts +60 -60
  52. package/app/fs-list.providers.d.ts +3 -3
  53. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  54. package/app/interfaces/column-config.interface.d.ts +2 -2
  55. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  56. package/app/interfaces/external-params.interface.d.ts +13 -13
  57. package/app/interfaces/index.d.ts +4 -4
  58. package/app/interfaces/listconfig.interface.d.ts +245 -245
  59. package/app/interfaces/pagination-state.interface.d.ts +9 -9
  60. package/app/interfaces/pagination.interface.d.ts +13 -13
  61. package/app/interfaces/sorting-change-event.interface.d.ts +4 -4
  62. package/app/models/column-async-attribute.d.ts +5 -5
  63. package/app/models/column-attributes.d.ts +39 -39
  64. package/app/models/column.model.d.ts +61 -61
  65. package/app/models/row/base-row.d.ts +13 -13
  66. package/app/models/row/child-row.d.ts +12 -12
  67. package/app/models/row/group-footer-row.d.ts +10 -10
  68. package/app/models/row/group-row.d.ts +16 -16
  69. package/app/models/row/simple-row.d.ts +5 -5
  70. package/app/models/row-action.model.d.ts +29 -29
  71. package/app/models/row.d.ts +34 -34
  72. package/app/models/styleConfig.model.d.ts +31 -31
  73. package/app/pipes/action-label.d.ts +8 -8
  74. package/app/pipes/index.d.ts +1 -1
  75. package/app/services/group-expand-notifier.service.d.ts +11 -11
  76. package/esm2020/app/classes/actions-controller.mjs +55 -55
  77. package/esm2020/app/classes/columns-controller.mjs +205 -205
  78. package/esm2020/app/classes/data-controller.mjs +344 -344
  79. package/esm2020/app/classes/external-params-controller.mjs +146 -146
  80. package/esm2020/app/classes/index.mjs +3 -3
  81. package/esm2020/app/classes/list-controller.mjs +673 -673
  82. package/esm2020/app/classes/pagination-controller.mjs +490 -490
  83. package/esm2020/app/classes/persistance-controller.mjs +19 -19
  84. package/esm2020/app/classes/reorder-controller.mjs +182 -182
  85. package/esm2020/app/classes/selection-controller.mjs +465 -465
  86. package/esm2020/app/classes/sorting-controller.mjs +201 -201
  87. package/esm2020/app/components/body/body.component.mjs +64 -64
  88. package/esm2020/app/components/body/row/actions/actions.component.mjs +97 -97
  89. package/esm2020/app/components/body/row/cell/cell.component.mjs +107 -107
  90. package/esm2020/app/components/body/row/inline-action/inline-action.component.mjs +33 -33
  91. package/esm2020/app/components/body/row/menu-action/menu-action.component.mjs +46 -46
  92. package/esm2020/app/components/body/row/row.component.mjs +322 -322
  93. package/esm2020/app/components/customize-cols/customize-cols.component.mjs +68 -68
  94. package/esm2020/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +16 -16
  95. package/esm2020/app/components/footer/footer-row/footer-row.component.mjs +28 -28
  96. package/esm2020/app/components/footer/footer.component.mjs +31 -31
  97. package/esm2020/app/components/head/head-cell/head-cell.component.mjs +29 -29
  98. package/esm2020/app/components/head/head.component.mjs +103 -103
  99. package/esm2020/app/components/list/list.component.mjs +385 -385
  100. package/esm2020/app/components/loader/loader.component.mjs +40 -40
  101. package/esm2020/app/components/manage-saved-filters/manage-saved-filters.component.mjs +76 -76
  102. package/esm2020/app/components/pagination/pagination.component.mjs +37 -37
  103. package/esm2020/app/components/saved-filters/saved-filters.component.mjs +29 -29
  104. package/esm2020/app/components/status/status.component.mjs +64 -64
  105. package/esm2020/app/directives/cell/cell.directive.mjs +18 -18
  106. package/esm2020/app/directives/column/column.directive.mjs +121 -121
  107. package/esm2020/app/directives/content/content.directive.mjs +13 -13
  108. package/esm2020/app/directives/content-init/content-init.directive.mjs +22 -22
  109. package/esm2020/app/directives/draggable-list/draggable-list.directive.mjs +330 -330
  110. package/esm2020/app/directives/draggable-row/draggable-row.directive.mjs +78 -78
  111. package/esm2020/app/directives/empty-state/empty-state.directive.mjs +13 -13
  112. package/esm2020/app/directives/footer/footer.directive.mjs +18 -18
  113. package/esm2020/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs +26 -26
  114. package/esm2020/app/directives/group-footer/group-footer.directive.mjs +14 -14
  115. package/esm2020/app/directives/group-header/group-header.directive.mjs +14 -14
  116. package/esm2020/app/directives/header/header.directive.mjs +18 -18
  117. package/esm2020/app/directives/heading/heading.directive.mjs +13 -13
  118. package/esm2020/app/directives/heading-container/heading-container.directive.mjs +13 -13
  119. package/esm2020/app/directives/index.mjs +4 -4
  120. package/esm2020/app/directives/subheading/subheading.directive.mjs +13 -13
  121. package/esm2020/app/enums/action-type.enum.mjs +8 -8
  122. package/esm2020/app/enums/page-change-type.enum.mjs +6 -6
  123. package/esm2020/app/enums/pagination-strategy.enum.mjs +7 -7
  124. package/esm2020/app/enums/row-type.enum.mjs +7 -7
  125. package/esm2020/app/enums/state.enum.mjs +11 -11
  126. package/esm2020/app/fs-list.module.mjs +244 -244
  127. package/esm2020/app/fs-list.providers.mjs +4 -4
  128. package/esm2020/app/interfaces/cellconfig.interface.mjs +2 -2
  129. package/esm2020/app/interfaces/column-config.interface.mjs +1 -1
  130. package/esm2020/app/interfaces/draggable-list.interface.mjs +2 -2
  131. package/esm2020/app/interfaces/external-params.interface.mjs +2 -2
  132. package/esm2020/app/interfaces/index.mjs +5 -5
  133. package/esm2020/app/interfaces/listconfig.interface.mjs +1 -1
  134. package/esm2020/app/interfaces/pagination-state.interface.mjs +1 -1
  135. package/esm2020/app/interfaces/pagination.interface.mjs +2 -2
  136. package/esm2020/app/interfaces/sorting-change-event.interface.mjs +2 -2
  137. package/esm2020/app/models/column-async-attribute.mjs +13 -13
  138. package/esm2020/app/models/column-attributes.mjs +131 -131
  139. package/esm2020/app/models/column.model.mjs +163 -163
  140. package/esm2020/app/models/row/base-row.mjs +23 -23
  141. package/esm2020/app/models/row/child-row.mjs +28 -28
  142. package/esm2020/app/models/row/group-footer-row.mjs +20 -20
  143. package/esm2020/app/models/row/group-row.mjs +44 -44
  144. package/esm2020/app/models/row/simple-row.mjs +10 -10
  145. package/esm2020/app/models/row-action.model.mjs +89 -89
  146. package/esm2020/app/models/row.mjs +88 -88
  147. package/esm2020/app/models/styleConfig.model.mjs +75 -75
  148. package/esm2020/app/pipes/action-label.mjs +17 -17
  149. package/esm2020/app/pipes/index.mjs +1 -1
  150. package/esm2020/app/services/group-expand-notifier.service.mjs +26 -26
  151. package/esm2020/firestitch-list.mjs +4 -4
  152. package/esm2020/public_api.mjs +45 -45
  153. package/fesm2015/firestitch-list.mjs +5627 -5626
  154. package/fesm2015/firestitch-list.mjs.map +1 -1
  155. package/fesm2020/firestitch-list.mjs +5620 -5619
  156. package/fesm2020/firestitch-list.mjs.map +1 -1
  157. package/index.d.ts +5 -5
  158. package/package.json +1 -1
  159. package/public_api.d.ts +41 -41
@@ -1,491 +1,491 @@
1
- import { BehaviorSubject, Subject } from 'rxjs';
2
- import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
3
- import { PageChangeType } from '../enums/page-change-type.enum';
4
- import { PaginationStrategy } from '../enums/pagination-strategy.enum';
5
- export class PaginationController {
6
- constructor() {
7
- this.limit = 25;
8
- this.manual = false;
9
- this.page = 1; // Active page
10
- this.offset = 0;
11
- this.displayed = 0;
12
- this._pages$ = new BehaviorSubject(0); // Total pages
13
- this._strategy = PaginationStrategy.None;
14
- this._removedRows = 0;
15
- this._pageChanged$ = new Subject();
16
- this._pageReset$ = new Subject();
17
- this._onDestroy$ = new Subject();
18
- this._limits = [10, 25, 50, 100, 200];
19
- }
20
- // Total pages
21
- set pages(value) {
22
- this._pages$.next(value);
23
- }
24
- get pages() {
25
- return this._pages$.getValue();
26
- }
27
- get pages$() {
28
- return this._pages$
29
- .pipe(distinctUntilChanged());
30
- }
31
- /**
32
- * Fire if page was changed
33
- */
34
- get pageChanged$() {
35
- return this._pageChanged$.pipe(takeUntil(this._onDestroy$));
36
- }
37
- get pageReset$() {
38
- return this._pageReset$.asObservable();
39
- }
40
- /**
41
- * Get enabled
42
- */
43
- get enabled() {
44
- return !this.hasNoneStrategy;
45
- }
46
- /**
47
- * Get Limits
48
- */
49
- get limits() {
50
- return this._limits;
51
- }
52
- /**
53
- * Set limits, update pages array and set new limit per page
54
- *
55
- * @param value
56
- */
57
- set limits(value) {
58
- this._limits = value;
59
- if (this.limits.length > 0 && this.limits.indexOf(this.limit) === -1) {
60
- this.limit = this.limits[0];
61
- }
62
- else if (this.limits.length === 0) {
63
- this.limit = this.records;
64
- }
65
- }
66
- /**
67
- * Get query for request
68
- */
69
- get query() {
70
- switch (this.strategy) {
71
- case PaginationStrategy.Page:
72
- return this.queryPageStrategy;
73
- case PaginationStrategy.Offset:
74
- return this.queryOffsetStrategy;
75
- }
76
- return {};
77
- }
78
- get loadMoreQuery() {
79
- switch (this.strategy) {
80
- case PaginationStrategy.Page: {
81
- return this.query;
82
- }
83
- case PaginationStrategy.Offset: {
84
- const query = this.queryOffsetStrategy;
85
- query.limit = query.offset + query.limit;
86
- query.offset = 0;
87
- return query;
88
- }
89
- }
90
- return {};
91
- }
92
- /**
93
- * Query for Page Strategy
94
- */
95
- get queryPageStrategy() {
96
- return this.hasNoneStrategy
97
- ? {}
98
- : {
99
- page: this.page || 1,
100
- limit: this.limit || 10,
101
- };
102
- }
103
- /**
104
- * Query for Offset Strategy
105
- */
106
- get queryOffsetStrategy() {
107
- const page = this.page - 1 || 0;
108
- const limit = this.limit || 5;
109
- return {
110
- offset: page * limit,
111
- limit,
112
- };
113
- }
114
- /**
115
- * Get query for load only count of deleted rows
116
- */
117
- get loadDeletedOffsetQuery() {
118
- const paginationOffset = this.limit * this.page;
119
- const actualOffset = Math.min(this.records, paginationOffset);
120
- const offset = Math.max(0, actualOffset - this._removedRows);
121
- return {
122
- offset,
123
- limit: this._removedRows,
124
- };
125
- }
126
- get initialized() {
127
- return !!this.pages;
128
- }
129
- get strategy() {
130
- return this._strategy;
131
- }
132
- set strategy(strategy) {
133
- this._strategy = (strategy === undefined) ? PaginationStrategy.Page : strategy;
134
- }
135
- /**
136
- * Check if pagination in Page Strategy Mode
137
- */
138
- get hasPageStrategy() {
139
- return this.strategy === PaginationStrategy.Page;
140
- }
141
- /**
142
- * Check if pagination in Offset Strategy Mode
143
- */
144
- get hasOffsetStrategy() {
145
- return this.strategy === PaginationStrategy.Offset;
146
- }
147
- /**
148
- * Check if pagination in None Strategy Mode
149
- */
150
- get hasNoneStrategy() {
151
- return this.strategy === PaginationStrategy.None;
152
- }
153
- /**
154
- * If prev page can be activated
155
- *
156
- */
157
- get hasPrevPage() {
158
- switch (this.strategy) {
159
- case PaginationStrategy.Page:
160
- return this._hasPrevPagePageStrategy;
161
- case PaginationStrategy.Offset:
162
- return this._hasPrevPageOffsetStrategy;
163
- }
164
- return false;
165
- }
166
- /**
167
- * If next page can be activated
168
- */
169
- get hasNextPage() {
170
- switch (this.strategy) {
171
- case PaginationStrategy.Page:
172
- return this._hasNextPagePageStrategy;
173
- case PaginationStrategy.Offset:
174
- return this._hasNextPageOffsetStrategy;
175
- }
176
- return false;
177
- }
178
- get loadMoreEnabled() {
179
- return this._loadMoreConfig.enabled;
180
- }
181
- get loadMoreLabel() {
182
- return this._loadMoreConfig.label;
183
- }
184
- get loadMoreButtonColor() {
185
- return this._loadMoreConfig.buttonColor;
186
- }
187
- get loadMoreButtonClass() {
188
- if (this._loadMoreConfig.buttonType === 'basic') {
189
- return '';
190
- }
191
- return `mat-${this._loadMoreConfig.buttonType}-button`;
192
- }
193
- get loadMoreButtonType() {
194
- return this._loadMoreConfig.buttonType;
195
- }
196
- /**
197
- * SP-T1974
198
- * Showing 26-50 of 333 results sorted by Name, Ascending
199
- * Showing 0 results sorted by Name, Ascending
200
- */
201
- get statusLabel() {
202
- const current = (this.page - 1) * this.limit;
203
- const from = current + 1;
204
- const to = Math.min(this.records, current + this.limit);
205
- return `${from}-${to}`;
206
- }
207
- get state() {
208
- return {
209
- enabled: this.enabled,
210
- strategy: this.strategy,
211
- page: this.page,
212
- offset: this.offset,
213
- limit: this.limit,
214
- records: this.records,
215
- displayed: this.displayed,
216
- };
217
- }
218
- initWithConfig(config, loadMore) {
219
- if (config) {
220
- if (config.limits) {
221
- this.limits = config.limits;
222
- }
223
- if (config.limit) {
224
- this.limit = config.limit;
225
- }
226
- this.strategy = config.strategy;
227
- }
228
- this.setLoadMore(loadMore);
229
- }
230
- /**
231
- * If pagination has prev page when Page Strategy
232
- */
233
- get _hasPrevPagePageStrategy() {
234
- return this.page > 1 && this.pages > 1;
235
- }
236
- /**
237
- * If pagination has prev page when Offset Strategy
238
- */
239
- get _hasPrevPageOffsetStrategy() {
240
- return this.offset >= this.limit && this.records > 1;
241
- }
242
- /**
243
- * If pagination has next page when Page Strategy
244
- */
245
- get _hasNextPagePageStrategy() {
246
- return this.page < this.pages && this.pages > 1;
247
- }
248
- /**
249
- * If pagination has next page when Offset Strategy
250
- */
251
- get _hasNextPageOffsetStrategy() {
252
- return (this.offset + this.limit) < this.records && this.records > 1;
253
- }
254
- /**
255
- * Update paging config and all related fields
256
- *
257
- * @param config
258
- * @param displayedRecords
259
- * @param loadMoreOperation
260
- */
261
- updatePaging(config, displayedRecords = 0, loadMoreOperation = false) {
262
- if (!loadMoreOperation) {
263
- this._fromParams(config);
264
- this.displayed = displayedRecords;
265
- }
266
- else {
267
- this.records = config.records;
268
- if (this.records < this.displayed) {
269
- this.displayed = this.records;
270
- }
271
- this._removedRows = 0;
272
- }
273
- this._updateTotalPages();
274
- }
275
- // /**
276
- // * Update paging when data source not remove
277
- // * @param {any[]} rows
278
- // */
279
- /*public updatePagingManual(rows: any[]) {
280
- if (Array.isArray(rows) && rows.length > 0) {
281
- this.records = rows.length;
282
- this.pages = Math.ceil(rows.length / this.limit);
283
- }
284
-
285
- this.updatePagesArray();
286
- this.updateDisplayed();
287
- }*/
288
- /**
289
- * Update pages array with new pages count
290
- */
291
- // public updatePagesArray() {
292
- // const MIDDLE = 2;
293
- // const pagesArr = [];
294
- // let from = 0;
295
- // let to = 0;
296
- // if (this.page < MIDDLE) {
297
- // from = MIDDLE - 1;
298
- // to = MIDDLE + 1;
299
- // } else if (this.page >= MIDDLE && this.page <= this.pages - MIDDLE + 1) {
300
- // from = this.page - 1;
301
- // to = this.page + 1;
302
- // } else if (this.page > this.pages - MIDDLE + 1) {
303
- // from = this.pages - MIDDLE - 1;
304
- // to = this.pages;
305
- // }
306
- // if (!this.pages || this.pages < 5) {
307
- // from = 1;
308
- // to = this.pages || 0;
309
- // }
310
- // for (let i = from; i <= to; i++) {
311
- // pagesArr.push(i);
312
- // }
313
- // this.pagesArray = Object.assign([], pagesArr);
314
- // }
315
- setLoadMore(config) {
316
- const loadMoreConfig = typeof config === 'boolean' ?
317
- {
318
- enabled: !!config,
319
- } :
320
- (config === undefined ? {} : {
321
- ...config,
322
- enabled: true,
323
- });
324
- this._loadMoreConfig = {
325
- enabled: false,
326
- label: 'Load More',
327
- buttonType: 'basic',
328
- ...loadMoreConfig,
329
- };
330
- }
331
- /**
332
- * Update dispayed records counter
333
- */
334
- // public updateDisplayed() {
335
- // this.displayed = this.getVisibleRecords();
336
- // }
337
- /**
338
- * Return count of records that could be shown on page
339
- */
340
- // public getVisibleRecords() {
341
- // const diff = this.hasOffsetStrategy
342
- // ? this.records - this.offset
343
- // : this.limit;
344
- //
345
- // return diff < this.limit
346
- // ? diff
347
- // : this.displayed;
348
- // }
349
- getVisibleRecords() {
350
- return this.displayed;
351
- }
352
- /**
353
- * Set new limit
354
- *
355
- * @param limit
356
- */
357
- setLimit(limit) {
358
- this.limit = limit;
359
- this.resetPaging();
360
- this._pageChanged$.next({
361
- type: PageChangeType.LimitChanged,
362
- payload: limit,
363
- });
364
- }
365
- /**
366
- * If page is activate page
367
- *
368
- * @param page
369
- */
370
- isActive(page) {
371
- return page === this.page;
372
- }
373
- /**
374
- * Go to page
375
- *
376
- * @param page
377
- */
378
- goToPage(page) {
379
- if (page >= 1 && this.page !== page) {
380
- this.page = page;
381
- this._updateOffset();
382
- this._pageChanged$.next({
383
- type: PageChangeType.Default,
384
- payload: page,
385
- });
386
- }
387
- }
388
- /**
389
- * Reset paging like it was just initialized
390
- */
391
- resetPaging() {
392
- this.page = 1;
393
- this.offset = 0;
394
- }
395
- /**
396
- * Go to next page
397
- */
398
- goNext() {
399
- if (this.hasNextPage) {
400
- this.page++;
401
- this._updateOffset();
402
- this._pageChanged$.next({
403
- type: PageChangeType.Default,
404
- payload: this.page,
405
- });
406
- }
407
- }
408
- /**
409
- * Go to first page
410
- */
411
- goFirst() {
412
- if (this.page > 1) {
413
- this.page = 1;
414
- this._updateOffset();
415
- this._pageChanged$.next({
416
- type: PageChangeType.Default,
417
- payload: this.page,
418
- });
419
- }
420
- }
421
- /**
422
- * Go to prev page
423
- */
424
- goPrev() {
425
- if (this.page > 1) {
426
- this.page--;
427
- this._updateOffset();
428
- this._pageChanged$.next({
429
- type: PageChangeType.Default,
430
- payload: this.page,
431
- });
432
- }
433
- }
434
- /**
435
- * Go to last page
436
- */
437
- goLast() {
438
- if (this.page !== this.pages) {
439
- this.page = this.pages;
440
- this._updateOffset();
441
- this._pageChanged$.next({
442
- type: PageChangeType.Default,
443
- payload: this.page,
444
- });
445
- }
446
- }
447
- /**
448
- * Update count of deleted rows. This count will be applied for offset calc
449
- *
450
- * @param count
451
- */
452
- removeRows(count) {
453
- this._removedRows += count;
454
- }
455
- updatePagination() {
456
- this._updateTotalPages();
457
- }
458
- /**
459
- * Destroy
460
- */
461
- destroy() {
462
- this._onDestroy$.next();
463
- this._onDestroy$.complete();
464
- }
465
- /**
466
- * Update paging state
467
- *
468
- * @param params
469
- */
470
- _fromParams(params) {
471
- if (!this.loadMoreEnabled) {
472
- this.limit = params.limit ?? 25;
473
- }
474
- this.records = params.records;
475
- this.manual = params.manual;
476
- this.pages = params.pages || 0;
477
- }
478
- /**
479
- * Calc and update offset
480
- */
481
- _updateOffset() {
482
- this.offset = this.limit * (this.page - 1);
483
- }
484
- /**
485
- * Calc and update total count of pages
486
- */
487
- _updateTotalPages() {
488
- this.pages = Math.ceil(this.records / this.limit);
489
- }
490
- }
1
+ import { BehaviorSubject, Subject } from 'rxjs';
2
+ import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
3
+ import { PageChangeType } from '../enums/page-change-type.enum';
4
+ import { PaginationStrategy } from '../enums/pagination-strategy.enum';
5
+ export class PaginationController {
6
+ constructor() {
7
+ this.limit = 25;
8
+ this.manual = false;
9
+ this.page = 1; // Active page
10
+ this.offset = 0;
11
+ this.displayed = 0;
12
+ this._pages$ = new BehaviorSubject(0); // Total pages
13
+ this._strategy = PaginationStrategy.None;
14
+ this._removedRows = 0;
15
+ this._pageChanged$ = new Subject();
16
+ this._pageReset$ = new Subject();
17
+ this._onDestroy$ = new Subject();
18
+ this._limits = [10, 25, 50, 100, 200];
19
+ }
20
+ // Total pages
21
+ set pages(value) {
22
+ this._pages$.next(value);
23
+ }
24
+ get pages() {
25
+ return this._pages$.getValue();
26
+ }
27
+ get pages$() {
28
+ return this._pages$
29
+ .pipe(distinctUntilChanged());
30
+ }
31
+ /**
32
+ * Fire if page was changed
33
+ */
34
+ get pageChanged$() {
35
+ return this._pageChanged$.pipe(takeUntil(this._onDestroy$));
36
+ }
37
+ get pageReset$() {
38
+ return this._pageReset$.asObservable();
39
+ }
40
+ /**
41
+ * Get enabled
42
+ */
43
+ get enabled() {
44
+ return !this.hasNoneStrategy;
45
+ }
46
+ /**
47
+ * Get Limits
48
+ */
49
+ get limits() {
50
+ return this._limits;
51
+ }
52
+ /**
53
+ * Set limits, update pages array and set new limit per page
54
+ *
55
+ * @param value
56
+ */
57
+ set limits(value) {
58
+ this._limits = value;
59
+ if (this.limits.length > 0 && this.limits.indexOf(this.limit) === -1) {
60
+ this.limit = this.limits[0];
61
+ }
62
+ else if (this.limits.length === 0) {
63
+ this.limit = this.records;
64
+ }
65
+ }
66
+ /**
67
+ * Get query for request
68
+ */
69
+ get query() {
70
+ switch (this.strategy) {
71
+ case PaginationStrategy.Page:
72
+ return this.queryPageStrategy;
73
+ case PaginationStrategy.Offset:
74
+ return this.queryOffsetStrategy;
75
+ }
76
+ return {};
77
+ }
78
+ get loadMoreQuery() {
79
+ switch (this.strategy) {
80
+ case PaginationStrategy.Page: {
81
+ return this.query;
82
+ }
83
+ case PaginationStrategy.Offset: {
84
+ const query = this.queryOffsetStrategy;
85
+ query.limit = query.offset + query.limit;
86
+ query.offset = 0;
87
+ return query;
88
+ }
89
+ }
90
+ return {};
91
+ }
92
+ /**
93
+ * Query for Page Strategy
94
+ */
95
+ get queryPageStrategy() {
96
+ return this.hasNoneStrategy
97
+ ? {}
98
+ : {
99
+ page: this.page || 1,
100
+ limit: this.limit || 10,
101
+ };
102
+ }
103
+ /**
104
+ * Query for Offset Strategy
105
+ */
106
+ get queryOffsetStrategy() {
107
+ const page = this.page - 1 || 0;
108
+ const limit = this.limit || 5;
109
+ return {
110
+ offset: page * limit,
111
+ limit,
112
+ };
113
+ }
114
+ /**
115
+ * Get query for load only count of deleted rows
116
+ */
117
+ get loadDeletedOffsetQuery() {
118
+ const paginationOffset = this.limit * this.page;
119
+ const actualOffset = Math.min(this.records, paginationOffset);
120
+ const offset = Math.max(0, actualOffset - this._removedRows);
121
+ return {
122
+ offset,
123
+ limit: this._removedRows,
124
+ };
125
+ }
126
+ get initialized() {
127
+ return !!this.pages;
128
+ }
129
+ get strategy() {
130
+ return this._strategy;
131
+ }
132
+ set strategy(strategy) {
133
+ this._strategy = (strategy === undefined) ? PaginationStrategy.Page : strategy;
134
+ }
135
+ /**
136
+ * Check if pagination in Page Strategy Mode
137
+ */
138
+ get hasPageStrategy() {
139
+ return this.strategy === PaginationStrategy.Page;
140
+ }
141
+ /**
142
+ * Check if pagination in Offset Strategy Mode
143
+ */
144
+ get hasOffsetStrategy() {
145
+ return this.strategy === PaginationStrategy.Offset;
146
+ }
147
+ /**
148
+ * Check if pagination in None Strategy Mode
149
+ */
150
+ get hasNoneStrategy() {
151
+ return this.strategy === PaginationStrategy.None;
152
+ }
153
+ /**
154
+ * If prev page can be activated
155
+ *
156
+ */
157
+ get hasPrevPage() {
158
+ switch (this.strategy) {
159
+ case PaginationStrategy.Page:
160
+ return this._hasPrevPagePageStrategy;
161
+ case PaginationStrategy.Offset:
162
+ return this._hasPrevPageOffsetStrategy;
163
+ }
164
+ return false;
165
+ }
166
+ /**
167
+ * If next page can be activated
168
+ */
169
+ get hasNextPage() {
170
+ switch (this.strategy) {
171
+ case PaginationStrategy.Page:
172
+ return this._hasNextPagePageStrategy;
173
+ case PaginationStrategy.Offset:
174
+ return this._hasNextPageOffsetStrategy;
175
+ }
176
+ return false;
177
+ }
178
+ get loadMoreEnabled() {
179
+ return this._loadMoreConfig.enabled;
180
+ }
181
+ get loadMoreLabel() {
182
+ return this._loadMoreConfig.label;
183
+ }
184
+ get loadMoreButtonColor() {
185
+ return this._loadMoreConfig.buttonColor;
186
+ }
187
+ get loadMoreButtonClass() {
188
+ if (this._loadMoreConfig.buttonType === 'basic') {
189
+ return '';
190
+ }
191
+ return `mat-${this._loadMoreConfig.buttonType}-button`;
192
+ }
193
+ get loadMoreButtonType() {
194
+ return this._loadMoreConfig.buttonType;
195
+ }
196
+ /**
197
+ * SP-T1974
198
+ * Showing 26-50 of 333 results sorted by Name, Ascending
199
+ * Showing 0 results sorted by Name, Ascending
200
+ */
201
+ get statusLabel() {
202
+ const current = (this.page - 1) * this.limit;
203
+ const from = current + 1;
204
+ const to = Math.min(this.records, current + this.limit);
205
+ return `${from}-${to}`;
206
+ }
207
+ get state() {
208
+ return {
209
+ enabled: this.enabled,
210
+ strategy: this.strategy,
211
+ page: this.page,
212
+ offset: this.offset,
213
+ limit: this.limit,
214
+ records: this.records,
215
+ displayed: this.displayed,
216
+ };
217
+ }
218
+ initWithConfig(config, loadMore) {
219
+ if (config) {
220
+ if (config.limits) {
221
+ this.limits = config.limits;
222
+ }
223
+ if (config.limit) {
224
+ this.limit = config.limit;
225
+ }
226
+ this.strategy = config.strategy;
227
+ }
228
+ this.setLoadMore(loadMore);
229
+ }
230
+ /**
231
+ * If pagination has prev page when Page Strategy
232
+ */
233
+ get _hasPrevPagePageStrategy() {
234
+ return this.page > 1 && this.pages > 1;
235
+ }
236
+ /**
237
+ * If pagination has prev page when Offset Strategy
238
+ */
239
+ get _hasPrevPageOffsetStrategy() {
240
+ return this.offset >= this.limit && this.records > 1;
241
+ }
242
+ /**
243
+ * If pagination has next page when Page Strategy
244
+ */
245
+ get _hasNextPagePageStrategy() {
246
+ return this.page < this.pages && this.pages > 1;
247
+ }
248
+ /**
249
+ * If pagination has next page when Offset Strategy
250
+ */
251
+ get _hasNextPageOffsetStrategy() {
252
+ return (this.offset + this.limit) < this.records && this.records > 1;
253
+ }
254
+ /**
255
+ * Update paging config and all related fields
256
+ *
257
+ * @param config
258
+ * @param displayedRecords
259
+ * @param loadMoreOperation
260
+ */
261
+ updatePaging(config, displayedRecords = 0, loadMoreOperation = false) {
262
+ if (!loadMoreOperation) {
263
+ this._fromParams(config);
264
+ this.displayed = displayedRecords;
265
+ }
266
+ else {
267
+ this.records = config.records;
268
+ if (this.records < this.displayed) {
269
+ this.displayed = this.records;
270
+ }
271
+ this._removedRows = 0;
272
+ }
273
+ this._updateTotalPages();
274
+ }
275
+ // /**
276
+ // * Update paging when data source not remove
277
+ // * @param {any[]} rows
278
+ // */
279
+ /*public updatePagingManual(rows: any[]) {
280
+ if (Array.isArray(rows) && rows.length > 0) {
281
+ this.records = rows.length;
282
+ this.pages = Math.ceil(rows.length / this.limit);
283
+ }
284
+
285
+ this.updatePagesArray();
286
+ this.updateDisplayed();
287
+ }*/
288
+ /**
289
+ * Update pages array with new pages count
290
+ */
291
+ // public updatePagesArray() {
292
+ // const MIDDLE = 2;
293
+ // const pagesArr = [];
294
+ // let from = 0;
295
+ // let to = 0;
296
+ // if (this.page < MIDDLE) {
297
+ // from = MIDDLE - 1;
298
+ // to = MIDDLE + 1;
299
+ // } else if (this.page >= MIDDLE && this.page <= this.pages - MIDDLE + 1) {
300
+ // from = this.page - 1;
301
+ // to = this.page + 1;
302
+ // } else if (this.page > this.pages - MIDDLE + 1) {
303
+ // from = this.pages - MIDDLE - 1;
304
+ // to = this.pages;
305
+ // }
306
+ // if (!this.pages || this.pages < 5) {
307
+ // from = 1;
308
+ // to = this.pages || 0;
309
+ // }
310
+ // for (let i = from; i <= to; i++) {
311
+ // pagesArr.push(i);
312
+ // }
313
+ // this.pagesArray = Object.assign([], pagesArr);
314
+ // }
315
+ setLoadMore(config) {
316
+ const loadMoreConfig = typeof config === 'boolean' ?
317
+ {
318
+ enabled: !!config,
319
+ } :
320
+ (config === undefined ? {} : {
321
+ ...config,
322
+ enabled: true,
323
+ });
324
+ this._loadMoreConfig = {
325
+ enabled: false,
326
+ label: 'Load More',
327
+ buttonType: 'basic',
328
+ ...loadMoreConfig,
329
+ };
330
+ }
331
+ /**
332
+ * Update dispayed records counter
333
+ */
334
+ // public updateDisplayed() {
335
+ // this.displayed = this.getVisibleRecords();
336
+ // }
337
+ /**
338
+ * Return count of records that could be shown on page
339
+ */
340
+ // public getVisibleRecords() {
341
+ // const diff = this.hasOffsetStrategy
342
+ // ? this.records - this.offset
343
+ // : this.limit;
344
+ //
345
+ // return diff < this.limit
346
+ // ? diff
347
+ // : this.displayed;
348
+ // }
349
+ getVisibleRecords() {
350
+ return this.displayed;
351
+ }
352
+ /**
353
+ * Set new limit
354
+ *
355
+ * @param limit
356
+ */
357
+ setLimit(limit) {
358
+ this.limit = limit;
359
+ this.resetPaging();
360
+ this._pageChanged$.next({
361
+ type: PageChangeType.LimitChanged,
362
+ payload: limit,
363
+ });
364
+ }
365
+ /**
366
+ * If page is activate page
367
+ *
368
+ * @param page
369
+ */
370
+ isActive(page) {
371
+ return page === this.page;
372
+ }
373
+ /**
374
+ * Go to page
375
+ *
376
+ * @param page
377
+ */
378
+ goToPage(page) {
379
+ if (page >= 1 && this.page !== page) {
380
+ this.page = page;
381
+ this._updateOffset();
382
+ this._pageChanged$.next({
383
+ type: PageChangeType.Default,
384
+ payload: page,
385
+ });
386
+ }
387
+ }
388
+ /**
389
+ * Reset paging like it was just initialized
390
+ */
391
+ resetPaging() {
392
+ this.page = 1;
393
+ this.offset = 0;
394
+ }
395
+ /**
396
+ * Go to next page
397
+ */
398
+ goNext() {
399
+ if (this.hasNextPage) {
400
+ this.page++;
401
+ this._updateOffset();
402
+ this._pageChanged$.next({
403
+ type: PageChangeType.Default,
404
+ payload: this.page,
405
+ });
406
+ }
407
+ }
408
+ /**
409
+ * Go to first page
410
+ */
411
+ goFirst() {
412
+ if (this.page > 1) {
413
+ this.page = 1;
414
+ this._updateOffset();
415
+ this._pageChanged$.next({
416
+ type: PageChangeType.Default,
417
+ payload: this.page,
418
+ });
419
+ }
420
+ }
421
+ /**
422
+ * Go to prev page
423
+ */
424
+ goPrev() {
425
+ if (this.page > 1) {
426
+ this.page--;
427
+ this._updateOffset();
428
+ this._pageChanged$.next({
429
+ type: PageChangeType.Default,
430
+ payload: this.page,
431
+ });
432
+ }
433
+ }
434
+ /**
435
+ * Go to last page
436
+ */
437
+ goLast() {
438
+ if (this.page !== this.pages) {
439
+ this.page = this.pages;
440
+ this._updateOffset();
441
+ this._pageChanged$.next({
442
+ type: PageChangeType.Default,
443
+ payload: this.page,
444
+ });
445
+ }
446
+ }
447
+ /**
448
+ * Update count of deleted rows. This count will be applied for offset calc
449
+ *
450
+ * @param count
451
+ */
452
+ removeRows(count) {
453
+ this._removedRows += count;
454
+ }
455
+ updatePagination() {
456
+ this._updateTotalPages();
457
+ }
458
+ /**
459
+ * Destroy
460
+ */
461
+ destroy() {
462
+ this._onDestroy$.next();
463
+ this._onDestroy$.complete();
464
+ }
465
+ /**
466
+ * Update paging state
467
+ *
468
+ * @param params
469
+ */
470
+ _fromParams(params) {
471
+ if (!this.loadMoreEnabled) {
472
+ this.limit = params.limit ?? 25;
473
+ }
474
+ this.records = params.records;
475
+ this.manual = params.manual;
476
+ this.pages = params.pages || 0;
477
+ }
478
+ /**
479
+ * Calc and update offset
480
+ */
481
+ _updateOffset() {
482
+ this.offset = this.limit * (this.page - 1);
483
+ }
484
+ /**
485
+ * Calc and update total count of pages
486
+ */
487
+ _updateTotalPages() {
488
+ this.pages = Math.ceil(this.records / this.limit);
489
+ }
490
+ }
491
491
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9jbGFzc2VzL3BhZ2luYXRpb24tY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBVXZFLE1BQU0sT0FBTyxvQkFBb0I7SUFBakM7UUFFUyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLFNBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBQ3hCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWCxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWIsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYztRQUV4RCxjQUFTLEdBQXVCLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUN4RCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVqQixrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7UUFDMUMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUc1QixZQUFPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUF1akIzQyxDQUFDO0lBcmpCQyxjQUFjO0lBQ2QsSUFBVyxLQUFLLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUks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QUVEOzs7O09BSUc7SUFDSSxVQUFVLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxXQUFXLENBQUMsTUFBTTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbmltcG9ydCB7IFBhZ2VDaGFuZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvcGFnZS1jaGFuZ2UtdHlwZS5lbnVtJztcbmltcG9ydCB7IFBhZ2luYXRpb25TdHJhdGVneSB9IGZyb20gJy4uL2VudW1zL3BhZ2luYXRpb24tc3RyYXRlZ3kuZW51bSc7XG5pbXBvcnQge1xuICBGc0xpc3RMb2FkTW9yZUNvbmZpZyxcbiAgRnNQYWdpbmcsXG4gIFBhZ2VDaGFuZ2UsXG4gIFF1ZXJ5T2Zmc2V0U3RyYXRlZ3ksXG4gIFF1ZXJ5UGFnZVN0cmF0ZWd5LFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IElQYWdpbmF0aW9uU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BhZ2luYXRpb24tc3RhdGUuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25Db250cm9sbGVyIHtcblxuICBwdWJsaWMgbGltaXQgPSAyNTtcbiAgcHVibGljIHJlY29yZHM6IG51bWJlcjtcbiAgcHVibGljIG1hbnVhbCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBwYWdlID0gMTsgLy8gQWN0aXZlIHBhZ2VcbiAgcHVibGljIG9mZnNldCA9IDA7XG5cbiAgcHVibGljIGRpc3BsYXllZCA9IDA7XG5cbiAgcHJpdmF0ZSBfcGFnZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApOyAvLyBUb3RhbCBwYWdlc1xuXG4gIHByaXZhdGUgX3N0cmF0ZWd5OiBQYWdpbmF0aW9uU3RyYXRlZ3kgPSBQYWdpbmF0aW9uU3RyYXRlZ3kuTm9uZTtcbiAgcHJpdmF0ZSBfcmVtb3ZlZFJvd3MgPSAwO1xuXG4gIHByaXZhdGUgX3BhZ2VDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PFBhZ2VDaGFuZ2U+KCk7XG4gIHByaXZhdGUgX3BhZ2VSZXNldCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9vbkRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIF9sb2FkTW9yZUNvbmZpZzogRnNMaXN0TG9hZE1vcmVDb25maWc7XG4gIHByaXZhdGUgX2xpbWl0cyA9IFsxMCwgMjUsIDUwLCAxMDAsIDIwMF07XG5cbiAgLy8gVG90YWwgcGFnZXNcbiAgcHVibGljIHNldCBwYWdlcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGFnZXMkLm5leHQodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wYWdlcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFnZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmUgaWYgcGFnZSB3YXMgY2hhbmdlZFxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlQ2hhbmdlZCQoKTogT2JzZXJ2YWJsZTxQYWdlQ2hhbmdlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VDaGFuZ2VkJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2VSZXNldCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VSZXNldCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGFzTm9uZVN0cmF0ZWd5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBMaW1pdHNcbiAgICovXG4gIHB1YmxpYyBnZXQgbGltaXRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fbGltaXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBsaW1pdHMsIHVwZGF0ZSBwYWdlcyBhcnJheSBhbmQgc2V0IG5ldyBsaW1pdCBwZXIgcGFnZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzZXQgbGltaXRzKHZhbHVlKSB7XG4gICAgdGhpcy5fbGltaXRzID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5saW1pdHMubGVuZ3RoID4gMCAmJiB0aGlzLmxpbWl0cy5pbmRleE9mKHRoaXMubGltaXQpID09PSAtMSkge1xuICAgICAgdGhpcy5saW1pdCA9IHRoaXMubGltaXRzWzBdO1xuICAgIH0gZWxzZSBpZiAodGhpcy5saW1pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxpbWl0ID0gdGhpcy5yZWNvcmRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcXVlcnkgZm9yIHJlcXVlc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgc3dpdGNoICh0aGlzLnN0cmF0ZWd5KSB7XG4gICAgICBjYXNlIFBhZ2luYXRpb25TdHJhdGVneS5QYWdlOlxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVBhZ2VTdHJhdGVneTtcbiAgICAgIGNhc2UgUGFnaW5hdGlvblN0cmF0ZWd5Lk9mZnNldDpcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlPZmZzZXRTdHJhdGVneTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvYWRNb3JlUXVlcnkoKSB7XG4gICAgc3dpdGNoICh0aGlzLnN0cmF0ZWd5KSB7XG4gICAgICBjYXNlIFBhZ2luYXRpb25TdHJhdGVneS5QYWdlOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQ6IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJ5T2Zmc2V0U3RyYXRlZ3k7XG5cbiAgICAgICAgcXVlcnkubGltaXQgPSBxdWVyeS5vZmZzZXQgKyBxdWVyeS5saW1pdDtcbiAgICAgICAgcXVlcnkub2Zmc2V0ID0gMDtcblxuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IGZvciBQYWdlIFN0cmF0ZWd5XG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5UGFnZVN0cmF0ZWd5KCk6IFF1ZXJ5UGFnZVN0cmF0ZWd5IHtcbiAgICByZXR1cm4gdGhpcy5oYXNOb25lU3RyYXRlZ3lcbiAgICAgID8ge31cbiAgICAgIDoge1xuICAgICAgICBwYWdlOiB0aGlzLnBhZ2UgfHwgMSxcbiAgICAgICAgbGltaXQ6IHRoaXMubGltaXQgfHwgMTAsXG4gICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IGZvciBPZmZzZXQgU3RyYXRlZ3lcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlPZmZzZXRTdHJhdGVneSgpOiBRdWVyeU9mZnNldFN0cmF0ZWd5IHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlIC0gMSB8fCAwO1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5saW1pdCB8fCA1O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldDogcGFnZSAqIGxpbWl0LFxuICAgICAgbGltaXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcXVlcnkgZm9yIGxvYWQgb25seSBjb3VudCBvZiBkZWxldGVkIHJvd3NcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZERlbGV0ZWRPZmZzZXRRdWVyeSgpIHtcbiAgICBjb25zdCBwYWdpbmF0aW9uT2Zmc2V0ID0gdGhpcy5saW1pdCAqIHRoaXMucGFnZTtcbiAgICBjb25zdCBhY3R1YWxPZmZzZXQgPSBNYXRoLm1pbih0aGlzLnJlY29yZHMsIHBhZ2luYXRpb25PZmZzZXQpO1xuICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KDAsIGFjdHVhbE9mZnNldCAtIHRoaXMuX3JlbW92ZWRSb3dzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXQsXG4gICAgICBsaW1pdDogdGhpcy5fcmVtb3ZlZFJvd3MsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5wYWdlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RyYXRlZ3koKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5O1xuICB9XG5cbiAgcHVibGljIHNldCBzdHJhdGVneShzdHJhdGVneTogUGFnaW5hdGlvblN0cmF0ZWd5KSB7XG4gICAgdGhpcy5fc3RyYXRlZ3kgPSAoc3RyYXRlZ3kgPT09IHVuZGVmaW5lZCkgPyBQYWdpbmF0aW9uU3RyYXRlZ3kuUGFnZSA6IHN0cmF0ZWd5O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhZ2luYXRpb24gaW4gUGFnZSBTdHJhdGVneSBNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1BhZ2VTdHJhdGVneSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVneSA9PT0gUGFnaW5hdGlvblN0cmF0ZWd5LlBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGFnaW5hdGlvbiBpbiBPZmZzZXQgU3RyYXRlZ3kgTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNPZmZzZXRTdHJhdGVneSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVneSA9PT0gUGFnaW5hdGlvblN0cmF0ZWd5Lk9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYWdpbmF0aW9uIGluIE5vbmUgU3RyYXRlZ3kgTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNOb25lU3RyYXRlZ3koKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT09IFBhZ2luYXRpb25TdHJhdGVneS5Ob25lO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHByZXYgcGFnZSBjYW4gYmUgYWN0aXZhdGVkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgIGdldCBoYXNQcmV2UGFnZSgpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RyYXRlZ3kpIHtcbiAgICAgIGNhc2UgUGFnaW5hdGlvblN0cmF0ZWd5LlBhZ2U6XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNQcmV2UGFnZVBhZ2VTdHJhdGVneTtcbiAgICAgIGNhc2UgUGFnaW5hdGlvblN0cmF0ZWd5Lk9mZnNldDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1ByZXZQYWdlT2Zmc2V0U3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5leHQgcGFnZSBjYW4gYmUgYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc05leHRQYWdlKCk6IGJvb2xlYW4geyAvLyBOZWVkIHRvIGNoZWNrIGlmIHBhZ2VzID09PSBwYWdlICYmIHBhZ2UgPT09IDFcbiAgICBzd2l0Y2ggKHRoaXMuc3RyYXRlZ3kpIHtcbiAgICAgIGNhc2UgUGFnaW5hdGlvblN0cmF0ZWd5LlBhZ2U6XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNOZXh0UGFnZVBhZ2VTdHJhdGVneTtcbiAgICAgIGNhc2UgUGFnaW5hdGlvblN0cmF0ZWd5Lk9mZnNldDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc05leHRQYWdlT2Zmc2V0U3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2FkTW9yZUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRNb3JlQ29uZmlnLmVuYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvYWRNb3JlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZE1vcmVDb25maWcubGFiZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvYWRNb3JlQnV0dG9uQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZE1vcmVDb25maWcuYnV0dG9uQ29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvYWRNb3JlQnV0dG9uQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiggdGhpcy5fbG9hZE1vcmVDb25maWcuYnV0dG9uVHlwZSA9PT0gJ2Jhc2ljJyApIHtcbiAgICAgIHJldHVybiAnJzsgXG4gICAgfVxuXG4gICAgcmV0dXJuIGBtYXQtJHt0aGlzLl9sb2FkTW9yZUNvbmZpZy5idXR0b25UeXBlfS1idXR0b25gO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2FkTW9yZUJ1dHRvblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZE1vcmVDb25maWcuYnV0dG9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTUC1UMTk3NFxuICAgKiBTaG93aW5nIDI2LTUwIG9mIDMzMyByZXN1bHRzIHNvcnRlZCBieSBOYW1lLCBBc2NlbmRpbmdcbiAgICogU2hvd2luZyAwIHJlc3VsdHMgc29ydGVkIGJ5IE5hbWUsIEFzY2VuZGluZ1xuICAgKi9cbiAgcHVibGljIGdldCBzdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1cnJlbnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLmxpbWl0O1xuICAgIGNvbnN0IGZyb20gPSBjdXJyZW50ICsgMTtcbiAgICBjb25zdCB0byA9IE1hdGgubWluKHRoaXMucmVjb3JkcywgY3VycmVudCArIHRoaXMubGltaXQpO1xuXG4gICAgcmV0dXJuIGAke2Zyb219LSR7dG99YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogSVBhZ2luYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuZW5hYmxlZCxcbiAgICAgIHN0cmF0ZWd5OiB0aGlzLnN0cmF0ZWd5LFxuICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgIGxpbWl0OiB0aGlzLmxpbWl0LFxuICAgICAgcmVjb3JkczogdGhpcy5yZWNvcmRzLFxuICAgICAgZGlzcGxheWVkOiB0aGlzLmRpc3BsYXllZCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGluaXRXaXRoQ29uZmlnKFxuICAgIGNvbmZpZzogRnNQYWdpbmcgfCBmYWxzZSxcbiAgICBsb2FkTW9yZTogRnNMaXN0TG9hZE1vcmVDb25maWcgfCBib29sZWFuLFxuICApIHtcblxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGlmIChjb25maWcubGltaXRzKSB7XG4gICAgICAgIHRoaXMubGltaXRzID0gY29uZmlnLmxpbWl0cztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5saW1pdCkge1xuICAgICAgICB0aGlzLmxpbWl0ID0gY29uZmlnLmxpbWl0O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0cmF0ZWd5ID0gY29uZmlnLnN0cmF0ZWd5O1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNldExvYWRNb3JlKGxvYWRNb3JlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBwYWdpbmF0aW9uIGhhcyBwcmV2IHBhZ2Ugd2hlbiBQYWdlIFN0cmF0ZWd5XG4gICAqL1xuICBwcml2YXRlIGdldCBfaGFzUHJldlBhZ2VQYWdlU3RyYXRlZ3koKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSA+IDEgJiYgdGhpcy5wYWdlcyA+IDE7XG4gIH1cblxuICAvKipcbiAgICogSWYgcGFnaW5hdGlvbiBoYXMgcHJldiBwYWdlIHdoZW4gT2Zmc2V0IFN0cmF0ZWd5XG4gICAqL1xuICBwcml2YXRlIGdldCBfaGFzUHJldlBhZ2VPZmZzZXRTdHJhdGVneSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vZmZzZXQgPj0gdGhpcy5saW1pdCAmJiB0aGlzLnJlY29yZHMgPiAxO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHBhZ2luYXRpb24gaGFzIG5leHQgcGFnZSB3aGVuIFBhZ2UgU3RyYXRlZ3lcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9oYXNOZXh0UGFnZVBhZ2VTdHJhdGVneSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlIDwgdGhpcy5wYWdlcyAmJiB0aGlzLnBhZ2VzID4gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBwYWdpbmF0aW9uIGhhcyBuZXh0IHBhZ2Ugd2hlbiBPZmZzZXQgU3RyYXRlZ3lcbiAgICovXG4gIHByaXZhdGUgZ2V0IF9oYXNOZXh0UGFnZU9mZnNldFN0cmF0ZWd5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5vZmZzZXQgKyB0aGlzLmxpbWl0KSA8IHRoaXMucmVjb3JkcyAmJiB0aGlzLnJlY29yZHMgPiAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwYWdpbmcgY29uZmlnIGFuZCBhbGwgcmVsYXRlZCBmaWVsZHNcbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZ1xuICAgKiBAcGFyYW0gZGlzcGxheWVkUmVjb3Jkc1xuICAgKiBAcGFyYW0gbG9hZE1vcmVPcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVQYWdpbmcoY29uZmlnLCBkaXNwbGF5ZWRSZWNvcmRzID0gMCwgbG9hZE1vcmVPcGVyYXRpb24gPSBmYWxzZSkge1xuICAgIGlmICghbG9hZE1vcmVPcGVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2Zyb21QYXJhbXMoY29uZmlnKTtcbiAgICAgIHRoaXMuZGlzcGxheWVkID0gZGlzcGxheWVkUmVjb3JkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWNvcmRzID0gY29uZmlnLnJlY29yZHM7XG5cbiAgICAgIGlmICh0aGlzLnJlY29yZHMgPCB0aGlzLmRpc3BsYXllZCkge1xuICAgICAgICB0aGlzLmRpc3BsYXllZCA9IHRoaXMucmVjb3JkcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVtb3ZlZFJvd3MgPSAwO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVRvdGFsUGFnZXMoKTtcbiAgfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBVcGRhdGUgcGFnaW5nIHdoZW4gZGF0YSBzb3VyY2Ugbm90IHJlbW92ZVxuICAvLyAgKiBAcGFyYW0ge2FueVtdfSByb3dzXG4gIC8vICAqL1xuICAvKnB1YmxpYyB1cGRhdGVQYWdpbmdNYW51YWwocm93czogYW55W10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzKSAmJiByb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVjb3JkcyA9IHJvd3MubGVuZ3RoO1xuICAgICAgdGhpcy5wYWdlcyA9IE1hdGguY2VpbChyb3dzLmxlbmd0aCAvIHRoaXMubGltaXQpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUGFnZXNBcnJheSgpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheWVkKCk7XG4gIH0qL1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgcGFnZXMgYXJyYXkgd2l0aCBuZXcgcGFnZXMgY291bnRcbiAgICovXG4gIC8vIHB1YmxpYyB1cGRhdGVQYWdlc0FycmF5KCkge1xuICAvLyAgIGNvbnN0IE1JRERMRSA9IDI7XG4gIC8vICAgY29uc3QgcGFnZXNBcnIgPSBbXTtcblxuICAvLyAgIGxldCBmcm9tID0gMDtcbiAgLy8gICBsZXQgdG8gPSAwO1xuICAvLyAgIGlmICh0aGlzLnBhZ2UgPCBNSURETEUpIHtcbiAgLy8gICAgIGZyb20gPSBNSURETEUgLSAxO1xuICAvLyAgICAgdG8gPSBNSURETEUgKyAxO1xuICAvLyAgIH0gZWxzZSBpZiAodGhpcy5wYWdlID49IE1JRERMRSAmJiB0aGlzLnBhZ2UgPD0gdGhpcy5wYWdlcyAtIE1JRERMRSArIDEpIHtcbiAgLy8gICAgIGZyb20gPSB0aGlzLnBhZ2UgLSAxO1xuICAvLyAgICAgdG8gPSB0aGlzLnBhZ2UgKyAxO1xuICAvLyAgIH0gZWxzZSBpZiAodGhpcy5wYWdlID4gdGhpcy5wYWdlcyAtIE1JRERMRSArIDEpIHtcbiAgLy8gICAgIGZyb20gPSB0aGlzLnBhZ2VzIC0gTUlERExFIC0gMTtcbiAgLy8gICAgIHRvID0gdGhpcy5wYWdlcztcbiAgLy8gICB9XG5cbiAgLy8gICBpZiAoIXRoaXMucGFnZXMgfHwgdGhpcy5wYWdlcyA8IDUpIHtcbiAgLy8gICAgIGZyb20gPSAxO1xuICAvLyAgICAgdG8gPSB0aGlzLnBhZ2VzIHx8IDA7XG4gIC8vICAgfVxuXG4gIC8vICAgZm9yIChsZXQgaSA9IGZyb207IGkgPD0gdG87IGkrKykge1xuICAvLyAgICAgcGFnZXNBcnIucHVzaChpKTtcbiAgLy8gICB9XG5cbiAgLy8gICB0aGlzLnBhZ2VzQXJyYXkgPSBPYmplY3QuYXNzaWduKFtdLCBwYWdlc0Fycik7XG4gIC8vIH1cblxuICBwdWJsaWMgc2V0TG9hZE1vcmUoY29uZmlnOiBGc0xpc3RMb2FkTW9yZUNvbmZpZyB8IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsb2FkTW9yZUNvbmZpZyA9IHR5cGVvZiBjb25maWcgPT09ICdib29sZWFuJyA/IFxuICAgICAge1xuICAgICAgICBlbmFibGVkOiAhIWNvbmZpZyxcbiAgICAgIH0gOiBcbiAgICAgIChcbiAgICAgICAgY29uZmlnID09PSB1bmRlZmluZWQgPyB7fSA6IHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgIHRoaXMuX2xvYWRNb3JlQ29uZmlnID0ge1xuICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICBsYWJlbDogJ0xvYWQgTW9yZScsXG4gICAgICBidXR0b25UeXBlOiAnYmFzaWMnLFxuICAgICAgLi4ubG9hZE1vcmVDb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZGlzcGF5ZWQgcmVjb3JkcyBjb3VudGVyXG4gICAqL1xuICAvLyBwdWJsaWMgdXBkYXRlRGlzcGxheWVkKCkge1xuICAvLyAgIHRoaXMuZGlzcGxheWVkID0gdGhpcy5nZXRWaXNpYmxlUmVjb3JkcygpO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBjb3VudCBvZiByZWNvcmRzIHRoYXQgY291bGQgYmUgc2hvd24gb24gcGFnZVxuICAgKi9cbiAgLy8gcHVibGljIGdldFZpc2libGVSZWNvcmRzKCkge1xuICAvLyAgIGNvbnN0IGRpZmYgPSB0aGlzLmhhc09mZnNldFN0cmF0ZWd5XG4gIC8vICAgICA/IHRoaXMucmVjb3JkcyAtIHRoaXMub2Zmc2V0XG4gIC8vICAgICA6IHRoaXMubGltaXQ7XG4gIC8vXG4gIC8vICAgcmV0dXJuIGRpZmYgPCB0aGlzLmxpbWl0XG4gIC8vICAgICA/IGRpZmZcbiAgLy8gICAgIDogdGhpcy5kaXNwbGF5ZWQ7XG4gIC8vIH1cblxuICBwdWJsaWMgZ2V0VmlzaWJsZVJlY29yZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBuZXcgbGltaXRcbiAgICpcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqL1xuICBwdWJsaWMgc2V0TGltaXQobGltaXQpIHtcbiAgICB0aGlzLmxpbWl0ID0gbGltaXQ7XG4gICAgdGhpcy5yZXNldFBhZ2luZygpO1xuXG4gICAgdGhpcy5fcGFnZUNoYW5nZWQkLm5leHQoe1xuICAgICAgdHlwZTogUGFnZUNoYW5nZVR5cGUuTGltaXRDaGFuZ2VkLFxuICAgICAgcGF5bG9hZDogbGltaXQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgcGFnZSBpcyBhY3RpdmF0ZSBwYWdlXG4gICAqXG4gICAqIEBwYXJhbSBwYWdlXG4gICAqL1xuICBwdWJsaWMgaXNBY3RpdmUocGFnZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlID09PSB0aGlzLnBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR28gdG8gcGFnZVxuICAgKlxuICAgKiBAcGFyYW0gcGFnZVxuICAgKi9cbiAgcHVibGljIGdvVG9QYWdlKHBhZ2UpIHtcbiAgICBpZiAocGFnZSA+PSAxICYmIHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgdGhpcy5wYWdlID0gcGFnZTtcblxuICAgICAgdGhpcy5fdXBkYXRlT2Zmc2V0KCk7XG5cbiAgICAgIHRoaXMuX3BhZ2VDaGFuZ2VkJC5uZXh0KHtcbiAgICAgICAgdHlwZTogUGFnZUNoYW5nZVR5cGUuRGVmYXVsdCxcbiAgICAgICAgcGF5bG9hZDogcGFnZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwYWdpbmcgbGlrZSBpdCB3YXMganVzdCBpbml0aWFsaXplZFxuICAgKi9cbiAgcHVibGljIHJlc2V0UGFnaW5nKCkge1xuICAgIHRoaXMucGFnZSA9IDE7XG4gICAgdGhpcy5vZmZzZXQgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRvIG5leHQgcGFnZVxuICAgKi9cbiAgcHVibGljIGdvTmV4dCgpIHtcbiAgICBpZiAodGhpcy5oYXNOZXh0UGFnZSkge1xuICAgICAgdGhpcy5wYWdlKys7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZU9mZnNldCgpO1xuXG4gICAgICB0aGlzLl9wYWdlQ2hhbmdlZCQubmV4dCh7XG4gICAgICAgIHR5cGU6IFBhZ2VDaGFuZ2VUeXBlLkRlZmF1bHQsXG4gICAgICAgIHBheWxvYWQ6IHRoaXMucGFnZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0byBmaXJzdCBwYWdlXG4gICAqL1xuICBwdWJsaWMgZ29GaXJzdCgpIHtcbiAgICBpZiAodGhpcy5wYWdlID4gMSkge1xuICAgICAgdGhpcy5wYWdlID0gMTtcblxuICAgICAgdGhpcy5fdXBkYXRlT2Zmc2V0KCk7XG5cbiAgICAgIHRoaXMuX3BhZ2VDaGFuZ2VkJC5uZXh0KHtcbiAgICAgICAgdHlwZTogUGFnZUNoYW5nZVR5cGUuRGVmYXVsdCxcbiAgICAgICAgcGF5bG9hZDogdGhpcy5wYWdlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRvIHByZXYgcGFnZVxuICAgKi9cbiAgcHVibGljIGdvUHJldigpIHtcbiAgICBpZiAodGhpcy5wYWdlID4gMSkge1xuICAgICAgdGhpcy5wYWdlLS07XG5cbiAgICAgIHRoaXMuX3VwZGF0ZU9mZnNldCgpO1xuXG4gICAgICB0aGlzLl9wYWdlQ2hhbmdlZCQubmV4dCh7XG4gICAgICAgIHR5cGU6IFBhZ2VDaGFuZ2VUeXBlLkRlZmF1bHQsXG4gICAgICAgIHBheWxvYWQ6IHRoaXMucGFnZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0byBsYXN0IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnb0xhc3QoKSB7XG4gICAgaWYgKHRoaXMucGFnZSAhPT0gdGhpcy5wYWdlcykge1xuICAgICAgdGhpcy5wYWdlID0gdGhpcy5wYWdlcztcblxuICAgICAgdGhpcy5fdXBkYXRlT2Zmc2V0KCk7XG5cbiAgICAgIHRoaXMuX3BhZ2VDaGFuZ2VkJC5uZXh0KHtcbiAgICAgICAgdHlwZTogUGFnZUNoYW5nZVR5cGUuRGVmYXVsdCxcbiAgICAgICAgcGF5bG9hZDogdGhpcy5wYWdlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb3VudCBvZiBkZWxldGVkIHJvd3MuIFRoaXMgY291bnQgd2lsbCBiZSBhcHBsaWVkIGZvciBvZmZzZXQgY2FsY1xuICAgKlxuICAgKiBAcGFyYW0gY291bnRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3dzKGNvdW50OiBudW1iZXIpIHtcbiAgICB0aGlzLl9yZW1vdmVkUm93cyArPSBjb3VudDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQYWdpbmF0aW9uKCkge1xuICAgIHRoaXMuX3VwZGF0ZVRvdGFsUGFnZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95XG4gICAqL1xuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHBhZ2luZyBzdGF0ZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBwcml2YXRlIF9mcm9tUGFyYW1zKHBhcmFtcyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5sb2FkTW9yZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMubGltaXQgPSBwYXJhbXMubGltaXQgPz8gMjU7XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvcmRzID0gcGFyYW1zLnJlY29yZHM7XG4gICAgdGhpcy5tYW51YWwgPSBwYXJhbXMubWFudWFsO1xuXG4gICAgdGhpcy5wYWdlcyA9IHBhcmFtcy5wYWdlcyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGMgYW5kIHVwZGF0ZSBvZmZzZXRcbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZU9mZnNldCgpIHtcbiAgICB0aGlzLm9mZnNldCA9IHRoaXMubGltaXQgKiAodGhpcy5wYWdlIC0gMSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsYyBhbmQgdXBkYXRlIHRvdGFsIGNvdW50IG9mIHBhZ2VzXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVUb3RhbFBhZ2VzKCkge1xuICAgIHRoaXMucGFnZXMgPSBNYXRoLmNlaWwodGhpcy5yZWNvcmRzIC8gdGhpcy5saW1pdCk7XG4gIH1cbn1cbiJdfQ==