@paperless/angular 0.1.0-alpha.438 → 0.1.0-alpha.440

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