@yuuvis/client-core 0.6.5

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 (153) hide show
  1. package/README.md +111 -0
  2. package/esm2022/index.mjs +65 -0
  3. package/esm2022/lib/client-core.module.mjs +117 -0
  4. package/esm2022/lib/client-core.shared.module.mjs +18 -0
  5. package/esm2022/lib/common/pipes/filesize.pipe.mjs +37 -0
  6. package/esm2022/lib/common/pipes/index.mjs +6 -0
  7. package/esm2022/lib/common/pipes/keys.pipe.mjs +17 -0
  8. package/esm2022/lib/common/pipes/locale-date.pipe.mjs +45 -0
  9. package/esm2022/lib/common/pipes/locale-number.pipe.mjs +115 -0
  10. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +44 -0
  11. package/esm2022/lib/common/services/native-notifications.interface.mjs +2 -0
  12. package/esm2022/lib/common/services/native-notifications.mjs +40 -0
  13. package/esm2022/lib/model/dms-object.interface.mjs +2 -0
  14. package/esm2022/lib/model/dms-object.model.mjs +79 -0
  15. package/esm2022/lib/model/object-flavor.interface.mjs +2 -0
  16. package/esm2022/lib/model/range-value.interface.mjs +2 -0
  17. package/esm2022/lib/model/yuv-error.model.mjs +37 -0
  18. package/esm2022/lib/model/yuv-user.model.mjs +38 -0
  19. package/esm2022/lib/service/audit/audit.interface.mjs +2 -0
  20. package/esm2022/lib/service/audit/audit.service.mjs +135 -0
  21. package/esm2022/lib/service/auth/auth.interceptor.mjs +50 -0
  22. package/esm2022/lib/service/auth/auth.interface.mjs +7 -0
  23. package/esm2022/lib/service/auth/auth.service.mjs +130 -0
  24. package/esm2022/lib/service/auth/oidc.service.mjs +81 -0
  25. package/esm2022/lib/service/backend/api.enum.mjs +11 -0
  26. package/esm2022/lib/service/backend/backend.interface.mjs +2 -0
  27. package/esm2022/lib/service/backend/backend.service.mjs +206 -0
  28. package/esm2022/lib/service/bpm/bpm.interface.mjs +8 -0
  29. package/esm2022/lib/service/bpm/bpm.service.mjs +51 -0
  30. package/esm2022/lib/service/cache/app-cache.service.mjs +51 -0
  31. package/esm2022/lib/service/catalog/catalog.interface.mjs +2 -0
  32. package/esm2022/lib/service/catalog/catalog.service.mjs +13 -0
  33. package/esm2022/lib/service/clipboard/clipboard.interface.mjs +2 -0
  34. package/esm2022/lib/service/clipboard/clipboard.service.mjs +90 -0
  35. package/esm2022/lib/service/config/config.interface.mjs +6 -0
  36. package/esm2022/lib/service/config/config.service.mjs +115 -0
  37. package/esm2022/lib/service/config/core-config.mjs +20 -0
  38. package/esm2022/lib/service/config/core-config.tokens.mjs +9 -0
  39. package/esm2022/lib/service/connection/connection.service.mjs +36 -0
  40. package/esm2022/lib/service/connection/offline.interceptor.mjs +28 -0
  41. package/esm2022/lib/service/core-init/core-init.service.mjs +29 -0
  42. package/esm2022/lib/service/core-init/missing-translation-handler.mjs +10 -0
  43. package/esm2022/lib/service/core-init/translate-json-loader.mjs +117 -0
  44. package/esm2022/lib/service/device/device.interface.mjs +6 -0
  45. package/esm2022/lib/service/device/device.service.mjs +144 -0
  46. package/esm2022/lib/service/dms/dms.service.interface.mjs +2 -0
  47. package/esm2022/lib/service/dms/dms.service.mjs +440 -0
  48. package/esm2022/lib/service/event/event.interface.mjs +2 -0
  49. package/esm2022/lib/service/event/event.service.mjs +38 -0
  50. package/esm2022/lib/service/event/events.mjs +14 -0
  51. package/esm2022/lib/service/idm/idm.interface.mjs +2 -0
  52. package/esm2022/lib/service/idm/idm.service.mjs +34 -0
  53. package/esm2022/lib/service/logger/logger-console.service.mjs +73 -0
  54. package/esm2022/lib/service/logger/logger.interface.mjs +2 -0
  55. package/esm2022/lib/service/logger/logger.mjs +27 -0
  56. package/esm2022/lib/service/notification/notification.service.mjs +131 -0
  57. package/esm2022/lib/service/object-config/object-config.interface.mjs +2 -0
  58. package/esm2022/lib/service/object-config/object-config.service.mjs +229 -0
  59. package/esm2022/lib/service/pending-changes/pending-changes-component.interface.mjs +5 -0
  60. package/esm2022/lib/service/pending-changes/pending-changes-guard.service.mjs +25 -0
  61. package/esm2022/lib/service/pending-changes/pending-changes.service.mjs +123 -0
  62. package/esm2022/lib/service/prediction/prediction.interface.mjs +2 -0
  63. package/esm2022/lib/service/prediction/prediction.service.mjs +60 -0
  64. package/esm2022/lib/service/search/search.service.interface.mjs +39 -0
  65. package/esm2022/lib/service/search/search.service.mjs +178 -0
  66. package/esm2022/lib/service/session-storage/session-storage.service.mjs +50 -0
  67. package/esm2022/lib/service/system/object-form.interface.mjs +2 -0
  68. package/esm2022/lib/service/system/system.enum.mjs +179 -0
  69. package/esm2022/lib/service/system/system.interface.mjs +2 -0
  70. package/esm2022/lib/service/system/system.service.mjs +597 -0
  71. package/esm2022/lib/service/upload/upload.interface.mjs +2 -0
  72. package/esm2022/lib/service/upload/upload.service.mjs +228 -0
  73. package/esm2022/lib/service/user/user.service.mjs +211 -0
  74. package/esm2022/lib/util/utils.helper.enum.mjs +15 -0
  75. package/esm2022/lib/util/utils.mjs +373 -0
  76. package/esm2022/yuuvis-client-core.mjs +5 -0
  77. package/fesm2022/yuuvis-client-core.mjs +4775 -0
  78. package/fesm2022/yuuvis-client-core.mjs.map +1 -0
  79. package/index.d.ts +61 -0
  80. package/lib/client-core.module.d.ts +20 -0
  81. package/lib/client-core.shared.module.d.ts +10 -0
  82. package/lib/common/pipes/filesize.pipe.d.ts +18 -0
  83. package/lib/common/pipes/index.d.ts +5 -0
  84. package/lib/common/pipes/keys.pipe.d.ts +10 -0
  85. package/lib/common/pipes/locale-date.pipe.d.ts +12 -0
  86. package/lib/common/pipes/locale-number.pipe.d.ts +47 -0
  87. package/lib/common/pipes/safe-html.pipe.d.ts +28 -0
  88. package/lib/common/services/native-notifications.d.ts +8 -0
  89. package/lib/common/services/native-notifications.interface.d.ts +5 -0
  90. package/lib/model/dms-object.interface.d.ts +16 -0
  91. package/lib/model/dms-object.model.d.ts +26 -0
  92. package/lib/model/object-flavor.interface.d.ts +30 -0
  93. package/lib/model/range-value.interface.d.ts +9 -0
  94. package/lib/model/yuv-error.model.d.ts +18 -0
  95. package/lib/model/yuv-user.model.d.ts +44 -0
  96. package/lib/service/audit/audit.interface.d.ts +47 -0
  97. package/lib/service/audit/audit.service.d.ts +35 -0
  98. package/lib/service/auth/auth.interceptor.d.ts +12 -0
  99. package/lib/service/auth/auth.interface.d.ts +34 -0
  100. package/lib/service/auth/auth.service.d.ts +50 -0
  101. package/lib/service/auth/oidc.service.d.ts +16 -0
  102. package/lib/service/backend/api.enum.d.ts +7 -0
  103. package/lib/service/backend/backend.interface.d.ts +29 -0
  104. package/lib/service/backend/backend.service.d.ts +118 -0
  105. package/lib/service/bpm/bpm.interface.d.ts +86 -0
  106. package/lib/service/bpm/bpm.service.d.ts +19 -0
  107. package/lib/service/cache/app-cache.service.d.ts +18 -0
  108. package/lib/service/catalog/catalog.interface.d.ts +12 -0
  109. package/lib/service/catalog/catalog.service.d.ts +5 -0
  110. package/lib/service/clipboard/clipboard.interface.d.ts +11 -0
  111. package/lib/service/clipboard/clipboard.service.d.ts +23 -0
  112. package/lib/service/config/config.interface.d.ts +34 -0
  113. package/lib/service/config/config.service.d.ts +45 -0
  114. package/lib/service/config/core-config.d.ts +14 -0
  115. package/lib/service/config/core-config.tokens.d.ts +7 -0
  116. package/lib/service/connection/connection.service.d.ts +25 -0
  117. package/lib/service/connection/offline.interceptor.d.ts +15 -0
  118. package/lib/service/core-init/core-init.service.d.ts +11 -0
  119. package/lib/service/core-init/missing-translation-handler.d.ts +8 -0
  120. package/lib/service/core-init/translate-json-loader.d.ts +20 -0
  121. package/lib/service/device/device.interface.d.ts +15 -0
  122. package/lib/service/device/device.service.d.ts +54 -0
  123. package/lib/service/dms/dms.service.d.ts +153 -0
  124. package/lib/service/dms/dms.service.interface.d.ts +59 -0
  125. package/lib/service/event/event.interface.d.ts +13 -0
  126. package/lib/service/event/event.service.d.ts +23 -0
  127. package/lib/service/event/events.d.ts +12 -0
  128. package/lib/service/idm/idm.interface.d.ts +5 -0
  129. package/lib/service/idm/idm.service.d.ts +9 -0
  130. package/lib/service/logger/logger-console.service.d.ts +20 -0
  131. package/lib/service/logger/logger.d.ts +17 -0
  132. package/lib/service/logger/logger.interface.d.ts +10 -0
  133. package/lib/service/notification/notification.service.d.ts +71 -0
  134. package/lib/service/object-config/object-config.interface.d.ts +62 -0
  135. package/lib/service/object-config/object-config.service.d.ts +38 -0
  136. package/lib/service/pending-changes/pending-changes-component.interface.d.ts +6 -0
  137. package/lib/service/pending-changes/pending-changes-guard.service.d.ts +14 -0
  138. package/lib/service/pending-changes/pending-changes.service.d.ts +57 -0
  139. package/lib/service/prediction/prediction.interface.d.ts +18 -0
  140. package/lib/service/prediction/prediction.service.d.ts +15 -0
  141. package/lib/service/search/search.service.d.ts +46 -0
  142. package/lib/service/search/search.service.interface.d.ts +119 -0
  143. package/lib/service/session-storage/session-storage.service.d.ts +15 -0
  144. package/lib/service/system/object-form.interface.d.ts +46 -0
  145. package/lib/service/system/system.enum.d.ts +141 -0
  146. package/lib/service/system/system.interface.d.ts +146 -0
  147. package/lib/service/system/system.service.d.ts +168 -0
  148. package/lib/service/upload/upload.interface.d.ts +55 -0
  149. package/lib/service/upload/upload.service.d.ts +34 -0
  150. package/lib/service/user/user.service.d.ts +69 -0
  151. package/lib/util/utils.d.ts +118 -0
  152. package/lib/util/utils.helper.enum.d.ts +13 -0
  153. package/package.json +33 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS91cGxvYWQvdXBsb2FkLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG4vKipcbiAqIEludHJlZmljZSBmb3IgcHJvdmlkaW5nIGFuIHVwbG9hZGluZyBzdGF0dXMgb2YgYW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NTdGF0dXMge1xuICBpdGVtczogUHJvZ3Jlc3NTdGF0dXNJdGVtW107XG4gIGVycjogbnVtYmVyO1xufVxuLyoqXG4gKiBJcyBwYXJ0IG9mIHRoZSBgUHJvZ3Jlc3NTdGF0dXNgIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzU3RhdHVzSXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIHByb2dyZXNzOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICByZXN1bHQ/OiBVcGxvYWRSZXN1bHRbXTtcbiAgZXJyPzoge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gIH07XG59XG4vKipcbiAqIGlzIGEgcGFydCBvZiBgQ3JlYXRlZE9iamVjdGAgaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBDb250ZW50U3RyZWFtIHtcbiAgY29udGVudFN0cmVhbUlkOiBzdHJpbmc7XG4gIHJlcG9zaXRvcnlJZDogc3RyaW5nO1xuICBkaWdlc3Q6IHN0cmluZztcbiAgZmlsZU5hbWU6IHN0cmluZztcbiAgYXJjaGl2ZVBhdGg6IHN0cmluZztcbiAgbGVuZ3RoOiBudW1iZXI7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVyZmFjZSBwcm92aWRuZyBwcm9wZXJ0aWVzIG9mIHVwbG9hZGVkIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkUmVzdWx0IHtcbiAgb2JqZWN0SWQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBjb250ZW50U3RyZWFtSWQ6IHN0cmluZztcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRoYXQgd2FzIHVzZWQgYnkgdXBsb2FkIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVkT2JqZWN0IHtcbiAgYm9keT86IHtcbiAgICBvYmplY3RzOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBhbnk7XG4gICAgICBjb250ZW50U3RyZWFtcz86IENvbnRlbnRTdHJlYW1bXTtcbiAgICB9W107XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,228 @@
