@yuuvis/client-core 2.0.0-beta.0 → 2.0.0-beta.2

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 (105) hide show
  1. package/fesm2022/yuuvis-client-core.mjs +773 -645
  2. package/fesm2022/yuuvis-client-core.mjs.map +1 -1
  3. package/index.d.ts +7 -4
  4. package/lib/model/object-flavor.interface.d.ts +4 -1
  5. package/lib/provide.client.core.d.ts +58 -0
  6. package/lib/service/backend/backend.service.d.ts +0 -1
  7. package/lib/service/config/config.service.d.ts +0 -8
  8. package/lib/service/core-init/core-init.service.d.ts +1 -7
  9. package/lib/service/core-init/translate-json-loader.d.ts +1 -1
  10. package/lib/service/dms/dms.service.d.ts +2 -1
  11. package/lib/service/object-config/object-config.interface.d.ts +1 -1
  12. package/lib/service/object-form/object-form-translate.service.d.ts +15 -0
  13. package/lib/service/{system → object-form}/object-form.interface.d.ts +2 -2
  14. package/lib/service/object-form/object-form.model.d.ts +45 -0
  15. package/lib/service/system/system.interface.d.ts +1 -1
  16. package/lib/service/system/system.service.d.ts +1 -1
  17. package/lib/service/toast/toast.interface.d.ts +8 -0
  18. package/lib/service/toast/toast.service.d.ts +17 -0
  19. package/lib/service/toast/toast.styles.d.ts +1 -0
  20. package/lib/service/upload/upload.interface.d.ts +1 -1
  21. package/lib/service/user/user.providers.d.ts +4 -0
  22. package/lib/service/user/user.service.d.ts +2 -4
  23. package/package.json +7 -10
  24. package/esm2022/index.mjs +0 -69
  25. package/esm2022/lib/client-core.module.mjs +0 -117
  26. package/esm2022/lib/client-core.shared.module.mjs +0 -18
  27. package/esm2022/lib/common/pipes/filesize.pipe.mjs +0 -37
  28. package/esm2022/lib/common/pipes/index.mjs +0 -6
  29. package/esm2022/lib/common/pipes/keys.pipe.mjs +0 -17
  30. package/esm2022/lib/common/pipes/locale-date.pipe.mjs +0 -45
  31. package/esm2022/lib/common/pipes/locale-number.pipe.mjs +0 -115
  32. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +0 -44
  33. package/esm2022/lib/common/services/native-notifications.interface.mjs +0 -2
  34. package/esm2022/lib/common/services/native-notifications.mjs +0 -40
  35. package/esm2022/lib/model/dms-object.interface.mjs +0 -2
  36. package/esm2022/lib/model/dms-object.model.mjs +0 -79
  37. package/esm2022/lib/model/object-flavor.interface.mjs +0 -2
  38. package/esm2022/lib/model/range-value.interface.mjs +0 -2
  39. package/esm2022/lib/model/yuv-error.model.mjs +0 -37
  40. package/esm2022/lib/model/yuv-user.model.mjs +0 -38
  41. package/esm2022/lib/service/audit/audit.interface.mjs +0 -2
  42. package/esm2022/lib/service/audit/audit.service.mjs +0 -135
  43. package/esm2022/lib/service/auth/auth.interceptor.mjs +0 -50
  44. package/esm2022/lib/service/auth/auth.interface.mjs +0 -7
  45. package/esm2022/lib/service/auth/auth.service.mjs +0 -130
  46. package/esm2022/lib/service/auth/oidc.service.mjs +0 -81
  47. package/esm2022/lib/service/backend/api.enum.mjs +0 -11
  48. package/esm2022/lib/service/backend/backend.interface.mjs +0 -2
  49. package/esm2022/lib/service/backend/backend.service.mjs +0 -206
  50. package/esm2022/lib/service/bpm/bpm.interface.mjs +0 -8
  51. package/esm2022/lib/service/bpm/bpm.service.mjs +0 -51
  52. package/esm2022/lib/service/cache/app-cache.service.mjs +0 -51
  53. package/esm2022/lib/service/catalog/catalog.interface.mjs +0 -2
  54. package/esm2022/lib/service/catalog/catalog.service.mjs +0 -13
  55. package/esm2022/lib/service/clipboard/clipboard.interface.mjs +0 -2
  56. package/esm2022/lib/service/clipboard/clipboard.service.mjs +0 -99
  57. package/esm2022/lib/service/config/config.interface.mjs +0 -6
  58. package/esm2022/lib/service/config/config.service.mjs +0 -115
  59. package/esm2022/lib/service/config/core-config.mjs +0 -20
  60. package/esm2022/lib/service/config/core-config.tokens.mjs +0 -9
  61. package/esm2022/lib/service/connection/connection.service.mjs +0 -36
  62. package/esm2022/lib/service/connection/offline.interceptor.mjs +0 -28
  63. package/esm2022/lib/service/core-init/core-init.service.mjs +0 -29
  64. package/esm2022/lib/service/core-init/missing-translation-handler.mjs +0 -10
  65. package/esm2022/lib/service/core-init/translate-json-loader.mjs +0 -117
  66. package/esm2022/lib/service/device/device.interface.mjs +0 -6
  67. package/esm2022/lib/service/device/device.service.mjs +0 -144
  68. package/esm2022/lib/service/dms/dms.service.interface.mjs +0 -2
  69. package/esm2022/lib/service/dms/dms.service.mjs +0 -440
  70. package/esm2022/lib/service/event/event.interface.mjs +0 -2
  71. package/esm2022/lib/service/event/event.service.mjs +0 -38
  72. package/esm2022/lib/service/event/events.mjs +0 -14
  73. package/esm2022/lib/service/idm/idm.interface.mjs +0 -2
  74. package/esm2022/lib/service/idm/idm.service.mjs +0 -34
  75. package/esm2022/lib/service/logger/logger-console.service.mjs +0 -73
  76. package/esm2022/lib/service/logger/logger.interface.mjs +0 -2
  77. package/esm2022/lib/service/logger/logger.mjs +0 -27
  78. package/esm2022/lib/service/notification/notification.service.mjs +0 -131
  79. package/esm2022/lib/service/object-config/object-config.interface.mjs +0 -2
  80. package/esm2022/lib/service/object-config/object-config.service.mjs +0 -233
  81. package/esm2022/lib/service/pending-changes/pending-changes-component.interface.mjs +0 -5
  82. package/esm2022/lib/service/pending-changes/pending-changes-guard.service.mjs +0 -25
  83. package/esm2022/lib/service/pending-changes/pending-changes.service.mjs +0 -123
  84. package/esm2022/lib/service/prediction/prediction.interface.mjs +0 -2
  85. package/esm2022/lib/service/prediction/prediction.service.mjs +0 -60
  86. package/esm2022/lib/service/retention/retention.interface.mjs +0 -2
  87. package/esm2022/lib/service/retention/retention.service.mjs +0 -65
  88. package/esm2022/lib/service/search/search.service.interface.mjs +0 -39
  89. package/esm2022/lib/service/search/search.service.mjs +0 -261
  90. package/esm2022/lib/service/search/search.utils.mjs +0 -142
  91. package/esm2022/lib/service/session-storage/session-storage.service.mjs +0 -50
  92. package/esm2022/lib/service/system/object-form.interface.mjs +0 -2
  93. package/esm2022/lib/service/system/system.enum.mjs +0 -167
  94. package/esm2022/lib/service/system/system.interface.mjs +0 -2
  95. package/esm2022/lib/service/system/system.service.mjs +0 -597
  96. package/esm2022/lib/service/upload/upload.interface.mjs +0 -2
  97. package/esm2022/lib/service/upload/upload.service.mjs +0 -228
  98. package/esm2022/lib/service/user/user-storage.service.mjs +0 -38
  99. package/esm2022/lib/service/user/user.service.mjs +0 -211
  100. package/esm2022/lib/util/utils.helper.enum.mjs +0 -15
  101. package/esm2022/lib/util/utils.mjs +0 -373
  102. package/esm2022/yuuvis-client-core.mjs +0 -5
  103. package/lib/client-core.module.d.ts +0 -20
  104. package/lib/client-core.shared.module.d.ts +0 -10
  105. package/lib/service/auth/oidc.service.d.ts +0 -16
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG1zLnNlcnZpY2UuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2Rtcy9kbXMuc2VydmljZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0RGVsZXRlT3B0aW9ucyB7XG4gIC8vIHdoZXRoZXIgdG8gZW1pdCB0aGUgcmVzdWx0IG9mIHRoZSBkZWxldGUgb3BlcmF0aW9uIGludG8gdGhlIGFwcC4gSWYgc2V0IHRvIHRydWUsXG4gIC8vIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgZW1pdHRlZCB2aWEgdGhlIGBvYmplY3REZWxldGVkYCBldmVudFxuICBzaWxlbnQ/OiBib29sZWFuO1xuICAvLyB3aGV0ZXIgdG8gd2FpdCBmb3IgdGhlIHNlYXJjaCBpbmRleCB0byBiZSBjb25zaXN0ZW50IGFmdGVyIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gIHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeT86IGJvb2xlYW47XG4gIC8vIHdoZXRoZXIgdGhlIHdob2xlIGRlbGV0ZSBvcGVyYXRpb24gc2hvdWxkIGZhaWwgaWYgb25lIG9mIHRoZSBvYmplY3RzIGNvdWxkIG5vdCBiZSBkZWxldGVkXG4gIGdyZWVkeT86IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdERlbGV0ZVJlc3VsdCB7XG4gIC8vIElEIG9mIHRoZSBvYmplY3Qgc3VwcG9zZWQgdG8gYmUgZGVsZXRlZFxuICBpZDogc3RyaW5nO1xuICAvLyBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Qgc3VwcG9zZWQgdG8gYmUgZGVsZXRlZFxuICBwcm9wZXJ0aWVzPzogeyBba2V5OiBzdHJpbmddOiB7IHZhbHVlOiBhbnkgfSB9O1xuICAvLyBlcnJvciB0aGF0IG9jY3VyZWQgZHVyaW5nIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gIF9lcnJvcj86IE9iamVjdERlbGV0ZUVycm9yO1xufVxuZXhwb3J0IGludGVyZmFjZSBPYmplY3REZWxldGVFcnJvciB7XG4gIHN0YXR1czogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0TW92ZU9wdGlvbnMge1xuICAvLyBJZiB0cnVlLCB0aGUgb2JzZXJ2YWJsZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXJjaCBpbmRleCBpcyB1cGRhdGVkIGFzIHdlbGxcbiAgd2FpdEZvclNlYXJjaENvbnNpc3RlbmN5PzogYm9vbGVhbjtcbiAgc2lsZW50PzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0Q29weU9wdGlvbnMge1xuICAvLyBJZiB0cnVlLCB0aGUgb2JzZXJ2YWJsZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXJjaCBpbmRleCBpcyB1cGRhdGVkIGFzIHdlbGxcbiAgd2FpdEZvclNlYXJjaENvbnNpc3RlbmN5PzogYm9vbGVhbjtcbn1cblxuLy8gaW50ZXJmYWNlcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDb3JlLUFQSVxuZXhwb3J0IGludGVyZmFjZSBDb3JlQXBpT2JqZWN0IHtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQ29yZUFwaU9iamVjdFByb3BlcnR5PjtcbiAgY29udGVudFN0cmVhbXM/OiBQYXJ0aWFsPENvbnRlbnRTdHJlYW0+W107XG59XG5leHBvcnQgaW50ZXJmYWNlIENvcmVBcGlPYmplY3RQcm9wZXJ0eSB7XG4gIHZhbHVlOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRTdHJlYW0ge1xuICBjb250ZW50U3RyZWFtSWQ6IHN0cmluZztcbiAgcmVwb3NpdG9yeUlkOiBzdHJpbmc7XG4gIGRpZ2VzdDogc3RyaW5nO1xuICBmaWxlTmFtZTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIGFyY2hpdmVQYXRoPzogc3RyaW5nO1xuICByYW5nZT86IHN0cmluZztcbiAgbWltZVR5cGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3JlQXBpQmF0Y2hSZXNwb25zZSB7XG4gIGhhc01vcmVJdGVtczogYm9vbGVhbjtcbiAgbnVtSXRlbXM6IG51bWJlcjtcbiAgb2JqZWN0czogQ29yZUFwaVJlc3BvbnNlW107XG4gIHRvdGFsTnVtSXRlbXM6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZUFwaVJlc3BvbnNlIHtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQ29yZUFwaU9iamVjdFByb3BlcnR5PjtcbiAgY29udGVudFN0cmVhbXM/OiBDb250ZW50U3RyZWFtW107XG4gIG9wdGlvbnM6IHtcbiAgICAnc3lzdGVtOnJlc3BvbnNlJzoge1xuICAgICAgaHR0cFN0YXR1c0NvZGU6IG51bWJlcjtcbiAgICAgIHNlcnZpY2VFcnJvckNvZGU/OiBudW1iZXI7XG4gICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
@@ -1,440 +0,0 @@
1
- import { inject, Injectable } from '@angular/core';
2
- import { of } from 'rxjs';
3
- import { delay, map, switchMap, tap } from 'rxjs/operators';
4
- import { DmsObject } from '../../model/dms-object.model';
5
- import { Utils } from '../../util/utils';
6
- import { ApiBase } from '../backend/api.enum';
7
- import { BackendService } from '../backend/backend.service';
8
- import { EventService } from '../event/event.service';
9
- import { YuvEventType } from '../event/events';
10
- import { SearchService } from '../search/search.service';
11
- import { BaseObjectTypeField, ContentStreamField, SystemResult } from '../system/system.enum';
12
- import { UploadService } from '../upload/upload.service';
13
- import { Sort } from '../../util/utils.helper.enum';
14
- import * as i0 from "@angular/core";
15
- /**
16
- * Service for working with dms objects: create them, delete, etc.
17
- */
18
- export class DmsService {
19
- #searchService = inject(SearchService);
20
- #backend = inject(BackendService);
21
- #eventService = inject(EventService);
22
- #uploadService = inject(UploadService);
23
- // general trigger operator to handle all dms events
24
- triggerEvent(event, id, silent = false) {
25
- return (stream) => stream.pipe(
26
- // update does not return permissions, so we need to re-load the whole dms object
27
- // TODO: Remove once permissions are provided
28
- switchMap((res) => (!id ? of(res) : this.getDmsObject(id))),
29
- // TODO: enable once permissions are provided
30
- // map((res) => this.searchResultToDmsObject(this.searchService.toSearchResult(res).items[0])),
31
- tap((res) => !silent && this.#eventService.trigger(event, res)));
32
- }
33
- // general trigger operator to handle all dms events
34
- #triggerEvents(event, ids, silent = false) {
35
- return (stream) => stream.pipe(
36
- // update does not return permissions, so we need to re-load the whole dms object
37
- // TODO: Remove once permissions are provided
38
- switchMap((res) => (!ids ? of(res) : this.getDmsObjects(ids))),
39
- // TODO: enable once permissions are provided
40
- // map((_res: any[]) => _res.map((res, i) => res?._error ? { ...res, id: ids?[i] } : this.searchResultToDmsObject(this.searchService.toSearchResult(res).items[0]))),
41
- map((_res) => _res.map((res, i) => (res?._error && ids ? { ...res, id: ids[i] } : res))), tap((res) => !silent && res.forEach((o) => o && this.#eventService.trigger(event, o))));
42
- }
43
- /**
44
- * Create new dms object(s). Providing an array of files here instead of one will create
45
- * a new dms object for every file. In this case indexdata will shared across all files.
46
- * @param objectTypeId The ID of the object type to be created
47
- * @param indexdata Indexdata for the new object(s)
48
- * @param files File(s) to create dms objects content(s) with
49
- * @param label A label that will show up in the upload overlay dialog while uploading
50
- *
51
- * @returns Array of IDs of the objects that have been created
52
- */
53
- createDmsObject(objectTypeId, indexdata, files, label, silent = false) {
54
- const url = `${this.#backend.getApiBase(ApiBase.apiWeb)}/dms/objects`;
55
- const data = indexdata;
56
- data[BaseObjectTypeField.OBJECT_TYPE_ID] = objectTypeId;
57
- const upload = files.length ? this.#uploadService.uploadMultipart(url, files, data, label, silent) : this.#uploadService.createDocument(url, data);
58
- return upload
59
- .pipe(map((res) => res.map((r) => r.properties[BaseObjectTypeField.OBJECT_ID].value)),
60
- // TODO: Replace by proper solution
61
- // Right now there is a gap between when the object was
62
- // created and when it is indexed. So delaying here will
63
- // give backend time to get its stuff together.
64
- delay(1000))
65
- .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_CREATED, '', silent));
66
- }
67
- /**
68
- * Delete a dms object.
69
- * @param id ID of the object to be deleted
70
- */
71
- deleteDmsObject(id, silent = false) {
72
- const url = `/dms/objects/${id}`;
73
- return this.#backend
74
- .delete(url, ApiBase.apiWeb)
75
- .pipe(map(() => ({ id })))
76
- .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_DELETED, '', silent));
77
- }
78
- /**
79
- * Restore older version of a dms object.
80
- * @param id ID of the object to be restored
81
- * @param version version of the object to be restored
82
- */
83
- restoreDmsObject(id, version, silent = false) {
84
- const url = `/dms/objects/${id}/versions/${version}/actions/restore?waitForSearchConsistency=true&restoreParentId=false`;
85
- return this.#backend.post(url, {}, ApiBase.apiWeb).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
86
- }
87
- /**
88
- * Upload (add/replace) content to a dms object.
89
- * @param objectId ID of the dms object to upload the file to
90
- * @param file The file to be uploaded
91
- */
92
- uploadContent(objectId, file) {
93
- return this.#uploadService.upload(this.getContentPath(objectId), file).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, objectId));
94
- }
95
- /**
96
- * Path of dms object content file.
97
- * @param objectId ID of the dms object
98
- * @param version version number of the dms object
99
- */
100
- getContentPath(objectId, version) {
101
- return `${this.#backend.getApiBase(ApiBase.apiWeb)}/dms/objects/${objectId}/contents/file${version ? '?version=' + version : ''}`;
102
- }
103
- /**
104
- * Original API Path of dms object content file.
105
- * @param objectId ID of the dms object
106
- * @param version version number of the dms object
107
- * @param rendition should return rendition path of the dms object
108
- */
109
- getFullContentPath(objectId, version, rendition = false) {
110
- return `${this.#backend.getApiBase(ApiBase.core, true)}/dms/objects/${objectId}${version ? '/versions/' + version : ''}/contents/${rendition ? 'renditions/pdf' : 'file'}`;
111
- }
112
- getSlideURI(objectId, mimeType) {
113
- const supportedMimeTypes = ['*/*'];
114
- let supported = false;
115
- if (mimeType) {
116
- // check if mime type supports slides
117
- supportedMimeTypes.forEach((p) => (supported = supported || Utils.patternToRegExp(p).test(mimeType)));
118
- }
119
- return !mimeType || supported ? `${this.#backend.getApiBase(ApiBase.core, true)}/dms/objects/${objectId}/contents/renditions/slide` : undefined;
120
- }
121
- /**
122
- * Downloads the content of dms objects.
123
- *
124
- * @param DmsObject[] dmsObjects Array of dms objects to be downloaded
125
- * @param withVersion should download specific version of the object
126
- */
127
- downloadContent(objects, withVersion) {
128
- objects.forEach((object, i) => setTimeout(() => {
129
- const uri = `${this.getContentPath(object?.id, withVersion ? object?.version : undefined)}`;
130
- this.#backend.download(uri);
131
- }, Utils.isSafari() ? i * 1000 : 0 // Safari does not allow multi download
132
- ));
133
- }
134
- /**
135
- * Fetch a dms object.
136
- * @param id ID of the object to be retrieved
137
- * @param version Desired version of the object
138
- */
139
- getDmsObject(id, version, silent = false, requestOptions) {
140
- return this.#backend
141
- .get(`/dms/objects/${id}${version ? '/versions/' + version : ''}`, undefined, requestOptions)
142
- .pipe(map((res) => {
143
- const item = this.#searchService.toSearchResult(res).items[0];
144
- return this.#searchResultToDmsObject(item);
145
- }))
146
- .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_LOADED, '', silent));
147
- }
148
- /**
149
- * Updates a tag on a dms object.
150
- * @param id The ID of the object
151
- * @param tag The tag to be updated
152
- * @param value The tags new value
153
- */
154
- setDmsObjectTag(id, tag, value, silent = false) {
155
- return this.#backend
156
- .post(`/dms/objects/tags/${tag}/state/${value}?query=SELECT * FROM system:object WHERE system:objectId='${id}'`, {}, ApiBase.core)
157
- .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
158
- }
159
- /**
160
- * Deletes a tag from a dms object.
161
- * @param id The ID of the object
162
- * @param tag The tag to be deleted
163
- */
164
- deleteDmsObjectTag(id, tag, silent = false) {
165
- return this.#backend.delete(`/dms/objects/${id}/tags/${tag}`, ApiBase.core).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
166
- }
167
- /**
168
- * Update indexdata of a dms object.
169
- * @param id ID of the object to apply the data to
170
- * @param data Indexdata to be applied
171
- * @param silent flag to trigger DMS_OBJECT_UPDATED event
172
- */
173
- updateDmsObject(id, data, silent = false) {
174
- return this.#backend.patch(`/dms/objects/${id}`, data).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
175
- }
176
- /**
177
- * Updates given objects.
178
- * @param objects the objects to updated
179
- */
180
- updateDmsObjects(objects, silent = false) {
181
- return this.#backend
182
- .patch(`/dms/objects`, {
183
- patches: objects.map((o) => ({
184
- id: o.id,
185
- data: o.data
186
- }))
187
- })
188
- .pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_UPDATED, objects.map((o) => o.id), silent));
189
- }
190
- /**
191
- * Updates a tag on a dms object.
192
- * @param ids List of IDs of objects
193
- * @param tag The tag to be updated
194
- * @param value The tags new value
195
- */
196
- updateDmsObjectsTag(ids, tag, value, silent = false) {
197
- return this.batchUpdateTag(ids, tag, value).pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_UPDATED, ids, silent));
198
- }
199
- /**
200
- * Moves given objects to a different folder.
201
- * @param folderId the id of the new parent folder
202
- * @param objects objects to be moved
203
- * @param options options for the move operation
204
- */
205
- moveDmsObjects(targetFolderId, objects, options) {
206
- return this.updateDmsObjects(objects.map((o) => ({ id: o.id, data: { [BaseObjectTypeField.PARENT_ID]: targetFolderId } }), true)).pipe(tap((res) => !options?.silent && this.#eventService.trigger(YuvEventType.DMS_OBJECTS_MOVED, res)));
207
- }
208
- /**
209
- * Copy given objects to a different folder. The objects will be copied with their indexdata referencing
210
- * the existing content of the source object.
211
- * @param targetFolderId The ID of the target folder
212
- * @param objects The objects to be copied
213
- * @param options options for the copy operation
214
- */
215
- copyDmsObjects(targetFolderId, objects, options) {
216
- const excludeProperties = [
217
- BaseObjectTypeField.OBJECT_ID,
218
- BaseObjectTypeField.CREATED_BY,
219
- BaseObjectTypeField.CREATION_DATE,
220
- BaseObjectTypeField.MODIFIED_BY,
221
- BaseObjectTypeField.MODIFICATION_DATE,
222
- BaseObjectTypeField.VERSION_NUMBER,
223
- BaseObjectTypeField.TRACE_ID,
224
- BaseObjectTypeField.PARENT_OBJECT_TYPE_ID,
225
- BaseObjectTypeField.PARENT_VERSION_NUMBER
226
- ];
227
- const mappedObjects = objects.map((o) => {
228
- o.data[BaseObjectTypeField.PARENT_ID] = targetFolderId;
229
- // Remove properties that are not allowed to be copied.
230
- // This also includes content stream fields bundled into the objects data field.
231
- // Properties ending with '_title' are also excluded as they are enrichment values
232
- // provided by API-Web.
233
- Object.keys(o.data)
234
- .filter((key) => key.endsWith('_title') || excludeProperties.includes(key) || Object.values(ContentStreamField).includes(key))
235
- .forEach((key) => Reflect.deleteProperty(o.data, key));
236
- // map filtered data field to data format required by the Core-API
237
- const properties = Object.keys(o.data).reduce((acc, key) => {
238
- acc[key] = { value: o.data[key] };
239
- return acc;
240
- }, {});
241
- return {
242
- properties: properties,
243
- objectTypeId: o.objectTypeId,
244
- ...(o.content
245
- ? {
246
- contentStreams: [o.content]
247
- }
248
- : {})
249
- };
250
- });
251
- const query = options
252
- ? Object.keys(options)
253
- .map((key) => `${key}=${options[key]}`)
254
- .join('&')
255
- : '';
256
- return this.#backend.post(`/dms/objects?${query}`, { objects: mappedObjects }, ApiBase.core);
257
- }
258
- /**
259
- * Get a bunch of dms objects.
260
- * @param ids List of IDs of objects to be retrieved
261
- */
262
- getDmsObjects(ids, silent = false) {
263
- return this.batchGet(ids)
264
- .pipe(map((_res) => _res.map((res, i) => (res?._error ? { ...res, id: ids[i] } : this.#searchResultToDmsObject(this.#searchService.toSearchResult(res).items[0])))))
265
- .pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_LOADED, undefined, silent));
266
- }
267
- /**
268
- * Delete a bunch of dms objects.
269
- * @param ids List of IDs of objects to be deleted
270
- * @param options Options for the delete operation
271
- * @returns Array of delete results.
272
- */
273
- deleteDmsObjects(objects, options) {
274
- const queryParams = options
275
- ? `?${Object.keys(options)
276
- .filter((k) => ['waitForSearchConsistency', 'greedy'].includes(k))
277
- .map((k) => `${k}=${options[k]}`)
278
- .join('&')}`
279
- : '';
280
- return this.#backend
281
- .delete(`/dms/objects${queryParams}`, ApiBase.core, {
282
- body: {
283
- objects: objects.map((o) => ({
284
- properties: typeof o === 'string'
285
- ? {
286
- 'system:objectId': {
287
- value: o
288
- }
289
- }
290
- : {
291
- 'system:objectId': { value: o.id },
292
- subject: { value: o.subject }
293
- }
294
- }))
295
- }
296
- })
297
- .pipe(map((res) => res?.objects?.map((r) => {
298
- const v = r.options?.[SystemResult.DELETE];
299
- return {
300
- id: r.properties?.[BaseObjectTypeField.OBJECT_ID]?.value,
301
- properties: r.properties,
302
- ...(v?.httpStatusCode >= 400 ? { _error: { status: v.httpStatusCode, message: v.message } } : {})
303
- };
304
- })))
305
- .pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_DELETED, undefined, options?.silent));
306
- }
307
- /**
308
- * Fetch a dms object versions.
309
- * @param id ID of the object to be retrieved
310
- */
311
- getDmsObjectVersions(id) {
312
- return this.#backend.get('/dms/objects/' + id + '/versions').pipe(map((res) => {
313
- const items = this.#searchService.toSearchResult(res).items || [];
314
- return items.map((item) => this.#searchResultToDmsObject(item));
315
- }), map((res) => res.sort(Utils.sortValues('version', Sort.DESC))));
316
- }
317
- getDmsObjectVersion(id, version) {
318
- return this.#backend
319
- .get(`/dms/objects/${id}/versions/${version}`)
320
- .pipe(map((res) => this.#searchResultToDmsObject(this.#searchService.toSearchResult(res).items[0])));
321
- }
322
- coreApiResponseToDmsObject(res) {
323
- return this.#searchResultToDmsObject({
324
- objectTypeId: res.properties[BaseObjectTypeField.OBJECT_TYPE_ID].value,
325
- fields: new Map(Object.entries(res.properties)),
326
- content: res.contentStreams?.[0]
327
- });
328
- }
329
- #searchResultToDmsObject(resItem) {
330
- return new DmsObject(resItem);
331
- }
332
- batchUpdateTag(ids, tag, value) {
333
- return this.#backend.batch(ids.map((id) => ({
334
- method: 'POST',
335
- uri: `/dms/objects/tags/${tag}/state/${value}?query=SELECT * FROM system:object WHERE system:objectId='${id}'`,
336
- base: ApiBase.core,
337
- body: {}
338
- })));
339
- }
340
- batchDeleteTag(ids, tag) {
341
- return this.#backend.batch(ids.map((id) => ({
342
- method: 'DELETE',
343
- uri: `/dms/objects/${id}/tags/${tag}`,
344
- base: ApiBase.core
345
- })));
346
- }
347
- batchDelete(ids) {
348
- return this.#backend.batch(ids.map((id) => ({ method: 'DELETE', uri: `/dms/objects/${id}` })));
349
- }
350
- batchGet(ids) {
351
- return this.#backend.batch(ids.map((id) => ({ method: 'GET', uri: `/dms/objects/${id}` })));
352
- }
353
- /**
354
- * Map search result from the backend to applications SearchResult object
355
- * @param searchResponse The backend response
356
- */
357
- toSearchResult(searchResponse) {
358
- const resultListItems = [];
359
- const objectTypes = [];
360
- searchResponse.objects.forEach((o) => {
361
- const fields = new Map();
362
- // process properties section of result
363
- Object.keys(o.properties).forEach((key) => {
364
- let value = o.properties[key].value;
365
- if (o.properties[key].clvalue) {
366
- // table fields will have a clientValue too ...
367
- value = o.properties[key].clvalue;
368
- // ... and also may contain values that need to be resolved
369
- if (o.properties[key].resolvedValues) {
370
- value.forEach((v) => {
371
- Object.keys(v).forEach((k) => {
372
- const resValue = Array.isArray(v[k]) ? v[k].map((i) => o.properties[key].resolvedValues[i]) : o.properties[key].resolvedValues[v[k]];
373
- if (resValue) {
374
- v[`${k}_title`] = resValue;
375
- }
376
- });
377
- });
378
- }
379
- }
380
- fields.set(key, value);
381
- if (o.properties[key].title) {
382
- fields.set(key + '_title', o.properties[key].title);
383
- }
384
- });
385
- // process contentStreams section of result if available.
386
- // Objects that don't have files attached won't have this section
387
- let content;
388
- if (o.contentStreams && o.contentStreams.length > 0) {
389
- // we assume that each result object only has ONE file attached, altough
390
- // this is an array and there may be more
391
- const contentStream = o.contentStreams[0];
392
- // also add contentstream related fields to the result fields
393
- fields.set(ContentStreamField.LENGTH, contentStream.length);
394
- fields.set(ContentStreamField.MIME_TYPE, contentStream.mimeType);
395
- fields.set(ContentStreamField.FILENAME, contentStream.fileName);
396
- fields.set(ContentStreamField.ID, contentStream.contentStreamId);
397
- fields.set(ContentStreamField.RANGE, contentStream.contentStreamRange);
398
- fields.set(ContentStreamField.REPOSITORY_ID, contentStream.repositoryId);
399
- fields.set(ContentStreamField.DIGEST, contentStream.digest);
400
- fields.set(ContentStreamField.ARCHIVE_PATH, contentStream.archivePath);
401
- content = {
402
- contentStreamId: contentStream.contentStreamId,
403
- repositoryId: contentStream.repositoryId,
404
- range: contentStream.range,
405
- digest: contentStream.digest,
406
- archivePath: contentStream.archivePath,
407
- fileName: contentStream.fileName,
408
- mimeType: contentStream.mimeType,
409
- size: contentStream.length
410
- };
411
- }
412
- const objectTypeId = o.properties[BaseObjectTypeField.OBJECT_TYPE_ID] ? o.properties[BaseObjectTypeField.OBJECT_TYPE_ID].value : null;
413
- if (objectTypes.indexOf(objectTypeId) === -1) {
414
- objectTypes.push(objectTypeId);
415
- }
416
- resultListItems.push({
417
- objectTypeId,
418
- content,
419
- fields,
420
- permissions: o.permissions
421
- });
422
- });
423
- const result = {
424
- hasMoreItems: searchResponse.hasMoreItems,
425
- totalNumItems: searchResponse.totalNumItems,
426
- items: resultListItems,
427
- objectTypes
428
- };
429
- return result;
430
- }
431
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
432
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, providedIn: 'root' }); }
433
- }
434
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, decorators: [{
435
- type: Injectable,
436
- args: [{
437
- providedIn: 'root'
438
- }]
439
- }] });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG1zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2UvZG1zL2Rtcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFjLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBVXpELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFDcEQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUNyQixjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFD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QUssRUFBRSxlQUFlO1lBQ3RCLFdBQVc7U0FDWixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0F0ZlUsVUFBVTttSEFBVixVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERtc09iamVjdCB9IGZyb20gJy4uLy4uL21vZGVsL2Rtcy1vYmplY3QubW9kZWwnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3V0aWxzJztcbmltcG9ydCB7IEFwaUJhc2UgfSBmcm9tICcuLi9iYWNrZW5kL2FwaS5lbnVtJztcbmltcG9ydCB7IEh0dHBPcHRpb25zIH0gZnJvbSAnLi4vYmFja2VuZC9iYWNrZW5kLmludGVyZmFjZSc7XG5pbXBvcnQgeyBCYWNrZW5kU2VydmljZSB9IGZyb20gJy4uL2JhY2tlbmQvYmFja2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uL2V2ZW50L2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgWXV2RXZlbnRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvZXZlbnRzJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoUmVzcG9uc2UsIFNlYXJjaFJlc3VsdCwgU2VhcmNoUmVzdWx0Q29udGVudCwgU2VhcmNoUmVzdWx0SXRlbSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCwgQ29udGVudFN0cmVhbUZpZWxkLCBTeXN0ZW1SZXN1bHQgfSBmcm9tICcuLi9zeXN0ZW0vc3lzdGVtLmVudW0nO1xuaW1wb3J0IHsgU3lzdGVtU2VydmljZSB9IGZyb20gJy4uL3N5c3RlbS9zeXN0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vdXBsb2FkL3VwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENvcmVBcGlPYmplY3QsXG4gIENvcmVBcGlPYmplY3RQcm9wZXJ0eSxcbiAgQ29yZUFwaVJlc3BvbnNlLFxuICBPYmplY3RDb3B5T3B0aW9ucyxcbiAgT2JqZWN0RGVsZXRlT3B0aW9ucyxcbiAgT2JqZWN0RGVsZXRlUmVzdWx0LFxuICBPYmplY3RNb3ZlT3B0aW9uc1xufSBmcm9tICcuL2Rtcy5zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnLi4vLi4vdXRpbC91dGlscy5oZWxwZXIuZW51bSc7XG4vKipcbiAqIFNlcnZpY2UgZm9yIHdvcmtpbmcgd2l0aCBkbXMgb2JqZWN0czogY3JlYXRlIHRoZW0sIGRlbGV0ZSwgZXRjLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEbXNTZXJ2aWNlIHtcbiAgI3NlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gICNiYWNrZW5kID0gaW5qZWN0KEJhY2tlbmRTZXJ2aWNlKTtcbiAgI2V2ZW50U2VydmljZSA9IGluamVjdChFdmVudFNlcnZpY2UpO1xuICAjdXBsb2FkU2VydmljZSA9IGluamVjdChVcGxvYWRTZXJ2aWNlKTtcblxuICAvLyBnZW5lcmFsIHRyaWdnZXIgb3BlcmF0b3IgdG8gaGFuZGxlIGFsbCBkbXMgZXZlbnRzXG4gIHByaXZhdGUgdHJpZ2dlckV2ZW50KGV2ZW50OiBZdXZFdmVudFR5cGUsIGlkPzogc3RyaW5nLCBzaWxlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiAoc3RyZWFtOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgIHN0cmVhbS5waXBlKFxuICAgICAgICAvLyB1cGRhdGUgZG9lcyBub3QgcmV0dXJuIHBlcm1pc3Npb25zLCBzbyB3ZSBuZWVkIHRvIHJlLWxvYWQgdGhlIHdob2xlIGRtcyBvYmplY3RcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgcGVybWlzc2lvbnMgYXJlIHByb3ZpZGVkXG4gICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiAoIWlkID8gb2YocmVzKSA6IHRoaXMuZ2V0RG1zT2JqZWN0KGlkKSkpLFxuICAgICAgICAvLyBUT0RPOiBlbmFibGUgb25jZSBwZXJtaXNzaW9ucyBhcmUgcHJvdmlkZWRcbiAgICAgICAgLy8gbWFwKChyZXMpID0+IHRoaXMuc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy5zZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSxcbiAgICAgICAgdGFwKChyZXM6IGFueSkgPT4gIXNpbGVudCAmJiB0aGlzLiNldmVudFNlcnZpY2UudHJpZ2dlcihldmVudCwgcmVzKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyBnZW5lcmFsIHRyaWdnZXIgb3BlcmF0b3IgdG8gaGFuZGxlIGFsbCBkbXMgZXZlbnRzXG4gICN0cmlnZ2VyRXZlbnRzKGV2ZW50OiBZdXZFdmVudFR5cGUsIGlkcz86IHN0cmluZ1tdLCBzaWxlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiAoc3RyZWFtOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgIHN0cmVhbS5waXBlKFxuICAgICAgICAvLyB1cGRhdGUgZG9lcyBub3QgcmV0dXJuIHBlcm1pc3Npb25zLCBzbyB3ZSBuZWVkIHRvIHJlLWxvYWQgdGhlIHdob2xlIGRtcyBvYmplY3RcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgcGVybWlzc2lvbnMgYXJlIHByb3ZpZGVkXG4gICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiAoIWlkcyA/IG9mKHJlcykgOiB0aGlzLmdldERtc09iamVjdHMoaWRzKSkpLFxuICAgICAgICAvLyBUT0RPOiBlbmFibGUgb25jZSBwZXJtaXNzaW9ucyBhcmUgcHJvdmlkZWRcbiAgICAgICAgLy8gbWFwKChfcmVzOiBhbnlbXSkgPT4gX3Jlcy5tYXAoKHJlcywgaSkgPT4gcmVzPy5fZXJyb3IgPyB7IC4uLnJlcywgaWQ6IGlkcz9baV0gfSA6IHRoaXMuc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy5zZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSksXG4gICAgICAgIG1hcCgoX3JlczogYW55W10pID0+IF9yZXMubWFwKChyZXMsIGkpID0+IChyZXM/Ll9lcnJvciAmJiBpZHMgPyB7IC4uLnJlcywgaWQ6IGlkc1tpXSB9IDogcmVzKSkpLFxuICAgICAgICB0YXAoKHJlczogYW55KSA9PiAhc2lsZW50ICYmIHJlcy5mb3JFYWNoKChvOiBhbnkpID0+IG8gJiYgdGhpcy4jZXZlbnRTZXJ2aWNlLnRyaWdnZXIoZXZlbnQsIG8pKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG5ldyBkbXMgb2JqZWN0KHMpLiBQcm92aWRpbmcgYW4gYXJyYXkgb2YgZmlsZXMgaGVyZSBpbnN0ZWFkIG9mIG9uZSB3aWxsIGNyZWF0ZVxuICAgKiBhIG5ldyBkbXMgb2JqZWN0IGZvciBldmVyeSBmaWxlLiBJbiB0aGlzIGNhc2UgaW5kZXhkYXRhIHdpbGwgc2hhcmVkIGFjcm9zcyBhbGwgZmlsZXMuXG4gICAqIEBwYXJhbSBvYmplY3RUeXBlSWQgVGhlIElEIG9mIHRoZSBvYmplY3QgdHlwZSB0byBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSBpbmRleGRhdGEgSW5kZXhkYXRhIGZvciB0aGUgbmV3IG9iamVjdChzKVxuICAgKiBAcGFyYW0gZmlsZXMgRmlsZShzKSB0byBjcmVhdGUgZG1zIG9iamVjdHMgY29udGVudChzKSB3aXRoXG4gICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHRoYXQgd2lsbCBzaG93IHVwIGluIHRoZSB1cGxvYWQgb3ZlcmxheSBkaWFsb2cgd2hpbGUgdXBsb2FkaW5nXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIElEcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBjcmVhdGVEbXNPYmplY3Qob2JqZWN0VHlwZUlkOiBzdHJpbmcsIGluZGV4ZGF0YTogYW55LCBmaWxlczogRmlsZVtdLCBsYWJlbD86IHN0cmluZywgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy4jYmFja2VuZC5nZXRBcGlCYXNlKEFwaUJhc2UuYXBpV2ViKX0vZG1zL29iamVjdHNgO1xuICAgIGNvbnN0IGRhdGEgPSBpbmRleGRhdGE7XG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXSA9IG9iamVjdFR5cGVJZDtcblxuICAgIGNvbnN0IHVwbG9hZCA9IGZpbGVzLmxlbmd0aCA/IHRoaXMuI3VwbG9hZFNlcnZpY2UudXBsb2FkTXVsdGlwYXJ0KHVybCwgZmlsZXMsIGRhdGEsIGxhYmVsLCBzaWxlbnQpIDogdGhpcy4jdXBsb2FkU2VydmljZS5jcmVhdGVEb2N1bWVudCh1cmwsIGRhdGEpO1xuXG4gICAgcmV0dXJuIHVwbG9hZFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiByZXMubWFwKChyOiBhbnkpID0+IHIucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9JRF0udmFsdWUpKSxcbiAgICAgICAgLy8gVE9ETzogUmVwbGFjZSBieSBwcm9wZXIgc29sdXRpb25cbiAgICAgICAgLy8gUmlnaHQgbm93IHRoZXJlIGlzIGEgZ2FwIGJldHdlZW4gd2hlbiB0aGUgb2JqZWN0IHdhc1xuICAgICAgICAvLyBjcmVhdGVkIGFuZCB3aGVuIGl0IGlzIGluZGV4ZWQuIFNvIGRlbGF5aW5nIGhlcmUgd2lsbFxuICAgICAgICAvLyBnaXZlIGJhY2tlbmQgdGltZSB0byBnZXQgaXRzIHN0dWZmIHRvZ2V0aGVyLlxuICAgICAgICBkZWxheSgxMDAwKVxuICAgICAgKVxuICAgICAgLnBpcGUodGhpcy50cmlnZ2VyRXZlbnQoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfQ1JFQVRFRCwgJycsIHNpbGVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIGRlbGV0ZURtc09iamVjdChpZDogc3RyaW5nLCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgdXJsID0gYC9kbXMvb2JqZWN0cy8ke2lkfWA7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5kZWxldGUodXJsLCBBcGlCYXNlLmFwaVdlYilcbiAgICAgIC5waXBlKG1hcCgoKSA9PiAoeyBpZCB9KSkpXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9ERUxFVEVELCAnJywgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBvbGRlciB2ZXJzaW9uIG9mIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIElEIG9mIHRoZSBvYmplY3QgdG8gYmUgcmVzdG9yZWRcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIHJlc3RvcmVkXG4gICAqL1xuICByZXN0b3JlRG1zT2JqZWN0KGlkOiBzdHJpbmcsIHZlcnNpb246IG51bWJlciwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IGAvZG1zL29iamVjdHMvJHtpZH0vdmVyc2lvbnMvJHt2ZXJzaW9ufS9hY3Rpb25zL3Jlc3RvcmU/d2FpdEZvclNlYXJjaENvbnNpc3RlbmN5PXRydWUmcmVzdG9yZVBhcmVudElkPWZhbHNlYDtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5wb3N0KHVybCwge30sIEFwaUJhc2UuYXBpV2ViKS5waXBlKHRoaXMudHJpZ2dlckV2ZW50KFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX1VQREFURUQsIGlkLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgKGFkZC9yZXBsYWNlKSBjb250ZW50IHRvIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIG9iamVjdElkIElEIG9mIHRoZSBkbXMgb2JqZWN0IHRvIHVwbG9hZCB0aGUgZmlsZSB0b1xuICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgdXBsb2FkQ29udGVudChvYmplY3RJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jdXBsb2FkU2VydmljZS51cGxvYWQodGhpcy5nZXRDb250ZW50UGF0aChvYmplY3RJZCksIGZpbGUpLnBpcGUodGhpcy50cmlnZ2VyRXZlbnQoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCwgb2JqZWN0SWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIG9mIGRtcyBvYmplY3QgY29udGVudCBmaWxlLlxuICAgKiBAcGFyYW0gb2JqZWN0SWQgSUQgb2YgdGhlIGRtcyBvYmplY3RcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRtcyBvYmplY3RcbiAgICovXG4gIGdldENvbnRlbnRQYXRoKG9iamVjdElkOiBzdHJpbmcsIHZlcnNpb24/OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jYmFja2VuZC5nZXRBcGlCYXNlKEFwaUJhc2UuYXBpV2ViKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0vY29udGVudHMvZmlsZSR7dmVyc2lvbiA/ICc/dmVyc2lvbj0nICsgdmVyc2lvbiA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogT3JpZ2luYWwgQVBJIFBhdGggb2YgZG1zIG9iamVjdCBjb250ZW50IGZpbGUuXG4gICAqIEBwYXJhbSBvYmplY3RJZCBJRCBvZiB0aGUgZG1zIG9iamVjdFxuICAgKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZG1zIG9iamVjdFxuICAgKiBAcGFyYW0gcmVuZGl0aW9uIHNob3VsZCByZXR1cm4gcmVuZGl0aW9uIHBhdGggb2YgdGhlIGRtcyBvYmplY3RcbiAgICovXG4gIGdldEZ1bGxDb250ZW50UGF0aChvYmplY3RJZDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyLCByZW5kaXRpb24gPSBmYWxzZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNiYWNrZW5kLmdldEFwaUJhc2UoQXBpQmFzZS5jb3JlLCB0cnVlKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0ke3ZlcnNpb24gPyAnL3ZlcnNpb25zLycgKyB2ZXJzaW9uIDogJyd9L2NvbnRlbnRzLyR7XG4gICAgICByZW5kaXRpb24gPyAncmVuZGl0aW9ucy9wZGYnIDogJ2ZpbGUnXG4gICAgfWA7XG4gIH1cblxuICBnZXRTbGlkZVVSSShvYmplY3RJZDogc3RyaW5nLCBtaW1lVHlwZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkTWltZVR5cGVzID0gWycqLyonXTtcbiAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAvLyBjaGVjayBpZiBtaW1lIHR5cGUgc3VwcG9ydHMgc2xpZGVzXG4gICAgICBzdXBwb3J0ZWRNaW1lVHlwZXMuZm9yRWFjaCgocCkgPT4gKHN1cHBvcnRlZCA9IHN1cHBvcnRlZCB8fCBVdGlscy5wYXR0ZXJuVG9SZWdFeHAocCkudGVzdChtaW1lVHlwZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuICFtaW1lVHlwZSB8fCBzdXBwb3J0ZWQgPyBgJHt0aGlzLiNiYWNrZW5kLmdldEFwaUJhc2UoQXBpQmFzZS5jb3JlLCB0cnVlKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0vY29udGVudHMvcmVuZGl0aW9ucy9zbGlkZWAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIHRoZSBjb250ZW50IG9mIGRtcyBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gRG1zT2JqZWN0W10gZG1zT2JqZWN0cyBBcnJheSBvZiBkbXMgb2JqZWN0cyB0byBiZSBkb3dubG9hZGVkXG4gICAqIEBwYXJhbSB3aXRoVmVyc2lvbiBzaG91bGQgZG93bmxvYWQgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgb2JqZWN0XG4gICAqL1xuICBkb3dubG9hZENvbnRlbnQob2JqZWN0czogRG1zT2JqZWN0W10sIHdpdGhWZXJzaW9uPzogYm9vbGVhbikge1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqZWN0LCBpKSA9PlxuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVyaSA9IGAke3RoaXMuZ2V0Q29udGVudFBhdGgob2JqZWN0Py5pZCwgd2l0aFZlcnNpb24gPyBvYmplY3Q/LnZlcnNpb24gOiB1bmRlZmluZWQpfWA7XG4gICAgICAgICAgdGhpcy4jYmFja2VuZC5kb3dubG9hZCh1cmkpO1xuICAgICAgICB9LFxuICAgICAgICBVdGlscy5pc1NhZmFyaSgpID8gaSAqIDEwMDAgOiAwIC8vIFNhZmFyaSBkb2VzIG5vdCBhbGxvdyBtdWx0aSBkb3dubG9hZFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBkbXMgb2JqZWN0LlxuICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIG9iamVjdCB0byBiZSByZXRyaWV2ZWRcbiAgICogQHBhcmFtIHZlcnNpb24gRGVzaXJlZCB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcbiAgICovXG4gIGdldERtc09iamVjdChpZDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyLCBzaWxlbnQgPSBmYWxzZSwgcmVxdWVzdE9wdGlvbnM/OiBIdHRwT3B0aW9ucyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RG1zT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5nZXQoYC9kbXMvb2JqZWN0cy8ke2lkfSR7dmVyc2lvbiA/ICcvdmVyc2lvbnMvJyArIHZlcnNpb24gOiAnJ31gLCB1bmRlZmluZWQsIHJlcXVlc3RPcHRpb25zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbTogU2VhcmNoUmVzdWx0SXRlbSA9IHRoaXMuI3NlYXJjaFNlcnZpY2UudG9TZWFyY2hSZXN1bHQocmVzKS5pdGVtc1swXTtcbiAgICAgICAgICByZXR1cm4gdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QoaXRlbSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9MT0FERUQsICcnLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgdGFnIG9uIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSB1cGRhdGVkXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdGFncyBuZXcgdmFsdWVcbiAgICovXG4gIHNldERtc09iamVjdFRhZyhpZDogc3RyaW5nLCB0YWc6IHN0cmluZywgdmFsdWU6IGFueSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kXG4gICAgICAucG9zdChgL2Rtcy9vYmplY3RzL3RhZ3MvJHt0YWd9L3N0YXRlLyR7dmFsdWV9P3F1ZXJ5PVNFTEVDVCAqIEZST00gc3lzdGVtOm9iamVjdCBXSEVSRSBzeXN0ZW06b2JqZWN0SWQ9JyR7aWR9J2AsIHt9LCBBcGlCYXNlLmNvcmUpXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVELCBpZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHRhZyBmcm9tIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSBkZWxldGVkXG4gICAqL1xuICBkZWxldGVEbXNPYmplY3RUYWcoaWQ6IHN0cmluZywgdGFnOiBzdHJpbmcsIHNpbGVudCA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5kZWxldGUoYC9kbXMvb2JqZWN0cy8ke2lkfS90YWdzLyR7dGFnfWAsIEFwaUJhc2UuY29yZSkucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVELCBpZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGluZGV4ZGF0YSBvZiBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBkYXRhIHRvXG4gICAqIEBwYXJhbSBkYXRhIEluZGV4ZGF0YSB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSBzaWxlbnQgZmxhZyB0byB0cmlnZ2VyIERNU19PQkpFQ1RfVVBEQVRFRCBldmVudFxuICAgKi9cbiAgdXBkYXRlRG1zT2JqZWN0KGlkOiBzdHJpbmcsIGRhdGE6IGFueSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBhdGNoKGAvZG1zL29iamVjdHMvJHtpZH1gLCBkYXRhKS5waXBlKHRoaXMudHJpZ2dlckV2ZW50KFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX1VQREFURUQsIGlkLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGdpdmVuIG9iamVjdHMuXG4gICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZURtc09iamVjdHMob2JqZWN0czogeyBpZDogc3RyaW5nOyBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH1bXSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5wYXRjaChgL2Rtcy9vYmplY3RzYCwge1xuICAgICAgICBwYXRjaGVzOiBvYmplY3RzLm1hcCgobykgPT4gKHtcbiAgICAgICAgICBpZDogby5pZCxcbiAgICAgICAgICBkYXRhOiBvLmRhdGFcbiAgICAgICAgfSkpXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRoaXMuI3RyaWdnZXJFdmVudHMoXG4gICAgICAgICAgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCxcbiAgICAgICAgICBvYmplY3RzLm1hcCgobykgPT4gby5pZCksXG4gICAgICAgICAgc2lsZW50XG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHRhZyBvbiBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZHMgTGlzdCBvZiBJRHMgb2Ygb2JqZWN0c1xuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gYmUgdXBkYXRlZFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHRhZ3MgbmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGVEbXNPYmplY3RzVGFnKGlkczogc3RyaW5nW10sIHRhZzogc3RyaW5nLCB2YWx1ZTogYW55LCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hVcGRhdGVUYWcoaWRzLCB0YWcsIHZhbHVlKS5waXBlKHRoaXMuI3RyaWdnZXJFdmVudHMoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCwgaWRzLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBnaXZlbiBvYmplY3RzIHRvIGEgZGlmZmVyZW50IGZvbGRlci5cbiAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBpZCBvZiB0aGUgbmV3IHBhcmVudCBmb2xkZXJcbiAgICogQHBhcmFtIG9iamVjdHMgb2JqZWN0cyB0byBiZSBtb3ZlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgbW92ZSBvcGVyYXRpb25cbiAgICovXG4gIG1vdmVEbXNPYmplY3RzKHRhcmdldEZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvYmplY3RzOiBEbXNPYmplY3RbXSwgb3B0aW9ucz86IE9iamVjdE1vdmVPcHRpb25zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVEbXNPYmplY3RzKG9iamVjdHMubWFwKChvKSA9PiAoeyBpZDogby5pZCwgZGF0YTogeyBbQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfSURdOiB0YXJnZXRGb2xkZXJJZCB9IH0pLCB0cnVlKSkucGlwZShcbiAgICAgIHRhcCgocmVzKSA9PiAhb3B0aW9ucz8uc2lsZW50ICYmIHRoaXMuI2V2ZW50U2VydmljZS50cmlnZ2VyKFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUU19NT1ZFRCwgcmVzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgZ2l2ZW4gb2JqZWN0cyB0byBhIGRpZmZlcmVudCBmb2xkZXIuIFRoZSBvYmplY3RzIHdpbGwgYmUgY29waWVkIHdpdGggdGhlaXIgaW5kZXhkYXRhIHJlZmVyZW5jaW5nXG4gICAqIHRoZSBleGlzdGluZyBjb250ZW50IG9mIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVySWQgVGhlIElEIG9mIHRoZSB0YXJnZXQgZm9sZGVyXG4gICAqIEBwYXJhbSBvYmplY3RzIFRoZSBvYmplY3RzIHRvIGJlIGNvcGllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgY29weSBvcGVyYXRpb25cbiAgICovXG4gIGNvcHlEbXNPYmplY3RzKHRhcmdldEZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvYmplY3RzOiBEbXNPYmplY3RbXSwgb3B0aW9ucz86IE9iamVjdENvcHlPcHRpb25zKTogT2JzZXJ2YWJsZTxDb3JlQXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBleGNsdWRlUHJvcGVydGllcyA9IFtcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX0lELFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVEVEX0JZLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5NT0RJRklFRF9CWSxcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuTU9ESUZJQ0FUSU9OX0RBVEUsXG4gICAgICBCYXNlT2JqZWN0VHlwZUZpZWxkLlZFUlNJT05fTlVNQkVSLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5UUkFDRV9JRCxcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX09CSkVDVF9UWVBFX0lELFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfVkVSU0lPTl9OVU1CRVJcbiAgICBdO1xuXG4gICAgY29uc3QgbWFwcGVkT2JqZWN0czogQ29yZUFwaU9iamVjdFtdID0gb2JqZWN0cy5tYXAoKG8pID0+IHtcbiAgICAgIG8uZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRF0gPSB0YXJnZXRGb2xkZXJJZDtcblxuICAgICAgLy8gUmVtb3ZlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgY29waWVkLlxuICAgICAgLy8gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbnRlbnQgc3RyZWFtIGZpZWxkcyBidW5kbGVkIGludG8gdGhlIG9iamVjdHMgZGF0YSBmaWVsZC5cbiAgICAgIC8vIFByb3BlcnRpZXMgZW5kaW5nIHdpdGggJ190aXRsZScgYXJlIGFsc28gZXhjbHVkZWQgYXMgdGhleSBhcmUgZW5yaWNobWVudCB2YWx1ZXNcbiAgICAgIC8vIHByb3ZpZGVkIGJ5IEFQSS1XZWIuXG4gICAgICBPYmplY3Qua2V5cyhvLmRhdGEpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5LmVuZHNXaXRoKCdfdGl0bGUnKSB8fCBleGNsdWRlUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpIHx8IE9iamVjdC52YWx1ZXMoQ29udGVudFN0cmVhbUZpZWxkKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KG8uZGF0YSwga2V5KSk7XG5cbiAgICAgIC8vIG1hcCBmaWx0ZXJlZCBkYXRhIGZpZWxkIHRvIGRhdGEgZm9ybWF0IHJlcXVpcmVkIGJ5IHRoZSBDb3JlLUFQSVxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG8uZGF0YSkucmVkdWNlKFxuICAgICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHsgdmFsdWU6IG8uZGF0YVtrZXldIH07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgQ29yZUFwaU9iamVjdFByb3BlcnR5PlxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgICAgb2JqZWN0VHlwZUlkOiBvLm9iamVjdFR5cGVJZCxcbiAgICAgICAgLi4uKG8uY29udGVudFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb250ZW50U3RyZWFtczogW28uY29udGVudF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfSBhcyBDb3JlQXBpT2JqZWN0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgcXVlcnkgPSBvcHRpb25zXG4gICAgICA/IE9iamVjdC5rZXlzKG9wdGlvbnMpXG4gICAgICAgICAgLm1hcCgoa2V5OiBzdHJpbmcpID0+IGAke2tleX09JHsob3B0aW9ucyBhcyBhbnkpW2tleV19YClcbiAgICAgICAgICAuam9pbignJicpXG4gICAgICA6ICcnO1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBvc3QoYC9kbXMvb2JqZWN0cz8ke3F1ZXJ5fWAsIHsgb2JqZWN0czogbWFwcGVkT2JqZWN0cyB9LCBBcGlCYXNlLmNvcmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGJ1bmNoIG9mIGRtcyBvYmplY3RzLlxuICAgKiBAcGFyYW0gaWRzIExpc3Qgb2YgSURzIG9mIG9iamVjdHMgdG8gYmUgcmV0cmlldmVkXG4gICAqL1xuICBnZXREbXNPYmplY3RzKGlkczogc3RyaW5nW10sIHNpbGVudCA9IGZhbHNlKTogT2JzZXJ2YWJsZTxEbXNPYmplY3RbXT4ge1xuICAgIHJldHVybiB0aGlzLmJhdGNoR2V0KGlkcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKF9yZXM6IGFueVtdKSA9PlxuICAgICAgICAgIF9yZXMubWFwKChyZXMsIGkpID0+IChyZXM/Ll9lcnJvciA/IHsgLi4ucmVzLCBpZDogaWRzW2ldIH0gOiB0aGlzLiNzZWFyY2hSZXN1bHRUb0Rtc09iamVjdCh0aGlzLiNzZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnBpcGUodGhpcy4jdHJpZ2dlckV2ZW50cyhZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9MT0FERUQsIHVuZGVmaW5lZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgYnVuY2ggb2YgZG1zIG9iamVjdHMuXG4gICAqIEBwYXJhbSBpZHMgTGlzdCBvZiBJRHMgb2Ygb2JqZWN0cyB0byBiZSBkZWxldGVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRlbGV0ZSByZXN1bHRzLlxuICAgKi9cbiAgZGVsZXRlRG1zT2JqZWN0cyhcbiAgICBvYmplY3RzOiBzdHJpbmdbXSB8IHsgaWQ6IHN0cmluZzsgc3ViamVjdDogc3RyaW5nIH1bXSxcblxuICAgIG9wdGlvbnM/OiBPYmplY3REZWxldGVPcHRpb25zXG4gICk6IE9ic2VydmFibGU8T2JqZWN0RGVsZXRlUmVzdWx0W10+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG9wdGlvbnNcbiAgICAgID8gYD8ke09iamVjdC5rZXlzKG9wdGlvbnMpXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gWyd3YWl0Rm9yU2VhcmNoQ29uc2lzdGVuY3knLCAnZ3JlZWR5J10uaW5jbHVkZXMoaykpXG4gICAgICAgICAgLm1hcCgoaykgPT4gYCR7a309JHsob3B0aW9ucyBhcyBhbnkpW2tdfWApXG4gICAgICAgICAgLmpvaW4oJyYnKX1gXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5kZWxldGUoYC9kbXMvb2JqZWN0cyR7cXVlcnlQYXJhbXN9YCwgQXBpQmFzZS5jb3JlLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBvYmplY3RzOiBvYmplY3RzLm1hcCgobykgPT4gKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6XG4gICAgICAgICAgICAgIHR5cGVvZiBvID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtOm9iamVjdElkJzoge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbTpvYmplY3RJZCc6IHsgdmFsdWU6IG8uaWQgfSxcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdDogeyB2YWx1ZTogby5zdWJqZWN0IH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlcykgPT5cbiAgICAgICAgICByZXM/Lm9iamVjdHM/Lm1hcCgocjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gci5vcHRpb25zPy5bU3lzdGVtUmVzdWx0LkRFTEVURV07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpZDogci5wcm9wZXJ0aWVzPy5bQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSURdPy52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcGVydGllczogci5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAuLi4odj8uaHR0cFN0YXR1c0NvZGUgPj0gNDAwID8geyBfZXJyb3I6IHsgc3RhdHVzOiB2Lmh0dHBTdGF0dXNDb2RlLCBtZXNzYWdlOiB2Lm1lc3NhZ2UgfSB9IDoge30pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5waXBlKHRoaXMuI3RyaWdnZXJFdmVudHMoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfREVMRVRFRCwgdW5kZWZpbmVkLCBvcHRpb25zPy5zaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIGRtcyBvYmplY3QgdmVyc2lvbnMuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHJpZXZlZFxuICAgKi9cbiAgZ2V0RG1zT2JqZWN0VmVyc2lvbnMoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RG1zT2JqZWN0W10+IHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5nZXQoJy9kbXMvb2JqZWN0cy8nICsgaWQgKyAnL3ZlcnNpb25zJykucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBTZWFyY2hSZXN1bHRJdGVtW10gPSB0aGlzLiNzZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXMgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMuI3NlYXJjaFJlc3VsdFRvRG1zT2JqZWN0KGl0ZW0pKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChyZXMpID0+IHJlcy5zb3J0KFV0aWxzLnNvcnRWYWx1ZXMoJ3ZlcnNpb24nLCBTb3J0LkRFU0MpKSlcbiAgICApO1xuICB9XG5cbiAgZ2V0RG1zT2JqZWN0VmVyc2lvbihpZDogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kXG4gICAgICAuZ2V0KGAvZG1zL29iamVjdHMvJHtpZH0vdmVyc2lvbnMvJHt2ZXJzaW9ufWApXG4gICAgICAucGlwZShtYXAoKHJlcykgPT4gdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy4jc2VhcmNoU2VydmljZS50b1NlYXJjaFJlc3VsdChyZXMpLml0ZW1zWzBdKSkpO1xuICB9XG5cbiAgY29yZUFwaVJlc3BvbnNlVG9EbXNPYmplY3QocmVzOiBDb3JlQXBpUmVzcG9uc2UpOiBEbXNPYmplY3Qge1xuICAgIHJldHVybiB0aGlzLiNzZWFyY2hSZXN1bHRUb0Rtc09iamVjdCh7XG4gICAgICBvYmplY3RUeXBlSWQ6IHJlcy5wcm9wZXJ0aWVzW0Jhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX1RZUEVfSURdLnZhbHVlIGFzIHN0cmluZyxcbiAgICAgIGZpZWxkczogbmV3IE1hcChPYmplY3QuZW50cmllcyhyZXMucHJvcGVydGllcykpLFxuICAgICAgY29udGVudDogcmVzLmNvbnRlbnRTdHJlYW1zPy5bMF1cbiAgICB9KTtcbiAgfVxuXG4gICNzZWFyY2hSZXN1bHRUb0Rtc09iamVjdChyZXNJdGVtOiBTZWFyY2hSZXN1bHRJdGVtKTogRG1zT2JqZWN0IHtcbiAgICByZXR1cm4gbmV3IERtc09iamVjdChyZXNJdGVtKTtcbiAgfVxuXG4gIGJhdGNoVXBkYXRlVGFnKGlkczogc3RyaW5nW10sIHRhZzogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuYmF0Y2goXG4gICAgICBpZHMubWFwKChpZCkgPT4gKHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHVyaTogYC9kbXMvb2JqZWN0cy90YWdzLyR7dGFnfS9zdGF0ZS8ke3ZhbHVlfT9xdWVyeT1TRUxFQ1QgKiBGUk9NIHN5c3RlbTpvYmplY3QgV0hFUkUgc3lzdGVtOm9iamVjdElkPScke2lkfSdgLFxuICAgICAgICBiYXNlOiBBcGlCYXNlLmNvcmUsXG4gICAgICAgIGJvZHk6IHt9XG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgYmF0Y2hEZWxldGVUYWcoaWRzOiBzdHJpbmdbXSwgdGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5iYXRjaChcbiAgICAgIGlkcy5tYXAoKGlkKSA9PiAoe1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB1cmk6IGAvZG1zL29iamVjdHMvJHtpZH0vdGFncy8ke3RhZ31gLFxuICAgICAgICBiYXNlOiBBcGlCYXNlLmNvcmVcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICBiYXRjaERlbGV0ZShpZHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuYmF0Y2goaWRzLm1hcCgoaWQpID0+ICh7IG1ldGhvZDogJ0RFTEVURScsIHVyaTogYC9kbXMvb2JqZWN0cy8ke2lkfWAgfSkpKTtcbiAgfVxuXG4gIGJhdGNoR2V0KGlkczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5iYXRjaChpZHMubWFwKChpZCkgPT4gKHsgbWV0aG9kOiAnR0VUJywgdXJpOiBgL2Rtcy9vYmplY3RzLyR7aWR9YCB9KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBzZWFyY2ggcmVzdWx0IGZyb20gdGhlIGJhY2tlbmQgdG8gYXBwbGljYXRpb25zIFNlYXJjaFJlc3VsdCBvYmplY3RcbiAgICogQHBhcmFtIHNlYXJjaFJlc3BvbnNlIFRoZSBiYWNrZW5kIHJlc3BvbnNlXG4gICAqL1xuICB0b1NlYXJjaFJlc3VsdChzZWFyY2hSZXNwb25zZTogU2VhcmNoUmVzcG9uc2UpOiBTZWFyY2hSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdExpc3RJdGVtczogU2VhcmNoUmVzdWx0SXRlbVtdID0gW107XG4gICAgY29uc3Qgb2JqZWN0VHlwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBzZWFyY2hSZXNwb25zZS5vYmplY3RzLmZvckVhY2goKG86IGFueSkgPT4ge1xuICAgICAgY29uc3QgZmllbGRzID0gbmV3IE1hcCgpO1xuICAgICAgLy8gcHJvY2VzcyBwcm9wZXJ0aWVzIHNlY3Rpb24gb2YgcmVzdWx0XG4gICAgICBPYmplY3Qua2V5cyhvLnByb3BlcnRpZXMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG8ucHJvcGVydGllc1trZXldLnZhbHVlO1xuICAgICAgICBpZiAoby5wcm9wZXJ0aWVzW2tleV0uY2x2YWx1ZSkge1xuICAgICAgICAgIC8vIHRhYmxlIGZpZWxkcyB3aWxsIGhhdmUgYSBjbGllbnRWYWx1ZSB0b28gLi4uXG4gICAgICAgICAgdmFsdWUgPSBvLnByb3BlcnRpZXNba2V5XS5jbHZhbHVlO1xuICAgICAgICAgIC8vIC4uLiBhbmQgYWxzbyBtYXkgY29udGFpbiB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHJlc29sdmVkXG4gICAgICAgICAgaWYgKG8ucHJvcGVydGllc1trZXldLnJlc29sdmVkVmFsdWVzKSB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXModikuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc1ZhbHVlID0gQXJyYXkuaXNBcnJheSh2W2tdKSA/IHZba10ubWFwKChpOiBhbnkpID0+IG8ucHJvcGVydGllc1trZXldLnJlc29sdmVkVmFsdWVzW2ldKSA6IG8ucHJvcGVydGllc1trZXldLnJlc29sdmVkVmFsdWVzW3Zba11dO1xuICAgICAgICAgICAgICAgIGlmIChyZXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdltgJHtrfV90aXRsZWBdID0gcmVzVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChvLnByb3BlcnRpZXNba2V5XS50aXRsZSkge1xuICAgICAgICAgIGZpZWxkcy5zZXQoa2V5ICsgJ190aXRsZScsIG8ucHJvcGVydGllc1trZXldLnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHByb2Nlc3MgY29udGVudFN0cmVhbXMgc2VjdGlvbiBvZiByZXN1bHQgaWYgYXZhaWxhYmxlLlxuICAgICAgLy8gT2JqZWN0cyB0aGF0IGRvbid0IGhhdmUgZmlsZXMgYXR0YWNoZWQgd29uJ3QgaGF2ZSB0aGlzIHNlY3Rpb25cbiAgICAgIGxldCBjb250ZW50OiBTZWFyY2hSZXN1bHRDb250ZW50IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG8uY29udGVudFN0cmVhbXMgJiYgby5jb250ZW50U3RyZWFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IGVhY2ggcmVzdWx0IG9iamVjdCBvbmx5IGhhcyBPTkUgZmlsZSBhdHRhY2hlZCwgYWx0b3VnaFxuICAgICAgICAvLyB0aGlzIGlzIGFuIGFycmF5IGFuZCB0aGVyZSBtYXkgYmUgbW9yZVxuICAgICAgICBjb25zdCBjb250ZW50U3RyZWFtID0gby5jb250ZW50U3RyZWFtc1swXTtcbiAgICAgICAgLy8gYWxzbyBhZGQgY29udGVudHN0cmVhbSByZWxhdGVkIGZpZWxkcyB0byB0aGUgcmVzdWx0IGZpZWxkc1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5MRU5HVEgsIGNvbnRlbnRTdHJlYW0ubGVuZ3RoKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuTUlNRV9UWVBFLCBjb250ZW50U3RyZWFtLm1pbWVUeXBlKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuRklMRU5BTUUsIGNvbnRlbnRTdHJlYW0uZmlsZU5hbWUpO1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5JRCwgY29udGVudFN0cmVhbS5jb250ZW50U3RyZWFtSWQpO1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5SQU5HRSwgY29udGVudFN0cmVhbS5jb250ZW50U3RyZWFtUmFuZ2UpO1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5SRVBPU0lUT1JZX0lELCBjb250ZW50U3RyZWFtLnJlcG9zaXRvcnlJZCk7XG4gICAgICAgIGZpZWxkcy5zZXQoQ29udGVudFN0cmVhbUZpZWxkLkRJR0VTVCwgY29udGVudFN0cmVhbS5kaWdlc3QpO1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5BUkNISVZFX1BBVEgsIGNvbnRlbnRTdHJlYW0uYXJjaGl2ZVBhdGgpO1xuXG4gICAgICAgIGNvbnRlbnQgPSB7XG4gICAgICAgICAgY29udGVudFN0cmVhbUlkOiBjb250ZW50U3RyZWFtLmNvbnRlbnRTdHJlYW1JZCxcbiAgICAgICAgICByZXBvc2l0b3J5SWQ6IGNvbnRlbnRTdHJlYW0ucmVwb3NpdG9yeUlkLFxuICAgICAgICAgIHJhbmdlOiBjb250ZW50U3RyZWFtLnJhbmdlLFxuICAgICAgICAgIGRpZ2VzdDogY29udGVudFN0cmVhbS5kaWdlc3QsXG4gICAgICAgICAgYXJjaGl2ZVBhdGg6IGNvbnRlbnRTdHJlYW0uYXJjaGl2ZVBhdGgsXG4gICAgICAgICAgZmlsZU5hbWU6IGNvbnRlbnRTdHJlYW0uZmlsZU5hbWUsXG4gICAgICAgICAgbWltZVR5cGU6IGNvbnRlbnRTdHJlYW0ubWltZVR5cGUsXG4gICAgICAgICAgc2l6ZTogY29udGVudFN0cmVhbS5sZW5ndGhcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqZWN0VHlwZUlkID0gby5wcm9wZXJ0aWVzW0Jhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX1RZUEVfSURdID8gby5wcm9wZXJ0aWVzW0Jhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX1RZUEVfSURdLnZhbHVlIDogbnVsbDtcbiAgICAgIGlmIChvYmplY3RUeXBlcy5pbmRleE9mKG9iamVjdFR5cGVJZCkgPT09IC0xKSB7XG4gICAgICAgIG9iamVjdFR5cGVzLnB1c2gob2JqZWN0VHlwZUlkKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0TGlzdEl0ZW1zLnB1c2goe1xuICAgICAgICBvYmplY3RUeXBlSWQsXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgcGVybWlzc2lvbnM6IG8ucGVybWlzc2lvbnNcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTZWFyY2hSZXN1bHQgPSB7XG4gICAgICBoYXNNb3JlSXRlbXM6IHNlYXJjaFJlc3BvbnNlLmhhc01vcmVJdGVtcyxcbiAgICAgIHRvdGFsTnVtSXRlbXM6IHNlYXJjaFJlc3BvbnNlLnRvdGFsTnVtSXRlbXMsXG4gICAgICBpdGVtczogcmVzdWx0TGlzdEl0ZW1zLFxuICAgICAgb2JqZWN0VHlwZXNcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2V2ZW50L2V2ZW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmlnZ2VyYWJsZSBhbmQgU3Vic2NyaWJhYmxlIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFl1dkV2ZW50IHtcbiAgICAvKipcbiAgICAgKiB0eXBlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGRhdGEgdG8gYmUgcGFzc2VkIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gICAgICovXG4gICAgZGF0YT86IGFueTtcbiAgfSJdfQ==
@@ -1,38 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { filter } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * Service for providing triggered events
7
- */
8
- export class EventService {
9
- constructor() {
10
- this.#eventSource = new Subject();
11
- this.event$ = this.#eventSource.asObservable();
12
- }
13
- #eventSource;
14
- /**
15
- * Trigger an global event
16
- * @param type Type/key of the event
17
- * @param data Data to be send along with the event
18
- */
19
- trigger(type, data) {
20
- this.#eventSource.next({ type, data });
21
- }
22
- /**
23
- * Listen on a triggered event
24
- * @param types Type/key of the event
25
- */
26
- on(...types) {
27
- return this.event$.pipe(filter((event) => event && !!types.find((t) => t === event.type)));
28
- }
29
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
30
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, providedIn: 'root' }); }
31
- }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, decorators: [{
33
- type: Injectable,
34
- args: [{
35
- providedIn: 'root'
36
- }]
37
- }] });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS9ldmVudC9ldmVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJRSxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFDdkMsV0FBTSxHQUF5QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBa0JqRTtJQW5CQyxZQUFZLENBQTJCO0lBR3ZDOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVU7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsRUFBRSxDQUFDLEdBQUcsS0FBZTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDOytHQW5CVSxZQUFZO21IQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFl1dkV2ZW50IH0gZnJvbSAnLi9ldmVudC5pbnRlcmZhY2UnO1xuLyoqXG4gKiBTZXJ2aWNlIGZvciBwcm92aWRpbmcgdHJpZ2dlcmVkIGV2ZW50c1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFdmVudFNlcnZpY2Uge1xuICAjZXZlbnRTb3VyY2UgPSBuZXcgU3ViamVjdDxZdXZFdmVudD4oKTtcbiAgZXZlbnQkOiBPYnNlcnZhYmxlPFl1dkV2ZW50PiA9IHRoaXMuI2V2ZW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGdsb2JhbCBldmVudFxuICAgKiBAcGFyYW0gdHlwZSBUeXBlL2tleSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gICAqL1xuICB0cmlnZ2VyKHR5cGU6IHN0cmluZywgZGF0YT86IGFueSkge1xuICAgIHRoaXMuI2V2ZW50U291cmNlLm5leHQoeyB0eXBlLCBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBvbiBhIHRyaWdnZXJlZCBldmVudFxuICAgKiBAcGFyYW0gdHlwZXMgVHlwZS9rZXkgb2YgdGhlIGV2ZW50XG4gICAqL1xuICBvbiguLi50eXBlczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFl1dkV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnQkLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgJiYgISF0eXBlcy5maW5kKCh0KSA9PiB0ID09PSBldmVudC50eXBlKSkpO1xuICB9XG59XG4iXX0=
@@ -1,14 +0,0 @@
1
- /**
2
- * Events emitted by parts of the application
3
- */
4
- export var YuvEventType;
5
- (function (YuvEventType) {
6
- YuvEventType["LOGOUT"] = "yuv.user.logout";
7
- YuvEventType["CLIENT_LOCALE_CHANGED"] = "yuv.user.locale.client.changed";
8
- YuvEventType["DMS_OBJECT_LOADED"] = "yuv.dms.object.loaded";
9
- YuvEventType["DMS_OBJECT_CREATED"] = "yuv.dms.object.created";
10
- YuvEventType["DMS_OBJECT_DELETED"] = "yuv.dms.object.deleted";
11
- YuvEventType["DMS_OBJECT_UPDATED"] = "yuv.dms.object.updated";
12
- YuvEventType["DMS_OBJECTS_MOVED"] = "yuv.dms.objects.moved";
13
- })(YuvEventType || (YuvEventType = {}));
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2V2ZW50L2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDdEIsMENBQTBCLENBQUE7SUFDMUIsd0VBQXdELENBQUE7SUFDeEQsMkRBQTJDLENBQUE7SUFDM0MsNkRBQTZDLENBQUE7SUFDN0MsNkRBQTZDLENBQUE7SUFDN0MsNkRBQTZDLENBQUE7SUFDN0MsMkRBQTJDLENBQUE7QUFDN0MsQ0FBQyxFQVJXLFlBQVksS0FBWixZQUFZLFFBUXZCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdmVudHMgZW1pdHRlZCBieSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gWXV2RXZlbnRUeXBlIHtcbiAgTE9HT1VUID0gJ3l1di51c2VyLmxvZ291dCcsXG4gIENMSUVOVF9MT0NBTEVfQ0hBTkdFRCA9ICd5dXYudXNlci5sb2NhbGUuY2xpZW50LmNoYW5nZWQnLFxuICBETVNfT0JKRUNUX0xPQURFRCA9ICd5dXYuZG1zLm9iamVjdC5sb2FkZWQnLFxuICBETVNfT0JKRUNUX0NSRUFURUQgPSAneXV2LmRtcy5vYmplY3QuY3JlYXRlZCcsXG4gIERNU19PQkpFQ1RfREVMRVRFRCA9ICd5dXYuZG1zLm9iamVjdC5kZWxldGVkJyxcbiAgRE1TX09CSkVDVF9VUERBVEVEID0gJ3l1di5kbXMub2JqZWN0LnVwZGF0ZWQnLFxuICBETVNfT0JKRUNUU19NT1ZFRCA9ICd5dXYuZG1zLm9iamVjdHMubW92ZWQnXG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRtLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS9pZG0vaWRtLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBPcmdhbml6YXRpb25TZXRFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6ICd1c2VyJyB8ICdyb2xlJztcbn1cbiJdfQ==