@paperless/angular 1.12.2 → 1.12.4

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 (87) hide show
  1. package/esm2022/lib/base/form.component.mjs +103 -0
  2. package/esm2022/lib/base/upload.component.mjs +57 -0
  3. package/esm2022/lib/base/value-accessor.mjs +44 -0
  4. package/esm2022/lib/directives/p-cropper.directive.mjs +37 -0
  5. package/esm2022/lib/directives/p-datepicker.directive.mjs +37 -0
  6. package/esm2022/lib/directives/p-page-size-select.directive.mjs +42 -0
  7. package/esm2022/lib/directives/p-pagination.directive.mjs +42 -0
  8. package/esm2022/lib/directives/p-select.directive.mjs +37 -0
  9. package/{esm2020 → esm2022}/lib/modules/overlay/overlay.module.mjs +14 -14
  10. package/esm2022/lib/modules/overlay/overlay.ref.mjs +14 -0
  11. package/esm2022/lib/modules/overlay/services/overlay.service.mjs +77 -0
  12. package/esm2022/lib/modules/table/base/table.component.mjs +211 -0
  13. package/esm2022/lib/modules/table/components/table/table.component.mjs +734 -0
  14. package/esm2022/lib/modules/table/components/table-cell/table-cell.component.mjs +230 -0
  15. package/esm2022/lib/modules/table/components/table-column/table-column.component.mjs +59 -0
  16. package/{esm2020 → esm2022}/lib/modules/table/directives/p-table-custom-filter.directive.mjs +3 -3
  17. package/{esm2020 → esm2022}/lib/modules/table/directives/p-table-filter-modal.directive.mjs +3 -3
  18. package/esm2022/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
  19. package/esm2022/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
  20. package/esm2022/lib/modules/table/directives/p-table-ngx.directive.mjs +122 -0
  21. package/esm2022/lib/modules/table/directives/p-table.directive.mjs +78 -0
  22. package/{esm2020 → esm2022}/lib/modules/table/table.module.mjs +4 -4
  23. package/esm2022/lib/modules/toast/components/toast-container/toast-container.component.mjs +39 -0
  24. package/esm2022/lib/modules/toast/directives/toast.directive.mjs +51 -0
  25. package/esm2022/lib/modules/toast/services/toast.service.mjs +51 -0
  26. package/{esm2020 → esm2022}/lib/modules/toast/toast.module.mjs +4 -4
  27. package/{esm2020 → esm2022}/lib/paperless.module.mjs +4 -4
  28. package/esm2022/lib/pipes/currency.pipe.mjs +21 -0
  29. package/esm2022/lib/pipes/date.pipe.mjs +21 -0
  30. package/esm2022/lib/pipes/safe.pipe.mjs +34 -0
  31. package/esm2022/lib/stencil/components.mjs +1582 -0
  32. package/esm2022/lib/stencil.module.mjs +17 -0
  33. package/{fesm2020 → fesm2022}/paperless-angular.mjs +698 -496
  34. package/{fesm2020 → fesm2022}/paperless-angular.mjs.map +1 -1
  35. package/package.json +6 -12
  36. package/esm2020/lib/base/form.component.mjs +0 -105
  37. package/esm2020/lib/base/upload.component.mjs +0 -56
  38. package/esm2020/lib/base/value-accessor.mjs +0 -42
  39. package/esm2020/lib/directives/p-cropper.directive.mjs +0 -37
  40. package/esm2020/lib/directives/p-datepicker.directive.mjs +0 -37
  41. package/esm2020/lib/directives/p-page-size-select.directive.mjs +0 -42
  42. package/esm2020/lib/directives/p-pagination.directive.mjs +0 -42
  43. package/esm2020/lib/directives/p-select.directive.mjs +0 -37
  44. package/esm2020/lib/modules/overlay/overlay.ref.mjs +0 -12
  45. package/esm2020/lib/modules/overlay/services/overlay.service.mjs +0 -74
  46. package/esm2020/lib/modules/table/base/table.component.mjs +0 -209
  47. package/esm2020/lib/modules/table/components/table/table.component.mjs +0 -683
  48. package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +0 -212
  49. package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +0 -56
  50. package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +0 -52
  51. package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +0 -60
  52. package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +0 -121
  53. package/esm2020/lib/modules/table/directives/p-table.directive.mjs +0 -78
  54. package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +0 -36
  55. package/esm2020/lib/modules/toast/directives/toast.directive.mjs +0 -51
  56. package/esm2020/lib/modules/toast/services/toast.service.mjs +0 -53
  57. package/esm2020/lib/pipes/currency.pipe.mjs +0 -20
  58. package/esm2020/lib/pipes/date.pipe.mjs +0 -20
  59. package/esm2020/lib/pipes/safe.pipe.mjs +0 -33
  60. package/esm2020/lib/stencil/components.mjs +0 -1466
  61. package/esm2020/lib/stencil.module.mjs +0 -17
  62. package/fesm2015/paperless-angular.mjs +0 -3805
  63. package/fesm2015/paperless-angular.mjs.map +0 -1
  64. /package/{esm2020 → esm2022}/lib/animations/fade.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/animations/index.mjs +0 -0
  66. /package/{esm2020 → esm2022}/lib/animations/slide.mjs +0 -0
  67. /package/{esm2020 → esm2022}/lib/base/index.mjs +0 -0
  68. /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
  69. /package/{esm2020 → esm2022}/lib/modules/index.mjs +0 -0
  70. /package/{esm2020 → esm2022}/lib/modules/overlay/index.mjs +0 -0
  71. /package/{esm2020 → esm2022}/lib/modules/overlay/services/index.mjs +0 -0
  72. /package/{esm2020 → esm2022}/lib/modules/table/base/index.mjs +0 -0
  73. /package/{esm2020 → esm2022}/lib/modules/table/components/index.mjs +0 -0
  74. /package/{esm2020 → esm2022}/lib/modules/table/components/table/constants.mjs +0 -0
  75. /package/{esm2020 → esm2022}/lib/modules/table/directives/index.mjs +0 -0
  76. /package/{esm2020 → esm2022}/lib/modules/table/index.mjs +0 -0
  77. /package/{esm2020 → esm2022}/lib/modules/table/utils.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/toast/components/index.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/toast/directives/index.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/toast/index.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/toast/services/index.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/toast/types.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/stencil/angular-component-lib/utils.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/stencil/index.mjs +0 -0
  86. /package/{esm2020 → esm2022}/paperless-angular.mjs +0 -0
  87. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,211 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component } from '@angular/core';
