@sinequa/assistant 3.8.0 → 3.9.0

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 (151) hide show
  1. package/chat/charts/chart/chart.component.d.ts +13 -13
  2. package/chat/chat-message/chat-message.component.d.ts +85 -81
  3. package/chat/chat-message/i18n/en.json +11 -0
  4. package/chat/chat-message/i18n/fr.json +11 -0
  5. package/chat/chat-reference/chat-reference.component.d.ts +14 -14
  6. package/chat/chat-reference/i18n/en.json +4 -0
  7. package/chat/chat-reference/i18n/fr.json +4 -0
  8. package/chat/chat-settings-v3/chat-settings-v3.component.d.ts +48 -50
  9. package/chat/chat-settings-v3/i18n/en.json +14 -0
  10. package/chat/chat-settings-v3/i18n/fr.json +14 -0
  11. package/chat/chat.component.d.ts +388 -1405
  12. package/chat/chat.service.d.ts +247 -228
  13. package/chat/debug-message/debug-message.component.d.ts +17 -17
  14. package/chat/debug-message/i18n/en.json +3 -0
  15. package/chat/debug-message/i18n/fr.json +3 -0
  16. package/chat/dialogs/delete-saved-chat.component.d.ts +22 -0
  17. package/chat/dialogs/i18n/en.json +19 -0
  18. package/chat/dialogs/i18n/fr.json +19 -0
  19. package/chat/dialogs/rename-saved-chat.component.d.ts +21 -0
  20. package/chat/dialogs/updates.component.d.ts +15 -0
  21. package/chat/documents-upload/document-list/document-list.component.d.ts +68 -77
  22. package/chat/documents-upload/document-overview/document-overview.component.d.ts +31 -41
  23. package/chat/documents-upload/document-upload/document-upload.component.d.ts +96 -98
  24. package/chat/documents-upload/documents-upload.model.d.ts +66 -66
  25. package/chat/documents-upload/documents-upload.service.d.ts +170 -174
  26. package/chat/documents-upload/i18n/en.json +24 -0
  27. package/chat/documents-upload/i18n/fr.json +24 -0
  28. package/chat/format-icon/format-icon.component.d.ts +10 -10
  29. package/chat/format-icon/icons.d.ts +5 -5
  30. package/chat/i18n/en.json +42 -0
  31. package/chat/i18n/fr.json +42 -0
  32. package/chat/index.d.ts +5 -5
  33. package/chat/initials-avatar/initials-avatar.component.d.ts +35 -35
  34. package/chat/instance-manager.service.d.ts +28 -28
  35. package/chat/pipes/message-content.pipe.d.ts +16 -0
  36. package/chat/prompt.component.d.ts +25 -21
  37. package/chat/public-api.d.ts +17 -17
  38. package/chat/references/i18n/en.json +6 -0
  39. package/chat/references/i18n/fr.json +6 -0
  40. package/chat/references/inline-image-reference.d.ts +21 -0
  41. package/chat/references/inline-page-reference.d.ts +21 -0
  42. package/chat/rest-chat.service.d.ts +31 -33
  43. package/chat/saved-chats/i18n/en.json +4 -0
  44. package/chat/saved-chats/i18n/fr.json +4 -0
  45. package/chat/saved-chats/saved-chats.component.d.ts +30 -36
  46. package/chat/services/app.service.d.ts +8 -0
  47. package/chat/services/dialog.service.d.ts +12 -0
  48. package/chat/services/notification.service.d.ts +10 -0
  49. package/chat/services/principal.service.d.ts +7 -0
  50. package/chat/services/search.service.d.ts +7 -0
  51. package/chat/services/signalR.web.service.d.ts +45 -0
  52. package/chat/services/ui.service.d.ts +13 -0
  53. package/chat/services/user-settings.service.d.ts +7 -0
  54. package/chat/token-progress-bar/i18n/en.json +4 -0
  55. package/chat/token-progress-bar/i18n/fr.json +4 -0
  56. package/chat/token-progress-bar/token-progress-bar.component.d.ts +24 -27
  57. package/chat/tooltip/tooltip.component.d.ts +12 -0
  58. package/chat/tooltip/tooltip.directive.d.ts +81 -0
  59. package/chat/types/message-content.types.d.ts +54 -0
  60. package/chat/types/message-reference.types.d.ts +11 -0
  61. package/chat/types.d.ts +913 -873
  62. package/chat/unified-plugins/embedded-image-reference.plugin.d.ts +3 -0
  63. package/chat/unified-plugins/embedded-page-reference.plugin.d.ts +3 -0
  64. package/chat/utils/assistant-json.d.ts +2 -0
  65. package/chat/websocket-chat.service.d.ts +102 -103
  66. package/esm2022/chat/charts/chart/chart.component.mjs +40 -0
  67. package/esm2022/chat/chat-message/chat-message.component.mjs +351 -0
  68. package/esm2022/chat/chat-reference/chat-reference.component.mjs +40 -0
  69. package/esm2022/chat/chat-settings-v3/chat-settings-v3.component.mjs +118 -0
  70. package/esm2022/chat/chat.component.mjs +1090 -0
  71. package/esm2022/chat/chat.service.mjs +417 -0
  72. package/esm2022/chat/debug-message/debug-message.component.mjs +43 -0
  73. package/esm2022/chat/dialogs/delete-saved-chat.component.mjs +81 -0
  74. package/esm2022/chat/dialogs/rename-saved-chat.component.mjs +84 -0
  75. package/esm2022/chat/dialogs/updates.component.mjs +61 -0
  76. package/esm2022/chat/documents-upload/document-list/document-list.component.mjs +140 -0
  77. package/esm2022/chat/documents-upload/document-overview/document-overview.component.mjs +65 -0
  78. package/esm2022/chat/documents-upload/document-upload/document-upload.component.mjs +256 -0
  79. package/{esm2020 → esm2022}/chat/documents-upload/documents-upload.model.mjs +1 -1
  80. package/esm2022/chat/documents-upload/documents-upload.service.mjs +291 -0
  81. package/{esm2020 → esm2022}/chat/format-icon/format-icon.component.mjs +23 -23
  82. package/{esm2020 → esm2022}/chat/format-icon/icons.mjs +137 -137
  83. package/{esm2020 → esm2022}/chat/initials-avatar/initials-avatar.component.mjs +60 -60
  84. package/esm2022/chat/instance-manager.service.mjs +46 -0
  85. package/esm2022/chat/pipes/message-content.pipe.mjs +34 -0
  86. package/esm2022/chat/prompt.component.mjs +88 -0
  87. package/{esm2020 → esm2022}/chat/public-api.mjs +18 -18
  88. package/esm2022/chat/references/inline-image-reference.mjs +110 -0
  89. package/esm2022/chat/references/inline-page-reference.mjs +110 -0
  90. package/esm2022/chat/rest-chat.service.mjs +296 -0
  91. package/esm2022/chat/saved-chats/saved-chats.component.mjs +82 -0
  92. package/esm2022/chat/services/app.service.mjs +19 -0
  93. package/esm2022/chat/services/dialog.service.mjs +40 -0
  94. package/esm2022/chat/services/notification.service.mjs +25 -0
  95. package/esm2022/chat/services/principal.service.mjs +16 -0
  96. package/esm2022/chat/services/search.service.mjs +13 -0
  97. package/esm2022/chat/services/signalR.web.service.mjs +79 -0
  98. package/esm2022/chat/services/ui.service.mjs +61 -0
  99. package/esm2022/chat/services/user-settings.service.mjs +22 -0
  100. package/{esm2020 → esm2022}/chat/sinequa-assistant-chat.mjs +4 -4
  101. package/esm2022/chat/token-progress-bar/token-progress-bar.component.mjs +52 -0
  102. package/esm2022/chat/tooltip/tooltip.component.mjs +44 -0
  103. package/esm2022/chat/tooltip/tooltip.directive.mjs +203 -0
  104. package/esm2022/chat/types/message-content.types.mjs +2 -0
  105. package/esm2022/chat/types/message-reference.types.mjs +2 -0
  106. package/esm2022/chat/types.mjs +130 -0
  107. package/esm2022/chat/unified-plugins/embedded-image-reference.plugin.mjs +57 -0
  108. package/esm2022/chat/unified-plugins/embedded-page-reference.plugin.mjs +57 -0
  109. package/esm2022/chat/utils/assistant-json.mjs +12 -0
  110. package/esm2022/chat/websocket-chat.service.mjs +654 -0
  111. package/{esm2020 → esm2022}/public-api.mjs +2 -2
  112. package/{esm2020 → esm2022}/sinequa-assistant.mjs +4 -4
  113. package/fesm2022/sinequa-assistant-chat.mjs +5340 -0
  114. package/fesm2022/sinequa-assistant-chat.mjs.map +1 -0
  115. package/{fesm2015 → fesm2022}/sinequa-assistant.mjs +3 -3
  116. package/index.d.ts +5 -5
  117. package/package.json +52 -25
  118. package/public-api.d.ts +1 -1
  119. package/chat/messages/de.d.ts +0 -4
  120. package/chat/messages/en.d.ts +0 -4
  121. package/chat/messages/fr.d.ts +0 -4
  122. package/chat/messages/index.d.ts +0 -4
  123. package/esm2020/chat/charts/chart/chart.component.mjs +0 -40
  124. package/esm2020/chat/chat-message/chat-message.component.mjs +0 -263
  125. package/esm2020/chat/chat-reference/chat-reference.component.mjs +0 -40
  126. package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +0 -117
  127. package/esm2020/chat/chat.component.mjs +0 -1069
  128. package/esm2020/chat/chat.service.mjs +0 -333
  129. package/esm2020/chat/debug-message/debug-message.component.mjs +0 -43
  130. package/esm2020/chat/documents-upload/document-list/document-list.component.mjs +0 -191
  131. package/esm2020/chat/documents-upload/document-overview/document-overview.component.mjs +0 -80
  132. package/esm2020/chat/documents-upload/document-upload/document-upload.component.mjs +0 -258
  133. package/esm2020/chat/documents-upload/documents-upload.service.mjs +0 -289
  134. package/esm2020/chat/instance-manager.service.mjs +0 -46
  135. package/esm2020/chat/messages/de.mjs +0 -4
  136. package/esm2020/chat/messages/en.mjs +0 -4
  137. package/esm2020/chat/messages/fr.mjs +0 -4
  138. package/esm2020/chat/messages/index.mjs +0 -9
  139. package/esm2020/chat/prompt.component.mjs +0 -88
  140. package/esm2020/chat/rest-chat.service.mjs +0 -241
  141. package/esm2020/chat/saved-chats/saved-chats.component.mjs +0 -175
  142. package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +0 -54
  143. package/esm2020/chat/types.mjs +0 -112
  144. package/esm2020/chat/websocket-chat.service.mjs +0 -641
  145. package/fesm2015/sinequa-assistant-chat.mjs +0 -4200
  146. package/fesm2015/sinequa-assistant-chat.mjs.map +0 -1
  147. package/fesm2020/sinequa-assistant-chat.mjs +0 -4171
  148. package/fesm2020/sinequa-assistant-chat.mjs.map +0 -1
  149. package/fesm2020/sinequa-assistant.mjs +0 -9
  150. package/fesm2020/sinequa-assistant.mjs.map +0 -1
  151. /package/{fesm2015 → fesm2022}/sinequa-assistant.mjs.map +0 -0
