@firestitch/list 13.0.4 → 13.0.6

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