1
+ import { HttpClient, HttpEventType, HttpRequest, HttpResponse } from '@angular/common/http';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { BehaviorSubject, Observable, ReplaySubject, Subject, throwError } from 'rxjs';
4
+ import { catchError, filter, map, scan, tap } from 'rxjs/operators';
5
+ import { Utils } from '../../util/utils';
6
+ import { BackendService } from '../backend/backend.service';
7
+ import { Logger } from '../logger/logger';
8
+ import { BaseObjectTypeField } from '../system/system.enum';
9
+ import * as i0 from "@angular/core";
10
+ const transformResponse = () => map((res) => (res && res.body ? res.body.objects.map((val) => val) : null));
11
+ /**
12
+ * Service for providing upload of different object types into a client.
13
+ */
14
+ export class UploadService {
15
+ constructor() {
16
+ this.#backend = inject(BackendService);
17
+ this.#http = inject(HttpClient);
18
+ this.#logger = inject(Logger);
19
+ this.#status = { err: 0, items: [] };
20
+ this.#statusSource = new ReplaySubject();
21
+ this.status$ = this.#statusSource.pipe(scan((acc, newVal) => ({ ...acc, ...newVal }), this.#status));
22
+ this.#uploadStatus = new BehaviorSubject(null);
23
+ this.uploadStatus$ = this.#uploadStatus.asObservable();
24
+ }
25
+ #backend;
26
+ #http;
27
+ #logger;
28
+ #status;
29
+ #statusSource;
30
+ #uploadStatus;
31
+ /**
32
+ * Upload a file.
33
+ * @param url The URL to upload the file to
34
+ * @param file The file to be uploaded
35
+ * @param label A label that will show up in the upload overlay dialog while uploading
36
+ */
37
+ upload(url, file, label, silent) {
38
+ return this.#executeUpload(url, file, label || file.name, silent);
39
+ }
40
+ /**
41
+ * Upload files using multipart upload.
42
+ * @param url The URL to upload the files to
43
+ * @param files The files to be uploaded
44
+ * @param data Data to be send along with the files
45
+ * @param label A label that will show up in the upload overlay dialog while uploading
46
+ */
47
+ uploadMultipart(url, files, data, label, silent) {
48
+ return this.#executeMultipartUpload(url, files, label || 'Upload', data, silent);
49
+ }
50
+ createDocument(url, data) {
51
+ const formData = this.#createFormData({ data });
52
+ const request = this.#createHttpRequest(url, { formData }, false);
53
+ return this.#http.request(request).pipe(filter((obj) => obj && obj.body), transformResponse(), catchError((err) => throwError(() => err)));
54
+ }
55
+ /**
56
+ * Cancels an upload request and removes it from the list of files being uploaded.
57
+ * @param id ID of the UploadItem to be canceled
58
+ */
59
+ cancelItem(id) {
60
+ if (id) {
61
+ const match = this.#status.items.find((i) => i.id === id);
62
+ if (match) {
63
+ match.subscription.unsubscribe();
64
+ this.#status.items = this.#status.items.filter((i) => i.id !== id);
65
+ }
66
+ }
67
+ else {
68
+ this.#status.items.forEach((element) => element.subscription.unsubscribe());
69
+ this.#status.items = [];
70
+ }
71
+ this.#status.err = this.#status.items.filter((i) => i.err).length;
72
+ this.#statusSource.next(this.#status);
73
+ }
74
+ /**
75
+ * Prepares Formdata for multipart upload.
76
+ * @param from contains form and or file
77
+ */
78
+ #createFormData({ file, data }) {
79
+ const formData = new FormData();
80
+ (file || []).forEach((f) => formData.append('files', f, f.name));
81
+ data ? formData.append('data', new Blob([JSON.stringify(data)], { type: 'application/json' })) : null;
82
+ return formData;
83
+ }
84
+ /**
85
+ * Prepares Http Request.
86
+ * @param url The URL to upload the file to
87
+ * @param content formdata or single file
88
+ * @param reportProgress Request should report upload progress
89
+ * @param method Request method
90
+ */
91
+ #createHttpRequest(url, content, reportProgress, method = 'POST') {
92
+ const { formData, file } = content;
93
+ // add request param to bypass the serviceworker
94
+ url += `${url.indexOf('?') === -1 ? '?' : '&'}ngsw-bypass=1`;
95
+ let headers = this.#backend.getAuthHeaders();
96
+ if (file) {
97
+ headers = headers.set('Content-Disposition', `attachment; filename*=utf-8''${encodeURIComponent(file.name)}`);
98
+ }
99
+ return new HttpRequest(method, url, file || formData, { headers, reportProgress });
100
+ }
101
+ /**
102
+ * Prepares single file POST upload.
103
+ * @param url The URL to upload the file to
104
+ * @param file The file to be uploaded
105
+ * @param label A label that will show up in the upload overlay dialog while uploading
106
+ */
107
+ #executeUpload(url, file, label, silent = false) {
108
+ const request = this.#createHttpRequest(url, { file }, true);
109
+ return silent ? this.#http.request(request) : this.#startUploadWithFile(request, label).pipe(transformResponse());
110
+ }
111
+ /**
112
+ * Prepare multipart upload.
113
+ * @param url The URL to upload the file to
114
+ * @param file Array of files to be uploaded
115
+ * @param label A label that will show up in the upload overlay dialog while uploading
116
+ * @param data Data to be send along with the files
117
+ */
118
+ #executeMultipartUpload(url, file, label, data, silent = false) {
119
+ const formData = this.#createFormData({ file, data });
120
+ const request = this.#createHttpRequest(url, { formData }, true);
121
+ return silent ? this.#http.request(request) : this.#startUploadWithFile(request, label).pipe(transformResponse());
122
+ }
123
+ #generateResult(result) {
124
+ const objects = result.body?.objects;
125
+ if (objects && objects.length > 1) {
126
+ const data = objects[0];
127
+ // const bp = this.#system.getBaseProperties();
128
+ // const label = data.properties[bp.title] ? data.properties[bp.title].value : '...';
129
+ // TODO: Get the label from somewhere
130
+ const label = '...';
131
+ return [
132
+ {
133
+ objectId: objects.map((val) => val.properties[BaseObjectTypeField.OBJECT_ID].value),
134
+ contentStreamId: data.contentStreams[0]?.contentStreamId,
135
+ filename: data.contentStreams[0]?.fileName,
136
+ label: `(${objects.length}) ${label}`
137
+ }
138
+ ];
139
+ }
140
+ else {
141
+ return result.body.objects.map((o) => ({
142
+ objectId: o.properties[BaseObjectTypeField.OBJECT_ID].value,
143
+ contentStreamId: o.contentStreams[0]?.contentStreamId,
144
+ filename: o.contentStreams[0]?.fileName,
145
+ // label: o.properties[bp.title] ? o.properties[bp.title].value : o.contentStreams![0]?.fileName
146
+ // TODO: Get the label from somewhere
147
+ label: o.contentStreams[0]?.fileName
148
+ }));
149
+ }
150
+ }
151
+ #createProgressStatus(event, progress, id) {
152
+ if (event.type === HttpEventType.UploadProgress) {
153
+ const percentDone = Math.round((100 * event.loaded) / event.total);
154
+ progress.next(percentDone);
155
+ }
156
+ else if (event instanceof HttpResponse) {
157
+ progress.complete();
158
+ // add upload response
159
+ // this.status.items = this.status.items.filter(s => s.id !== id);
160
+ const idx = this.#status.items.findIndex((s) => s.id === id);
161
+ if (idx !== -1) {
162
+ this.#status.items[idx].result = this.#generateResult(event);
163
+ this.#statusSource.next(this.#status);
164
+ }
165
+ }
166
+ }
167
+ #createUploadError(err, progress, id) {
168
+ const statusItem = this.#status.items.find((s) => s.id === id);
169
+ statusItem.err = {
170
+ code: err.status,
171
+ message: err.error ? err.error.errorMessage : err.message
172
+ };
173
+ this.#logger.error('upload failed', statusItem);
174
+ this.#status.err++;
175
+ this.#statusSource.next(this.#status);
176
+ progress.next(0);
177
+ return throwError(() => new Error(err.message));
178
+ }
179
+ /**
180
+ * Actually starts the upload process.
181
+ * @param request Request to be executed
182
+ * @param label A label that will show up in the upload overlay dialog while uploading
183
+ */
184
+ #startUploadWithFile(request, label) {
185
+ return new Observable((o) => {
186
+ const id = Utils.uuid();
187
+ const progress = new Subject();
188
+ let result;
189
+ // Create a subscription from the http request that will be applied to the upload
190
+ // status item in order to be able to cancel the request later on.
191
+ this.#uploadStatus.next(false);
192
+ const subscription = this.#http
193
+ .request(request)
194
+ .pipe(catchError((err) => this.#createUploadError(err, progress, id)), tap((event) => this.#createProgressStatus(event, progress, id)))
195
+ // actual return value of this function
196
+ .subscribe({
197
+ next: (res) => (res.status ? (result = res) : null),
198
+ error: (err) => {
199
+ o.error(err);
200
+ this.#uploadStatus.next(true);
201
+ o.complete();
202
+ },
203
+ complete: () => {
204
+ o.next(result);
205
+ this.#uploadStatus.next(true);
206
+ o.complete();
207
+ }
208
+ });
209
+ this.#status.items.push({
210
+ id,
211
+ filename: label,
212
+ progress: progress.asObservable(),
213
+ subscription,
214
+ err: undefined
215
+ });
216
+ this.#statusSource.next(this.#status);
217
+ });
218
+ }
219
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
220
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadService, providedIn: 'root' }); }
221
+ }
222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadService, decorators: [{
223
+ type: Injectable,
224
+ args: [{
225
+ providedIn: 'root'
226
+ }]
227
+ }] });
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2UvdXBsb2FkL3VwbG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWdDLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFHNUQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRTNIOztHQUVHO0FBSUgsTUFBTSxPQUFP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LElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDZixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNmLENBQUM7YUFDRixDQUFDLENBQUM7WUFFTCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLEVBQUU7Z0JBQ0YsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUU7Z0JBQ2pDLFlBQVk7Z0JBQ1osR0FBRyxFQUFFLFNBQVM7YUFDZixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQXhOVSxhQUFhO21IQUFiLGFBQWEsY0FGWixNQUFNOzs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIHNjYW4sIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlscyc7XG5pbXBvcnQgeyBCYWNrZW5kU2VydmljZSB9IGZyb20gJy4uL2JhY2tlbmQvYmFja2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci9sb2dnZXInO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCB9IGZyb20gJy4uL3N5c3RlbS9zeXN0ZW0uZW51bSc7XG5pbXBvcnQgeyBDcmVhdGVkT2JqZWN0LCBQcm9ncmVzc1N0YXR1cywgVXBsb2FkUmVzdWx0IH0gZnJvbSAnLi91cGxvYWQuaW50ZXJmYWNlJztcblxuY29uc3QgdHJhbnNmb3JtUmVzcG9uc2UgPSAoKSA9PiBtYXAoKHJlczogQ3JlYXRlZE9iamVjdCkgPT4gKHJlcyAmJiByZXMuYm9keSA/IHJlcy5ib2R5Lm9iamVjdHMubWFwKCh2YWwpID0+IHZhbCkgOiBudWxsKSk7XG5cbi8qKlxuICogU2VydmljZSBmb3IgcHJvdmlkaW5nIHVwbG9hZCBvZiBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzIGludG8gYSBjbGllbnQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZFNlcnZpY2Uge1xuICByZWFkb25seSAjYmFja2VuZCA9IGluamVjdChCYWNrZW5kU2VydmljZSk7XG4gIHJlYWRvbmx5ICNodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICByZWFkb25seSAjbG9nZ2VyID0gaW5qZWN0KExvZ2dlcik7XG5cbiAgI3N0YXR1czogUHJvZ3Jlc3NTdGF0dXMgPSB7IGVycjogMCwgaXRlbXM6IFtdIH07XG4gICNzdGF0dXNTb3VyY2UgPSBuZXcgUmVwbGF5U3ViamVjdDxQcm9ncmVzc1N0YXR1cz4oKTtcbiAgc3RhdHVzJDogT2JzZXJ2YWJsZTxQcm9ncmVzc1N0YXR1cz4gPSB0aGlzLiNzdGF0dXNTb3VyY2UucGlwZShzY2FuKChhY2M6IFByb2dyZXNzU3RhdHVzLCBuZXdWYWwpID0+ICh7IC4uLmFjYywgLi4ubmV3VmFsIH0pLCB0aGlzLiNzdGF0dXMpKTtcbiAgI3VwbG9hZFN0YXR1cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8IG51bGw+KG51bGwpO1xuICB1cGxvYWRTdGF0dXMkOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBudWxsPiA9IHRoaXMuI3VwbG9hZFN0YXR1cy5hc09ic2VydmFibGUoKTtcblxuICAvKipcbiAgICogVXBsb2FkIGEgZmlsZS5cbiAgICogQHBhcmFtIHVybCBUaGUgVVJMIHRvIHVwbG9hZCB0aGUgZmlsZSB0b1xuICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBiZSB1cGxvYWRlZFxuICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCB0aGF0IHdpbGwgc2hvdyB1cCBpbiB0aGUgdXBsb2FkIG92ZXJsYXkgZGlhbG9nIHdoaWxlIHVwbG9hZGluZ1xuICAgKi9cbiAgdXBsb2FkKHVybDogc3RyaW5nLCBmaWxlOiBGaWxlLCBsYWJlbD86IHN0cmluZywgc2lsZW50PzogYm9vbGVhbik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuI2V4ZWN1dGVVcGxvYWQodXJsLCBmaWxlLCBsYWJlbCB8fCBmaWxlLm5hbWUsIHNpbGVudCk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGZpbGVzIHVzaW5nIG11bHRpcGFydCB1cGxvYWQuXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB1cGxvYWQgdGhlIGZpbGVzIHRvXG4gICAqIEBwYXJhbSBmaWxlcyBUaGUgZmlsZXMgdG8gYmUgdXBsb2FkZWRcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBzZW5kIGFsb25nIHdpdGggdGhlIGZpbGVzXG4gICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHRoYXQgd2lsbCBzaG93IHVwIGluIHRoZSB1cGxvYWQgb3ZlcmxheSBkaWFsb2cgd2hpbGUgdXBsb2FkaW5nXG4gICAqL1xuICB1cGxvYWRNdWx0aXBhcnQodXJsOiBzdHJpbmcsIGZpbGVzOiBGaWxlW10sIGRhdGE/OiBhbnksIGxhYmVsPzogc3RyaW5nLCBzaWxlbnQ/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jZXhlY3V0ZU11bHRpcGFydFVwbG9hZCh1cmwsIGZpbGVzLCBsYWJlbCB8fCAnVXBsb2FkJywgZGF0YSwgc2lsZW50KTtcbiAgfVxuXG4gIGNyZWF0ZURvY3VtZW50KHVybDogc3RyaW5nLCBkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IHRoaXMuI2NyZWF0ZUZvcm1EYXRhKHsgZGF0YSB9KTtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy4jY3JlYXRlSHR0cFJlcXVlc3QodXJsLCB7IGZvcm1EYXRhIH0sIGZhbHNlKTtcbiAgICByZXR1cm4gdGhpcy4jaHR0cC5yZXF1ZXN0KHJlcXVlc3QpLnBpcGUoXG4gICAgICBmaWx0ZXIoKG9iajogYW55KSA9PiBvYmogJiYgb2JqLmJvZHkpLFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2UoKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4gdGhyb3dFcnJvcigoKSA9PiBlcnIpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhbiB1cGxvYWQgcmVxdWVzdCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBsaXN0IG9mIGZpbGVzIGJlaW5nIHVwbG9hZGVkLlxuICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIFVwbG9hZEl0ZW0gdG8gYmUgY2FuY2VsZWRcbiAgICovXG4gIGNhbmNlbEl0ZW0oaWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy4jc3RhdHVzLml0ZW1zLmZpbmQoKGkpID0+IGkuaWQgPT09IGlkKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBtYXRjaC5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy4jc3RhdHVzLml0ZW1zID0gdGhpcy4jc3RhdHVzLml0ZW1zLmZpbHRlcigoaSkgPT4gaS5pZCAhPT0gaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNzdGF0dXMuaXRlbXMuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICB0aGlzLiNzdGF0dXMuaXRlbXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy4jc3RhdHVzLmVyciA9IHRoaXMuI3N0YXR1cy5pdGVtcy5maWx0ZXIoKGkpID0+IGkuZXJyKS5sZW5ndGg7XG4gICAgdGhpcy4jc3RhdHVzU291cmNlLm5leHQodGhpcy4jc3RhdHVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBGb3JtZGF0YSBmb3IgbXVsdGlwYXJ0IHVwbG9hZC5cbiAgICogQHBhcmFtIGZyb20gY29udGFpbnMgZm9ybSBhbmQgb3IgZmlsZVxuICAgKi9cbiAgI2NyZWF0ZUZvcm1EYXRhKHsgZmlsZSwgZGF0YSB9OiB7IGRhdGE/OiBhbnk7IGZpbGU/OiBGaWxlW10gfSk6IEZvcm1EYXRhIHtcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAoZmlsZSB8fCBbXSkuZm9yRWFjaCgoZikgPT4gZm9ybURhdGEuYXBwZW5kKCdmaWxlcycsIGYsIGYubmFtZSkpO1xuICAgIGRhdGEgPyBmb3JtRGF0YS5hcHBlbmQoJ2RhdGEnLCBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSkgOiBudWxsO1xuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBIdHRwIFJlcXVlc3QuXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB1cGxvYWQgdGhlIGZpbGUgdG9cbiAgICogQHBhcmFtIGNvbnRlbnQgZm9ybWRhdGEgb3Igc2luZ2xlIGZpbGVcbiAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIFJlcXVlc3Qgc2hvdWxkIHJlcG9ydCB1cGxvYWQgcHJvZ3Jlc3NcbiAgICogQHBhcmFtIG1ldGhvZCBSZXF1ZXN0IG1ldGhvZFxuICAgKi9cbiAgI2NyZWF0ZUh0dHBSZXF1ZXN0KHVybDogc3RyaW5nLCBjb250ZW50OiBQYXJ0aWFsPHsgZm9ybURhdGE6IEZvcm1EYXRhOyBmaWxlOiBGaWxlIH0+LCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiwgbWV0aG9kID0gJ1BPU1QnKTogSHR0cFJlcXVlc3Q8YW55PiB7XG4gICAgY29uc3QgeyBmb3JtRGF0YSwgZmlsZSB9ID0gY29udGVudDtcbiAgICAvLyBhZGQgcmVxdWVzdCBwYXJhbSB0byBieXBhc3MgdGhlIHNlcnZpY2V3b3JrZXJcbiAgICB1cmwgKz0gYCR7dXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJid9bmdzdy1ieXBhc3M9MWA7XG5cbiAgICBsZXQgaGVhZGVycyA9IHRoaXMuI2JhY2tlbmQuZ2V0QXV0aEhlYWRlcnMoKTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJywgYGF0dGFjaG1lbnQ7IGZpbGVuYW1lKj11dGYtOCcnJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZS5uYW1lKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh0dHBSZXF1ZXN0KG1ldGhvZCwgdXJsLCBmaWxlIHx8IGZvcm1EYXRhLCB7IGhlYWRlcnMsIHJlcG9ydFByb2dyZXNzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIHNpbmdsZSBmaWxlIFBPU1QgdXBsb2FkLlxuICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgdG8gdXBsb2FkIHRoZSBmaWxlIHRvXG4gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkXG4gICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHRoYXQgd2lsbCBzaG93IHVwIGluIHRoZSB1cGxvYWQgb3ZlcmxheSBkaWFsb2cgd2hpbGUgdXBsb2FkaW5nXG4gICAqL1xuICAjZXhlY3V0ZVVwbG9hZCh1cmw6IHN0cmluZywgZmlsZTogRmlsZSwgbGFiZWw6IHN0cmluZywgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNjcmVhdGVIdHRwUmVxdWVzdCh1cmwsIHsgZmlsZSB9LCB0cnVlKTtcbiAgICByZXR1cm4gc2lsZW50ID8gdGhpcy4jaHR0cC5yZXF1ZXN0KHJlcXVlc3QpIDogdGhpcy4jc3RhcnRVcGxvYWRXaXRoRmlsZShyZXF1ZXN0LCBsYWJlbCkucGlwZSh0cmFuc2Zvcm1SZXNwb25zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIG11bHRpcGFydCB1cGxvYWQuXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCB0byB1cGxvYWQgdGhlIGZpbGUgdG9cbiAgICogQHBhcmFtIGZpbGUgQXJyYXkgb2YgZmlsZXMgdG8gYmUgdXBsb2FkZWRcbiAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlIHVwbG9hZCBvdmVybGF5IGRpYWxvZyB3aGlsZSB1cGxvYWRpbmdcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBzZW5kIGFsb25nIHdpdGggdGhlIGZpbGVzXG4gICAqL1xuICAjZXhlY3V0ZU11bHRpcGFydFVwbG9hZCh1cmw6IHN0cmluZywgZmlsZTogRmlsZVtdLCBsYWJlbDogc3RyaW5nLCBkYXRhPzogYW55LCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gdGhpcy4jY3JlYXRlRm9ybURhdGEoeyBmaWxlLCBkYXRhIH0pO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNjcmVhdGVIdHRwUmVxdWVzdCh1cmwsIHsgZm9ybURhdGEgfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHNpbGVudCA/IHRoaXMuI2h0dHAucmVxdWVzdChyZXF1ZXN0KSA6IHRoaXMuI3N0YXJ0VXBsb2FkV2l0aEZpbGUocmVxdWVzdCwgbGFiZWwpLnBpcGUodHJhbnNmb3JtUmVzcG9uc2UoKSk7XG4gIH1cblxuICAjZ2VuZXJhdGVSZXN1bHQocmVzdWx0OiBDcmVhdGVkT2JqZWN0KTogVXBsb2FkUmVzdWx0W10ge1xuICAgIGNvbnN0IG9iamVjdHMgPSByZXN1bHQuYm9keT8ub2JqZWN0cztcbiAgICBpZiAob2JqZWN0cyAmJiBvYmplY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBvYmplY3RzWzBdO1xuICAgICAgLy8gY29uc3QgYnAgPSB0aGlzLiNzeXN0ZW0uZ2V0QmFzZVByb3BlcnRpZXMoKTtcbiAgICAgIC8vIGNvbnN0IGxhYmVsID0gZGF0YS5wcm9wZXJ0aWVzW2JwLnRpdGxlXSA/IGRhdGEucHJvcGVydGllc1ticC50aXRsZV0udmFsdWUgOiAnLi4uJztcbiAgICAgIC8vIFRPRE86IEdldCB0aGUgbGFiZWwgZnJvbSBzb21ld2hlcmVcbiAgICAgIGNvbnN0IGxhYmVsID0gJy4uLic7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgb2JqZWN0SWQ6IG9iamVjdHMubWFwKCh2YWw6IGFueSkgPT4gdmFsLnByb3BlcnRpZXNbQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSURdLnZhbHVlKSxcbiAgICAgICAgICBjb250ZW50U3RyZWFtSWQ6IGRhdGEuY29udGVudFN0cmVhbXMhWzBdPy5jb250ZW50U3RyZWFtSWQsXG4gICAgICAgICAgZmlsZW5hbWU6IGRhdGEuY29udGVudFN0cmVhbXMhWzBdPy5maWxlTmFtZSxcbiAgICAgICAgICBsYWJlbDogYCgke29iamVjdHMubGVuZ3RofSkgJHtsYWJlbH1gXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHQuYm9keSEub2JqZWN0cy5tYXAoKG8pID0+ICh7XG4gICAgICAgIG9iamVjdElkOiBvLnByb3BlcnRpZXNbQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSURdLnZhbHVlLFxuICAgICAgICBjb250ZW50U3RyZWFtSWQ6IG8uY29udGVudFN0cmVhbXMhWzBdPy5jb250ZW50U3RyZWFtSWQsXG4gICAgICAgIGZpbGVuYW1lOiBvLmNvbnRlbnRTdHJlYW1zIVswXT8uZmlsZU5hbWUsXG4gICAgICAgIC8vIGxhYmVsOiBvLnByb3BlcnRpZXNbYnAudGl0bGVdID8gby5wcm9wZXJ0aWVzW2JwLnRpdGxlXS52YWx1ZSA6IG8uY29udGVudFN0cmVhbXMhWzBdPy5maWxlTmFtZVxuICAgICAgICAvLyBUT0RPOiBHZXQgdGhlIGxhYmVsIGZyb20gc29tZXdoZXJlXG4gICAgICAgIGxhYmVsOiBvLmNvbnRlbnRTdHJlYW1zIVswXT8uZmlsZU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICAjY3JlYXRlUHJvZ3Jlc3NTdGF0dXMoZXZlbnQ6IGFueSwgcHJvZ3Jlc3M6IFN1YmplY3Q8bnVtYmVyPiwgaWQ6IHN0cmluZykge1xuICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKSB7XG4gICAgICBjb25zdCBwZXJjZW50RG9uZSA9IE1hdGgucm91bmQoKDEwMCAqIGV2ZW50LmxvYWRlZCkgLyBldmVudC50b3RhbCk7XG4gICAgICBwcm9ncmVzcy5uZXh0KHBlcmNlbnREb25lKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICBwcm9ncmVzcy5jb21wbGV0ZSgpO1xuICAgICAgLy8gYWRkIHVwbG9hZCByZXNwb25zZVxuICAgICAgLy8gdGhpcy5zdGF0dXMuaXRlbXMgPSB0aGlzLnN0YXR1cy5pdGVtcy5maWx0ZXIocyA9PiBzLmlkICE9PSBpZCk7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLiNzdGF0dXMuaXRlbXMuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBpZCk7XG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLiNzdGF0dXMuaXRlbXNbaWR4XS5yZXN1bHQgPSB0aGlzLiNnZW5lcmF0ZVJlc3VsdChldmVudCk7XG4gICAgICAgIHRoaXMuI3N0YXR1c1NvdXJjZS5uZXh0KHRoaXMuI3N0YXR1cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2NyZWF0ZVVwbG9hZEVycm9yKGVycjogSHR0cEVycm9yUmVzcG9uc2UsIHByb2dyZXNzOiBTdWJqZWN0PG51bWJlcj4sIGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEh0dHBFcnJvclJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc3RhdHVzSXRlbSA9IHRoaXMuI3N0YXR1cy5pdGVtcy5maW5kKChzKSA9PiBzLmlkID09PSBpZCk7XG4gICAgc3RhdHVzSXRlbSEuZXJyID0ge1xuICAgICAgY29kZTogZXJyLnN0YXR1cyxcbiAgICAgIG1lc3NhZ2U6IGVyci5lcnJvciA/IGVyci5lcnJvci5lcnJvck1lc3NhZ2UgOiBlcnIubWVzc2FnZVxuICAgIH07XG4gICAgdGhpcy4jbG9nZ2VyLmVycm9yKCd1cGxvYWQgZmFpbGVkJywgc3RhdHVzSXRlbSk7XG4gICAgdGhpcy4jc3RhdHVzLmVycisrO1xuICAgIHRoaXMuI3N0YXR1c1NvdXJjZS5uZXh0KHRoaXMuI3N0YXR1cyk7XG4gICAgcHJvZ3Jlc3MubmV4dCgwKTtcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSBzdGFydHMgdGhlIHVwbG9hZCBwcm9jZXNzLlxuICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHRoYXQgd2lsbCBzaG93IHVwIGluIHRoZSB1cGxvYWQgb3ZlcmxheSBkaWFsb2cgd2hpbGUgdXBsb2FkaW5nXG4gICAqL1xuICAjc3RhcnRVcGxvYWRXaXRoRmlsZShyZXF1ZXN0OiBhbnksIGxhYmVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENyZWF0ZWRPYmplY3Q+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG86IGFueSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBVdGlscy51dWlkKCk7XG4gICAgICBjb25zdCBwcm9ncmVzcyA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcbiAgICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICAgIC8vIENyZWF0ZSBhIHN1YnNjcmlwdGlvbiBmcm9tIHRoZSBodHRwIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHVwbG9hZFxuICAgICAgLy8gc3RhdHVzIGl0ZW0gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgbGF0ZXIgb24uXG4gICAgICB0aGlzLiN1cGxvYWRTdGF0dXMubmV4dChmYWxzZSk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLiNodHRwXG4gICAgICAgIC5yZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuI2NyZWF0ZVVwbG9hZEVycm9yKGVyciwgcHJvZ3Jlc3MsIGlkKSksXG4gICAgICAgICAgdGFwKChldmVudDogSHR0cEVycm9yUmVzcG9uc2UgfCBIdHRwRXZlbnQ8dW5rbm93bj4pID0+IHRoaXMuI2NyZWF0ZVByb2dyZXNzU3RhdHVzKGV2ZW50LCBwcm9ncmVzcywgaWQpKVxuICAgICAgICApXG4gICAgICAgIC8vIGFjdHVhbCByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IChyZXMuc3RhdHVzID8gKHJlc3VsdCA9IHJlcykgOiBudWxsKSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgby5lcnJvcihlcnIpO1xuICAgICAgICAgICAgdGhpcy4jdXBsb2FkU3RhdHVzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBvLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgby5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLiN1cGxvYWRTdGF0dXMubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIG8uY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLiNzdGF0dXMuaXRlbXMucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBmaWxlbmFtZTogbGFiZWwsXG4gICAgICAgIHByb2dyZXNzOiBwcm9ncmVzcy5hc09ic2VydmFibGUoKSxcbiAgICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgICBlcnI6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICB0aGlzLiNzdGF0dXNTb3VyY2UubmV4dCh0aGlzLiNzdGF0dXMpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,211 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { TranslateService } from '@ngx-translate/core';
4
+ import { BehaviorSubject, forkJoin, of } from 'rxjs';
5
+ import { catchError, map, switchMap, tap } from 'rxjs/operators';
6
+ import { YuvUser } from '../../model/yuv-user.model';
7
+ import { OidcService } from '../auth/oidc.service';
8
+ import { BackendService } from '../backend/backend.service';
9
+ import { Direction } from '../config/config.interface';
10
+ import { ConfigService } from '../config/config.service';
11
+ import { EventService } from '../event/event.service';
12
+ import { YuvEventType } from '../event/events';
13
+ import { Logger } from '../logger/logger';
14
+ import { AdministrationRoles } from '../system/system.enum';
15
+ import { SystemService } from '../system/system.service';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../backend/backend.service";
18
+ import * as i2 from "@ngx-translate/core";
19
+ import * as i3 from "../logger/logger";
20
+ import * as i4 from "../system/system.service";
21
+ import * as i5 from "../auth/oidc.service";
22
+ import * as i6 from "../event/event.service";
23
+ import * as i7 from "../config/config.service";
24
+ /**
25
+ * Service providing user account configurations.
26
+ */
27
+ export class UserService {
28
+ // #GLOBAL_SETTINGS = '/users/globalsettings/';
29
+ #USERS_SETTINGS;
30
+ #DEFAULT_SETTINGS;
31
+ #SETTINGS_SECTION_OBJECTCONFIG;
32
+ #user;
33
+ #userSource;
34
+ /**
35
+ * @ignore
36
+ */
37
+ constructor(backend, translate, logger, system, oidc, eventService, config) {
38
+ this.backend = backend;
39
+ this.translate = translate;
40
+ this.logger = logger;
41
+ this.system = system;
42
+ this.oidc = oidc;
43
+ this.eventService = eventService;
44
+ this.config = config;
45
+ // #GLOBAL_SETTINGS = '/users/globalsettings/';
46
+ this.#USERS_SETTINGS = '/users/settings/';
47
+ this.#DEFAULT_SETTINGS = '/users/settings';
48
+ this.#SETTINGS_SECTION_OBJECTCONFIG = 'object-config';
49
+ this.#userSource = new BehaviorSubject(this.#user);
50
+ this.user$ = this.#userSource.asObservable();
51
+ this.globalSettings = new Map();
52
+ this.canCreateObjects = false;
53
+ }
54
+ getUiDirection(iso) {
55
+ // languages that are read right to left
56
+ const rtlLanguages = ['ar', 'arc', 'dv', 'fa', 'ha', 'he', 'khw', 'ks', 'ku', 'ps', 'ur', 'yi'];
57
+ return rtlLanguages.indexOf(iso) === -1 ? Direction.LTR : Direction.RTL;
58
+ }
59
+ /**
60
+ * Set a new current user
61
+ * @param user The user to be set as current user
62
+ */
63
+ setCurrentUser(user) {
64
+ this.#user = user;
65
+ this.changeClientLocale('', false);
66
+ this.#userSource.next(this.#user);
67
+ }
68
+ getCurrentUser() {
69
+ return this.#user;
70
+ }
71
+ get hasAdminRole() {
72
+ return this.#user?.authorities?.includes(AdministrationRoles.ADMIN) || false;
73
+ }
74
+ get hasSystemRole() {
75
+ return this.#user?.authorities?.includes(AdministrationRoles.SYSTEM) || false;
76
+ }
77
+ get hasAdministrationRoles() {
78
+ return this.hasAdminRole || this.hasSystemRole;
79
+ }
80
+ get hasManageSettingsRole() {
81
+ const customRole = this.config.get('core.permissions.manageSettingsRole');
82
+ const manageSettingsRole = customRole || AdministrationRoles.MANAGE_SETTINGS;
83
+ return this.#user?.authorities?.includes(manageSettingsRole) || false;
84
+ }
85
+ get isAdvancedUser() {
86
+ const customRole = this.config.get('core.permissions.advancedUserRole');
87
+ const advancedUserRole = customRole || AdministrationRoles.MANAGE_SETTINGS;
88
+ return this.#user?.authorities?.includes(advancedUserRole) || false;
89
+ }
90
+ get isRetentionManager() {
91
+ const customRole = this.config.get('core.permissions.retentionManagerRole');
92
+ const retenetionManagerRole = customRole || AdministrationRoles.MANAGE_SETTINGS;
93
+ return this.#user?.authorities?.includes(retenetionManagerRole) || false;
94
+ }
95
+ /**
96
+ * Change the users client locale
97
+ * @param iso ISO locale string to be set as new client locale
98
+ */
99
+ changeClientLocale(iso, persist = true) {
100
+ if (this.#user) {
101
+ const languages = this.config.getClientLocales().map((lang) => lang.iso);
102
+ iso = iso || this.#user.getClientLocale(this.config.getDefaultClientLocale());
103
+ if (!languages.includes(iso)) {
104
+ iso = this.config.getDefaultClientLocale();
105
+ }
106
+ this.logger.debug("Changed client locale to '" + iso + "'");
107
+ this.backend.setHeader('Accept-Language', iso);
108
+ this.#user.uiDirection = this.getUiDirection(iso);
109
+ this.#user.userSettings.locale = iso;
110
+ if (this.translate.currentLang !== iso || this.system.authData?.language !== iso) {
111
+ const ob = persist
112
+ ? forkJoin([
113
+ this.translate.use(iso),
114
+ this.system.updateLocalizations(iso),
115
+ this.saveUserSettings(this.#user.userSettings).pipe(tap(() => {
116
+ // this.#userSource.next(this.#user);
117
+ this.logger.debug('Loading system definitions i18n resources for new locale.');
118
+ }))
119
+ ])
120
+ : this.translate.use(iso);
121
+ ob.subscribe(() => this.eventService.trigger(YuvEventType.CLIENT_LOCALE_CHANGED, iso));
122
+ }
123
+ }
124
+ }
125
+ saveUserSettings(settings) {
126
+ if (this.#user) {
127
+ console.log(this.#user.userSettings);
128
+ this.#user.userSettings = { ...this.#user.userSettings, ...settings };
129
+ return this.backend.post(this.#DEFAULT_SETTINGS, this.#user.userSettings).pipe(tap(() => this.#userSource.next(this.#user)));
130
+ }
131
+ else
132
+ return of(null);
133
+ }
134
+ fetchUserSettings() {
135
+ return this.backend.get('/dms/permissions').pipe(catchError((e) => of(undefined)), switchMap((res) => {
136
+ this.setUserPermissions(res);
137
+ return this.backend.get(this.#DEFAULT_SETTINGS);
138
+ }));
139
+ }
140
+ setUserPermissions(res) {
141
+ this.userPermissions = {
142
+ create: this.mapPermissions('CREATE', res),
143
+ write: this.mapPermissions('WRITE', res),
144
+ read: this.mapPermissions('READ', res),
145
+ delete: this.mapPermissions('DELETE', res)
146
+ };
147
+ const sp = {
148
+ createableObjectTypes: [
149
+ ...this.userPermissions.create.folderTypes,
150
+ ...this.userPermissions.create.objectTypes,
151
+ ...this.userPermissions.create.secondaryObjectTypes
152
+ ],
153
+ searchableObjectTypes: [
154
+ ...this.userPermissions.read.folderTypes,
155
+ ...this.userPermissions.read.objectTypes,
156
+ ...this.userPermissions.read.secondaryObjectTypes
157
+ ]
158
+ };
159
+ this.system.setPermissions(sp);
160
+ this.canCreateObjects = sp.createableObjectTypes.length > 0;
161
+ }
162
+ mapPermissions(section, apiResponse) {
163
+ const res = apiResponse[section] || {};
164
+ return {
165
+ folderTypes: res['folderTypeIds'] || [],
166
+ objectTypes: res['objectTypeIds'] || [],
167
+ secondaryObjectTypes: res['secondaryObjectTypeIds'] || []
168
+ };
169
+ }
170
+ /**
171
+ * Search for a user based on a search term
172
+ * @param term Search term
173
+ * @param excludeMe whether or not to exclude myself from the result list
174
+ * @param roles narrow down the search results by certain roles
175
+ */
176
+ queryUser(term, excludeMe, roles) {
177
+ let params = new HttpParams().set('search', term).set('excludeMe', `${!!excludeMe}`);
178
+ roles?.length && roles.map((r) => (params = params.append(`roles`, r)));
179
+ return this.backend.get(`/idm/users?${params}`).pipe(map((users) => (!users ? [] : users.map((u) => new YuvUser(u)))));
180
+ }
181
+ getUserById(id) {
182
+ return this.backend.get(`/idm/users/${id}`).pipe(map((user) => new YuvUser(user, this.#user.userSettings)));
183
+ }
184
+ logout(redirRoute) {
185
+ if (this.backend.authUsesOpenIdConnect()) {
186
+ this.oidc.logout();
187
+ }
188
+ else {
189
+ const redir = redirRoute ? `?redir=${redirRoute}` : '';
190
+ window.location.href = `${this.backend.getApiBase('logout')}${redir}`;
191
+ }
192
+ }
193
+ getSettings(section) {
194
+ return this.#user ? this.backend.get(this.#USERS_SETTINGS + encodeURIComponent(section)) : of(null);
195
+ }
196
+ saveObjectConfig(objectConfigs) {
197
+ return this.backend.post(this.#USERS_SETTINGS + encodeURIComponent(this.#SETTINGS_SECTION_OBJECTCONFIG), objectConfigs);
198
+ }
199
+ loadObjectConfig() {
200
+ return this.getSettings(this.#SETTINGS_SECTION_OBJECTCONFIG).pipe(catchError(() => of(undefined)));
201
+ }
202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserService, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: i3.Logger }, { token: i4.SystemService }, { token: i5.OidcService }, { token: i6.EventService }, { token: i7.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
203
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserService, providedIn: 'root' }); }
204
+ }
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserService, decorators: [{
206
+ type: Injectable,
207
+ args: [{
208
+ providedIn: 'root'
209
+ }]
210
+ }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: i3.Logger }, { type: i4.SystemService }, { type: i5.OidcService }, { type: i6.EventService }, { type: i7.ConfigService }] });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL3VzZXIvdXNlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFnQixPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFHekQ7O0dBRUc7QUFJSCxNQUFN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cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFVzZXJTZXR0aW5ncywgWXV2VXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3l1di11c2VyLm1vZGVsJztcbmltcG9ydCB7IE9pZGNTZXJ2aWNlIH0gZnJvbSAnLi4vYXV0aC9vaWRjLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFja2VuZFNlcnZpY2UgfSBmcm9tICcuLi9iYWNrZW5kL2JhY2tlbmQuc2VydmljZSc7XG5pbXBvcnQgeyBEaXJlY3Rpb24gfSBmcm9tICcuLi9jb25maWcvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uL2V2ZW50L2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgWXV2RXZlbnRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvZXZlbnRzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci9sb2dnZXInO1xuaW1wb3J0IHsgQWRtaW5pc3RyYXRpb25Sb2xlcyB9IGZyb20gJy4uL3N5c3RlbS9zeXN0ZW0uZW51bSc7XG5pbXBvcnQgeyBVc2VyUGVybWlzc2lvbnMsIFVzZXJQZXJtaXNzaW9uc1NlY3Rpb24gfSBmcm9tICcuLi9zeXN0ZW0vc3lzdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTeXN0ZW1TZXJ2aWNlIH0gZnJvbSAnLi4vc3lzdGVtL3N5c3RlbS5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JlZE9iamVjdENvbmZpZyB9IGZyb20gJy4uL29iamVjdC1jb25maWcvb2JqZWN0LWNvbmZpZy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIFNlcnZpY2UgcHJvdmlkaW5nIHVzZXIgYWNjb3VudCBjb25maWd1cmF0aW9ucy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVXNlclNlcnZpY2Uge1xuICAvLyAjR0xPQkFMX1NFVFRJTkdTID0gJy91c2Vycy9nbG9iYWxzZXR0aW5ncy8nO1xuICAjVVNFUlNfU0VUVElOR1MgPSAnL3VzZXJzL3NldHRpbmdzLyc7XG4gICNERUZBVUxUX1NFVFRJTkdTID0gJy91c2Vycy9zZXR0aW5ncyc7XG5cbiAgI1NFVFRJTkdTX1NFQ1RJT05fT0JKRUNUQ09ORklHID0gJ29iamVjdC1jb25maWcnO1xuXG4gICN1c2VyPzogWXV2VXNlcjtcbiAgI3VzZXJTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFl1dlVzZXIgfCB1bmRlZmluZWQ+KHRoaXMuI3VzZXIpO1xuICB1c2VyJDogT2JzZXJ2YWJsZTxZdXZVc2VyIHwgdW5kZWZpbmVkPiA9IHRoaXMuI3VzZXJTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgZ2xvYmFsU2V0dGluZ3MgPSBuZXcgTWFwKCk7XG4gIHVzZXJQZXJtaXNzaW9ucz86IFVzZXJQZXJtaXNzaW9ucztcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYWNrZW5kOiBCYWNrZW5kU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHByaXZhdGUgc3lzdGVtOiBTeXN0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgb2lkYzogT2lkY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXRVaURpcmVjdGlvbihpc286IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gbGFuZ3VhZ2VzIHRoYXQgYXJlIHJlYWQgcmlnaHQgdG8gbGVmdFxuICAgIGNvbnN0IHJ0bExhbmd1YWdlcyA9IFsnYXInLCAnYXJjJywgJ2R2JywgJ2ZhJywgJ2hhJywgJ2hlJywgJ2todycsICdrcycsICdrdScsICdwcycsICd1cicsICd5aSddO1xuICAgIHJldHVybiBydGxMYW5ndWFnZXMuaW5kZXhPZihpc28pID09PSAtMSA/IERpcmVjdGlvbi5MVFIgOiBEaXJlY3Rpb24uUlRMO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG5ldyBjdXJyZW50IHVzZXJcbiAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgdG8gYmUgc2V0IGFzIGN1cnJlbnQgdXNlclxuICAgKi9cbiAgcHVibGljIHNldEN1cnJlbnRVc2VyKHVzZXI6IFl1dlVzZXIpIHtcbiAgICB0aGlzLiN1c2VyID0gdXNlcjtcbiAgICB0aGlzLmNoYW5nZUNsaWVudExvY2FsZSgnJywgZmFsc2UpO1xuICAgIHRoaXMuI3VzZXJTb3VyY2UubmV4dCh0aGlzLiN1c2VyKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRVc2VyKCk6IFl1dlVzZXIge1xuICAgIHJldHVybiB0aGlzLiN1c2VyITtcbiAgfVxuXG4gIGdldCBoYXNBZG1pblJvbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI3VzZXI/LmF1dGhvcml0aWVzPy5pbmNsdWRlcyhBZG1pbmlzdHJhdGlvblJvbGVzLkFETUlOKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBoYXNTeXN0ZW1Sb2xlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiN1c2VyPy5hdXRob3JpdGllcz8uaW5jbHVkZXMoQWRtaW5pc3RyYXRpb25Sb2xlcy5TWVNURU0pIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhhc0FkbWluaXN0cmF0aW9uUm9sZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQWRtaW5Sb2xlIHx8IHRoaXMuaGFzU3lzdGVtUm9sZTtcbiAgfVxuXG4gIGdldCBoYXNNYW5hZ2VTZXR0aW5nc1JvbGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VzdG9tUm9sZSA9IHRoaXMuY29uZmlnLmdldCgnY29yZS5wZXJtaXNzaW9ucy5tYW5hZ2VTZXR0aW5nc1JvbGUnKTtcbiAgICBjb25zdCBtYW5hZ2VTZXR0aW5nc1JvbGUgPSBjdXN0b21Sb2xlIHx8IEFkbWluaXN0cmF0aW9uUm9sZXMuTUFOQUdFX1NFVFRJTkdTO1xuICAgIHJldHVybiB0aGlzLiN1c2VyPy5hdXRob3JpdGllcz8uaW5jbHVkZXMobWFuYWdlU2V0dGluZ3NSb2xlKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBpc0FkdmFuY2VkVXNlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXN0b21Sb2xlID0gdGhpcy5jb25maWcuZ2V0KCdjb3JlLnBlcm1pc3Npb25zLmFkdmFuY2VkVXNlclJvbGUnKTtcbiAgICBjb25zdCBhZHZhbmNlZFVzZXJSb2xlID0gY3VzdG9tUm9sZSB8fCBBZG1pbmlzdHJhdGlvblJvbGVzLk1BTkFHRV9TRVRUSU5HUztcbiAgICByZXR1cm4gdGhpcy4jdXNlcj8uYXV0aG9yaXRpZXM/LmluY2x1ZGVzKGFkdmFuY2VkVXNlclJvbGUpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzUmV0ZW50aW9uTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXN0b21Sb2xlID0gdGhpcy5jb25maWcuZ2V0KCdjb3JlLnBlcm1pc3Npb25zLnJldGVudGlvbk1hbmFnZXJSb2xlJyk7XG4gICAgY29uc3QgcmV0ZW5ldGlvbk1hbmFnZXJSb2xlID0gY3VzdG9tUm9sZSB8fCBBZG1pbmlzdHJhdGlvblJvbGVzLk1BTkFHRV9TRVRUSU5HUztcbiAgICByZXR1cm4gdGhpcy4jdXNlcj8uYXV0aG9yaXRpZXM/LmluY2x1ZGVzKHJldGVuZXRpb25NYW5hZ2VyUm9sZSkgfHwgZmFsc2U7XG4gIH1cblxuICBjYW5DcmVhdGVPYmplY3RzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgdXNlcnMgY2xpZW50IGxvY2FsZVxuICAgKiBAcGFyYW0gaXNvIElTTyBsb2NhbGUgc3RyaW5nIHRvIGJlIHNldCBhcyBuZXcgY2xpZW50IGxvY2FsZVxuICAgKi9cbiAgY2hhbmdlQ2xpZW50TG9jYWxlKGlzbzogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLiN1c2VyKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZXMgPSB0aGlzLmNvbmZpZy5nZXRDbGllbnRMb2NhbGVzKCkubWFwKChsYW5nKSA9PiBsYW5nLmlzbyk7XG4gICAgICBpc28gPSBpc28gfHwgdGhpcy4jdXNlci5nZXRDbGllbnRMb2NhbGUodGhpcy5jb25maWcuZ2V0RGVmYXVsdENsaWVudExvY2FsZSgpKTtcbiAgICAgIGlmICghbGFuZ3VhZ2VzLmluY2x1ZGVzKGlzbykpIHtcbiAgICAgICAgaXNvID0gdGhpcy5jb25maWcuZ2V0RGVmYXVsdENsaWVudExvY2FsZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJDaGFuZ2VkIGNsaWVudCBsb2NhbGUgdG8gJ1wiICsgaXNvICsgXCInXCIpO1xuICAgICAgdGhpcy5iYWNrZW5kLnNldEhlYWRlcignQWNjZXB0LUxhbmd1YWdlJywgaXNvKTtcbiAgICAgIHRoaXMuI3VzZXIudWlEaXJlY3Rpb24gPSB0aGlzLmdldFVpRGlyZWN0aW9uKGlzbyk7XG4gICAgICB0aGlzLiN1c2VyLnVzZXJTZXR0aW5ncy5sb2NhbGUgPSBpc287XG4gICAgICBpZiAodGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgIT09IGlzbyB8fCB0aGlzLnN5c3RlbS5hdXRoRGF0YT8ubGFuZ3VhZ2UgIT09IGlzbykge1xuICAgICAgICBjb25zdCBvYiA9IHBlcnNpc3RcbiAgICAgICAgICA/IGZvcmtKb2luKFtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGlzbyksXG4gICAgICAgICAgICAgIHRoaXMuc3lzdGVtLnVwZGF0ZUxvY2FsaXphdGlvbnMoaXNvKSxcbiAgICAgICAgICAgICAgdGhpcy5zYXZlVXNlclNldHRpbmdzKHRoaXMuI3VzZXIudXNlclNldHRpbmdzKS5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLiN1c2VyU291cmNlLm5leHQodGhpcy4jdXNlcik7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBzeXN0ZW0gZGVmaW5pdGlvbnMgaTE4biByZXNvdXJjZXMgZm9yIG5ldyBsb2NhbGUuJyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlLnVzZShpc28pO1xuICAgICAgICBvYi5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ldmVudFNlcnZpY2UudHJpZ2dlcihZdXZFdmVudFR5cGUuQ0xJRU5UX0xPQ0FMRV9DSEFOR0VELCBpc28pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzYXZlVXNlclNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPFVzZXJTZXR0aW5ncz4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLiN1c2VyKSB7XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLiN1c2VyLnVzZXJTZXR0aW5ncyk7XG5cbiAgICAgIHRoaXMuI3VzZXIudXNlclNldHRpbmdzID0geyAuLi50aGlzLiN1c2VyLnVzZXJTZXR0aW5ncywgLi4uc2V0dGluZ3MgfTtcbiAgICAgIHJldHVybiB0aGlzLmJhY2tlbmQucG9zdCh0aGlzLiNERUZBVUxUX1NFVFRJTkdTLCB0aGlzLiN1c2VyLnVzZXJTZXR0aW5ncykucGlwZSh0YXAoKCkgPT4gdGhpcy4jdXNlclNvdXJjZS5uZXh0KHRoaXMuI3VzZXIpKSk7XG4gICAgfSBlbHNlIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIGZldGNoVXNlclNldHRpbmdzKCk6IE9ic2VydmFibGU8VXNlclNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZC5nZXQoJy9kbXMvcGVybWlzc2lvbnMnKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZSkgPT4gb2YodW5kZWZpbmVkKSksXG4gICAgICBzd2l0Y2hNYXAoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnNldFVzZXJQZXJtaXNzaW9ucyhyZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kLmdldCh0aGlzLiNERUZBVUxUX1NFVFRJTkdTKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlclBlcm1pc3Npb25zKHJlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyUGVybWlzc2lvbnMgPSB7XG4gICAgICBjcmVhdGU6IHRoaXMubWFwUGVybWlzc2lvbnMoJ0NSRUFURScsIHJlcyksXG4gICAgICB3cml0ZTogdGhpcy5tYXBQZXJtaXNzaW9ucygnV1JJVEUnLCByZXMpLFxuICAgICAgcmVhZDogdGhpcy5tYXBQZXJtaXNzaW9ucygnUkVBRCcsIHJlcyksXG4gICAgICBkZWxldGU6IHRoaXMubWFwUGVybWlzc2lvbnMoJ0RFTEVURScsIHJlcylcbiAgICB9O1xuICAgIGNvbnN0IHNwID0ge1xuICAgICAgY3JlYXRlYWJsZU9iamVjdFR5cGVzOiBbXG4gICAgICAgIC4uLnRoaXMudXNlclBlcm1pc3Npb25zLmNyZWF0ZS5mb2xkZXJUeXBlcyxcbiAgICAgICAgLi4udGhpcy51c2VyUGVybWlzc2lvbnMuY3JlYXRlLm9iamVjdFR5cGVzLFxuICAgICAgICAuLi50aGlzLnVzZXJQZXJtaXNzaW9ucy5jcmVhdGUuc2Vjb25kYXJ5T2JqZWN0VHlwZXNcbiAgICAgIF0sXG4gICAgICBzZWFyY2hhYmxlT2JqZWN0VHlwZXM6IFtcbiAgICAgICAgLi4udGhpcy51c2VyUGVybWlzc2lvbnMucmVhZC5mb2xkZXJUeXBlcyxcbiAgICAgICAgLi4udGhpcy51c2VyUGVybWlzc2lvbnMucmVhZC5vYmplY3RUeXBlcyxcbiAgICAgICAgLi4udGhpcy51c2VyUGVybWlzc2lvbnMucmVhZC5zZWNvbmRhcnlPYmplY3RUeXBlc1xuICAgICAgXVxuICAgIH07XG4gICAgdGhpcy5zeXN0ZW0uc2V0UGVybWlzc2lvbnMoc3ApO1xuICAgIHRoaXMuY2FuQ3JlYXRlT2JqZWN0cyA9IHNwLmNyZWF0ZWFibGVPYmplY3RUeXBlcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBQZXJtaXNzaW9ucyhzZWN0aW9uOiAnQ1JFQVRFJyB8ICdSRUFEJyB8ICdXUklURScgfCAnREVMRVRFJywgYXBpUmVzcG9uc2U6IGFueSk6IFVzZXJQZXJtaXNzaW9uc1NlY3Rpb24ge1xuICAgIGNvbnN0IHJlcyA9IGFwaVJlc3BvbnNlW3NlY3Rpb25dIHx8IHt9O1xuICAgIHJldHVybiB7XG4gICAgICBmb2xkZXJUeXBlczogcmVzWydmb2xkZXJUeXBlSWRzJ10gfHwgW10sXG4gICAgICBvYmplY3RUeXBlczogcmVzWydvYmplY3RUeXBlSWRzJ10gfHwgW10sXG4gICAgICBzZWNvbmRhcnlPYmplY3RUeXBlczogcmVzWydzZWNvbmRhcnlPYmplY3RUeXBlSWRzJ10gfHwgW11cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgYSB1c2VyIGJhc2VkIG9uIGEgc2VhcmNoIHRlcm1cbiAgICogQHBhcmFtIHRlcm0gU2VhcmNoIHRlcm1cbiAgICogQHBhcmFtIGV4Y2x1ZGVNZSB3aGV0aGVyIG9yIG5vdCB0byBleGNsdWRlIG15c2VsZiBmcm9tIHRoZSByZXN1bHQgbGlzdFxuICAgKiBAcGFyYW0gcm9sZXMgbmFycm93IGRvd24gdGhlIHNlYXJjaCByZXN1bHRzIGJ5IGNlcnRhaW4gcm9sZXNcbiAgICovXG4gIHF1ZXJ5VXNlcih0ZXJtOiBzdHJpbmcsIGV4Y2x1ZGVNZT86IGJvb2xlYW4sIHJvbGVzPzogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFl1dlVzZXJbXT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldCgnc2VhcmNoJywgdGVybSkuc2V0KCdleGNsdWRlTWUnLCBgJHshIWV4Y2x1ZGVNZX1gKTtcbiAgICByb2xlcz8ubGVuZ3RoICYmIHJvbGVzLm1hcCgocikgPT4gKHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoYHJvbGVzYCwgcikpKTtcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kLmdldChgL2lkbS91c2Vycz8ke3BhcmFtc31gKS5waXBlKG1hcCgodXNlcnMpID0+ICghdXNlcnMgPyBbXSA6IHVzZXJzLm1hcCgodTogYW55KSA9PiBuZXcgWXV2VXNlcih1KSkpKSk7XG4gIH1cblxuICBnZXRVc2VyQnlJZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxZdXZVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZC5nZXQoYC9pZG0vdXNlcnMvJHtpZH1gKS5waXBlKG1hcCgodXNlcikgPT4gbmV3IFl1dlVzZXIodXNlciwgdGhpcy4jdXNlciEudXNlclNldHRpbmdzKSkpO1xuICB9XG5cbiAgbG9nb3V0KHJlZGlyUm91dGU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYWNrZW5kLmF1dGhVc2VzT3BlbklkQ29ubmVjdCgpKSB7XG4gICAgICB0aGlzLm9pZGMubG9nb3V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlZGlyID0gcmVkaXJSb3V0ZSA/IGA/cmVkaXI9JHtyZWRpclJvdXRlfWAgOiAnJztcbiAgICAgICh3aW5kb3cgYXMgYW55KS5sb2NhdGlvbi5ocmVmID0gYCR7dGhpcy5iYWNrZW5kLmdldEFwaUJhc2UoJ2xvZ291dCcpfSR7cmVkaXJ9YDtcbiAgICB9XG4gIH1cblxuICBnZXRTZXR0aW5ncyhzZWN0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLiN1c2VyID8gdGhpcy5iYWNrZW5kLmdldCh0aGlzLiNVU0VSU19TRVRUSU5HUyArIGVuY29kZVVSSUNvbXBvbmVudChzZWN0aW9uKSkgOiBvZihudWxsKTtcbiAgfVxuXG4gIHNhdmVPYmplY3RDb25maWcob2JqZWN0Q29uZmlnczogU3RvcmVkT2JqZWN0Q29uZmlnKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kLnBvc3QodGhpcy4jVVNFUlNfU0VUVElOR1MgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy4jU0VUVElOR1NfU0VDVElPTl9PQkpFQ1RDT05GSUcpLCBvYmplY3RDb25maWdzKTtcbiAgfVxuXG4gIGxvYWRPYmplY3RDb25maWcoKTogT2JzZXJ2YWJsZTxTdG9yZWRPYmplY3RDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyh0aGlzLiNTRVRUSU5HU19TRUNUSU9OX09CSkVDVENPTkZJRykucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YodW5kZWZpbmVkKSksXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,15 @@
1
+ export var Sort;
2
+ (function (Sort) {
3
+ Sort["ASC"] = "asc";
4
+ Sort["DESC"] = "desc";
5
+ })(Sort || (Sort = {}));
6
+ export var ClassificationPrefix;
7
+ (function (ClassificationPrefix) {
8
+ ClassificationPrefix["EMAIL"] = "mailto:";
9
+ ClassificationPrefix["EMAIL_ICON"] = "envelope";
10
+ ClassificationPrefix["PHONE"] = "tel:";
11
+ ClassificationPrefix["PHONE_ICON"] = "phone";
12
+ ClassificationPrefix["URL"] = "";
13
+ ClassificationPrefix["URL_ICON"] = "globe";
14
+ })(ClassificationPrefix || (ClassificationPrefix = {}));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuaGVscGVyLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtY29yZS9zcmMvbGliL3V0aWwvdXRpbHMuaGVscGVyLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksSUFHWDtBQUhELFdBQVksSUFBSTtJQUNkLG1CQUFXLENBQUE7SUFDWCxxQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhXLElBQUksS0FBSixJQUFJLFFBR2Y7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFPWDtBQVBELFdBQVksb0JBQW9CO0lBQzlCLHlDQUFpQixDQUFBO0lBQ2pCLCtDQUF1QixDQUFBO0lBQ3ZCLHNDQUFjLENBQUE7SUFDZCw0Q0FBb0IsQ0FBQTtJQUNwQixnQ0FBUSxDQUFBO0lBQ1IsMENBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQVBXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFPL0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBTb3J0IHtcbiAgQVNDID0gJ2FzYycsXG4gIERFU0MgPSAnZGVzYydcbn1cblxuZXhwb3J0IGVudW0gQ2xhc3NpZmljYXRpb25QcmVmaXgge1xuICBFTUFJTCA9ICdtYWlsdG86JyxcbiAgRU1BSUxfSUNPTiA9ICdlbnZlbG9wZScsXG4gIFBIT05FID0gJ3RlbDonLFxuICBQSE9ORV9JQ09OID0gJ3Bob25lJyxcbiAgVVJMID0gJycsXG4gIFVSTF9JQ09OID0gJ2dsb2JlJ1xufVxuXG5leHBvcnQgdHlwZSBGb3JtYXR0ZWRNYWlsVG8gPSBzdHJpbmcgfCBzdHJpbmdbXTtcbiJdfQ==