@@ -0,0 +1,81 @@
1
+ import { Component, inject, input, output, signal, viewChild } from "@angular/core";
2
+ import { FormsModule } from "@angular/forms";
3
+ import { catchError, Subscription, tap, throwError } from "rxjs";
4
+ import { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';
5
+ import { NotificationsService } from "../services/notification.service";
6
+ import * as i0 from "@angular/core";
7
+ export class DialogDeleteSavedChatComponent {
8
+ constructor() {
9
+ this.deleteDialog = viewChild('deleteDialog');
10
+ this.notificationsService = inject(NotificationsService);
11
+ this.transloco = inject(TranslocoService);
12
+ this.chatService = input.required();
13
+ this.delete = output();
14
+ this.savedChat = signal({ currentTitle: '', title: '' });
15
+ this.subscription = new Subscription();
16
+ }
17
+ showModal(event, savedChat) {
18
+ event.stopPropagation();
19
+ this.savedChat.set({ ...savedChat, currentTitle: savedChat.title });
20
+ this.deleteDialog()?.nativeElement.showModal();
21
+ }
22
+ onDelete(event, savedChat) {
23
+ event.stopPropagation();
24
+ if (!!this.chatService().streaming$.value || !!this.chatService().stoppingGeneration$.value) {
25
+ return;
26
+ }
27
+ this.subscription.add(this.chatService().deleteSavedChat([savedChat.id])
28
+ .pipe(tap(res => {
29
+ this.notificationsService.success(this.transloco.translate('chatDialogs.deleteSavedDiscussionSuccess', { title: savedChat.title }));
30
+ this.delete.emit(savedChat);
31
+ this.chatService().listSavedChat();
32
+ this.chatService().generateAuditEvent('ast-saved-chat.delete', { duration: res.executionTimeMilliseconds }, savedChat.id);
33
+ }), catchError((error) => {
34
+ console.error('Error occurred while deleting the saved chat:', error);
35
+ this.notificationsService.error(this.transloco.translate('chatDialogs.deleteSavedDiscussionError', { title: savedChat.title }));
36
+ return throwError(() => error);
37
+ })).subscribe());
38
+ this.deleteDialog()?.nativeElement.close();
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DialogDeleteSavedChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: DialogDeleteSavedChatComponent, isStandalone: true, selector: "sq-dialog-delete-saved-chat", inputs: { chatService: { classPropertyName: "chatService", publicName: "chatService", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { delete: "delete" }, providers: [provideTranslocoScope('chat-dialogs')], viewQueries: [{ propertyName: "deleteDialog", first: true, predicate: ["deleteDialog"], descendants: true, isSignal: true }], ngImport: i0, template: `
42
+ <dialog popover #deleteDialog class="rounded-3 z-backdrop w-full max-w-md p-4 rounded-lg border border-neutral-200 shadow-2xl">
43
+ <div class="flex flex-col gap-4">
44
+ <h1 class="text-xl font-bold">{{ 'chatDialogs.deleteSavedDiscussion' | transloco }}</h1>
45
+ <hr class="border-t">
46
+ <p>{{ 'chatDialogs.deleteSavedDiscussionText' | transloco }} "{{ savedChat().title }}".</p>
47
+ <p>{{ 'chatDialogs.deleteSavedDiscussionConfirm' | transloco }}</p>
48
+
49
+ <div class="flex justify-end d-flex justify-content-end gap-2 mt-4">
50
+ <button class="btn btn-ghost btn-light outline-none" (click)="deleteDialog.close()">{{ 'chatDialogs.cancel' | transloco }}</button>
51
+ <button class="btn btn-danger" (click)="onDelete($event, savedChat())">{{ 'chatDialogs.confirm' | transloco }}</button>
52
+ </div>
53
+ </div>
54
+ </dialog>
55
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DialogDeleteSavedChatComponent, decorators: [{
58
+ type: Component,
59
+ args: [{
60
+ selector: 'sq-dialog-delete-saved-chat',
61
+ standalone: true,
62
+ imports: [FormsModule, TranslocoPipe],
63
+ providers: [provideTranslocoScope('chat-dialogs')],
64
+ template: `
65
+ <dialog popover #deleteDialog class="rounded-3 z-backdrop w-full max-w-md p-4 rounded-lg border border-neutral-200 shadow-2xl">
66
+ <div class="flex flex-col gap-4">
67
+ <h1 class="text-xl font-bold">{{ 'chatDialogs.deleteSavedDiscussion' | transloco }}</h1>
68
+ <hr class="border-t">
69
+ <p>{{ 'chatDialogs.deleteSavedDiscussionText' | transloco }} "{{ savedChat().title }}".</p>
70
+ <p>{{ 'chatDialogs.deleteSavedDiscussionConfirm' | transloco }}</p>
71
+
72
+ <div class="flex justify-end d-flex justify-content-end gap-2 mt-4">
73
+ <button class="btn btn-ghost btn-light outline-none" (click)="deleteDialog.close()">{{ 'chatDialogs.cancel' | transloco }}</button>
74
+ <button class="btn btn-danger" (click)="onDelete($event, savedChat())">{{ 'chatDialogs.confirm' | transloco }}</button>
75
+ </div>
76
+ </div>
77
+ </dialog>
78
+ `
79
+ }]
80
+ }] });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXNhdmVkLWNoYXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvZGlhbG9ncy9kZWxldGUtc2F2ZWQtY2hhdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUEyQnhFLE1BQU0sT0FBTyw4QkFBOEI7SUFyQjNDO1FBc0JFLGlCQUFZLEdBQUcsU0FBUyxDQUFnQyxjQUFjLENBQUMsQ0FBQztRQUV4RSx5QkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNuQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFdEQsZ0JBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7UUFDNUMsV0FBTSxHQUFHLE1BQU0sRUFBYSxDQUFDO1FBRTdCLGNBQVMsR0FBRyxNQUFNLENBQWdCLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFtQixDQUFDLENBQUM7UUFFcEYsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBZ0NuQztJQTlCQyxTQUFTLENBQUMsS0FBWSxFQUFFLFNBQW9CO1FBQzFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFDLEdBQUcsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFUyxRQUFRLENBQUMsS0FBWSxFQUFFLFNBQW9CO1FBQ25ELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVGLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQ25CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDL0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNSLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsMENBQTBDLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1SCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLCtDQUErQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsd0NBQXdDLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoSSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxDQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QyxDQUFDOytHQXpDVSw4QkFBOEI7bUdBQTlCLDhCQUE4Qiw4UEFqQjlCLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUMsd0pBQ3hDOzs7Ozs7Ozs7Ozs7OztHQWNULDJEQWhCUyxXQUFXLDBCQUFFLGFBQWE7OzRGQWtCekIsOEJBQThCO2tCQXJCMUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNkJBQTZCO29CQUN2QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQztvQkFDckMsU0FBUyxFQUFFLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ2xELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7R0FjVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIFN1YnNjcmlwdGlvbiwgdGFwLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgcHJvdmlkZVRyYW5zbG9jb1Njb3BlLCBUcmFuc2xvY29QaXBlLCBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL2NoYXQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTYXZlZENoYXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCB0eXBlIFNhdmVkQ2hhdEVkaXQgPSBTYXZlZENoYXQgJiB7IGN1cnJlbnRUaXRsZTogc3RyaW5nIH07XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcS1kaWFsb2ctZGVsZXRlLXNhdmVkLWNoYXQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0Zvcm1zTW9kdWxlLCBUcmFuc2xvY29QaXBlXSxcclxuICBwcm92aWRlcnM6IFtwcm92aWRlVHJhbnNsb2NvU2NvcGUoJ2NoYXQtZGlhbG9ncycpXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gIDxkaWFsb2cgcG9wb3ZlciAjZGVsZXRlRGlhbG9nIGNsYXNzPVwicm91bmRlZC0zIHotYmFja2Ryb3Agdy1mdWxsIG1heC13LW1kIHAtNCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItbmV1dHJhbC0yMDAgc2hhZG93LTJ4bFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cclxuICAgICAgPGgxIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGRcIj57eyAnY2hhdERpYWxvZ3MuZGVsZXRlU2F2ZWREaXNjdXNzaW9uJyB8IHRyYW5zbG9jbyB9fTwvaDE+XHJcbiAgICAgIDxociBjbGFzcz1cImJvcmRlci10XCI+XHJcbiAgICAgIDxwPnt7ICdjaGF0RGlhbG9ncy5kZWxldGVTYXZlZERpc2N1c3Npb25UZXh0JyB8IHRyYW5zbG9jbyB9fSBcInt7IHNhdmVkQ2hhdCgpLnRpdGxlIH19XCIuPC9wPlxyXG4gICAgICA8cD57eyAnY2hhdERpYWxvZ3MuZGVsZXRlU2F2ZWREaXNjdXNzaW9uQ29uZmlybScgfCB0cmFuc2xvY28gfX08L3A+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBtdC00XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZ2hvc3QgYnRuLWxpZ2h0IG91dGxpbmUtbm9uZVwiIChjbGljayk9XCJkZWxldGVEaWFsb2cuY2xvc2UoKVwiPnt7ICdjaGF0RGlhbG9ncy5jYW5jZWwnIHwgdHJhbnNsb2NvIH19PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cIm9uRGVsZXRlKCRldmVudCwgc2F2ZWRDaGF0KCkpXCI+e3sgJ2NoYXREaWFsb2dzLmNvbmZpcm0nIHwgdHJhbnNsb2NvIH19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaWFsb2c+XHJcbiAgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nRGVsZXRlU2F2ZWRDaGF0Q29tcG9uZW50IHtcclxuICBkZWxldGVEaWFsb2cgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGlhbG9nRWxlbWVudD4+KCdkZWxldGVEaWFsb2cnKTtcclxuXHJcbiAgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsb2NvID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xyXG5cclxuICBjaGF0U2VydmljZSA9IGlucHV0LnJlcXVpcmVkPENoYXRTZXJ2aWNlPigpO1xyXG4gIGRlbGV0ZSA9IG91dHB1dDxTYXZlZENoYXQ+KCk7XHJcblxyXG4gIHNhdmVkQ2hhdCA9IHNpZ25hbDxTYXZlZENoYXRFZGl0Pih7IGN1cnJlbnRUaXRsZTogJycsIHRpdGxlOiAnJyB9IGFzIFNhdmVkQ2hhdEVkaXQpO1xyXG5cclxuICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHNob3dNb2RhbChldmVudDogRXZlbnQsIHNhdmVkQ2hhdDogU2F2ZWRDaGF0KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2F2ZWRDaGF0LnNldCh7Li4uc2F2ZWRDaGF0LCBjdXJyZW50VGl0bGU6IHNhdmVkQ2hhdC50aXRsZSB9KTtcclxuICAgIHRoaXMuZGVsZXRlRGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuc2hvd01vZGFsKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25EZWxldGUoZXZlbnQ6IEV2ZW50LCBzYXZlZENoYXQ6IFNhdmVkQ2hhdCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoISF0aGlzLmNoYXRTZXJ2aWNlKCkuc3RyZWFtaW5nJC52YWx1ZSB8fCAhIXRoaXMuY2hhdFNlcnZpY2UoKS5zdG9wcGluZ0dlbmVyYXRpb24kLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgdGhpcy5jaGF0U2VydmljZSgpLmRlbGV0ZVNhdmVkQ2hhdChbc2F2ZWRDaGF0LmlkXSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRhcChyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLnN1Y2Nlc3ModGhpcy50cmFuc2xvY28udHJhbnNsYXRlKCdjaGF0RGlhbG9ncy5kZWxldGVTYXZlZERpc2N1c3Npb25TdWNjZXNzJywgeyB0aXRsZTogc2F2ZWRDaGF0LnRpdGxlIH0pKTtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGUuZW1pdChzYXZlZENoYXQpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlKCkubGlzdFNhdmVkQ2hhdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlKCkuZ2VuZXJhdGVBdWRpdEV2ZW50KCdhc3Qtc2F2ZWQtY2hhdC5kZWxldGUnLCB7IGR1cmF0aW9uOiByZXMuZXhlY3V0aW9uVGltZU1pbGxpc2Vjb25kcyB9LCBzYXZlZENoYXQuaWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBkZWxldGluZyB0aGUgc2F2ZWQgY2hhdDonLCBlcnJvcik7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IodGhpcy50cmFuc2xvY28udHJhbnNsYXRlKCdjaGF0RGlhbG9ncy5kZWxldGVTYXZlZERpc2N1c3Npb25FcnJvcicsIHsgdGl0bGU6IHNhdmVkQ2hhdC50aXRsZSB9KSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxyXG4gICAgKTtcclxuICAgIHRoaXMuZGVsZXRlRGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,84 @@
1
+ import { Component, inject, input, signal, viewChild } from "@angular/core";
2
+ import { FormsModule } from "@angular/forms";
3
+ import { catchError, Subscription, tap, throwError } from "rxjs";
4
+ import { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';
5
+ import { NotificationsService } from "../services/notification.service";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ export class DialogRenameSavedChatComponent {
9
+ constructor() {
10
+ this.renameDialog = viewChild('renameDialog');
11
+ this.notificationsService = inject(NotificationsService);
12
+ this.transloco = inject(TranslocoService);
13
+ this.chatService = input.required();
14
+ this.savedChat = signal({ currentTitle: '', title: '' });
15
+ this.subscription = new Subscription();
16
+ }
17
+ showModal(event, savedChat) {
18
+ event.stopPropagation();
19
+ this.savedChat.set({ ...savedChat, currentTitle: savedChat.title });
20
+ this.renameDialog()?.nativeElement.showModal();
21
+ }
22
+ onRename(event, savedChat) {
23
+ event.stopPropagation();
24
+ if (!!this.chatService().streaming$.value || !!this.chatService().stoppingGeneration$.value) {
25
+ return;
26
+ }
27
+ this.subscription.add(this.chatService().updateSavedChat(savedChat.id, savedChat.title)
28
+ .pipe(tap(res => {
29
+ this.notificationsService.success(this.transloco.translate('chatDialogs.renameSavedDiscussionSuccess', { currentTitle: savedChat.currentTitle, title: savedChat.title }));
30
+ this.chatService().listSavedChat();
31
+ this.chatService().generateAuditEvent('ast-saved-chat.rename', { 'text': savedChat.title, duration: res.executionTimeMilliseconds }, savedChat.id);
32
+ }), catchError((error) => {
33
+ console.error('Error occurred while updating the saved chat:', error);
34
+ this.notificationsService.error(this.transloco.translate('chatDialogs.renameSavedDiscussionError', { currentTitle: savedChat.currentTitle }));
35
+ return throwError(() => error);
36
+ })).subscribe());
37
+ this.renameDialog()?.nativeElement.close();
38
+ }
39
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DialogRenameSavedChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: DialogRenameSavedChatComponent, isStandalone: true, selector: "sq-dialog-rename-saved-chat", inputs: { chatService: { classPropertyName: "chatService", publicName: "chatService", isSignal: true, isRequired: true, transformFunction: null } }, providers: [provideTranslocoScope('chat-dialogs')], viewQueries: [{ propertyName: "renameDialog", first: true, predicate: ["renameDialog"], descendants: true, isSignal: true }], ngImport: i0, template: `
41
+ <dialog popover #renameDialog class="rounded-3 z-backdrop w-full max-w-md p-4 rounded-lg border border-neutral-200 shadow-2xl">
42
+ <div class="flex flex-col gap-4">
43
+ <h1 class="text-xl font-bold">{{ 'chatDialogs.renameSavedDiscussion' | transloco }}</h1>
44
+ <hr class="border-t">
45
+ <p>{{ 'chatDialogs.renameSavedDiscussionText' | transloco }} "{{ savedChat().currentTitle }}"</p>
46
+ <input
47
+ class="w-100 rounded h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
48
+ type="text" [(ngModel)]="savedChat().title" />
49
+
50
+ <div class="flex justify-end d-flex justify-content-end gap-2 mt-4">
51
+ <button class="btn btn-ghost btn-light outline-none" (click)="renameDialog.close()">{{ 'chatDialogs.cancel' | transloco }}</button>
52
+ <button class="btn btn-primary" (click)="onRename($event, savedChat())">{{ 'chatDialogs.rename' | transloco }}</button>
53
+ </div>
54
+ </div>
55
+ </dialog>
56
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DialogRenameSavedChatComponent, decorators: [{
59
+ type: Component,
60
+ args: [{
61
+ selector: 'sq-dialog-rename-saved-chat',
62
+ standalone: true,
63
+ imports: [FormsModule, TranslocoPipe],
64
+ providers: [provideTranslocoScope('chat-dialogs')],
65
+ template: `
66
+ <dialog popover #renameDialog class="rounded-3 z-backdrop w-full max-w-md p-4 rounded-lg border border-neutral-200 shadow-2xl">
67
+ <div class="flex flex-col gap-4">
68
+ <h1 class="text-xl font-bold">{{ 'chatDialogs.renameSavedDiscussion' | transloco }}</h1>
69
+ <hr class="border-t">
70
+ <p>{{ 'chatDialogs.renameSavedDiscussionText' | transloco }} "{{ savedChat().currentTitle }}"</p>
71
+ <input
72
+ class="w-100 rounded h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
73
+ type="text" [(ngModel)]="savedChat().title" />
74
+
75
+ <div class="flex justify-end d-flex justify-content-end gap-2 mt-4">
76
+ <button class="btn btn-ghost btn-light outline-none" (click)="renameDialog.close()">{{ 'chatDialogs.cancel' | transloco }}</button>
77
+ <button class="btn btn-primary" (click)="onRename($event, savedChat())">{{ 'chatDialogs.rename' | transloco }}</button>
78
+ </div>
79
+ </div>
80
+ </dialog>
81
+ `
82
+ }]
83
+ }] });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuYW1lLXNhdmVkLWNoYXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvZGlhbG9ncy9yZW5hbWUtc2F2ZWQtY2hhdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7QUE2QnhFLE1BQU0sT0FBTyw4QkFBOEI7SUF2QjNDO1FBd0JFLGlCQUFZLEdBQUcsU0FBUyxDQUFnQyxjQUFjLENBQUMsQ0FBQztRQUV4RSx5QkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNuQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFdEQsZ0JBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7UUFDNUMsY0FBUyxHQUFHLE1BQU0sQ0FBZ0IsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQW1CLENBQUMsQ0FBQztRQUVwRixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0ErQm5DO0lBN0JDLFNBQVMsQ0FBQyxLQUFZLEVBQUUsU0FBb0I7UUFDMUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVTLFFBQVEsQ0FBQyxLQUFZLEVBQUUsU0FBd0I7UUFDdkQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUYsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUM7YUFDOUQsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNSLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsMENBQTBDLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNySixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLCtDQUErQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsd0NBQXdDLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5SSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxDQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QyxDQUFDOytHQXRDVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwrTkFuQjlCLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUMsd0pBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JULDJEQWxCUyxXQUFXLDBtQkFBRSxhQUFhOzs0RkFvQnpCLDhCQUE4QjtrQkF2QjFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUM7b0JBQ3JDLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUNsRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQ7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgU3Vic2NyaXB0aW9uLCB0YXAsIHRocm93RXJyb3IgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBwcm92aWRlVHJhbnNsb2NvU2NvcGUsIFRyYW5zbG9jb1BpcGUsIFRyYW5zbG9jb1NlcnZpY2UgfSBmcm9tICdAanN2ZXJzZS90cmFuc2xvY28nO1xyXG5cclxuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi4vY2hhdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNhdmVkQ2hhdCB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5cclxuZXhwb3J0IHR5cGUgU2F2ZWRDaGF0RWRpdCA9IFNhdmVkQ2hhdCAmIHsgY3VycmVudFRpdGxlOiBzdHJpbmcgfTtcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NxLWRpYWxvZy1yZW5hbWUtc2F2ZWQtY2hhdCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIFRyYW5zbG9jb1BpcGVdLFxyXG4gIHByb3ZpZGVyczogW3Byb3ZpZGVUcmFuc2xvY29TY29wZSgnY2hhdC1kaWFsb2dzJyldLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgPGRpYWxvZyBwb3BvdmVyICNyZW5hbWVEaWFsb2cgY2xhc3M9XCJyb3VuZGVkLTMgei1iYWNrZHJvcCB3LWZ1bGwgbWF4LXctbWQgcC00IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1uZXV0cmFsLTIwMCBzaGFkb3ctMnhsXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cclxuICAgIDxoMSBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkXCI+e3sgJ2NoYXREaWFsb2dzLnJlbmFtZVNhdmVkRGlzY3Vzc2lvbicgfCB0cmFuc2xvY28gfX08L2gxPlxyXG4gICAgPGhyIGNsYXNzPVwiYm9yZGVyLXRcIj5cclxuICAgIDxwPnt7ICdjaGF0RGlhbG9ncy5yZW5hbWVTYXZlZERpc2N1c3Npb25UZXh0JyB8IHRyYW5zbG9jbyB9fSBcInt7IHNhdmVkQ2hhdCgpLmN1cnJlbnRUaXRsZSB9fVwiPC9wPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIGNsYXNzPVwidy0xMDAgcm91bmRlZCBoLTEwIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZpbGU6Ym9yZGVyLTAgZmlsZTpiZy10cmFuc3BhcmVudCBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwXCJcclxuICAgICAgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNhdmVkQ2hhdCgpLnRpdGxlXCIgLz5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBtdC00XCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWdob3N0IGJ0bi1saWdodCBvdXRsaW5lLW5vbmVcIiAoY2xpY2spPVwicmVuYW1lRGlhbG9nLmNsb3NlKClcIj57eyAnY2hhdERpYWxvZ3MuY2FuY2VsJyB8IHRyYW5zbG9jbyB9fTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uUmVuYW1lKCRldmVudCwgc2F2ZWRDaGF0KCkpXCI+e3sgJ2NoYXREaWFsb2dzLnJlbmFtZScgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2RpYWxvZz5cclxuICBgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dSZW5hbWVTYXZlZENoYXRDb21wb25lbnQge1xyXG4gIHJlbmFtZURpYWxvZyA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaWFsb2dFbGVtZW50Pj4oJ3JlbmFtZURpYWxvZycpO1xyXG5cclxuICBub3RpZmljYXRpb25zU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xvY28gPSBpbmplY3QoVHJhbnNsb2NvU2VydmljZSk7XHJcblxyXG4gIGNoYXRTZXJ2aWNlID0gaW5wdXQucmVxdWlyZWQ8Q2hhdFNlcnZpY2U+KCk7XHJcbiAgc2F2ZWRDaGF0ID0gc2lnbmFsPFNhdmVkQ2hhdEVkaXQ+KHsgY3VycmVudFRpdGxlOiAnJywgdGl0bGU6ICcnIH0gYXMgU2F2ZWRDaGF0RWRpdCk7XHJcblxyXG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgc2hvd01vZGFsKGV2ZW50OiBFdmVudCwgc2F2ZWRDaGF0OiBTYXZlZENoYXQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zYXZlZENoYXQuc2V0KHsgLi4uc2F2ZWRDaGF0LCBjdXJyZW50VGl0bGU6IHNhdmVkQ2hhdC50aXRsZSB9KTtcclxuICAgIHRoaXMucmVuYW1lRGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuc2hvd01vZGFsKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25SZW5hbWUoZXZlbnQ6IEV2ZW50LCBzYXZlZENoYXQ6IFNhdmVkQ2hhdEVkaXQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCEhdGhpcy5jaGF0U2VydmljZSgpLnN0cmVhbWluZyQudmFsdWUgfHwgISF0aGlzLmNoYXRTZXJ2aWNlKCkuc3RvcHBpbmdHZW5lcmF0aW9uJC52YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UoKS51cGRhdGVTYXZlZENoYXQoc2F2ZWRDaGF0LmlkLCBzYXZlZENoYXQudGl0bGUpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5zdWNjZXNzKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERpYWxvZ3MucmVuYW1lU2F2ZWREaXNjdXNzaW9uU3VjY2VzcycsIHsgY3VycmVudFRpdGxlOiBzYXZlZENoYXQuY3VycmVudFRpdGxlLCB0aXRsZTogc2F2ZWRDaGF0LnRpdGxlIH0pKTtcclxuICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZSgpLmxpc3RTYXZlZENoYXQoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGF0U2VydmljZSgpLmdlbmVyYXRlQXVkaXRFdmVudCgnYXN0LXNhdmVkLWNoYXQucmVuYW1lJywgeyAndGV4dCc6IHNhdmVkQ2hhdC50aXRsZSwgZHVyYXRpb246IHJlcy5leGVjdXRpb25UaW1lTWlsbGlzZWNvbmRzIH0sIHNhdmVkQ2hhdC5pZCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIHRoZSBzYXZlZCBjaGF0OicsIGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREaWFsb2dzLnJlbmFtZVNhdmVkRGlzY3Vzc2lvbkVycm9yJywgeyBjdXJyZW50VGl0bGU6IHNhdmVkQ2hhdC5jdXJyZW50VGl0bGUgfSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICkuc3Vic2NyaWJlKClcclxuICAgICk7XHJcbiAgICB0aGlzLnJlbmFtZURpYWxvZygpPy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
@@ -0,0 +1,61 @@
1
+ import { Component, computed, ElementRef, output, viewChild } from "@angular/core";
2
+ import { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';
3
+ import * as i0 from "@angular/core";
4
+ export class DialogUpdatesComponent {
5
+ constructor() {
6
+ this.dialogRef = viewChild('dialog', { read: (ElementRef) });
7
+ this.dialog = computed(() => this.dialogRef()?.nativeElement);
8
+ this.closed = output();
9
+ }
10
+ open() {
11
+ this.dialog().showModal();
12
+ }
13
+ close(eventType = "dialog-close") {
14
+ this.dialog().close();
15
+ this.closed.emit(eventType);
16
+ // dispatch a javascript event
17
+ document.dispatchEvent(new Event(eventType));
18
+ }
19
+ seeNoMore() {
20
+ this.close("dialog-no");
21
+ }
22
+ remindMeLater() {
23
+ this.close();
24
+ }
25
+ update() {
26
+ this.close("dialog-confirm");
27
+ }
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DialogUpdatesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.13", type: DialogUpdatesComponent, isStandalone: true, selector: "sq-dialog-updates", outputs: { closed: "closed" }, providers: [provideTranslocoScope('chat-dialogs')], viewQueries: [{ propertyName: "dialogRef", first: true, predicate: ["dialog"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
30
+ <dialog popover #dialog class="z-backdrop w-full max-w-md p-4 rounded-lg border border-neutral-200 shadow-2xl">
31
+ <div class="flex flex-col gap-4">
32
+ <h1 class="text-xl font-bold">{{ 'chatDialogs.availableUpdates' | transloco }}</h1>
33
+ <hr class="border-t">
34
+ <p>{{ 'chatDialogs.availableUpdatesText' | transloco }}</p>
35
+ <div class="flex justify-end gap-2 mt-4">
36
+ <button class="btn btn-ghost outline-none w-24" (click)="seeNoMore()">{{ 'chatDialogs.seeNoMore' | transloco }}</button>
37
+ <button class="btn btn-secondary" (click)="remindMeLater()">{{ 'chatDialogs.remindMeLater' | transloco }}</button>
38
+ <button class="btn btn-primary w-24" (click)="update()">{{ 'chatDialogs.update' | transloco }}</button>
39
+ </div>
40
+ </div>
41
+ </dialog>
42
+ `, isInline: true, styles: [".flex{display:flex}.flex-col{flex-direction:column}.justify-end{justify-content:end}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DialogUpdatesComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'sq-dialog-updates', standalone: true, imports: [TranslocoPipe], providers: [provideTranslocoScope('chat-dialogs')], template: `
47
+ <dialog popover #dialog class="z-backdrop w-full max-w-md p-4 rounded-lg border border-neutral-200 shadow-2xl">
48
+ <div class="flex flex-col gap-4">
49
+ <h1 class="text-xl font-bold">{{ 'chatDialogs.availableUpdates' | transloco }}</h1>
50
+ <hr class="border-t">
51
+ <p>{{ 'chatDialogs.availableUpdatesText' | transloco }}</p>
52
+ <div class="flex justify-end gap-2 mt-4">
53
+ <button class="btn btn-ghost outline-none w-24" (click)="seeNoMore()">{{ 'chatDialogs.seeNoMore' | transloco }}</button>
54
+ <button class="btn btn-secondary" (click)="remindMeLater()">{{ 'chatDialogs.remindMeLater' | transloco }}</button>
55
+ <button class="btn btn-primary w-24" (click)="update()">{{ 'chatDialogs.update' | transloco }}</button>
56
+ </div>
57
+ </div>
58
+ </dialog>
59
+ `, styles: [".flex{display:flex}.flex-col{flex-direction:column}.justify-end{justify-content:end}\n"] }]
60
+ }] });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kaWFsb2dzL3VwZGF0ZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFtQzFFLE1BQU0sT0FBTyxzQkFBc0I7SUEvQm5DO1FBZ0NZLGNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUEsVUFBNkIsQ0FBQSxFQUFFLENBQUMsQ0FBQztRQUN6RSxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxhQUFrQyxDQUFDLENBQUM7UUFFeEYsV0FBTSxHQUFHLE1BQU0sRUFBZSxDQUFDO0tBd0JoQztJQXRCQyxJQUFJO1FBQ0YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBeUIsY0FBYztRQUMzQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUIsOEJBQThCO1FBQzlCLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMvQixDQUFDOytHQTNCVSxzQkFBc0I7bUdBQXRCLHNCQUFzQiwrRkEzQnRCLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUMsMEdBNEJBLFVBQVUsNkNBM0JsRDs7Ozs7Ozs7Ozs7OztHQWFULDJKQWZTLGFBQWE7OzRGQTRCWixzQkFBc0I7a0JBL0JsQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxhQUFhLENBQUMsYUFDYixDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQ3hDOzs7Ozs7Ozs7Ozs7O0dBYVQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBFbGVtZW50UmVmLCBvdXRwdXQsIHZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IHByb3ZpZGVUcmFuc2xvY29TY29wZSwgVHJhbnNsb2NvUGlwZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XHJcblxyXG5pbXBvcnQgeyBEaWFsb2dFdmVudCB9IGZyb20gXCIuLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcS1kaWFsb2ctdXBkYXRlcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbVHJhbnNsb2NvUGlwZV0sXHJcbiAgcHJvdmlkZXJzOiBbcHJvdmlkZVRyYW5zbG9jb1Njb3BlKCdjaGF0LWRpYWxvZ3MnKV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICA8ZGlhbG9nIHBvcG92ZXIgI2RpYWxvZyBjbGFzcz1cInotYmFja2Ryb3Agdy1mdWxsIG1heC13LW1kIHAtNCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItbmV1dHJhbC0yMDAgc2hhZG93LTJ4bFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cclxuICAgICAgPGgxIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGRcIj57eyAnY2hhdERpYWxvZ3MuYXZhaWxhYmxlVXBkYXRlcycgfCB0cmFuc2xvY28gfX08L2gxPlxyXG4gICAgICA8aHIgY2xhc3M9XCJib3JkZXItdFwiPlxyXG4gICAgICA8cD57eyAnY2hhdERpYWxvZ3MuYXZhaWxhYmxlVXBkYXRlc1RleHQnIHwgdHJhbnNsb2NvIH19PC9wPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMiBtdC00XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZ2hvc3Qgb3V0bGluZS1ub25lIHctMjRcIiAoY2xpY2spPVwic2VlTm9Nb3JlKClcIj57eyAnY2hhdERpYWxvZ3Muc2VlTm9Nb3JlJyB8IHRyYW5zbG9jbyB9fTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJyZW1pbmRNZUxhdGVyKClcIj57eyAnY2hhdERpYWxvZ3MucmVtaW5kTWVMYXRlcicgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMjRcIiAoY2xpY2spPVwidXBkYXRlKClcIj57eyAnY2hhdERpYWxvZ3MudXBkYXRlJyB8IHRyYW5zbG9jbyB9fTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGlhbG9nPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmZsZXgge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgfVxyXG4gICAgLmZsZXgtY29sIHtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIH1cclxuICAgIC5qdXN0aWZ5LWVuZCB7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogZW5kO1xyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dVcGRhdGVzQ29tcG9uZW50IHtcclxuICBwcm90ZWN0ZWQgZGlhbG9nUmVmID0gdmlld0NoaWxkKCdkaWFsb2cnLCB7IHJlYWQ6IEVsZW1lbnRSZWY8SFRNTERpYWxvZ0VsZW1lbnQ+IH0pO1xyXG4gIHByb3RlY3RlZCBkaWFsb2cgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRpYWxvZ1JlZigpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaWFsb2dFbGVtZW50KTtcclxuXHJcbiAgY2xvc2VkID0gb3V0cHV0PERpYWxvZ0V2ZW50PigpO1xyXG5cclxuICBvcGVuKCkge1xyXG4gICAgdGhpcy5kaWFsb2coKS5zaG93TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlKGV2ZW50VHlwZTogRGlhbG9nRXZlbnQgPSBcImRpYWxvZy1jbG9zZVwiKSB7XHJcbiAgICB0aGlzLmRpYWxvZygpLmNsb3NlKCk7XHJcbiAgICB0aGlzLmNsb3NlZC5lbWl0KGV2ZW50VHlwZSk7XHJcbiAgICAvLyBkaXNwYXRjaCBhIGphdmFzY3JpcHQgZXZlbnRcclxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KGV2ZW50VHlwZSkpO1xyXG4gIH1cclxuXHJcbiAgc2VlTm9Nb3JlKCkge1xyXG4gICAgdGhpcy5jbG9zZShcImRpYWxvZy1ub1wiKTtcclxuICB9XHJcblxyXG4gIHJlbWluZE1lTGF0ZXIoKSB7XHJcbiAgICB0aGlzLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICB0aGlzLmNsb3NlKFwiZGlhbG9nLWNvbmZpcm1cIik7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,140 @@
1
+ import { CommonModule } from "@angular/common";
2
+ import { Component, inject, Input } from "@angular/core";
3
+ import { BehaviorSubject, catchError, combineLatest, EMPTY, filter, of, Subscription, switchMap, take, tap } from "rxjs";
4
+ import { parseISO, toDate } from "date-fns";
5
+ import { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';
6
+ import { isAuthenticated } from "@sinequa/atomic";
7
+ import { InstanceManagerService } from "../../instance-manager.service";
8
+ import { DocumentsUploadService } from "../documents-upload.service";
9
+ import { FormatIconComponent } from '../../format-icon/format-icon.component';
10
+ import { NotificationsService } from "../../services/notification.service";
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ export class DocumentListComponent {
14
+ constructor() {
15
+ this.groupedUploadedDocuments$ = new BehaviorSubject([]);
16
+ this.deletingAll = false;
17
+ this._subscription = new Subscription();
18
+ this.instanceManagerService = inject(InstanceManagerService);
19
+ this.documentsUploadService = inject(DocumentsUploadService);
20
+ this.notificationsService = inject(NotificationsService);
21
+ this.transloco = inject(TranslocoService);
22
+ }
23
+ ngOnInit() {
24
+ this._subscription.add(of(isAuthenticated()).pipe(tap((_) => this.instantiateChatService()), switchMap((_) => this.chatService.assistantConfig$), filter((config) => !!config), tap((_) => this.documentsUploadService.init(this.chatService)), tap((_) => this.updateUploadedDocumentsList()), catchError((error) => {
25
+ console.error(error);
26
+ this.notificationsService.error(error);
27
+ return EMPTY;
28
+ }))
29
+ .subscribe());
30
+ }
31
+ ngOnDestroy() {
32
+ this._subscription.unsubscribe();
33
+ }
34
+ instantiateChatService() {
35
+ this.chatService = this.instanceManagerService.getInstance(this.instanceId);
36
+ }
37
+ /**
38
+ * Updates the list of uploaded documents by fetching the latest data from the service.
39
+ * The fetched documents are grouped by date.
40
+ *
41
+ * @returns {void}
42
+ */
43
+ updateUploadedDocumentsList() {
44
+ this._subscription.add(combineLatest([
45
+ this.documentsUploadService.getDocumentsList(),
46
+ this.transloco.langChanges$
47
+ ]).pipe(tap(([uploadedDocuments]) => {
48
+ this.groupedUploadedDocuments$.next(this._groupUploadedDocumentsByDate(uploadedDocuments.docs));
49
+ }), catchError((error) => {
50
+ console.error(error);
51
+ this.notificationsService.error(error);
52
+ return EMPTY;
53
+ }), take(1))
54
+ .subscribe());
55
+ }
56
+ deleteDocument(event, doc) {
57
+ event.stopPropagation();
58
+ this.documentToDelete = doc;
59
+ }
60
+ /**
61
+ * Handles the deletion of an uploaded document. This method triggers a confirmation modal
62
+ * to ensure the user wants to proceed with the deletion. If confirmed, it sends a request
63
+ * to delete the document and provides feedback to the user upon success or failure.
64
+ *
65
+ * @param event - The event object associated with the delete action, used to stop propagation.
66
+ * @param doc - The document to be deleted, represented as an instance of `UploadedDocument`.
67
+ *
68
+ * @remarks
69
+ * - Displays a confirmation modal with a warning message.
70
+ * - On confirmation, deletes the document.
71
+ * - Shows a success notification upon successful deletion.
72
+ * - Logs and notifies the user of any errors encountered during the deletion process.
73
+ */
74
+ performDeleteDocument() {
75
+ this._subscription.add(this.documentsUploadService.deleteDocuments([this.documentToDelete.id])
76
+ .pipe(tap(() => {
77
+ this.notificationsService.success(this.transloco.translate('chatDocumentsUpload.deleteDocumentSuccess', { title: this.documentToDelete.fileName }));
78
+ this.documentToDelete = undefined;
79
+ this.updateUploadedDocumentsList();
80
+ }), catchError((error) => {
81
+ console.error(error);
82
+ this.notificationsService.error(this.transloco.translate('chatDocumentsUpload.deleteDocumentError', { title: this.documentToDelete.fileName }));
83
+ return EMPTY;
84
+ }), take(1))
85
+ .subscribe());
86
+ }
87
+ deleteAllDocuments(event) {
88
+ event?.stopPropagation();
89
+ this.deletingAll = true;
90
+ }
91
+ /**
92
+ * Handles the deletion of all uploaded documents. This method triggers a confirmation modal
93
+ * to ensure the user wants to proceed with the deletion. If confirmed, it sends a request
94
+ * to delete the whole list of documents and provides feedback to the user upon success or failure.
95
+ *
96
+ * @param event - (Optional) The event object associated with the delete action, used to stop propagation.
97
+ *
98
+ * @remarks
99
+ * - Displays a confirmation modal with a warning message.
100
+ * - On confirmation, deletes all documents.
101
+ * - Shows a success notification upon successful deletion.
102
+ * - Logs and notifies the user of any errors encountered during the deletion process.
103
+ */
104
+ performDeleteAllDocuments() {
105
+ this._subscription.add(this.documentsUploadService.deleteAllDocuments()
106
+ .pipe(tap(() => {
107
+ this.deletingAll = false;
108
+ this.notificationsService.success(this.transloco.translate('chatDocumentsUpload.deleteAllDocumentsSuccess'));
109
+ this.updateUploadedDocumentsList();
110
+ }), catchError((error) => {
111
+ console.error(error);
112
+ this.notificationsService.error(this.transloco.translate('chatDocumentsUpload.deleteAllDocumentsError'));
113
+ return EMPTY;
114
+ }), take(1))
115
+ .subscribe());
116
+ }
117
+ _groupUploadedDocumentsByDate(docs) {
118
+ const groupedUploadedDocuments = new Map();
119
+ docs
120
+ .sort((a, b) => parseISO(b.indexationTime).getTime() - parseISO(a.indexationTime).getTime())
121
+ .forEach(doc => {
122
+ const groupKey = this.chatService.getTimeKey(toDate(parseISO(doc.indexationTime))); // Must convert the UTC date to local date before passing to _getTimeKey
123
+ if (!groupedUploadedDocuments.has(groupKey)) {
124
+ groupedUploadedDocuments.set(groupKey, []);
125
+ }
126
+ groupedUploadedDocuments.get(groupKey).push(doc);
127
+ });
128
+ return Array.from(groupedUploadedDocuments, ([key, value]) => ({ key, value }));
129
+ ;
130
+ }
131
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
132
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentListComponent, isStandalone: true, selector: "sq-document-list", inputs: { instanceId: "instanceId" }, providers: [DocumentsUploadService, provideTranslocoScope('chat-documents-upload')], ngImport: i0, template: "<div class=\"alert alert-danger\" *ngIf=\"deletingAll\">\n <span>{{ 'chatDocumentsUpload.deleteAllDocumentsText' | transloco }}</span>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-light w-100\" (click)=\"deletingAll=false\">{{ 'chatDocumentsUpload.cancel' | transloco }}</button>\n <button class=\"btn btn-secondary w-100\" (click)=\"performDeleteAllDocuments()\">{{ 'chatDocumentsUpload.confirm' | transloco }}</button>\n </div>\n</div>\n\n<div *ngFor=\"let group of (groupedUploadedDocuments$ | async)\" class=\"uploaded-docs\">\n <span class=\"uploaded-docs-date\">{{group.key}}</span>\n <div *ngFor=\"let doc of group.value\">\n <div class=\"uploaded-doc p-2\">\n <sq-format-icon [extension]=\"doc.fileExt\" class=\"me-1\"></sq-format-icon>\n <span class=\"title me-1\" [title]=\"doc.fileName\">{{doc.fileName}}</span>\n <i class=\"uploaded-doc-actions fas fa-trash ms-1\" [title]=\"'chatDocumentsUpload.delete' | transloco\"\n (click)=\"deleteDocument($event, doc)\"></i>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"documentToDelete && documentToDelete.id === doc.id\">\n <span>\n {{ 'chatDocumentsUpload.deleteDocumentText' | transloco: { title: documentToDelete!.fileName } }}\n </span>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-light w-100\" (click)=\"documentToDelete=undefined\">{{ 'chatDocumentsUpload.cancel' | transloco }}</button>\n <button class=\"btn btn-secondary w-100\" (click)=\"performDeleteDocument()\">{{ 'chatDocumentsUpload.confirm' | transloco }}</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}.uploaded-docs{padding:.3rem 1rem}.uploaded-docs-date{font-size:12px;font-weight:500;color:#a9a9a9;margin-top:.5rem}.uploaded-docs .uploaded-doc{display:flex;align-items:center;cursor:pointer;margin-left:.25rem}.uploaded-docs .uploaded-doc span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.uploaded-docs .uploaded-doc .uploaded-doc-actions{display:none}.uploaded-docs .uploaded-doc .uploaded-doc-actions:hover{color:var(--ast-primary-color, #005DA7)}.uploaded-docs .uploaded-doc:hover{background-color:var(--ast-uploaded-doc-hover-background, #f2f8fe)}.uploaded-docs .uploaded-doc:hover .uploaded-doc-actions{display:block}.uploaded-docs .title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: FormatIconComponent, selector: "sq-format-icon", inputs: ["extension"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
133
+ }
134
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentListComponent, decorators: [{
135
+ type: Component,
136
+ args: [{ selector: "sq-document-list", standalone: true, providers: [DocumentsUploadService, provideTranslocoScope('chat-documents-upload')], imports: [CommonModule, FormatIconComponent, TranslocoPipe], template: "<div class=\"alert alert-danger\" *ngIf=\"deletingAll\">\n <span>{{ 'chatDocumentsUpload.deleteAllDocumentsText' | transloco }}</span>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-light w-100\" (click)=\"deletingAll=false\">{{ 'chatDocumentsUpload.cancel' | transloco }}</button>\n <button class=\"btn btn-secondary w-100\" (click)=\"performDeleteAllDocuments()\">{{ 'chatDocumentsUpload.confirm' | transloco }}</button>\n </div>\n</div>\n\n<div *ngFor=\"let group of (groupedUploadedDocuments$ | async)\" class=\"uploaded-docs\">\n <span class=\"uploaded-docs-date\">{{group.key}}</span>\n <div *ngFor=\"let doc of group.value\">\n <div class=\"uploaded-doc p-2\">\n <sq-format-icon [extension]=\"doc.fileExt\" class=\"me-1\"></sq-format-icon>\n <span class=\"title me-1\" [title]=\"doc.fileName\">{{doc.fileName}}</span>\n <i class=\"uploaded-doc-actions fas fa-trash ms-1\" [title]=\"'chatDocumentsUpload.delete' | transloco\"\n (click)=\"deleteDocument($event, doc)\"></i>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"documentToDelete && documentToDelete.id === doc.id\">\n <span>\n {{ 'chatDocumentsUpload.deleteDocumentText' | transloco: { title: documentToDelete!.fileName } }}\n </span>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-light w-100\" (click)=\"documentToDelete=undefined\">{{ 'chatDocumentsUpload.cancel' | transloco }}</button>\n <button class=\"btn btn-secondary w-100\" (click)=\"performDeleteDocument()\">{{ 'chatDocumentsUpload.confirm' | transloco }}</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-uploaded-doc-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}.uploaded-docs{padding:.3rem 1rem}.uploaded-docs-date{font-size:12px;font-weight:500;color:#a9a9a9;margin-top:.5rem}.uploaded-docs .uploaded-doc{display:flex;align-items:center;cursor:pointer;margin-left:.25rem}.uploaded-docs .uploaded-doc span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.uploaded-docs .uploaded-doc .uploaded-doc-actions{display:none}.uploaded-docs .uploaded-doc .uploaded-doc-actions:hover{color:var(--ast-primary-color, #005DA7)}.uploaded-docs .uploaded-doc:hover{background-color:var(--ast-uploaded-doc-hover-background, #f2f8fe)}.uploaded-docs .uploaded-doc:hover .uploaded-doc-actions{display:block}.uploaded-docs .title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
137
+ }], propDecorators: { instanceId: [{
138
+ type: Input
139
+ }] } });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LWxpc3QvZG9jdW1lbnQtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LWxpc3QvZG9jdW1lbnQtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2IsS0FBSyxFQUNMLE1BQU0sRUFDTixFQUFFLEVBQ0YsWUFBWSxFQUNaLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUc5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBVTNFLE1BQU0sT0FBTyxx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LENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUVELHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFTCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQSxDQUFDO0lBQ25GLENBQUM7K0dBbktVLHFCQUFxQjttR0FBckIscUJBQXFCLHFHQUhyQixDQUFDLHNCQUFzQixFQUFFLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLENBQUMsMEJDbkNyRiw4bURBNkJBLDBuRURPWSxZQUFZLHFUQUFFLG1CQUFtQiw2RUFBRSxhQUFhOzs0RkFFL0MscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLGtCQUFrQixjQUdoQixJQUFJLGFBQ0wsQ0FBQyxzQkFBc0IsRUFBRSxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLFdBQzFFLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsQ0FBQzs4QkFJbEQsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBFTVBUWSxcbiAgZmlsdGVyLFxuICBvZixcbiAgU3Vic2NyaXB0aW9uLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcFxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VJU08sXG4gIHRvRGF0ZVxufSBmcm9tIFwiZGF0ZS1mbnNcIjtcbmltcG9ydCB7IHByb3ZpZGVUcmFuc2xvY29TY29wZSwgVHJhbnNsb2NvUGlwZSwgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5cbmltcG9ydCB7IGlzQXV0aGVudGljYXRlZCB9IGZyb20gXCJAc2luZXF1YS9hdG9taWNcIjtcblxuaW1wb3J0IHsgSW5zdGFuY2VNYW5hZ2VyU2VydmljZSB9IGZyb20gXCIuLi8uLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgRG9jdW1lbnRzVXBsb2FkU2VydmljZSB9IGZyb20gXCIuLi9kb2N1bWVudHMtdXBsb2FkLnNlcnZpY2VcIjtcbmltcG9ydCB7IEZvcm1hdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9mb3JtYXQtaWNvbi9mb3JtYXQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2hhdENvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWREb2N1bWVudCB9IGZyb20gXCIuLi9kb2N1bWVudHMtdXBsb2FkLm1vZGVsXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic3EtZG9jdW1lbnQtbGlzdFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2RvY3VtZW50LWxpc3QuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2RvY3VtZW50LWxpc3QuY29tcG9uZW50LnNjc3NcIl0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW0RvY3VtZW50c1VwbG9hZFNlcnZpY2UsIHByb3ZpZGVUcmFuc2xvY29TY29wZSgnY2hhdC1kb2N1bWVudHMtdXBsb2FkJyldLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3JtYXRJY29uQ29tcG9uZW50LCBUcmFuc2xvY29QaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBhcHByb3ByaWF0ZSBjaGF0U2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGZyb20gaW5zdGFuY2VNYW5hZ2VyU2VydmljZSAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgcHVibGljIGNoYXRTZXJ2aWNlOiBDaGF0U2VydmljZTtcbiAgcHVibGljIGdyb3VwZWRVcGxvYWRlZERvY3VtZW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBVcGxvYWRlZERvY3VtZW50W119W10+KFtdKTtcblxuICBwdWJsaWMgZG9jdW1lbnRUb0RlbGV0ZT86IFVwbG9hZGVkRG9jdW1lbnQ7XG4gIHB1YmxpYyBkZWxldGluZ0FsbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIGRvY3VtZW50c1VwbG9hZFNlcnZpY2UgPSBpbmplY3QoRG9jdW1lbnRzVXBsb2FkU2VydmljZSk7XG4gIHB1YmxpYyBub3RpZmljYXRpb25zU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsb2NvID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBvZihpc0F1dGhlbnRpY2F0ZWQoKSkucGlwZShcbiAgICAgICAgICB0YXAoKF8pID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKF8pID0+IHRoaXMuY2hhdFNlcnZpY2UuYXNzaXN0YW50Q29uZmlnJCksXG4gICAgICAgICAgZmlsdGVyKChjb25maWc6IENoYXRDb25maWcgfCB1bmRlZmluZWQpID0+ICEhY29uZmlnKSxcbiAgICAgICAgICB0YXAoKF8pID0+IHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS5pbml0KHRoaXMuY2hhdFNlcnZpY2UpKSxcbiAgICAgICAgICB0YXAoKF8pID0+IHRoaXMudXBkYXRlVXBsb2FkZWREb2N1bWVudHNMaXN0KCkpLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgaW5zdGFudGlhdGVDaGF0U2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlID0gdGhpcy5pbnN0YW5jZU1hbmFnZXJTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMuaW5zdGFuY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgbGlzdCBvZiB1cGxvYWRlZCBkb2N1bWVudHMgYnkgZmV0Y2hpbmcgdGhlIGxhdGVzdCBkYXRhIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqIFRoZSBmZXRjaGVkIGRvY3VtZW50cyBhcmUgZ3JvdXBlZCBieSBkYXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHVwZGF0ZVVwbG9hZGVkRG9jdW1lbnRzTGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS5nZXREb2N1bWVudHNMaXN0KCksXG4gICAgICAgIHRoaXMudHJhbnNsb2NvLmxhbmdDaGFuZ2VzJFxuICAgICAgXSkucGlwZShcbiAgICAgICAgICB0YXAoKFt1cGxvYWRlZERvY3VtZW50c10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBlZFVwbG9hZGVkRG9jdW1lbnRzJC5uZXh0KHRoaXMuX2dyb3VwVXBsb2FkZWREb2N1bWVudHNCeURhdGUodXBsb2FkZWREb2N1bWVudHMuZG9jcykpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBkZWxldGVEb2N1bWVudChldmVudDogRXZlbnQsIGRvYzogVXBsb2FkZWREb2N1bWVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZG9jdW1lbnRUb0RlbGV0ZSA9IGRvYztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBkZWxldGlvbiBvZiBhbiB1cGxvYWRlZCBkb2N1bWVudC4gVGhpcyBtZXRob2QgdHJpZ2dlcnMgYSBjb25maXJtYXRpb24gbW9kYWxcbiAgICogdG8gZW5zdXJlIHRoZSB1c2VyIHdhbnRzIHRvIHByb2NlZWQgd2l0aCB0aGUgZGVsZXRpb24uIElmIGNvbmZpcm1lZCwgaXQgc2VuZHMgYSByZXF1ZXN0XG4gICAqIHRvIGRlbGV0ZSB0aGUgZG9jdW1lbnQgYW5kIHByb3ZpZGVzIGZlZWRiYWNrIHRvIHRoZSB1c2VyIHVwb24gc3VjY2VzcyBvciBmYWlsdXJlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVsZXRlIGFjdGlvbiwgdXNlZCB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHRvIGJlIGRlbGV0ZWQsIHJlcHJlc2VudGVkIGFzIGFuIGluc3RhbmNlIG9mIGBVcGxvYWRlZERvY3VtZW50YC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogLSBEaXNwbGF5cyBhIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIGEgd2FybmluZyBtZXNzYWdlLlxuICAgKiAtIE9uIGNvbmZpcm1hdGlvbiwgZGVsZXRlcyB0aGUgZG9jdW1lbnQuXG4gICAqIC0gU2hvd3MgYSBzdWNjZXNzIG5vdGlmaWNhdGlvbiB1cG9uIHN1Y2Nlc3NmdWwgZGVsZXRpb24uXG4gICAqIC0gTG9ncyBhbmQgbm90aWZpZXMgdGhlIHVzZXIgb2YgYW55IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGRlbGV0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBwZXJmb3JtRGVsZXRlRG9jdW1lbnQoKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZG9jdW1lbnRzVXBsb2FkU2VydmljZS5kZWxldGVEb2N1bWVudHMoW3RoaXMuZG9jdW1lbnRUb0RlbGV0ZSEuaWRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5zdWNjZXNzKHRoaXMudHJhbnNsb2NvLnRyYW5zbGF0ZSgnY2hhdERvY3VtZW50c1VwbG9hZC5kZWxldGVEb2N1bWVudFN1Y2Nlc3MnLCB7IHRpdGxlOiB0aGlzLmRvY3VtZW50VG9EZWxldGUhLmZpbGVOYW1lIH0pKTtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50VG9EZWxldGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRlZERvY3VtZW50c0xpc3QoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREb2N1bWVudHNVcGxvYWQuZGVsZXRlRG9jdW1lbnRFcnJvcicsIHsgdGl0bGU6IHRoaXMuZG9jdW1lbnRUb0RlbGV0ZSEuZmlsZU5hbWUgfSkpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgfVxuXG4gIGRlbGV0ZUFsbERvY3VtZW50cyhldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZGVsZXRpbmdBbGwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGRlbGV0aW9uIG9mIGFsbCB1cGxvYWRlZCBkb2N1bWVudHMuIFRoaXMgbWV0aG9kIHRyaWdnZXJzIGEgY29uZmlybWF0aW9uIG1vZGFsXG4gICAqIHRvIGVuc3VyZSB0aGUgdXNlciB3YW50cyB0byBwcm9jZWVkIHdpdGggdGhlIGRlbGV0aW9uLiBJZiBjb25maXJtZWQsIGl0IHNlbmRzIGEgcmVxdWVzdFxuICAgKiB0byBkZWxldGUgdGhlIHdob2xlIGxpc3Qgb2YgZG9jdW1lbnRzIGFuZCBwcm92aWRlcyBmZWVkYmFjayB0byB0aGUgdXNlciB1cG9uIHN1Y2Nlc3Mgb3IgZmFpbHVyZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IC0gKE9wdGlvbmFsKSBUaGUgZXZlbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVsZXRlIGFjdGlvbiwgdXNlZCB0byBzdG9wIHByb3BhZ2F0aW9uLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIERpc3BsYXlzIGEgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggYSB3YXJuaW5nIG1lc3NhZ2UuXG4gICAqIC0gT24gY29uZmlybWF0aW9uLCBkZWxldGVzIGFsbCBkb2N1bWVudHMuXG4gICAqIC0gU2hvd3MgYSBzdWNjZXNzIG5vdGlmaWNhdGlvbiB1cG9uIHN1Y2Nlc3NmdWwgZGVsZXRpb24uXG4gICAqIC0gTG9ncyBhbmQgbm90aWZpZXMgdGhlIHVzZXIgb2YgYW55IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGRlbGV0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBwZXJmb3JtRGVsZXRlQWxsRG9jdW1lbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmRvY3VtZW50c1VwbG9hZFNlcnZpY2UuZGVsZXRlQWxsRG9jdW1lbnRzKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVsZXRpbmdBbGwgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLnN1Y2Nlc3ModGhpcy50cmFuc2xvY28udHJhbnNsYXRlKCdjaGF0RG9jdW1lbnRzVXBsb2FkLmRlbGV0ZUFsbERvY3VtZW50c1N1Y2Nlc3MnKSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRlZERvY3VtZW50c0xpc3QoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbG9jby50cmFuc2xhdGUoJ2NoYXREb2N1bWVudHNVcGxvYWQuZGVsZXRlQWxsRG9jdW1lbnRzRXJyb3InKSk7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dyb3VwVXBsb2FkZWREb2N1bWVudHNCeURhdGUoZG9jczogVXBsb2FkZWREb2N1bWVudFtdKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IFVwbG9hZGVkRG9jdW1lbnRbXSB9W10ge1xuICAgIGNvbnN0IGdyb3VwZWRVcGxvYWRlZERvY3VtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBVcGxvYWRlZERvY3VtZW50W10+KCk7XG5cbiAgICBkb2NzXG4gICAgICAuc29ydCgoYSwgYikgPT4gcGFyc2VJU08oYi5pbmRleGF0aW9uVGltZSkuZ2V0VGltZSgpIC0gcGFyc2VJU08oYS5pbmRleGF0aW9uVGltZSkuZ2V0VGltZSgpKVxuICAgICAgLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cEtleSA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0VGltZUtleSh0b0RhdGUocGFyc2VJU08oZG9jLmluZGV4YXRpb25UaW1lKSkpOyAvLyBNdXN0IGNvbnZlcnQgdGhlIFVUQyBkYXRlIHRvIGxvY2FsIGRhdGUgYmVmb3JlIHBhc3NpbmcgdG8gX2dldFRpbWVLZXlcblxuICAgICAgICAgIGlmICghZ3JvdXBlZFVwbG9hZGVkRG9jdW1lbnRzLmhhcyhncm91cEtleSkpIHtcbiAgICAgICAgICAgIGdyb3VwZWRVcGxvYWRlZERvY3VtZW50cy5zZXQoZ3JvdXBLZXksIFtdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBncm91cGVkVXBsb2FkZWREb2N1bWVudHMuZ2V0KGdyb3VwS2V5KSEucHVzaChkb2MpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cGVkVXBsb2FkZWREb2N1bWVudHMsIChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSkpOztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiICpuZ0lmPVwiZGVsZXRpbmdBbGxcIj5cbiAgPHNwYW4+e3sgJ2NoYXREb2N1bWVudHNVcGxvYWQuZGVsZXRlQWxsRG9jdW1lbnRzVGV4dCcgfCB0cmFuc2xvY28gfX08L3NwYW4+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCB3LTEwMFwiIChjbGljayk9XCJkZWxldGluZ0FsbD1mYWxzZVwiPnt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLmNhbmNlbCcgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgdy0xMDBcIiAoY2xpY2spPVwicGVyZm9ybURlbGV0ZUFsbERvY3VtZW50cygpXCI+e3sgJ2NoYXREb2N1bWVudHNVcGxvYWQuY29uZmlybScgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgKGdyb3VwZWRVcGxvYWRlZERvY3VtZW50cyQgfCBhc3luYylcIiBjbGFzcz1cInVwbG9hZGVkLWRvY3NcIj5cbiAgPHNwYW4gY2xhc3M9XCJ1cGxvYWRlZC1kb2NzLWRhdGVcIj57e2dyb3VwLmtleX19PC9zcGFuPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBkb2Mgb2YgZ3JvdXAudmFsdWVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidXBsb2FkZWQtZG9jIHAtMlwiPlxuICAgICAgPHNxLWZvcm1hdC1pY29uIFtleHRlbnNpb25dPVwiZG9jLmZpbGVFeHRcIiBjbGFzcz1cIm1lLTFcIj48L3NxLWZvcm1hdC1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZSBtZS0xXCIgW3RpdGxlXT1cImRvYy5maWxlTmFtZVwiPnt7ZG9jLmZpbGVOYW1lfX08L3NwYW4+XG4gICAgICA8aSBjbGFzcz1cInVwbG9hZGVkLWRvYy1hY3Rpb25zIGZhcyBmYS10cmFzaCBtcy0xXCIgW3RpdGxlXT1cIidjaGF0RG9jdW1lbnRzVXBsb2FkLmRlbGV0ZScgfCB0cmFuc2xvY29cIlxuICAgICAgICAoY2xpY2spPVwiZGVsZXRlRG9jdW1lbnQoJGV2ZW50LCBkb2MpXCI+PC9pPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIiAqbmdJZj1cImRvY3VtZW50VG9EZWxldGUgJiYgZG9jdW1lbnRUb0RlbGV0ZS5pZCA9PT0gZG9jLmlkXCI+XG4gICAgICA8c3Bhbj5cbiAgICAgICAge3sgJ2NoYXREb2N1bWVudHNVcGxvYWQuZGVsZXRlRG9jdW1lbnRUZXh0JyB8IHRyYW5zbG9jbzogeyB0aXRsZTogZG9jdW1lbnRUb0RlbGV0ZSEuZmlsZU5hbWUgfSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCB3LTEwMFwiIChjbGljayk9XCJkb2N1bWVudFRvRGVsZXRlPXVuZGVmaW5lZFwiPnt7ICdjaGF0RG9jdW1lbnRzVXBsb2FkLmNhbmNlbCcgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHctMTAwXCIgKGNsaWNrKT1cInBlcmZvcm1EZWxldGVEb2N1bWVudCgpXCI+e3sgJ2NoYXREb2N1bWVudHNVcGxvYWQuY29uZmlybScgfCB0cmFuc2xvY28gfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,65 @@
1
+ import { CommonModule } from "@angular/common";
2
+ import { Component, EventEmitter, inject, Input, Output } from "@angular/core";
3
+ import { BehaviorSubject, catchError, EMPTY, filter, of, Subscription, switchMap, take, tap } from "rxjs";
4
+ import { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';
5
+ import { isAuthenticated } from "@sinequa/atomic";
6
+ import { InstanceManagerService } from "../../instance-manager.service";
7
+ import { DocumentsUploadService } from "../documents-upload.service";
8
+ import { NotificationsService } from "../../services/notification.service";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common";
11
+ export class DocumentOverviewComponent {
12
+ constructor() {
13
+ this.disabledUpload = true;
14
+ this.onUpload = new EventEmitter();
15
+ this.uploadedDocuments$ = new BehaviorSubject([]);
16
+ this._subscription = new Subscription();
17
+ this.instanceManagerService = inject(InstanceManagerService);
18
+ this.documentsUploadService = inject(DocumentsUploadService);
19
+ this.notificationsService = inject(NotificationsService);
20
+ }
21
+ ;
22
+ ngOnInit() {
23
+ this._subscription.add(of(isAuthenticated()).pipe(tap((_) => this.instantiateChatService()), switchMap((_) => this.chatService.assistantConfig$), filter((config) => !!config), tap((_) => this.documentsUploadService.init(this.chatService)), tap((_) => this.updateUploadedDocumentsList()), catchError((error) => {
24
+ console.error(error);
25
+ this.notificationsService.error(error);
26
+ return EMPTY;
27
+ }))
28
+ .subscribe());
29
+ }
30
+ ngOnDestroy() {
31
+ this._subscription.unsubscribe();
32
+ }
33
+ instantiateChatService() {
34
+ this.chatService = this.instanceManagerService.getInstance(this.instanceId);
35
+ }
36
+ /**
37
+ * Updates the list of uploaded documents by fetching the latest data from the service.
38
+ *
39
+ * @returns {void}
40
+ */
41
+ updateUploadedDocumentsList() {
42
+ this._subscription.add(this.documentsUploadService.getDocumentsList()
43
+ .pipe(tap((uploadedDocuments) => {
44
+ this.uploadedDocuments$.next(uploadedDocuments.docs);
45
+ }), catchError((error) => {
46
+ console.error(error);
47
+ this.notificationsService.error(error);
48
+ return EMPTY;
49
+ }), take(1))
50
+ .subscribe());
51
+ }
52
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentOverviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentOverviewComponent, isStandalone: true, selector: "sq-document-overview", inputs: { instanceId: "instanceId", disabledUpload: "disabledUpload" }, outputs: { onUpload: "onUpload" }, providers: [DocumentsUploadService, provideTranslocoScope('chat-documents-upload')], ngImport: i0, template: "<div class=\"d-flex\">\n <span class=\"overview-text flex-grow-1\">\n {{ 'chatDocumentsUpload.uploadedDocuments' | transloco: { count: (uploadedDocuments$ | async)?.length || 0 } }}\n </span>\n <button disabled class=\"btn btn-light\" [title]=\"'chatDocumentsUpload.uploadToSources' | transloco\" (click)=\"onUpload.emit()\" [disabled]=\"disabledUpload\">\n <i class=\"fas fa-cloud-upload-alt\"></i>\n </button>\n</div>\n", styles: [".overview-text{font-style:italic;padding:.5rem .8rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] }); }
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentOverviewComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: "sq-document-overview", standalone: true, providers: [DocumentsUploadService, provideTranslocoScope('chat-documents-upload')], imports: [CommonModule, TranslocoPipe], template: "<div class=\"d-flex\">\n <span class=\"overview-text flex-grow-1\">\n {{ 'chatDocumentsUpload.uploadedDocuments' | transloco: { count: (uploadedDocuments$ | async)?.length || 0 } }}\n </span>\n <button disabled class=\"btn btn-light\" [title]=\"'chatDocumentsUpload.uploadToSources' | transloco\" (click)=\"onUpload.emit()\" [disabled]=\"disabledUpload\">\n <i class=\"fas fa-cloud-upload-alt\"></i>\n </button>\n</div>\n", styles: [".overview-text{font-style:italic;padding:.5rem .8rem}\n"] }]
58
+ }], propDecorators: { instanceId: [{
59
+ type: Input
60
+ }], disabledUpload: [{
61
+ type: Input
62
+ }], onUpload: [{
63
+ type: Output
64
+ }] } });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtb3ZlcnZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvZG9jdW1lbnRzLXVwbG9hZC9kb2N1bWVudC1vdmVydmlldy9kb2N1bWVudC1vdmVydmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9kb2N1bWVudHMtdXBsb2FkL2RvY3VtZW50LW92ZXJ2aWV3L2RvY3VtZW50LW92ZXJ2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixFQUFFLEVBQ0YsWUFBWSxFQUNaLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBZTNFLE1BQU0sT0FBTyx5QkFBeUI7SUFidEM7UUFnQlcsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFFOUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFH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YztzQkFBdEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBFTVBUWSxcbiAgZmlsdGVyLFxuICBvZixcbiAgU3Vic2NyaXB0aW9uLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcFxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcHJvdmlkZVRyYW5zbG9jb1Njb3BlLCBUcmFuc2xvY29QaXBlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcblxuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkIH0gZnJvbSBcIkBzaW5lcXVhL2F0b21pY1wiO1xuXG5pbXBvcnQgeyBJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2luc3RhbmNlLW1hbmFnZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEb2N1bWVudHNVcGxvYWRTZXJ2aWNlIH0gZnJvbSBcIi4uL2RvY3VtZW50cy11cGxvYWQuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdENvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWREb2N1bWVudCwgVXBsb2FkZWREb2N1bWVudHMgfSBmcm9tIFwiLi4vZG9jdW1lbnRzLXVwbG9hZC5tb2RlbFwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNxLWRvY3VtZW50LW92ZXJ2aWV3XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZG9jdW1lbnQtb3ZlcnZpZXcuY29tcG9uZW50Lmh0bWxcIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbRG9jdW1lbnRzVXBsb2FkU2VydmljZSwgcHJvdmlkZVRyYW5zbG9jb1Njb3BlKCdjaGF0LWRvY3VtZW50cy11cGxvYWQnKV0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRyYW5zbG9jb1BpcGVdLFxuICBzdHlsZXM6IFtgXG4ub3ZlcnZpZXctdGV4dCB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgcGFkZGluZzogLjVyZW0gLjhyZW07XG59XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIERvY3VtZW50T3ZlcnZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBEZWZpbmUgdGhlIGtleSBiYXNlZCBvbiBpdCwgdGhlIGFwcHJvcHJpYXRlIGNoYXRTZXJ2aWNlIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlICovXG4gIEBJbnB1dCgpIGluc3RhbmNlSWQ6IHN0cmluZztcbiAgQElucHV0KCkgZGlzYWJsZWRVcGxvYWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBvblVwbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBwdWJsaWMgdXBsb2FkZWREb2N1bWVudHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVcGxvYWRlZERvY3VtZW50W10+KFtdKTs7XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBpbnN0YW5jZU1hbmFnZXJTZXJ2aWNlID0gaW5qZWN0KEluc3RhbmNlTWFuYWdlclNlcnZpY2UpO1xuICBwdWJsaWMgZG9jdW1lbnRzVXBsb2FkU2VydmljZSA9IGluamVjdChEb2N1bWVudHNVcGxvYWRTZXJ2aWNlKTtcbiAgcHVibGljIG5vdGlmaWNhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgb2YoaXNBdXRoZW50aWNhdGVkKCkpLnBpcGUoXG4gICAgICAgICAgdGFwKChfKSA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgICAgc3dpdGNoTWFwKChfKSA9PiB0aGlzLmNoYXRTZXJ2aWNlLmFzc2lzdGFudENvbmZpZyQpLFxuICAgICAgICAgIGZpbHRlcigoY29uZmlnOiBDaGF0Q29uZmlnIHwgdW5kZWZpbmVkKSA9PiAhIWNvbmZpZyksXG4gICAgICAgICAgdGFwKChfKSA9PiB0aGlzLmRvY3VtZW50c1VwbG9hZFNlcnZpY2UuaW5pdCh0aGlzLmNoYXRTZXJ2aWNlKSksXG4gICAgICAgICAgdGFwKChfKSA9PiB0aGlzLnVwZGF0ZVVwbG9hZGVkRG9jdW1lbnRzTGlzdCgpKSxcbiAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5jaGF0U2VydmljZSA9IHRoaXMuaW5zdGFuY2VNYW5hZ2VyU2VydmljZS5nZXRJbnN0YW5jZSh0aGlzLmluc3RhbmNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGxpc3Qgb2YgdXBsb2FkZWQgZG9jdW1lbnRzIGJ5IGZldGNoaW5nIHRoZSBsYXRlc3QgZGF0YSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHVwZGF0ZVVwbG9hZGVkRG9jdW1lbnRzTGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5kb2N1bWVudHNVcGxvYWRTZXJ2aWNlLmdldERvY3VtZW50c0xpc3QoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHVwbG9hZGVkRG9jdW1lbnRzOiBVcGxvYWRlZERvY3VtZW50cykgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlZERvY3VtZW50cyQubmV4dCh1cGxvYWRlZERvY3VtZW50cy5kb2NzKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgPHNwYW4gY2xhc3M9XCJvdmVydmlldy10ZXh0IGZsZXgtZ3Jvdy0xXCI+XG4gICAge3sgJ2NoYXREb2N1bWVudHNVcGxvYWQudXBsb2FkZWREb2N1bWVudHMnIHwgdHJhbnNsb2NvOiB7IGNvdW50OiAodXBsb2FkZWREb2N1bWVudHMkIHwgYXN5bmMpPy5sZW5ndGggfHwgMCB9IH19XG4gIDwvc3Bhbj5cbiAgPGJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBbdGl0bGVdPVwiJ2NoYXREb2N1bWVudHNVcGxvYWQudXBsb2FkVG9Tb3VyY2VzJyB8IHRyYW5zbG9jb1wiIChjbGljayk9XCJvblVwbG9hZC5lbWl0KClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRVcGxvYWRcIj5cbiAgICA8aSBjbGFzcz1cImZhcyBmYS1jbG91ZC11cGxvYWQtYWx0XCI+PC9pPlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19