@firestitch/list 12.20.1 → 13.0.1

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 (117) hide show
  1. package/app/classes/list-controller.d.ts +33 -28
  2. package/app/components/body/row/row.component.d.ts +2 -0
  3. package/app/components/list/list.component.d.ts +2 -0
  4. package/app/interfaces/listconfig.interface.d.ts +2 -1
  5. package/app/models/row.d.ts +7 -3
  6. package/esm2020/app/classes/data-controller.mjs +367 -0
  7. package/esm2020/app/classes/external-params-controller.mjs +147 -0
  8. package/esm2020/app/classes/list-controller.mjs +752 -0
  9. package/{esm2015/app/classes/pagination-controller.js → esm2020/app/classes/pagination-controller.mjs} +2 -3
  10. package/{esm2015/app/classes/persistance-controller.js → esm2020/app/classes/persistance-controller.mjs} +4 -4
  11. package/esm2020/app/classes/reorder-controller.mjs +182 -0
  12. package/esm2020/app/classes/selection-controller.mjs +468 -0
  13. package/esm2020/app/components/body/body.component.mjs +64 -0
  14. package/esm2020/app/components/body/row/actions/actions.component.mjs +97 -0
  15. package/esm2020/app/components/body/row/cell/cell.component.mjs +107 -0
  16. package/esm2020/app/components/body/row/inline-action/inline-action.component.mjs +33 -0
  17. package/esm2020/app/components/body/row/menu-action/menu-action.component.mjs +46 -0
  18. package/esm2020/app/components/body/row/row.component.mjs +321 -0
  19. package/esm2020/app/components/customize-cols/customize-cols.component.mjs +68 -0
  20. package/esm2020/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +16 -0
  21. package/esm2020/app/components/footer/footer-row/footer-row.component.mjs +28 -0
  22. package/esm2020/app/components/footer/footer.component.mjs +31 -0
  23. package/esm2020/app/components/head/head-cell/head-cell.component.mjs +29 -0
  24. package/esm2020/app/components/head/head.component.mjs +103 -0
  25. package/esm2020/app/components/list/list.component.mjs +388 -0
  26. package/esm2020/app/components/loader/loader.component.mjs +40 -0
  27. package/esm2020/app/components/manage-saved-filters/manage-saved-filters.component.mjs +76 -0
  28. package/esm2020/app/components/pagination/pagination.component.mjs +37 -0
  29. package/esm2020/app/components/saved-filters/saved-filters.component.mjs +29 -0
  30. package/esm2020/app/components/status/status.component.mjs +66 -0
  31. package/{esm2015/app/directives/cell/cell.directive.js → esm2020/app/directives/cell/cell.directive.mjs} +4 -4
  32. package/{esm2015/app/directives/column/column.directive.js → esm2020/app/directives/column/column.directive.mjs} +4 -4
  33. package/{esm2015/app/directives/content/content.directive.js → esm2020/app/directives/content/content.directive.mjs} +4 -4
  34. package/{esm2015/app/directives/content-init/content-init.directive.js → esm2020/app/directives/content-init/content-init.directive.mjs} +4 -4
  35. package/esm2020/app/directives/draggable-list/draggable-list.directive.mjs +328 -0
  36. package/esm2020/app/directives/draggable-row/draggable-row.directive.mjs +78 -0
  37. package/{esm2015/app/directives/empty-state/empty-state.directive.js → esm2020/app/directives/empty-state/empty-state.directive.mjs} +4 -4
  38. package/{esm2015/app/directives/footer/footer.directive.js → esm2020/app/directives/footer/footer.directive.mjs} +4 -4
  39. package/{esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js → esm2020/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs} +4 -4
  40. package/{esm2015/app/directives/group-footer/group-footer.directive.js → esm2020/app/directives/group-footer/group-footer.directive.mjs} +4 -4
  41. package/{esm2015/app/directives/group-header/group-header.directive.js → esm2020/app/directives/group-header/group-header.directive.mjs} +4 -4
  42. package/{esm2015/app/directives/header/header.directive.js → esm2020/app/directives/header/header.directive.mjs} +4 -4
  43. package/{esm2015/app/directives/heading/heading.directive.js → esm2020/app/directives/heading/heading.directive.mjs} +4 -4
  44. package/{esm2015/app/directives/heading-container/heading-container.directive.js → esm2020/app/directives/heading-container/heading-container.directive.mjs} +4 -4
  45. package/{esm2015/app/directives/subheading/subheading.directive.js → esm2020/app/directives/subheading/subheading.directive.mjs} +4 -4
  46. package/{esm2015/app/fs-list.module.js → esm2020/app/fs-list.module.mjs} +5 -5
  47. package/esm2020/app/interfaces/listconfig.interface.mjs +2 -0
  48. package/{esm2015/app/interfaces/pagination.interface.js → esm2020/app/interfaces/pagination.interface.mjs} +1 -1
  49. package/esm2020/app/models/row-action.model.mjs +90 -0
  50. package/esm2020/app/models/row.mjs +89 -0
  51. package/{esm2015/app/pipes/action-label.js → esm2020/app/pipes/action-label.mjs} +4 -4
  52. package/{esm2015/app/services/group-expand-notifier.service.js → esm2020/app/services/group-expand-notifier.service.mjs} +4 -4
  53. package/fesm2015/{firestitch-list.js → firestitch-list.mjs} +2716 -2755
  54. package/fesm2015/firestitch-list.mjs.map +1 -0
  55. package/fesm2020/firestitch-list.mjs +5844 -0
  56. package/fesm2020/firestitch-list.mjs.map +1 -0
  57. package/package.json +20 -7
  58. package/bundles/firestitch-list.umd.js +0 -7147
  59. package/bundles/firestitch-list.umd.js.map +0 -1
  60. package/esm2015/app/classes/data-controller.js +0 -365
  61. package/esm2015/app/classes/external-params-controller.js +0 -147
  62. package/esm2015/app/classes/list-controller.js +0 -743
  63. package/esm2015/app/classes/reorder-controller.js +0 -183
  64. package/esm2015/app/classes/selection-controller.js +0 -468
  65. package/esm2015/app/components/body/body.component.js +0 -69
  66. package/esm2015/app/components/body/row/actions/actions.component.js +0 -99
  67. package/esm2015/app/components/body/row/cell/cell.component.js +0 -113
  68. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +0 -37
  69. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +0 -50
  70. package/esm2015/app/components/body/row/row.component.js +0 -315
  71. package/esm2015/app/components/customize-cols/customize-cols.component.js +0 -72
  72. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +0 -20
  73. package/esm2015/app/components/footer/footer-row/footer-row.component.js +0 -33
  74. package/esm2015/app/components/footer/footer.component.js +0 -36
  75. package/esm2015/app/components/head/head-cell/head-cell.component.js +0 -34
  76. package/esm2015/app/components/head/head.component.js +0 -108
  77. package/esm2015/app/components/list/list.component.js +0 -388
  78. package/esm2015/app/components/loader/loader.component.js +0 -45
  79. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +0 -79
  80. package/esm2015/app/components/pagination/pagination.component.js +0 -42
  81. package/esm2015/app/components/saved-filters/saved-filters.component.js +0 -32
  82. package/esm2015/app/components/status/status.component.js +0 -72
  83. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +0 -330
  84. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +0 -79
  85. package/esm2015/app/interfaces/listconfig.interface.js +0 -2
  86. package/esm2015/app/models/row-action.model.js +0 -90
  87. package/esm2015/app/models/row.js +0 -81
  88. package/fesm2015/firestitch-list.js.map +0 -1
  89. /package/{esm2015/app/classes/actions-controller.js → esm2020/app/classes/actions-controller.mjs} +0 -0
  90. /package/{esm2015/app/classes/columns-controller.js → esm2020/app/classes/columns-controller.mjs} +0 -0
  91. /package/{esm2015/app/classes/index.js → esm2020/app/classes/index.mjs} +0 -0
  92. /package/{esm2015/app/classes/sorting-controller.js → esm2020/app/classes/sorting-controller.mjs} +0 -0
  93. /package/{esm2015/app/directives/index.js → esm2020/app/directives/index.mjs} +0 -0
  94. /package/{esm2015/app/enums/button-type.enum.js → esm2020/app/enums/button-type.enum.mjs} +0 -0
  95. /package/{esm2015/app/enums/page-change-type.enum.js → esm2020/app/enums/page-change-type.enum.mjs} +0 -0
  96. /package/{esm2015/app/enums/pagination-strategy.enum.js → esm2020/app/enums/pagination-strategy.enum.mjs} +0 -0
  97. /package/{esm2015/app/enums/row-type.enum.js → esm2020/app/enums/row-type.enum.mjs} +0 -0
  98. /package/{esm2015/app/enums/state.enum.js → esm2020/app/enums/state.enum.mjs} +0 -0
  99. /package/{esm2015/app/fs-list.providers.js → esm2020/app/fs-list.providers.mjs} +0 -0
  100. /package/{esm2015/app/interfaces/cellconfig.interface.js → esm2020/app/interfaces/cellconfig.interface.mjs} +0 -0
  101. /package/{esm2015/app/interfaces/column-config.interface.js → esm2020/app/interfaces/column-config.interface.mjs} +0 -0
  102. /package/{esm2015/app/interfaces/draggable-list.interface.js → esm2020/app/interfaces/draggable-list.interface.mjs} +0 -0
  103. /package/{esm2015/app/interfaces/external-params.interface.js → esm2020/app/interfaces/external-params.interface.mjs} +0 -0
  104. /package/{esm2015/app/interfaces/index.js → esm2020/app/interfaces/index.mjs} +0 -0
  105. /package/{esm2015/app/interfaces/sorting-change-event.interface.js → esm2020/app/interfaces/sorting-change-event.interface.mjs} +0 -0
  106. /package/{esm2015/app/models/column-async-attribute.js → esm2020/app/models/column-async-attribute.mjs} +0 -0
  107. /package/{esm2015/app/models/column-attributes.js → esm2020/app/models/column-attributes.mjs} +0 -0
  108. /package/{esm2015/app/models/column.model.js → esm2020/app/models/column.model.mjs} +0 -0
  109. /package/{esm2015/app/models/row/base-row.js → esm2020/app/models/row/base-row.mjs} +0 -0
  110. /package/{esm2015/app/models/row/child-row.js → esm2020/app/models/row/child-row.mjs} +0 -0
  111. /package/{esm2015/app/models/row/group-footer-row.js → esm2020/app/models/row/group-footer-row.mjs} +0 -0
  112. /package/{esm2015/app/models/row/group-row.js → esm2020/app/models/row/group-row.mjs} +0 -0
  113. /package/{esm2015/app/models/row/simple-row.js → esm2020/app/models/row/simple-row.mjs} +0 -0
  114. /package/{esm2015/app/models/styleConfig.model.js → esm2020/app/models/styleConfig.model.mjs} +0 -0
  115. /package/{esm2015/app/pipes/index.js → esm2020/app/pipes/index.mjs} +0 -0
  116. /package/{esm2015/firestitch-list.js → esm2020/firestitch-list.mjs} +0 -0
  117. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -0,0 +1,147 @@