3
+ import { FormControl, FormGroup } from '@angular/forms';
4
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
5
+ import { timer } from 'rxjs';
6
+ import { debounce, filter, map, pairwise, startWith } from 'rxjs/operators';
7
+ import { BaseFormComponent } from '../../../base/form.component';
8
+ import { createFormFilters } from '../utils';
9
+ import * as i0 from "@angular/core";
10
+ let BaseTableComponent = class BaseTableComponent extends BaseFormComponent {
11
+ quickFilters = [];
12
+ filterForm = new FormGroup({});
13
+ filterFormQuickFilterKey;
14
+ defaultFilterFormValues = {};
15
+ pageSizeDefault = 12;
16
+ tableOptions;
17
+ _defaultTableValues = {
18
+ pageSize: this.pageSizeDefault,
19
+ page: 1,
20
+ quickFilter: null,
21
+ query: '',
22
+ filters: [],
23
+ selectedRows: [],
24
+ };
25
+ defaultTableValues = {};
26
+ get pageSize() {
27
+ if (!this.tableOptions) {
28
+ return this._defaultTableValues.pageSize;
29
+ }
30
+ return this.tableOptions.value.pageSize;
31
+ }
32
+ set pageSize(pageSize) {
33
+ this.tableValues = {
34
+ pageSize,
35
+ };
36
+ }
37
+ get page() {
38
+ if (!this.tableOptions) {
39
+ return this._defaultTableValues.page;
40
+ }
41
+ return this.tableOptions.value.page;
42
+ }
43
+ set page(page) {
44
+ this.tableValues = {
45
+ page,
46
+ };
47
+ }
48
+ get quickFilter() {
49
+ if (!this.tableOptions) {
50
+ return this._defaultTableValues.quickFilter;
51
+ }
52
+ return this.tableOptions.value.quickFilter;
53
+ }
54
+ set quickFilter(quickFilter) {
55
+ this.tableValues = {
56
+ quickFilter,
57
+ };
58
+ }
59
+ get query() {
60
+ if (!this.tableOptions) {
61
+ return this._defaultTableValues.query;
62
+ }
63
+ return this.tableOptions.value.query;
64
+ }
65
+ set query(query) {
66
+ this.tableValues = {
67
+ query,
68
+ };
69
+ }
70
+ get filters() {
71
+ if (!this.tableOptions) {
72
+ return this._defaultTableValues.filters;
73
+ }
74
+ return this.tableOptions.value.filters;
75
+ }
76
+ set filters(filters) {
77
+ this.tableValues = {
78
+ filters,
79
+ };
80
+ }
81
+ get selectedRows() {
82
+ if (!this.tableOptions) {
83
+ return this._defaultTableValues.selectedRows;
84
+ }
85
+ return this.tableOptions.value.selectedRows;
86
+ }
87
+ set selectedRows(selectedRows) {
88
+ this.tableValues = {
89
+ selectedRows,
90
+ };
91
+ }
92
+ // setter
93
+ get parsedDefaultTableValues() {
94
+ return {
95
+ ...this._defaultTableValues,
96
+ ...this.defaultTableValues,
97
+ pageSize: this.defaultTableValues?.pageSize || this.pageSizeDefault,
98
+ };
99
+ }
100
+ get tableValues() {
101
+ return this.tableOptions?.value ?? {};
102
+ }
103
+ set tableValues(values) {
104
+ this._setTableValues({
105
+ ...this.tableValues,
106
+ ...values,
107
+ });
108
+ }
109
+ constructor() {
110
+ super();
111
+ }
112
+ ngOnInit() {
113
+ this.tableOptions = new FormControl({
114
+ pageSize: this.parsedDefaultTableValues.pageSize,
115
+ page: this.parsedDefaultTableValues.page,
116
+ quickFilter: this.parsedDefaultTableValues.quickFilter,
117
+ query: this.parsedDefaultTableValues.query,
118
+ filters: this.parsedDefaultTableValues.filters,
119
+ selectedRows: this.parsedDefaultTableValues.selectedRows,
120
+ });
121
+ this.tableOptions.valueChanges
122
+ .pipe(untilDestroyed(this), startWith(this.tableOptions.value), pairwise(), map(([previous, next]) => this._getChanges(previous, next)), filter((changes) => !!changes), debounce((changes) => {
123
+ if (changes?.query && Object.keys(changes)?.length === 1) {
124
+ return timer(300);
125
+ }
126
+ return timer(0);
127
+ }))
128
+ .subscribe((changes) => {
129
+ if (changes?.page) {
130
+ this._refresh();
131
+ return;
132
+ }
133
+ this._resetPageOrRefresh();
134
+ });
135
+ this._refresh();
136
+ }
137
+ resetTable(emitEvent = true, forceRefresh = false) {
138
+ this._setTableValues(this.parsedDefaultTableValues, emitEvent);
139
+ if (forceRefresh) {
140
+ this._refresh();
141
+ }
142
+ }
143
+ applyFormFilters(values = null) {
144
+ values = values ?? this.filterForm.value;
145
+ const { filters, quickFilter } = createFormFilters(values, this.quickFilters, this.filterFormQuickFilterKey);
146
+ if (quickFilter) {
147
+ this.quickFilter = quickFilter;
148
+ }
149
+ this.filters = filters;
150
+ }
151
+ resetFormFilters(resetQuickFilter = false) {
152
+ const values = this.filterForm.value;
153
+ const defaultQuickFilter = this.quickFilters.find((f) => f.default);
154
+ for (const key of Object.keys(values)) {
155
+ if (key === this.filterFormQuickFilterKey) {
156
+ if (resetQuickFilter) {
157
+ values[key] = defaultQuickFilter.value;
158
+ }
159
+ continue;
160
+ }
161
+ values[key] = this.defaultFilterFormValues[key] ?? null;
162
+ }
163
+ this.filterForm.setValue(values);
164
+ this.applyFormFilters(values);
165
+ }
166
+ _refresh() {
167
+ console.warn('Not implemented');
168
+ }
169
+ _resetPageOrRefresh() {
170
+ if (!this.tableOptions) {
171
+ return;
172
+ }
173
+ if (this.page !== 1) {
174
+ this.page = 1;
175
+ }
176
+ this._refresh();
177
+ }
178
+ _setTableValues(data, emitEvent = true) {
179
+ this.tableOptions?.setValue({
180
+ ...this.tableOptions.value,
181
+ ...data,
182
+ }, { emitEvent });
183
+ }
184
+ _getChanges(previous, next) {
185
+ const changes = {};
186
+ let key;
187
+ for (key in next) {
188
+ if (key === 'selectedRows') {
189
+ continue;
190
+ }
191
+ if (JSON.stringify(previous[key]) !== JSON.stringify(next[key])) {
192
+ // @ts-ignore
193
+ changes[key] = next[key];
194
+ }
195
+ }
196
+ return Object.keys(changes).length ? changes : null;
197
+ }
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
199
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: BaseTableComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: ``, isInline: true });
200
+ };
201
+ BaseTableComponent = __decorate([
202
+ UntilDestroy({ checkProperties: true })
203
+ ], BaseTableComponent);
204
+ export { BaseTableComponent };
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTableComponent, decorators: [{
206
+ type: Component,
207
+ args: [{
208
+ template: ``,
209
+ }]
210
+ }], ctorParameters: function () { return []; } });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9iYXNlL3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFvQnRDLElBQWUsa0JBQWtCLEdBQWpDLE1BQWUsa0JBQ2xCLFNBQVEsaUJBQWlCO0lBR2YsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUU1QixVQUFVLEdBQW1CLElBQUksU0FBUyxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELHdCQUF3QixDQUFVO0lBQ2xDLHVCQUF1QixHQUFRLEVBQUUsQ0FBQztJQUVsQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLFlBQVksQ0FBNkI7SUFFeEMsbUJBQW1CLEdBQWlCO1FBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZTtRQUM5QixJQUFJLEVBQUUsQ0FBQztRQUNQLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxZQUFZLEVBQUUsRUFBRTtL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QUksR0FBdUIsQ0FBQztRQUM1QixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDZCxJQUFJLEdBQUcsS0FBSyxjQUFjLEVBQUU7Z0JBQ3hCLFNBQVM7YUFDWjtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUM3RCxhQUFhO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDNUI7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7dUdBelBpQixrQkFBa0I7MkZBQWxCLGtCQUFrQiwyRUFGMUIsRUFBRTs7QUFFTSxrQkFBa0I7SUFKdkMsWUFBWSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO0dBSWxCLGtCQUFrQixDQTBQdkM7U0ExUHFCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxFQUFFO2lCQUNmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IFF1aWNrRmlsdGVyIH0gZnJvbSAnQHBhcGVybGVzcy9jb3JlJztcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZSwgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY3JlYXRlRm9ybUZpbHRlcnMgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFRhYmxlUXVpY2tGaWx0ZXIgPSBRdWlja0ZpbHRlciAmIHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIG1ldHJpY05hbWU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlT3B0aW9ucyB7XG4gICAgcGFnZVNpemU6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcXVpY2tGaWx0ZXI6IFRhYmxlUXVpY2tGaWx0ZXIgfCBzdHJpbmcgfCBudWxsO1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgZmlsdGVyczogYW55W107XG4gICAgc2VsZWN0ZWRSb3dzOiBhbnlbXTtcbn1cblxuQFVudGlsRGVzdHJveSh7IGNoZWNrUHJvcGVydGllczogdHJ1ZSB9KVxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6IGBgLFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVGFibGVDb21wb25lbnRcbiAgICBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgICBwcm90ZWN0ZWQgcXVpY2tGaWx0ZXJzOiBhbnlbXSA9IFtdO1xuXG4gICAgcHVibGljIGZpbHRlckZvcm06IEZvcm1Hcm91cDxhbnk+ID0gbmV3IEZvcm1Hcm91cDxhbnk+KHt9KTtcbiAgICBwdWJsaWMgZmlsdGVyRm9ybVF1aWNrRmlsdGVyS2V5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBkZWZhdWx0RmlsdGVyRm9ybVZhbHVlczogYW55ID0ge307XG5cbiAgICBwdWJsaWMgcGFnZVNpemVEZWZhdWx0ID0gMTI7XG4gICAgcHVibGljIHRhYmxlT3B0aW9ucz86IEZvcm1Db250cm9sPFRhYmxlT3B0aW9ucz47XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0VGFibGVWYWx1ZXM6IFRhYmxlT3B0aW9ucyA9IHtcbiAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemVEZWZhdWx0LFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBxdWlja0ZpbHRlcjogbnVsbCxcbiAgICAgICAgcXVlcnk6ICcnLFxuICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgc2VsZWN0ZWRSb3dzOiBbXSxcbiAgICB9O1xuICAgIHB1YmxpYyBkZWZhdWx0VGFibGVWYWx1ZXM6IFBhcnRpYWw8VGFibGVPcHRpb25zPiA9IHt9O1xuXG4gICAgZ2V0IHBhZ2VTaXplKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnBhZ2VTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnBhZ2VTaXplO1xuICAgIH1cblxuICAgIHNldCBwYWdlU2l6ZShwYWdlU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgcGFnZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5wYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnBhZ2U7XG4gICAgfVxuXG4gICAgc2V0IHBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBxdWlja0ZpbHRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5xdWlja0ZpbHRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5xdWlja0ZpbHRlcjtcbiAgICB9XG4gICAgc2V0IHF1aWNrRmlsdGVyKHF1aWNrRmlsdGVyOiBUYWJsZVF1aWNrRmlsdGVyIHwgc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgcXVpY2tGaWx0ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnF1ZXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnF1ZXJ5O1xuICAgIH1cbiAgICBzZXQgcXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy50YWJsZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VGFibGVWYWx1ZXMuZmlsdGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5maWx0ZXJzO1xuICAgIH1cbiAgICBzZXQgZmlsdGVycyhmaWx0ZXJzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWRSb3dzKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnNlbGVjdGVkUm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5zZWxlY3RlZFJvd3M7XG4gICAgfVxuICAgIHNldCBzZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIHNldHRlclxuICAgIGdldCBwYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWZhdWx0VGFibGVWYWx1ZXMsXG4gICAgICAgICAgICAuLi50aGlzLmRlZmF1bHRUYWJsZVZhbHVlcyxcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLmRlZmF1bHRUYWJsZVZhbHVlcz8ucGFnZVNpemUgfHwgdGhpcy5wYWdlU2l6ZURlZmF1bHQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IHRhYmxlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZU9wdGlvbnM/LnZhbHVlID8/IHt9O1xuICAgIH1cblxuICAgIHNldCB0YWJsZVZhbHVlcyh2YWx1ZXM6IFBhcnRpYWw8VGFibGVPcHRpb25zPikge1xuICAgICAgICB0aGlzLl9zZXRUYWJsZVZhbHVlcyh7XG4gICAgICAgICAgICAuLi50aGlzLnRhYmxlVmFsdWVzLFxuICAgICAgICAgICAgLi4udmFsdWVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMgPSBuZXcgRm9ybUNvbnRyb2w8VGFibGVPcHRpb25zPih7XG4gICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMucGFnZVNpemUsXG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcy5wYWdlLFxuICAgICAgICAgICAgcXVpY2tGaWx0ZXI6IHRoaXMucGFyc2VkRGVmYXVsdFRhYmxlVmFsdWVzLnF1aWNrRmlsdGVyLFxuICAgICAgICAgICAgcXVlcnk6IHRoaXMucGFyc2VkRGVmYXVsdFRhYmxlVmFsdWVzLnF1ZXJ5LFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMuZmlsdGVycyxcbiAgICAgICAgICAgIHNlbGVjdGVkUm93czogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMuc2VsZWN0ZWRSb3dzLFxuICAgICAgICB9KSBhcyBGb3JtQ29udHJvbDxUYWJsZU9wdGlvbnM+O1xuXG4gICAgICAgIHRoaXMudGFibGVPcHRpb25zLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdW50aWxEZXN0cm95ZWQodGhpcyksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMudGFibGVPcHRpb25zLnZhbHVlKSxcbiAgICAgICAgICAgICAgICBwYWlyd2lzZSgpLFxuICAgICAgICAgICAgICAgIG1hcCgoW3ByZXZpb3VzLCBuZXh0XSkgPT4gdGhpcy5fZ2V0Q2hhbmdlcyhwcmV2aW91cywgbmV4dCkpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoY2hhbmdlczogYW55KSA9PiAhIWNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlKChjaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzPy5xdWVyeSAmJiBPYmplY3Qua2V5cyhjaGFuZ2VzKT8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoMzAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lcigwKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlczogVGFibGVPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXM/LnBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQYWdlT3JSZWZyZXNoKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmVzZXRUYWJsZShlbWl0RXZlbnQgPSB0cnVlLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9zZXRUYWJsZVZhbHVlcyh0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcywgZW1pdEV2ZW50KTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUZvcm1GaWx0ZXJzKHZhbHVlczogYW55ID0gbnVsbCkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMgPz8gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuXG4gICAgICAgIGNvbnN0IHsgZmlsdGVycywgcXVpY2tGaWx0ZXIgfSA9IGNyZWF0ZUZvcm1GaWx0ZXJzKFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgdGhpcy5xdWlja0ZpbHRlcnMsXG4gICAgICAgICAgICB0aGlzLmZpbHRlckZvcm1RdWlja0ZpbHRlcktleVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChxdWlja0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5xdWlja0ZpbHRlciA9IHF1aWNrRmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICB9XG5cbiAgICByZXNldEZvcm1GaWx0ZXJzKHJlc2V0UXVpY2tGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXM6IGFueSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFF1aWNrRmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcnMuZmluZCgoZikgPT4gZi5kZWZhdWx0KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB0aGlzLmZpbHRlckZvcm1RdWlja0ZpbHRlcktleSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNldFF1aWNrRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1trZXldID0gZGVmYXVsdFF1aWNrRmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB0aGlzLmRlZmF1bHRGaWx0ZXJGb3JtVmFsdWVzW2tleV0gPz8gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5zZXRWYWx1ZSh2YWx1ZXMpO1xuICAgICAgICB0aGlzLmFwcGx5Rm9ybUZpbHRlcnModmFsdWVzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JlZnJlc2goKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRQYWdlT3JSZWZyZXNoKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldFRhYmxlVmFsdWVzKGRhdGE6IFBhcnRpYWw8VGFibGVPcHRpb25zPiwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucz8uc2V0VmFsdWUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy50YWJsZU9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGVtaXRFdmVudCB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hhbmdlcyhwcmV2aW91czogVGFibGVPcHRpb25zLCBuZXh0OiBUYWJsZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlczogUGFydGlhbDxUYWJsZU9wdGlvbnM+ID0ge307XG5cbiAgICAgICAgbGV0IGtleToga2V5b2YgVGFibGVPcHRpb25zO1xuICAgICAgICBmb3IgKGtleSBpbiBuZXh0KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnc2VsZWN0ZWRSb3dzJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocHJldmlvdXNba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KG5leHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY2hhbmdlc1trZXldID0gbmV4dFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCA/IGNoYW5nZXMgOiBudWxsO1xuICAgIH1cbn1cbiJdfQ==