@firestitch/list 12.13.2 → 12.13.3

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