1
+ import { merge, Subject } from 'rxjs';
2
+ import { takeUntil } from 'rxjs/operators';
3
+ export class ExternalParamsController {
4
+ constructor(_router, _route, _persistance, _paginator, _sorting, _queryParamsEnabled) {
5
+ this._router = _router;
6
+ this._route = _route;
7
+ this._persistance = _persistance;
8
+ this._paginator = _paginator;
9
+ this._sorting = _sorting;
10
+ this._queryParamsEnabled = _queryParamsEnabled;
11
+ this._externalParams = {
12
+ page: null,
13
+ limit: null,
14
+ sortName: null,
15
+ sortDirection: null,
16
+ };
17
+ this._destroy$ = new Subject();
18
+ this.initialize();
19
+ }
20
+ get externalSorting() {
21
+ if (!this._enabled || !this._sortName || !this._sortDirection) {
22
+ return null;
23
+ }
24
+ return {
25
+ value: this._sortName,
26
+ direction: this._sortDirection,
27
+ };
28
+ }
29
+ get _enabled() {
30
+ return this._queryParamsEnabled || this._persistance.enabled;
31
+ }
32
+ get _page() {
33
+ return this._externalParams.page;
34
+ }
35
+ get _limit() {
36
+ return this._externalParams.limit;
37
+ }
38
+ get _sortName() {
39
+ return this._externalParams.sortName;
40
+ }
41
+ get _sortDirection() {
42
+ return this._externalParams.sortDirection;
43
+ }
44
+ initialize() {
45
+ // Restore from localStorage parameters if persistance enabled
46
+ if (this._persistance.enabled) {
47
+ this._restorePaginationParams(this._persistance.getDataFromScope('paging'));
48
+ this._restoreSortingParams(this._persistance.getDataFromScope('sorting'));
49
+ }
50
+ // Restore from queryParams and override if persistance already had values for those params
51
+ if (this._queryParamsEnabled) {
52
+ this._restorePaginationParams(this._route.snapshot.queryParams);
53
+ this._restoreSortingParams(this._route.snapshot.queryParams);
54
+ }
55
+ // Set initial pagination params
56
+ // The same initial, but for sorting placed in list-controller "tranformTemplatesToColumns" method
57
+ if (this._paginator.enabled && !this._paginator.infinityScrollEnabled) {
58
+ if (this._limit) {
59
+ this._paginator.setLimit(this._limit);
60
+ }
61
+ if (this._page) {
62
+ this._paginator.goToPage(this._page);
63
+ }
64
+ }
65
+ // Update pagination in stores
66
+ this._updatePaginationParams(this._paginator.queryPageStrategy);
67
+ this._listenPaginatorChanges();
68
+ this._listenSortingChanges();
69
+ }
70
+ clearSortingParams() {
71
+ this._updateSortingParams(null, null);
72
+ }
73
+ destroy() {
74
+ this._destroy$.next();
75
+ this._destroy$.complete();
76
+ }
77
+ _restorePaginationParams(values) {
78
+ if (values?.page) {
79
+ this._externalParams.page = +values.page;
80
+ }
81
+ if (values?.limit) {
82
+ this._externalParams.limit = +values.limit;
83
+ }
84
+ }
85
+ _restoreSortingParams(values) {
86
+ if (values?.sortName) {
87
+ this._externalParams.sortName = values.sortName;
88
+ }
89
+ if (values?.sortDirection) {
90
+ this._externalParams.sortDirection = values.sortDirection;
91
+ }
92
+ }
93
+ _listenPaginatorChanges() {
94
+ merge(this._paginator.pageChanged$, this._paginator.pages$, this._paginator.pageReset$)
95
+ .pipe(takeUntil(this._destroy$))
96
+ .subscribe(() => {
97
+ this._updatePaginationParams(this._paginator.queryPageStrategy);
98
+ });
99
+ }
100
+ _listenSortingChanges() {
101
+ merge(this._sorting.initialized$, this._sorting.sortingChanged$)
102
+ .pipe(takeUntil(this._destroy$))
103
+ .subscribe(() => {
104
+ const sorting = this._sorting.value;
105
+ if (sorting) {
106
+ this._updateSortingParams(sorting.value, sorting.direction);
107
+ }
108
+ else {
109
+ this.clearSortingParams();
110
+ }
111
+ });
112
+ }
113
+ _updateSortingParams(name, direction) {
114
+ if (this._queryParamsEnabled) {
115
+ this._replaceState({
116
+ sortName: name,
117
+ sortDirection: direction,
118
+ });
119
+ }
120
+ if (this._persistance.enabled) {
121
+ if (name && direction) {
122
+ this._persistance.saveDataToScope('sorting', { sortName: name, sortDirection: direction });
123
+ }
124
+ else {
125
+ this._persistance.saveDataToScope('sorting', null);
126
+ }
127
+ }
128
+ }
129
+ _updatePaginationParams(params) {
130
+ if (this._queryParamsEnabled) {
131
+ this._replaceState(params);
132
+ }
133
+ if (this._persistance.enabled) {
134
+ this._persistance.saveDataToScope('paging', params);
135
+ }
136
+ }
137
+ _replaceState(data) {
138
+ const url = new URL(window.location.href);
139
+ Object.keys(data)
140
+ .filter((name) => data[name] !== undefined && data[name] !== null)
141
+ .forEach((name) => {
142
+ url.searchParams.set(name, data[name]);
143
+ });
144
+ history.replaceState({}, null, url.pathname + url.search);
145
+ }
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2NsYXNzZXMvZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBYzNDLE1BQU0sT0FBTyx3QkFBd0I7SUFXbkMsWUFDVSxPQUFlLEVBQ2YsTUFBc0IsRUFDdEIsWUFBbUMsRUFDbkMsVUFBZ0MsRUFDaEMsUUFBMkIsRUFDM0IsbUJBQTRCO1FBTDVCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7UUFDaEMsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFDM0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFTO1FBZjlCLG9CQUFlLEdBQW1CO1lBQ3hDLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUM7UUFFTSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQVV0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMs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LFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29udHJvbGxlciB9IGZyb20gJy4uL2NsYXNzZXMvcGFnaW5hdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFNvcnRpbmdDb250cm9sbGVyIH0gZnJvbSAnLi4vY2xhc3Nlcy9zb3J0aW5nLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRnNMaXN0U29ydENvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgRXh0ZXJuYWxQYXJhbXMsXG4gIEV4dGVybmFsUXVlcnlQYWdpbmF0aW9uLFxuICBFeHRlcm5hbFF1ZXJ5U29ydGluZyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRlcm5hbC1wYXJhbXMuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgUGVyc2lzdGFuY2VDb250cm9sbGVyIH0gZnJvbSAnLi9wZXJzaXN0YW5jZS1jb250cm9sbGVyJztcblxuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyIHtcblxuICBwcml2YXRlIF9leHRlcm5hbFBhcmFtczogRXh0ZXJuYWxQYXJhbXMgPSB7XG4gICAgcGFnZTogbnVsbCxcbiAgICBsaW1pdDogbnVsbCxcbiAgICBzb3J0TmFtZTogbnVsbCxcbiAgICBzb3J0RGlyZWN0aW9uOiBudWxsLFxuICB9O1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIF9yb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBfcGVyc2lzdGFuY2U6IFBlcnNpc3RhbmNlQ29udHJvbGxlcixcbiAgICBwcml2YXRlIF9wYWdpbmF0b3I6IFBhZ2luYXRpb25Db250cm9sbGVyLFxuICAgIHByaXZhdGUgX3NvcnRpbmc6IFNvcnRpbmdDb250cm9sbGVyLFxuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zRW5hYmxlZDogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4dGVybmFsU29ydGluZygpOiBGc0xpc3RTb3J0Q29uZmlnIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQgfHwgIXRoaXMuX3NvcnROYW1lIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHRoaXMuX3NvcnROYW1lLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLl9zb3J0RGlyZWN0aW9uLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldCBfZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlQYXJhbXNFbmFibGVkIHx8IHRoaXMuX3BlcnNpc3RhbmNlLmVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBfcGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFBhcmFtcy5wYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsUGFyYW1zLmxpbWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3NvcnROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsUGFyYW1zLnNvcnROYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3NvcnREaXJlY3Rpb24oKTogJ2FzYycgfCAnZGVzYycge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFBhcmFtcy5zb3J0RGlyZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoKSB7XG5cbiAgICAvLyBSZXN0b3JlIGZyb20gbG9jYWxTdG9yYWdlIHBhcmFtZXRlcnMgaWYgcGVyc2lzdGFuY2UgZW5hYmxlZFxuICAgIGlmICh0aGlzLl9wZXJzaXN0YW5jZS5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9wZXJzaXN0YW5jZS5nZXREYXRhRnJvbVNjb3BlKCdwYWdpbmcnKSk7XG4gICAgICB0aGlzLl9yZXN0b3JlU29ydGluZ1BhcmFtcyh0aGlzLl9wZXJzaXN0YW5jZS5nZXREYXRhRnJvbVNjb3BlKCdzb3J0aW5nJykpO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgZnJvbSBxdWVyeVBhcmFtcyBhbmQgb3ZlcnJpZGUgaWYgcGVyc2lzdGFuY2UgYWxyZWFkeSBoYWQgdmFsdWVzIGZvciB0aG9zZSBwYXJhbXNcbiAgICBpZiAodGhpcy5fcXVlcnlQYXJhbXNFbmFibGVkKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyBhcyBFeHRlcm5hbFF1ZXJ5UGFnaW5hdGlvbik7XG4gICAgICB0aGlzLl9yZXN0b3JlU29ydGluZ1BhcmFtcyh0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyBhcyBFeHRlcm5hbFF1ZXJ5U29ydGluZyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGluaXRpYWwgcGFnaW5hdGlvbiBwYXJhbXNcbiAgICAvLyBUaGUgc2FtZSBpbml0aWFsLCBidXQgZm9yIHNvcnRpbmcgcGxhY2VkIGluIGxpc3QtY29udHJvbGxlciBcInRyYW5mb3JtVGVtcGxhdGVzVG9Db2x1bW5zXCIgbWV0aG9kXG4gICAgaWYgKHRoaXMuX3BhZ2luYXRvci5lbmFibGVkICYmICF0aGlzLl9wYWdpbmF0b3IuaW5maW5pdHlTY3JvbGxFbmFibGVkKSB7XG4gICAgICBpZiAodGhpcy5fbGltaXQpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdG9yLnNldExpbWl0KHRoaXMuX2xpbWl0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3BhZ2UpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdG9yLmdvVG9QYWdlKHRoaXMuX3BhZ2UpO1xuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHBhZ2luYXRpb24gaW4gc3RvcmVzXG4gICAgdGhpcy5fdXBkYXRlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9wYWdpbmF0b3IucXVlcnlQYWdlU3RyYXRlZ3kpO1xuXG4gICAgdGhpcy5fbGlzdGVuUGFnaW5hdG9yQ2hhbmdlcygpO1xuICAgIHRoaXMuX2xpc3RlblNvcnRpbmdDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTb3J0aW5nUGFyYW1zKCkge1xuICAgIHRoaXMuX3VwZGF0ZVNvcnRpbmdQYXJhbXMobnVsbCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVQYWdpbmF0aW9uUGFyYW1zKHZhbHVlczogRXh0ZXJuYWxRdWVyeVBhZ2luYXRpb24pIHtcbiAgICBpZiAodmFsdWVzPy5wYWdlKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5wYWdlID0gK3ZhbHVlcy5wYWdlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXM/LmxpbWl0KSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5saW1pdCA9ICt2YWx1ZXMubGltaXQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZVNvcnRpbmdQYXJhbXModmFsdWVzOiBFeHRlcm5hbFF1ZXJ5U29ydGluZykge1xuICAgIGlmICh2YWx1ZXM/LnNvcnROYW1lKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zb3J0TmFtZSA9IHZhbHVlcy5zb3J0TmFtZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzPy5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zb3J0RGlyZWN0aW9uID0gdmFsdWVzLnNvcnREaXJlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuUGFnaW5hdG9yQ2hhbmdlcygpIHtcbiAgICBtZXJnZShcbiAgICAgIHRoaXMuX3BhZ2luYXRvci5wYWdlQ2hhbmdlZCQsXG4gICAgICB0aGlzLl9wYWdpbmF0b3IucGFnZXMkLFxuICAgICAgdGhpcy5fcGFnaW5hdG9yLnBhZ2VSZXNldCQsXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGFnaW5hdGlvblBhcmFtcyh0aGlzLl9wYWdpbmF0b3IucXVlcnlQYWdlU3RyYXRlZ3kpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Tb3J0aW5nQ2hhbmdlcygpIHtcbiAgICBtZXJnZShcbiAgICAgIHRoaXMuX3NvcnRpbmcuaW5pdGlhbGl6ZWQkLFxuICAgICAgdGhpcy5fc29ydGluZy5zb3J0aW5nQ2hhbmdlZCQsXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ydGluZyA9IHRoaXMuX3NvcnRpbmcudmFsdWU7XG5cbiAgICAgICAgaWYgKHNvcnRpbmcpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVTb3J0aW5nUGFyYW1zKHNvcnRpbmcudmFsdWUsIHNvcnRpbmcuZGlyZWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsZWFyU29ydGluZ1BhcmFtcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVNvcnRpbmdQYXJhbXMobmFtZTogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9xdWVyeVBhcmFtc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3JlcGxhY2VTdGF0ZSh7XG4gICAgICAgIHNvcnROYW1lOiBuYW1lLFxuICAgICAgICBzb3J0RGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVyc2lzdGFuY2UuZW5hYmxlZCkge1xuICAgICAgaWYgKG5hbWUgJiYgZGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RhbmNlLnNhdmVEYXRhVG9TY29wZSgnc29ydGluZycsIHsgc29ydE5hbWU6IG5hbWUsIHNvcnREaXJlY3Rpb246IGRpcmVjdGlvbiB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RhbmNlLnNhdmVEYXRhVG9TY29wZSgnc29ydGluZycsIG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVBhZ2luYXRpb25QYXJhbXMocGFyYW1zKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXJ5UGFyYW1zRW5hYmxlZCkge1xuICAgICAgdGhpcy5fcmVwbGFjZVN0YXRlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BlcnNpc3RhbmNlLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3BlcnNpc3RhbmNlLnNhdmVEYXRhVG9TY29wZSgncGFnaW5nJywgcGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXBsYWNlU3RhdGUoZGF0YSkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgT2JqZWN0LmtleXMoZGF0YSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IGRhdGFbbmFtZV0gIT09IHVuZGVmaW5lZCAmJiBkYXRhW25hbWVdICE9PSBudWxsKVxuICAgICAgLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQobmFtZSxkYXRhW25hbWVdKTtcbiAgICAgIH0pO1xuXG4gICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIG51bGwsIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2gpO1xuICB9XG59XG4iXX0=