@sinequa/assistant 3.1.1

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 (53) hide show
  1. package/chat/chat-message/chat-message.component.d.ts +157 -0
  2. package/chat/chat-reference/chat-reference.component.d.ts +118 -0
  3. package/chat/chat-settings-v3/chat-settings-v3.component.d.ts +41 -0
  4. package/chat/chat.component.d.ts +1112 -0
  5. package/chat/chat.service.d.ts +1046 -0
  6. package/chat/format-icon/format-icon.component.d.ts +10 -0
  7. package/chat/format-icon/icons.d.ts +5 -0
  8. package/chat/index.d.ts +5 -0
  9. package/chat/initials-avatar/initials-avatar.component.d.ts +35 -0
  10. package/chat/instance-manager.service.d.ts +28 -0
  11. package/chat/messages/de.d.ts +4 -0
  12. package/chat/messages/en.d.ts +4 -0
  13. package/chat/messages/fr.d.ts +4 -0
  14. package/chat/messages/index.d.ts +4 -0
  15. package/chat/public-api.d.ts +11 -0
  16. package/chat/rest-chat.service.d.ts +28 -0
  17. package/chat/saved-chats/saved-chats.component.d.ts +37 -0
  18. package/chat/styles/assistant.scss +61 -0
  19. package/chat/styles/references.scss +23 -0
  20. package/chat/types.d.ts +1241 -0
  21. package/chat/websocket-chat.service.d.ts +97 -0
  22. package/esm2020/chat/chat-message/chat-message.component.mjs +181 -0
  23. package/esm2020/chat/chat-reference/chat-reference.component.mjs +40 -0
  24. package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +103 -0
  25. package/esm2020/chat/chat.component.mjs +369 -0
  26. package/esm2020/chat/chat.service.mjs +185 -0
  27. package/esm2020/chat/format-icon/format-icon.component.mjs +23 -0
  28. package/esm2020/chat/format-icon/icons.mjs +138 -0
  29. package/esm2020/chat/initials-avatar/initials-avatar.component.mjs +60 -0
  30. package/esm2020/chat/instance-manager.service.mjs +46 -0
  31. package/esm2020/chat/messages/de.mjs +4 -0
  32. package/esm2020/chat/messages/en.mjs +4 -0
  33. package/esm2020/chat/messages/fr.mjs +4 -0
  34. package/esm2020/chat/messages/index.mjs +9 -0
  35. package/esm2020/chat/public-api.mjs +12 -0
  36. package/esm2020/chat/rest-chat.service.mjs +164 -0
  37. package/esm2020/chat/saved-chats/saved-chats.component.mjs +132 -0
  38. package/esm2020/chat/sinequa-assistant-chat.mjs +5 -0
  39. package/esm2020/chat/types.mjs +85 -0
  40. package/esm2020/chat/websocket-chat.service.mjs +430 -0
  41. package/esm2020/public-api.mjs +3 -0
  42. package/esm2020/sinequa-assistant.mjs +5 -0
  43. package/fesm2015/sinequa-assistant-chat.mjs +1925 -0
  44. package/fesm2015/sinequa-assistant-chat.mjs.map +1 -0
  45. package/fesm2015/sinequa-assistant.mjs +9 -0
  46. package/fesm2015/sinequa-assistant.mjs.map +1 -0
  47. package/fesm2020/sinequa-assistant-chat.mjs +1911 -0
  48. package/fesm2020/sinequa-assistant-chat.mjs.map +1 -0
  49. package/fesm2020/sinequa-assistant.mjs +9 -0
  50. package/fesm2020/sinequa-assistant.mjs.map +1 -0
  51. package/index.d.ts +5 -0
  52. package/package.json +46 -0
  53. package/public-api.d.ts +1 -0
@@ -0,0 +1,164 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { ChatService } from './chat.service';
3
+ import { catchError, filter, finalize, forkJoin, map, shareReplay, switchMap, tap, throwError } from 'rxjs';
4
+ import { JsonMethodPluginService } from '@sinequa/core/web-services';
5
+ import * as i0 from "@angular/core";
6
+ export class RestChatService extends ChatService {
7
+ constructor() {
8
+ super();
9
+ this.jsonMethodWebService = inject(JsonMethodPluginService);
10
+ }
11
+ /**
12
+ * Initialize the chat process after the login is complete.
13
+ * It listens for the 'login-complete' event, initializes necessary URL, and performs parallel requests for models, functions and quota data.
14
+ * @returns An Observable<boolean> indicating the success of the initialization process.
15
+ */
16
+ init() {
17
+ return this.loginService.events.pipe(filter((e) => e.type === 'login-complete'), tap(() => this.getRequestsUrl()),
18
+ // Execute parallel requests for models and functions
19
+ switchMap(() => forkJoin([
20
+ this.listModels(),
21
+ this.listFunctions()
22
+ ])),
23
+ // Map the results of parallel requests to a boolean indicating success
24
+ map(([models, functions]) => !!models && !!functions),
25
+ // Any errors during the process are caught, logged, and re-thrown to propagate the error further
26
+ catchError((error) => {
27
+ console.error('Error occurred:', error);
28
+ return throwError(() => error);
29
+ }),
30
+ // cache and replay the emitted value for subsequent subscribers, ensuring the initialization logic is only executed once even if there are multiple subscribers
31
+ shareReplay(1));
32
+ }
33
+ /**
34
+ * Define the GLLM plugin to use for the http requests
35
+ * It can be overridden by the app config
36
+ */
37
+ getRequestsUrl() {
38
+ if (this.chatConfig$.value.globalSettings.restEndpoint) {
39
+ this.REQUEST_URL = this.chatConfig$.value.globalSettings.restEndpoint;
40
+ }
41
+ else {
42
+ throw new Error(`The property 'restEndpoint' must be provided when attempting to use 'REST' in assistant instance`);
43
+ }
44
+ }
45
+ listModels() {
46
+ const data = {
47
+ action: "listmodels",
48
+ debug: this.chatConfig$.value.debug
49
+ };
50
+ return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(map(res => res.models), tap(models => this.models = models?.filter(model => !!model.enable)), catchError((error) => {
51
+ console.error('Error invoking listmodels:', error);
52
+ return throwError(() => error);
53
+ }));
54
+ }
55
+ listFunctions() {
56
+ const data = {
57
+ action: "listfunctions",
58
+ debug: this.chatConfig$.value.debug
59
+ };
60
+ return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(map(res => res.functions), tap(functions => this.functions = functions), catchError((error) => {
61
+ console.error('Error invoking listfunctions:', error);
62
+ return throwError(() => error);
63
+ }));
64
+ }
65
+ fetch(messages, query = this.searchService.query) {
66
+ // Start streaming by invoking the Chat method
67
+ this.streaming$.next(true);
68
+ // Prepare the payload to send to the Chat method
69
+ const data = {
70
+ action: "chat",
71
+ history: messages,
72
+ functions: this.chatConfig$.value.functions,
73
+ debug: this.chatConfig$.value.debug,
74
+ serviceSettings: this.chatConfig$.value.serviceSettings,
75
+ contextSettings: {
76
+ ...this.chatConfig$.value.contextSettings,
77
+ app: this.appService.appName,
78
+ query
79
+ }
80
+ };
81
+ if (this.chatConfig$.value.saveChats) {
82
+ data.instanceId = this.chatInstanceId;
83
+ data.savedChatId = this.savedChatId;
84
+ }
85
+ // Request the Chat endpoint
86
+ return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(tap((res) => {
87
+ if (res.quota.maxQuotaReached) {
88
+ const msg = `Sorry, you have exceeded the allowed quota. Please retry starting from ${this.formatDateTime(res.quota.nextResetUTC)}.`;
89
+ this.notificationsService.error(msg);
90
+ throw new Error(msg);
91
+ }
92
+ }), map((res) => {
93
+ // Define $progress from the actions property of the response
94
+ let $progress;
95
+ if (res.actions?.length > 0) {
96
+ const actions = Object.values(res.actions.reduce((acc, item) => {
97
+ acc[item.guid] = { ...(acc[item.guid] || {}), ...item };
98
+ return acc;
99
+ }, {}));
100
+ $progress = actions.map((a) => ({
101
+ title: a.displayName ?? "",
102
+ content: a.displayValue ?? "",
103
+ done: a.executionTime !== undefined,
104
+ time: a.executionTime,
105
+ }));
106
+ }
107
+ // Define the response message
108
+ const response = { ...res.history.at(-1), additionalProperties: { display: true } };
109
+ if ($progress) {
110
+ response.additionalProperties.$progress = $progress;
111
+ }
112
+ if (res.context) {
113
+ response.additionalProperties.$attachment = res.context.map((ctx) => ctx.additionalProperties);
114
+ }
115
+ // Update the chat history with the history property of the res
116
+ this.chatHistory = res.history;
117
+ // Return the result
118
+ return { history: [...messages, response], executionTime: res.executionTime };
119
+ }), tap(() => this.notifyAudit(this.chatHistory, this.chatConfig$.value.serviceSettings.service_id)), finalize(() => this.streaming$.next(false)));
120
+ }
121
+ listSavedChat() {
122
+ const data = {
123
+ action: "SavedChatList",
124
+ instanceId: this.chatInstanceId,
125
+ debug: this.chatConfig$.value.debug
126
+ };
127
+ this.jsonMethodWebService.get(this.REQUEST_URL, data).subscribe(res => this.savedChats$.next(res.savedChats), error => {
128
+ console.error('Error occurred while calling the SavedChatList API:', error);
129
+ this.notificationsService.error('Error occurred while calling the SavedChatList API');
130
+ });
131
+ }
132
+ getSavedChat(id) {
133
+ const data = {
134
+ action: "SavedChatGet",
135
+ instanceId: this.chatInstanceId,
136
+ savedChatId: id,
137
+ debug: this.chatConfig$.value.debug
138
+ };
139
+ return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(map(res => res.savedChat), catchError((error) => {
140
+ console.error('Error occurred while calling the SavedChatGet API:', error);
141
+ this.notificationsService.error('Error occurred while calling the SavedChatGet API');
142
+ return throwError(() => error);
143
+ }));
144
+ }
145
+ deleteSavedChat(ids) {
146
+ const data = {
147
+ action: "SavedChatDelete",
148
+ instanceId: this.chatInstanceId,
149
+ savedChatIds: ids,
150
+ debug: this.chatConfig$.value.debug
151
+ };
152
+ return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(map(res => res.deletedCount), catchError((error) => {
153
+ console.error('Error occurred while calling the SavedChatDelete API:', error);
154
+ this.notificationsService.error('Error occurred while calling the SavedChatDelete API ');
155
+ return throwError(() => error);
156
+ }));
157
+ }
158
+ }
159
+ RestChatService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
160
+ RestChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService });
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RestChatService, decorators: [{
162
+ type: Injectable
163
+ }], ctorParameters: function () { return []; } });
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1jaGF0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9yZXN0LWNoYXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUdyRSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBSTlDO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFISCx5QkFBb0IsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUk5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEVBQzFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEMscURBQXFEO1FBQ3JELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDYixRQUFRLENBQUM7WUFDUCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxhQUFhLEVBQUU7U0FDckIsQ0FBQyxDQUNIO1FBQ0QsdUVBQXVFO1FBQ3ZFLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FB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QUssQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztZQUN6RixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7NEdBN0xVLGVBQWU7Z0hBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gJy4vY2hhdC5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNhdGNoRXJyb3IsIGZpbHRlciwgZmluYWxpemUsIGZvcmtKb2luLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWN0aW9uTWVzc2FnZSwgQ2hhdE1lc3NhZ2UsIENoYXRQYXlsb2FkLCBDaGF0UHJvZ3Jlc3MsIENoYXRSZXNwb25zZSwgR2xsbUZ1bmN0aW9uLCBHbGxtTW9kZWxEZXNjcmlwdGlvbiwgSHR0cENoYXRSZXNwb25zZSwgU2F2ZWRDaGF0SGlzdG9yeSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSnNvbk1ldGhvZFBsdWdpblNlcnZpY2UgfSBmcm9tICdAc2luZXF1YS9jb3JlL3dlYi1zZXJ2aWNlcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXN0Q2hhdFNlcnZpY2UgZXh0ZW5kcyBDaGF0U2VydmljZSB7XG5cbiAgcHVibGljIGpzb25NZXRob2RXZWJTZXJ2aWNlID0gaW5qZWN0KEpzb25NZXRob2RQbHVnaW5TZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNoYXQgcHJvY2VzcyBhZnRlciB0aGUgbG9naW4gaXMgY29tcGxldGUuXG4gICAqIEl0IGxpc3RlbnMgZm9yIHRoZSAnbG9naW4tY29tcGxldGUnIGV2ZW50LCBpbml0aWFsaXplcyBuZWNlc3NhcnkgVVJMLCBhbmQgcGVyZm9ybXMgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscywgZnVuY3Rpb25zIGFuZCBxdW90YSBkYXRhLlxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlPGJvb2xlYW4+IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4gICAqL1xuICBpbml0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmxvZ2luU2VydmljZS5ldmVudHMucGlwZShcbiAgICAgIGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnbG9naW4tY29tcGxldGUnKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmdldFJlcXVlc3RzVXJsKCkpLFxuICAgICAgLy8gRXhlY3V0ZSBwYXJhbGxlbCByZXF1ZXN0cyBmb3IgbW9kZWxzIGFuZCBmdW5jdGlvbnNcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICBmb3JrSm9pbihbXG4gICAgICAgICAgdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAgICAgdGhpcy5saXN0RnVuY3Rpb25zKClcbiAgICAgICAgXSlcbiAgICAgICksXG4gICAgICAvLyBNYXAgdGhlIHJlc3VsdHMgb2YgcGFyYWxsZWwgcmVxdWVzdHMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xuICAgICAgbWFwKChbbW9kZWxzLCBmdW5jdGlvbnNdKSA9PiAhIW1vZGVscyAmJiAhIWZ1bmN0aW9ucyksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgLy8gY2FjaGUgYW5kIHJlcGxheSB0aGUgZW1pdHRlZCB2YWx1ZSBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVycywgZW5zdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIGxvZ2ljIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWJzY3JpYmVyc1xuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgR0xMTSBwbHVnaW4gdG8gdXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UmVxdWVzdHNVcmwoKSB7XG4gICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmdsb2JhbFNldHRpbmdzLnJlc3RFbmRwb2ludCkge1xuICAgICAgdGhpcy5SRVFVRVNUX1VSTCA9IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmdsb2JhbFNldHRpbmdzLnJlc3RFbmRwb2ludDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgJ3Jlc3RFbmRwb2ludCcgbXVzdCBiZSBwcm92aWRlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlICdSRVNUJyBpbiBhc3Npc3RhbnQgaW5zdGFuY2VgKTtcbiAgICB9XG4gIH1cblxuICBsaXN0TW9kZWxzKCk6IE9ic2VydmFibGU8R2xsbU1vZGVsRGVzY3JpcHRpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IFwibGlzdG1vZGVsc1wiLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5nZXQodGhpcy5SRVFVRVNUX1VSTCwgZGF0YSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzLm1vZGVscyksXG4gICAgICB0YXAobW9kZWxzID0+IHRoaXMubW9kZWxzID0gbW9kZWxzPy5maWx0ZXIobW9kZWwgPT4gISFtb2RlbC5lbmFibGUpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIGxpc3Rtb2RlbHM6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBsaXN0RnVuY3Rpb25zKCk6IE9ic2VydmFibGU8R2xsbUZ1bmN0aW9uW10gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcImxpc3RmdW5jdGlvbnNcIixcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuanNvbk1ldGhvZFdlYlNlcnZpY2UuZ2V0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5mdW5jdGlvbnMpLFxuICAgICAgdGFwKGZ1bmN0aW9ucyA9PiB0aGlzLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucyksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBsaXN0ZnVuY3Rpb25zOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHF1ZXJ5ID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnF1ZXJ5KTogT2JzZXJ2YWJsZTxDaGF0UmVzcG9uc2U+IHtcbiAgICAvLyBTdGFydCBzdHJlYW1pbmcgYnkgaW52b2tpbmcgdGhlIENoYXQgbWV0aG9kXG4gICAgdGhpcy5zdHJlYW1pbmckLm5leHQodHJ1ZSk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIENoYXQgbWV0aG9kXG4gICAgY29uc3QgZGF0YTogQ2hhdFBheWxvYWQgJiB7YWN0aW9uOiBcImNoYXRcIn0gPSB7XG4gICAgICBhY3Rpb246IFwiY2hhdFwiLFxuICAgICAgaGlzdG9yeTogbWVzc2FnZXMsXG4gICAgICBmdW5jdGlvbnM6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmZ1bmN0aW9ucyxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1ZyxcbiAgICAgIHNlcnZpY2VTZXR0aW5nczogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2VydmljZVNldHRpbmdzLFxuICAgICAgY29udGV4dFNldHRpbmdzOiB7XG4gICAgICAgIC4uLnRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmNvbnRleHRTZXR0aW5ncyxcbiAgICAgICAgYXBwOiB0aGlzLmFwcFNlcnZpY2UuYXBwTmFtZSxcbiAgICAgICAgcXVlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLnNhdmVDaGF0cykge1xuICAgICAgZGF0YS5pbnN0YW5jZUlkID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcbiAgICAgIGRhdGEuc2F2ZWRDaGF0SWQgPSB0aGlzLnNhdmVkQ2hhdElkO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgdGhlIENoYXQgZW5kcG9pbnRcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICB0YXAoKHJlczogSHR0cENoYXRSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZihyZXMucXVvdGEubWF4UXVvdGFSZWFjaGVkKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gYFNvcnJ5LCB5b3UgaGF2ZSBleGNlZWRlZCB0aGUgYWxsb3dlZCBxdW90YS4gUGxlYXNlIHJldHJ5IHN0YXJ0aW5nIGZyb20gJHt0aGlzLmZvcm1hdERhdGVUaW1lKHJlcy5xdW90YS5uZXh0UmVzZXRVVEMpfS5gO1xuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IobXNnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoKHJlczogSHR0cENoYXRSZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBEZWZpbmUgJHByb2dyZXNzIGZyb20gdGhlIGFjdGlvbnMgcHJvcGVydHkgb2YgdGhlIHJlc3BvbnNlXG4gICAgICAgIGxldCAkcHJvZ3Jlc3M6IENoYXRQcm9ncmVzc1tdIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiggcmVzLmFjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb25zOiBBY3Rpb25NZXNzYWdlW10gPSBPYmplY3QudmFsdWVzKHJlcy5hY3Rpb25zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgICAgICBhY2NbaXRlbS5ndWlkXSA9IHsgLi4uKGFjY1tpdGVtLmd1aWRdIHx8IHt9KSwgLi4uaXRlbSB9O1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCB7fSkpO1xuICAgICAgICAgICRwcm9ncmVzcyA9IGFjdGlvbnMubWFwKChhKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGEuZGlzcGxheU5hbWUgPz8gXCJcIixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGEuZGlzcGxheVZhbHVlID8/IFwiXCIsXG4gICAgICAgICAgICBkb25lOiBhLmV4ZWN1dGlvblRpbWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRpbWU6IGEuZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWZpbmUgdGhlIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7Li4uKHJlcy5oaXN0b3J5IGFzIEFycmF5PENoYXRNZXNzYWdlPikuYXQoLTEpLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fSBhcyBDaGF0TWVzc2FnZTtcbiAgICAgICAgaWYoJHByb2dyZXNzKSB7XG4gICAgICAgICAgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzID0gJHByb2dyZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmKHJlcy5jb250ZXh0KSB7XG4gICAgICAgICAgcmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQgPSByZXMuY29udGV4dC5tYXAoKGN0eCkgPT4gY3R4LmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNoYXQgaGlzdG9yeSB3aXRoIHRoZSBoaXN0b3J5IHByb3BlcnR5IG9mIHRoZSByZXNcbiAgICAgICAgdGhpcy5jaGF0SGlzdG9yeSA9IHJlcy5oaXN0b3J5O1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgICAgICByZXR1cm4geyBoaXN0b3J5OiBbLi4ubWVzc2FnZXMsIHJlc3BvbnNlXSwgZXhlY3V0aW9uVGltZTogcmVzLmV4ZWN1dGlvblRpbWUgfTtcbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHRoaXMubm90aWZ5QXVkaXQodGhpcy5jaGF0SGlzdG9yeSEsIHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLnNlcnZpY2VTZXR0aW5ncy5zZXJ2aWNlX2lkKSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSkpXG4gICAgKTtcbiAgfVxuXG4gIGxpc3RTYXZlZENoYXQoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXRMaXN0XCIsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnXG4gICAgfTtcbiAgICB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4gdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0TGlzdCBBUEk6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRMaXN0IEFQSScpO1xuICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFNhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogXCJTYXZlZENoYXRHZXRcIixcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVidWdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmpzb25NZXRob2RXZWJTZXJ2aWNlLmdldCh0aGlzLlJFUVVFU1RfVVJMLCBkYXRhKS5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXMuc2F2ZWRDaGF0KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdEdldCBBUEk6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIHRoZSBTYXZlZENoYXRHZXQgQVBJJyk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZVNhdmVkQ2hhdChpZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiBcIlNhdmVkQ2hhdERlbGV0ZVwiLFxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHNhdmVkQ2hhdElkczogaWRzLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5qc29uTWV0aG9kV2ViU2VydmljZS5wb3N0KHRoaXMuUkVRVUVTVF9VUkwsIGRhdGEpLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcy5kZWxldGVkQ291bnQpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0aGUgU2F2ZWRDaGF0RGVsZXRlIEFQSTonLCBlcnJvcik7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgdGhlIFNhdmVkQ2hhdERlbGV0ZSBBUEkgJyk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,132 @@
1
+ import { Component, EventEmitter, Input, Output, inject } from "@angular/core";
2
+ import { AuditWebService } from "@sinequa/core/web-services";
3
+ import { InstanceManagerService } from "../instance-manager.service";
4
+ import { Subscription, catchError, filter, switchMap, tap, throwError, BehaviorSubject } from "rxjs";
5
+ import { CommonModule } from "@angular/common";
6
+ import { LoginService } from "@sinequa/core/login";
7
+ import { ModalButton, ModalModule, ModalService } from "@sinequa/core/modal";
8
+ import { NotificationsService } from "@sinequa/core/notification";
9
+ import { UtilsModule } from "@sinequa/components/utils";
10
+ import { format, parseISO, isToday, isYesterday, isThisWeek, isThisMonth, isThisQuarter, isThisYear, endOfYesterday, differenceInDays, differenceInMonths, differenceInYears } from 'date-fns';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "@sinequa/components/utils";
14
+ export class SavedChatsComponent {
15
+ constructor() {
16
+ this.load = new EventEmitter();
17
+ this.delete = new EventEmitter();
18
+ this.subscription = new Subscription();
19
+ this.groupedSavedChats$ = new BehaviorSubject([]);
20
+ this.loginService = inject(LoginService);
21
+ this.instanceManagerService = inject(InstanceManagerService);
22
+ this.auditService = inject(AuditWebService);
23
+ this.modalService = inject(ModalService);
24
+ this.notificationsService = inject(NotificationsService);
25
+ }
26
+ ngOnInit() {
27
+ this.subscription.add(this.loginService.events.pipe(filter(e => e.type === 'login-complete'), tap(_ => this.instantiateChatService()), switchMap(_ => this.chatService.initProcess$), filter(success => !!success), tap(_ => {
28
+ this.onListSavedChat();
29
+ this.chatService.listSavedChat();
30
+ })).subscribe());
31
+ }
32
+ ngOnDestroy() {
33
+ this.subscription.unsubscribe();
34
+ }
35
+ instantiateChatService() {
36
+ this.chatService = this.instanceManagerService.getInstance(this.instanceId);
37
+ }
38
+ onListSavedChat() {
39
+ this.subscription.add(this.chatService.savedChats$.subscribe((savedChats) => this.groupedSavedChats$.next(this._groupSavedChatsByDate(savedChats))));
40
+ }
41
+ onLoad(savedChat) {
42
+ this.chatService.loadSavedChat$.next(savedChat);
43
+ this.load.emit(savedChat);
44
+ }
45
+ onDelete(savedChat) {
46
+ this.modalService
47
+ .confirm({
48
+ title: "Delete saved discussion",
49
+ message: `You are about to delete the discussion "${savedChat.title}". Do you want to continue?`,
50
+ buttons: [
51
+ new ModalButton({ result: -2 /* ModalResult.Cancel */ }),
52
+ new ModalButton({ result: -1 /* ModalResult.OK */, text: "Confirm", primary: true })
53
+ ],
54
+ confirmType: 2 /* ConfirmType.Warning */
55
+ }).then(res => {
56
+ if (res === -1 /* ModalResult.OK */) {
57
+ this.subscription.add(this.chatService.deleteSavedChat([savedChat.id])
58
+ .pipe(tap(() => {
59
+ this.notificationsService.success(`The saved discussion "${savedChat.title}" has been successfully deleted.`);
60
+ this.delete.emit(savedChat);
61
+ this.chatService.listSavedChat();
62
+ }), catchError((error) => {
63
+ console.error('Error occurred while deleting the saved chat:', error);
64
+ this.notificationsService.error(`Error occurred while deleting the saved discussion "${savedChat.title}"`);
65
+ return throwError(() => error);
66
+ })).subscribe());
67
+ }
68
+ });
69
+ }
70
+ _groupSavedChatsByDate(savedChats) {
71
+ const groupedSavedChats = new Map();
72
+ savedChats
73
+ .sort((a, b) => parseISO(b.modifiedUTC).getTime() - parseISO(a.modifiedUTC).getTime())
74
+ .forEach(savedChat => {
75
+ const groupKey = this._getTimeKey(parseISO(savedChat.modifiedUTC));
76
+ if (!groupedSavedChats.has(groupKey)) {
77
+ groupedSavedChats.set(groupKey, []);
78
+ }
79
+ groupedSavedChats.get(groupKey).push(savedChat);
80
+ });
81
+ return Array.from(groupedSavedChats, ([key, value]) => ({ key, value }));
82
+ ;
83
+ }
84
+ _getTimeKey(date) {
85
+ if (isToday(date)) {
86
+ return 'Today';
87
+ }
88
+ else if (isYesterday(date)) {
89
+ return 'Yesterday';
90
+ }
91
+ else if (isThisWeek(date)) {
92
+ return 'This week';
93
+ }
94
+ else if (differenceInDays(endOfYesterday(), date) <= 7) {
95
+ return 'Last week';
96
+ }
97
+ else if (isThisMonth(date)) {
98
+ return 'This month';
99
+ }
100
+ else if (differenceInMonths(endOfYesterday(), date) <= 1) {
101
+ return 'Last month';
102
+ }
103
+ else if (isThisQuarter(date)) {
104
+ return 'This quarter';
105
+ }
106
+ else if (differenceInMonths(endOfYesterday(), date) <= 3) {
107
+ return 'Last quarter';
108
+ }
109
+ else if (isThisYear(date)) {
110
+ return 'This year';
111
+ }
112
+ else if (differenceInYears(endOfYesterday(), date) === 1) {
113
+ return 'Last year';
114
+ }
115
+ else {
116
+ return format(date, 'yyyy');
117
+ }
118
+ }
119
+ }
120
+ SavedChatsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SavedChatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
121
+ SavedChatsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: SavedChatsComponent, isStandalone: true, selector: "sq-saved-chats-v3", inputs: { instanceId: "instanceId" }, outputs: { load: "load", delete: "delete" }, ngImport: i0, template: "<div *ngFor=\"let group of (groupedSavedChats$ | async)\" class=\"saved-chats\">\n <div class=\"saved-chat-date\">{{group.key}}</div>\n <div *ngFor=\"let savedChat of group.value\" class=\"saved-chat p-2\">\n <span class=\"title me-1\" (click)=\"onLoad(savedChat)\">{{savedChat.title}}</span>\n <i class=\"saved-chat-actions fas fa-trash ms-1\" [sqTooltip]=\"'Delete'\" (click)=\"onDelete(savedChat)\"></i>\n </div>\n</div>\n", styles: [".saved-chats .saved-chat-date{font-weight:500;color:#a9a9a9;margin-top:.5rem}.saved-chats .saved-chat{display:flex;align-items:center;cursor:pointer;margin-left:.25rem}.saved-chats .saved-chat span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.saved-chats .saved-chat .saved-chat-actions{display:none}.saved-chats .saved-chat:hover{color:#ff732e;background-color:#fff8f1}.saved-chats .saved-chat:hover .saved-chat-actions{display:block}.saved-chats .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: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ModalModule }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }] });
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SavedChatsComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'sq-saved-chats-v3', standalone: true, imports: [CommonModule, ModalModule, UtilsModule], template: "<div *ngFor=\"let group of (groupedSavedChats$ | async)\" class=\"saved-chats\">\n <div class=\"saved-chat-date\">{{group.key}}</div>\n <div *ngFor=\"let savedChat of group.value\" class=\"saved-chat p-2\">\n <span class=\"title me-1\" (click)=\"onLoad(savedChat)\">{{savedChat.title}}</span>\n <i class=\"saved-chat-actions fas fa-trash ms-1\" [sqTooltip]=\"'Delete'\" (click)=\"onDelete(savedChat)\"></i>\n </div>\n</div>\n", styles: [".saved-chats .saved-chat-date{font-weight:500;color:#a9a9a9;margin-top:.5rem}.saved-chats .saved-chat{display:flex;align-items:center;cursor:pointer;margin-left:.25rem}.saved-chats .saved-chat span{flex-grow:1;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.saved-chats .saved-chat .saved-chat-actions{display:none}.saved-chats .saved-chat:hover{color:#ff732e;background-color:#fff8f1}.saved-chats .saved-chat:hover .saved-chat-actions{display:block}.saved-chats .title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
125
+ }], propDecorators: { instanceId: [{
126
+ type: Input
127
+ }], load: [{
128
+ type: Output
129
+ }], delete: [{
130
+ type: Output
131
+ }] } });
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtY2hhdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvc2F2ZWQtY2hhdHMvc2F2ZWQtY2hhdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvc2F2ZWQtY2hhdHMvc2F2ZWQtY2hhdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFlLFdBQVcsRUFBRSxXQUFXLEVBQWUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIs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QUFDLEVBQUU7WUFDNUIsT0FBTyxjQUFjLENBQUM7U0FDekI7YUFBTSxJQUFJLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4RCxPQUFPLGNBQWMsQ0FBQztTQUN6QjthQUFNLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sV0FBVyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEQsT0FBTyxXQUFXLENBQUM7U0FDdEI7YUFBTTtZQUNILE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvQjtJQUNILENBQUM7O2dIQTlIVSxtQkFBbUI7b0dBQW5CLG1CQUFtQixnS0NwQmhDLDhiQU9BLG9tQkRXWSxZQUFZLGdOQUFFLFdBQVcsOEJBQUUsV0FBVzsyRkFFckMsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLG1CQUFtQixjQUdqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQzs4QkFJeEMsVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQXVkaXRXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9jaGF0LnNlcnZpY2VcIjtcbmltcG9ydCB7IFNhdmVkQ2hhdCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5zdGFuY2VNYW5hZ2VyU2VydmljZSB9IGZyb20gXCIuLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgY2F0Y2hFcnJvciwgZmlsdGVyLCBzd2l0Y2hNYXAsIHRhcCwgdGhyb3dFcnJvciwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IExvZ2luU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2xvZ2luXCI7XG5pbXBvcnQgeyBDb25maXJtVHlwZSwgTW9kYWxCdXR0b24sIE1vZGFsTW9kdWxlLCBNb2RhbFJlc3VsdCwgTW9kYWxTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbW9kYWxcIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvbm90aWZpY2F0aW9uXCI7XG5pbXBvcnQgeyBVdGlsc01vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzXCI7XG5pbXBvcnQgeyBmb3JtYXQsIHBhcnNlSVNPLCBpc1RvZGF5LCBpc1llc3RlcmRheSwgaXNUaGlzV2VlaywgaXNUaGlzTW9udGgsIGlzVGhpc1F1YXJ0ZXIsIGlzVGhpc1llYXIsIGVuZE9mWWVzdGVyZGF5LCBkaWZmZXJlbmNlSW5EYXlzLCBkaWZmZXJlbmNlSW5Nb250aHMsIGRpZmZlcmVuY2VJblllYXJzIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcS1zYXZlZC1jaGF0cy12MycsXG4gIHRlbXBsYXRlVXJsOiAnc2F2ZWQtY2hhdHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2F2ZWQtY2hhdHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTW9kYWxNb2R1bGUsIFV0aWxzTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTYXZlZENoYXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBhcHByb3ByaWF0ZSBjaGF0U2VydmljZSBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGZyb20gaW5zdGFuY2VNYW5hZ2VyU2VydmljZSAqL1xuICBASW5wdXQoKSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpIGxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNhdmVkQ2hhdD4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2F2ZWRDaGF0PigpO1xuXG4gIGNoYXRTZXJ2aWNlOiBDaGF0U2VydmljZTtcbiAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBncm91cGVkU2F2ZWRDaGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBTYXZlZENoYXRbXX1bXT4oW10pO1xuXG4gIHB1YmxpYyBsb2dpblNlcnZpY2UgPSBpbmplY3QoTG9naW5TZXJ2aWNlKTtcbiAgcHVibGljIGluc3RhbmNlTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoSW5zdGFuY2VNYW5hZ2VyU2VydmljZSk7XG4gIHB1YmxpYyBhdWRpdFNlcnZpY2UgPSBpbmplY3QoQXVkaXRXZWJTZXJ2aWNlKTtcbiAgcHVibGljIG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuICBwdWJsaWMgbm90aWZpY2F0aW9uc1NlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubG9naW5TZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgICAgICBmaWx0ZXIoZSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxuICAgICAgICB0YXAoXyA9PiB0aGlzLmluc3RhbnRpYXRlQ2hhdFNlcnZpY2UoKSksXG4gICAgICAgIHN3aXRjaE1hcChfID0+IHRoaXMuY2hhdFNlcnZpY2UuaW5pdFByb2Nlc3MkKSxcbiAgICAgICAgZmlsdGVyKHN1Y2Nlc3MgPT4gISFzdWNjZXNzKSxcbiAgICAgICAgdGFwKF8gPT4ge1xuICAgICAgICAgIHRoaXMub25MaXN0U2F2ZWRDaGF0KCk7XG4gICAgICAgICAgdGhpcy5jaGF0U2VydmljZS5saXN0U2F2ZWRDaGF0KCk7XG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2UuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKTtcbiAgfVxuXG4gIG9uTGlzdFNhdmVkQ2hhdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLnNhdmVkQ2hhdHMkLnN1YnNjcmliZShcbiAgICAgICAgKHNhdmVkQ2hhdHM6IFNhdmVkQ2hhdFtdKSA9PiB0aGlzLmdyb3VwZWRTYXZlZENoYXRzJC5uZXh0KHRoaXMuX2dyb3VwU2F2ZWRDaGF0c0J5RGF0ZShzYXZlZENoYXRzKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgb25Mb2FkKHNhdmVkQ2hhdDogU2F2ZWRDaGF0KSB7XG4gICAgdGhpcy5jaGF0U2VydmljZS5sb2FkU2F2ZWRDaGF0JC5uZXh0KHNhdmVkQ2hhdCk7XG4gICAgdGhpcy5sb2FkLmVtaXQoc2F2ZWRDaGF0KTtcbiAgfVxuXG4gIG9uRGVsZXRlKHNhdmVkQ2hhdDogU2F2ZWRDaGF0KSB7XG4gICAgdGhpcy5tb2RhbFNlcnZpY2VcbiAgICAgIC5jb25maXJtKHtcbiAgICAgICAgICB0aXRsZTogXCJEZWxldGUgc2F2ZWQgZGlzY3Vzc2lvblwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSB0aGUgZGlzY3Vzc2lvbiBcIiR7c2F2ZWRDaGF0LnRpdGxlfVwiLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT9gLFxuICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgbmV3IE1vZGFsQnV0dG9uKHtyZXN1bHQ6IE1vZGFsUmVzdWx0LkNhbmNlbH0pLFxuICAgICAgICAgICAgICBuZXcgTW9kYWxCdXR0b24oe3Jlc3VsdDogTW9kYWxSZXN1bHQuT0ssIHRleHQ6IFwiQ29uZmlybVwiLCBwcmltYXJ5OiB0cnVlfSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNvbmZpcm1UeXBlOiBDb25maXJtVHlwZS5XYXJuaW5nXG4gICAgICB9KS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgaWYocmVzID09PSBNb2RhbFJlc3VsdC5PSykge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmRlbGV0ZVNhdmVkQ2hhdChbc2F2ZWRDaGF0LmlkXSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uuc3VjY2VzcyhgVGhlIHNhdmVkIGRpc2N1c3Npb24gXCIke3NhdmVkQ2hhdC50aXRsZX1cIiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGUuZW1pdChzYXZlZENoYXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmxpc3RTYXZlZENoYXQoKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQgd2hpbGUgZGVsZXRpbmcgdGhlIHNhdmVkIGNoYXQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGBFcnJvciBvY2N1cnJlZCB3aGlsZSBkZWxldGluZyB0aGUgc2F2ZWQgZGlzY3Vzc2lvbiBcIiR7c2F2ZWRDaGF0LnRpdGxlfVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ3JvdXBTYXZlZENoYXRzQnlEYXRlKHNhdmVkQ2hhdHM6IFNhdmVkQ2hhdFtdKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IFNhdmVkQ2hhdFtdIH1bXSB7XG4gICAgY29uc3QgZ3JvdXBlZFNhdmVkQ2hhdHMgPSBuZXcgTWFwPHN0cmluZywgU2F2ZWRDaGF0W10+KCk7XG5cbiAgICBzYXZlZENoYXRzXG4gICAgICAuc29ydCgoYSwgYikgPT4gcGFyc2VJU08oYi5tb2RpZmllZFVUQykuZ2V0VGltZSgpIC0gcGFyc2VJU08oYS5tb2RpZmllZFVUQykuZ2V0VGltZSgpKVxuICAgICAgLmZvckVhY2goc2F2ZWRDaGF0ID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cEtleSA9IHRoaXMuX2dldFRpbWVLZXkocGFyc2VJU08oc2F2ZWRDaGF0Lm1vZGlmaWVkVVRDKSk7XG5cbiAgICAgICAgICBpZiAoIWdyb3VwZWRTYXZlZENoYXRzLmhhcyhncm91cEtleSkpIHtcbiAgICAgICAgICAgIGdyb3VwZWRTYXZlZENoYXRzLnNldChncm91cEtleSwgW10pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGdyb3VwZWRTYXZlZENoYXRzLmdldChncm91cEtleSkhLnB1c2goc2F2ZWRDaGF0KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBlZFNhdmVkQ2hhdHMsIChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSkpOztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRpbWVLZXkoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzVG9kYXkoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICdUb2RheSc7XG4gICAgfSBlbHNlIGlmIChpc1llc3RlcmRheShkYXRlKSkge1xuICAgICAgICByZXR1cm4gJ1llc3RlcmRheSc7XG4gICAgfSBlbHNlIGlmIChpc1RoaXNXZWVrKGRhdGUpKSB7XG4gICAgICAgIHJldHVybiAnVGhpcyB3ZWVrJztcbiAgICB9IGVsc2UgaWYgKGRpZmZlcmVuY2VJbkRheXMoZW5kT2ZZZXN0ZXJkYXkoKSwgZGF0ZSkgPD0gNykge1xuICAgICAgcmV0dXJuICdMYXN0IHdlZWsnO1xuICAgIH0gZWxzZSBpZiAoaXNUaGlzTW9udGgoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICdUaGlzIG1vbnRoJztcbiAgICB9IGVsc2UgaWYgKGRpZmZlcmVuY2VJbk1vbnRocyhlbmRPZlllc3RlcmRheSgpLCBkYXRlKSA8PSAxKSB7XG4gICAgICByZXR1cm4gJ0xhc3QgbW9udGgnO1xuICAgIH0gZWxzZSBpZiAoaXNUaGlzUXVhcnRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gJ1RoaXMgcXVhcnRlcic7XG4gICAgfSBlbHNlIGlmIChkaWZmZXJlbmNlSW5Nb250aHMoZW5kT2ZZZXN0ZXJkYXkoKSwgZGF0ZSkgPD0gMykge1xuICAgICAgICByZXR1cm4gJ0xhc3QgcXVhcnRlcic7XG4gICAgfSBlbHNlIGlmIChpc1RoaXNZZWFyKGRhdGUpKSB7XG4gICAgICAgIHJldHVybiAnVGhpcyB5ZWFyJztcbiAgICB9IGVsc2UgaWYgKGRpZmZlcmVuY2VJblllYXJzKGVuZE9mWWVzdGVyZGF5KCksIGRhdGUpID09PSAxKSB7XG4gICAgICAgIHJldHVybiAnTGFzdCB5ZWFyJztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZm9ybWF0KGRhdGUsICd5eXl5Jyk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgKm5nRm9yPVwibGV0IGdyb3VwIG9mIChncm91cGVkU2F2ZWRDaGF0cyQgfCBhc3luYylcIiBjbGFzcz1cInNhdmVkLWNoYXRzXCI+XG4gICAgPGRpdiBjbGFzcz1cInNhdmVkLWNoYXQtZGF0ZVwiPnt7Z3JvdXAua2V5fX08L2Rpdj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzYXZlZENoYXQgb2YgZ3JvdXAudmFsdWVcIiBjbGFzcz1cInNhdmVkLWNoYXQgcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRpdGxlIG1lLTFcIiAoY2xpY2spPVwib25Mb2FkKHNhdmVkQ2hhdClcIj57e3NhdmVkQ2hhdC50aXRsZX19PC9zcGFuPlxuICAgICAgPGkgY2xhc3M9XCJzYXZlZC1jaGF0LWFjdGlvbnMgZmFzIGZhLXRyYXNoIG1zLTFcIiBbc3FUb29sdGlwXT1cIidEZWxldGUnXCIgKGNsaWNrKT1cIm9uRGVsZXRlKHNhdmVkQ2hhdClcIj48L2k+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZXF1YS1hc3Npc3RhbnQtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3NpbmVxdWEtYXNzaXN0YW50LWNoYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,85 @@
1
+ import { z } from 'zod';
2
+ // Define the Zod representation for the globalSettings object
3
+ export const globalSettingsSchema = z.object({
4
+ restEndpoint: z.string().optional(),
5
+ websocketEndpoint: z.string().optional(),
6
+ signalRTransport: z.enum(["WebSockets", "ServerSentEvents", "LongPolling", "None"]),
7
+ signalRLogLevel: z.enum(["Critical", "Debug", "Error", "Information", "None", "Trace", "Warning"])
8
+ }).refine(data => (!!data.restEndpoint || !!data.websocketEndpoint), {
9
+ message: "Based on the provided input() protocol ('REST' or 'WEBSOCKET') to the Chat Component, either 'restEndpoint' or 'websocketEndpoint' property should be provided in the 'globalSettings' of the assistant instance.",
10
+ });
11
+ // Define the Zod representation for the serviceSettings object
12
+ const serviceSettingsSchema = z.object({
13
+ service_id: z.string(),
14
+ model_id: z.string(),
15
+ temperature: z.number(),
16
+ top_p: z.number(),
17
+ maxTokens: z.number(),
18
+ results_per_prompt: z.number(),
19
+ presence_penalty: z.number(),
20
+ frequency_penalty: z.number(),
21
+ });
22
+ // Define the Zod representation for the TextChunksOptions interface
23
+ const textChunksOptionsSchema = z.object({
24
+ extendMode: z.enum(['None', 'Sentence', 'Chars']).optional(),
25
+ extendScope: z.number().optional(),
26
+ });
27
+ // Define the Zod representation for the contextOptions object
28
+ const contextOptionsSchema = z.object({
29
+ docColumns: z.array(z.string()),
30
+ textChunkFillGaps: z.number(),
31
+ html: z.boolean(),
32
+ topPassagesOptions: z.object({
33
+ topPassages: z.number(),
34
+ topPassagesMinScore: z.number(),
35
+ textChunkOptions: textChunksOptionsSchema,
36
+ }),
37
+ matchingPassagesOptions: z.object({
38
+ matchingPassagesPerDoc: z.number(),
39
+ fromTopDocuments: z.number(),
40
+ matchingPassagesMinScore: z.number(),
41
+ textChunkOptions: textChunksOptionsSchema,
42
+ }),
43
+ relevantExtractsOptions: z.object({
44
+ topRelevantExtractsPerDoc: z.number(),
45
+ fromTopDocuments: z.number(),
46
+ textChunkOptions: textChunksOptionsSchema,
47
+ }),
48
+ htmlOptions: z.object({
49
+ images: z.boolean(),
50
+ links: z.boolean(),
51
+ tables: z.boolean(),
52
+ extendTables: z.boolean(),
53
+ }),
54
+ });
55
+ // Define the Zod representation for the contextSettings object
56
+ const contextSettingsSchema = z.object({
57
+ app: z.string().optional(),
58
+ query: z.object({}).optional(),
59
+ contextOptions: contextOptionsSchema,
60
+ });
61
+ // Define the Zod representation for the uiSettings object
62
+ const uiSettingsSchema = z.object({
63
+ display: z.boolean(),
64
+ servicesModels: z.boolean(),
65
+ functions: z.boolean(),
66
+ temperature: z.boolean(),
67
+ top_p: z.boolean(),
68
+ maxTokens: z.boolean(),
69
+ debug: z.boolean(),
70
+ displaySystemPrompt: z.boolean(),
71
+ systemPrompt: z.string(),
72
+ displayUserPrompt: z.boolean(),
73
+ userPrompt: z.string(),
74
+ });
75
+ // Define the Zod representation for the entire ChatConfig object
76
+ export const chatConfigSchema = z.object({
77
+ globalSettings: globalSettingsSchema,
78
+ serviceSettings: serviceSettingsSchema,
79
+ contextSettings: contextSettingsSchema,
80
+ uiSettings: uiSettingsSchema,
81
+ functions: z.array(z.string()),
82
+ debug: z.boolean(),
83
+ saveChats: z.boolean()
84
+ });
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBcUl4Qiw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3hDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25GLGVBQWUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7Q0FDbkcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO0lBQ25FLE9BQU8sRUFBRSxtTkFBbU47Q0FDN04sQ0FBQyxDQUFDO0FBSUgsK0RBQStEO0FBQy9ELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN0QixRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNwQixXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN2QixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFB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LE9BQU8sRUFBRTtJQUNoQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN4QixpQkFBaUIsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQzlCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQztBQUlILGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLGNBQWMsRUFBRSxvQkFBb0I7SUFDcEMsZUFBZSxFQUFFLHFCQUFxQjtJQUN0QyxlQUFlLEVBQUUscUJBQXFCO0lBQ3RDLFVBQVUsRUFBRSxnQkFBZ0I7SUFDNUIsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlCLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ2xCLFNBQVMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0NBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5cbi8qKlxuICogSW5kaXZpZHVhbCBtZXNzYWdlIHNlbnQgJiByZXR1cm5lZCBieSB0aGUgQ2hhdEdQVCBBUEkuXG4gKiBJZiB0aGlzIG1lc3NhZ2UgaXMgYW4gYXR0YWNobWVudCwgd2UgYXR0YWNoIHRoZSBtaW5pbWFsXG4gKiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVjb25zdHJ1Y3QgdGhpcyBhdHRhY2htZW50IChSYXdBdHRhY2htZW50KVxuICogYXMgd2VsbCBhcyB0aGUgcmVmZXJlbmNlIGlkIGNvbXB1dGVkIGF0IHRoZSBtb21lbnQgb2Ygc2VuZGluZ1xuICogdGhlIGF0dGFjaG1lbnQgdG8gdGhlIEFQSS5cbiAqL1xuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBSYXdNZXNzYWdlIHtcbiAgcm9sZTogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG4gIH07XG59XG5cbi8qKlxuICogQSBjaGF0IG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBwcm9jZXNzZWQgdG8gaW5jbHVkZSB0aGUgbWFya2Rvd24tZm9ybWF0dGVkXG4gKiBjb250ZW50IGZvciBkaXNwbGF5LCBhcyB3ZWxsIGFzIGRldGFpbGVkIGF0dGFjaG1lbnQgZGF0YSwgYW5kIG9wdGlvbmFsbHlcbiAqIGEgbGlzdCBvZiB0aGUgcmVmZXJlbmNlcyBleHRyYWN0ZWQgZnJvbSB0aGF0IG1lc3NhZ2VcbiAqL1xuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBDaGF0TWVzc2FnZSBleHRlbmRzIFJhd01lc3NhZ2Uge1xuICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgIGRpc3BsYXk/OiBib29sZWFuO1xuICAgICRwcm9ncmVzcz86IENoYXRQcm9ncmVzc1tdO1xuICAgICRhdHRhY2htZW50PzogQ2hhdENvbnRleHRBdHRhY2htZW50W107XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufVxuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBDaGF0UHJvZ3Jlc3Mge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgY29udGVudD86IHN0cmluZztcbiAgICBkb25lPzogYm9vbGVhbjtcbiAgICB0aW1lPzogbnVtYmVyO1xufVxuXG4vLyBET05FXG5leHBvcnQgaW50ZXJmYWNlIFJhd0F0dGFjaG1lbnQge1xuICAvKiogVHlwZSBvZiB0aGUgYXR0YWNobWVudCAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBSZWNvcmQgaWQgZnJvbSB3aGljaCB0aGlzIGF0dGFjaG1lbnQgaXMgdGFrZW4gKi9cbiAgcmVjb3JkSWQ6IHN0cmluZztcbiAgLyoqIFJlY29yZCBmcm9tIHdoaWNoIHRoaXMgdGhpcyBhdHRhY2htZW50IGlzIHRha2VuICovXG4gIHJlY29yZDogUmVjb3JkO1xufVxuXG4vLyBET05FXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50UGFydCB7XG4gIHBhcnRJZDogbnVtYmVyO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgbGVuZ3RoOiBudW1iZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29udGV4dEF0dGFjaG1lbnQgZXh0ZW5kcyBSYXdBdHRhY2htZW50IHtcbiAgLyoqIFR5cGUgb2YgdGhlIGF0dGFjaG1lbnQgKi9cbiAgdHlwZTogXCJDb250ZXh0XCI7XG4gIC8qKiBSYW5rIG9mIHRoZSBhdHRhY2htZW50IGluIHRoZSBjb250ZXh0IG1lc3NhZ2UgKi9cbiAgY29udGV4dElkOiBudW1iZXI7XG4gIC8qKiBQYXJ0cyBvZiB0aGUgcmVjb3JkIHRoYXQgdGhlIGFzc2lzdGFudCB1c2VzIHRvIGFuc3dlciAqL1xuICBwYXJ0czogRG9jdW1lbnRQYXJ0W107XG4gIC8qKiBUaGUgc3BlY2lmaWMgaWQgb2YgdXNlZCB0aGUgcmVmZXJlbmNlZCBwYXJ0ICovXG4gICRwYXJ0SWQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmF3IHJlc3BvbnNlIG9mIHRoZSBBUElcbiAqL1xuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBSYXdSZXNwb25zZSB7XG4gIGhpc3Rvcnk6IFJhd01lc3NhZ2VbXTtcbiAgZXhlY3V0aW9uVGltZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVucmljaGVkIHJlc3BvbnNlIG9mIHRoZSBBUElcbiAqL1xuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBDaGF0UmVzcG9uc2UgZXh0ZW5kcyBSYXdSZXNwb25zZXtcbiAgaGlzdG9yeTogQ2hhdE1lc3NhZ2VbXTtcbn1cblxuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBHbGxtTW9kZWxEZXNjcmlwdGlvbiB7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHNlcnZpY2VJZDogc3RyaW5nO1xuICBtb2RlbElkOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgZW5hYmxlOiBib29sZWFuO1xuICBzdXBwb3J0U3RyZWFtaW5nOiBib29sZWFuO1xuICBzdXBwb3J0RnVuY3Rpb25zOiBib29sZWFuO1xufVxuXG4vLyBET05FXG5leHBvcnQgaW50ZXJmYWNlIEdsbG1GdW5jdGlvbiB7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwYXJhbWV0ZXJzOiBHbGxtRnVuY3Rpb25QYXJhbWV0ZXJbXTtcbn1cblxuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBHbGxtRnVuY3Rpb25QYXJhbWV0ZXIge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpc1JlcXVpcmVkOiBib29sZWFuO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBNaW5pbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgc2F2ZWQgY2hhdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVkQ2hhdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIG1vZGlmaWVkVVRDOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGF0YSBzdHJ1Y3R1cmUgc2F2ZWQgdG8gcmVjb25zdHJ1Y3QgYSBjb252ZXJzYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYXZlZENoYXRIaXN0b3J5IGV4dGVuZHMgU2F2ZWRDaGF0e1xuICBIaXN0b3J5OiBDaGF0TWVzc2FnZVtdO1xufVxuXG4vLyBEZWZpbmUgdGhlIFpvZCByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGdsb2JhbFNldHRpbmdzIG9iamVjdFxuZXhwb3J0IGNvbnN0IGdsb2JhbFNldHRpbmdzU2NoZW1hID0gei5vYmplY3Qoe1xuICByZXN0RW5kcG9pbnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgd2Vic29ja2V0RW5kcG9pbnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc2lnbmFsUlRyYW5zcG9ydDogei5lbnVtKFtcIldlYlNvY2tldHNcIiwgXCJTZXJ2ZXJTZW50RXZlbnRzXCIsIFwiTG9uZ1BvbGxpbmdcIiwgXCJOb25lXCJdKSxcbiAgc2lnbmFsUkxvZ0xldmVsOiB6LmVudW0oW1wiQ3JpdGljYWxcIiwgXCJEZWJ1Z1wiLCBcIkVycm9yXCIsIFwiSW5mb3JtYXRpb25cIiwgXCJOb25lXCIsIFwiVHJhY2VcIiwgXCJXYXJuaW5nXCJdKVxufSkucmVmaW5lKGRhdGEgPT4gKCEhZGF0YS5yZXN0RW5kcG9pbnQgfHwgISFkYXRhLndlYnNvY2tldEVuZHBvaW50KSwge1xuICBtZXNzYWdlOiBcIkJhc2VkIG9uIHRoZSBwcm92aWRlZCBpbnB1dCgpIHByb3RvY29sICgnUkVTVCcgb3IgJ1dFQlNPQ0tFVCcpIHRvIHRoZSBDaGF0IENvbXBvbmVudCwgZWl0aGVyICdyZXN0RW5kcG9pbnQnIG9yICd3ZWJzb2NrZXRFbmRwb2ludCcgcHJvcGVydHkgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoZSAnZ2xvYmFsU2V0dGluZ3MnIG9mIHRoZSBhc3Npc3RhbnQgaW5zdGFuY2UuXCIsXG59KTtcbi8vIERlZmluZSB0aGUgR2xvYmFsU2V0dGluZ3MgaW50ZXJmYWNlXG5leHBvcnQgdHlwZSBHbG9iYWxTZXR0aW5ncyA9IHouaW5mZXI8dHlwZW9mIGdsb2JhbFNldHRpbmdzU2NoZW1hPjtcblxuLy8gRGVmaW5lIHRoZSBab2QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBzZXJ2aWNlU2V0dGluZ3Mgb2JqZWN0XG5jb25zdCBzZXJ2aWNlU2V0dGluZ3NTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNlcnZpY2VfaWQ6IHouc3RyaW5nKCksXG4gIG1vZGVsX2lkOiB6LnN0cmluZygpLFxuICB0ZW1wZXJhdHVyZTogei5udW1iZXIoKSxcbiAgdG9wX3A6IHoubnVtYmVyKCksXG4gIG1heFRva2Vuczogei5udW1iZXIoKSxcbiAgcmVzdWx0c19wZXJfcHJvbXB0OiB6Lm51bWJlcigpLFxuICBwcmVzZW5jZV9wZW5hbHR5OiB6Lm51bWJlcigpLFxuICBmcmVxdWVuY3lfcGVuYWx0eTogei5udW1iZXIoKSxcbn0pO1xuLy8gRGVmaW5lIHRoZSBTZXJ2aWNlU2V0dGluZ3MgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VTZXR0aW5ncyBleHRlbmRzIHouaW5mZXI8dHlwZW9mIHNlcnZpY2VTZXR0aW5nc1NjaGVtYT4ge31cblxuLy8gRGVmaW5lIHRoZSBab2QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBUZXh0Q2h1bmtzT3B0aW9ucyBpbnRlcmZhY2VcbmNvbnN0IHRleHRDaHVua3NPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICBleHRlbmRNb2RlOiB6LmVudW0oWydOb25lJywgJ1NlbnRlbmNlJywgJ0NoYXJzJ10pLm9wdGlvbmFsKCksXG4gIGV4dGVuZFNjb3BlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG59KTtcbi8vIERlZmluZSB0aGUgVGV4dENodW5rc09wdGlvbnMgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFRleHRDaHVua3NPcHRpb25zIGV4dGVuZHMgei5pbmZlcjx0eXBlb2YgdGV4dENodW5rc09wdGlvbnNTY2hlbWE+IHt9XG5cbi8vIERlZmluZSB0aGUgWm9kIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY29udGV4dE9wdGlvbnMgb2JqZWN0XG5jb25zdCBjb250ZXh0T3B0aW9uc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZG9jQ29sdW1uczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgdGV4dENodW5rRmlsbEdhcHM6IHoubnVtYmVyKCksXG4gIGh0bWw6IHouYm9vbGVhbigpLFxuICB0b3BQYXNzYWdlc09wdGlvbnM6IHoub2JqZWN0KHtcbiAgICB0b3BQYXNzYWdlczogei5udW1iZXIoKSxcbiAgICB0b3BQYXNzYWdlc01pblNjb3JlOiB6Lm51bWJlcigpLFxuICAgIHRleHRDaHVua09wdGlvbnM6IHRleHRDaHVua3NPcHRpb25zU2NoZW1hLFxuICB9KSxcbiAgbWF0Y2hpbmdQYXNzYWdlc09wdGlvbnM6IHoub2JqZWN0KHtcbiAgICBtYXRjaGluZ1Bhc3NhZ2VzUGVyRG9jOiB6Lm51bWJlcigpLFxuICAgIGZyb21Ub3BEb2N1bWVudHM6IHoubnVtYmVyKCksXG4gICAgbWF0Y2hpbmdQYXNzYWdlc01pblNjb3JlOiB6Lm51bWJlcigpLFxuICAgIHRleHRDaHVua09wdGlvbnM6IHRleHRDaHVua3NPcHRpb25zU2NoZW1hLFxuICB9KSxcbiAgcmVsZXZhbnRFeHRyYWN0c09wdGlvbnM6IHoub2JqZWN0KHtcbiAgICB0b3BSZWxldmFudEV4dHJhY3RzUGVyRG9jOiB6Lm51bWJlcigpLFxuICAgIGZyb21Ub3BEb2N1bWVudHM6IHoubnVtYmVyKCksXG4gICAgdGV4dENodW5rT3B0aW9uczogdGV4dENodW5rc09wdGlvbnNTY2hlbWEsXG4gIH0pLFxuICBodG1sT3B0aW9uczogei5vYmplY3Qoe1xuICAgIGltYWdlczogei5ib29sZWFuKCksXG4gICAgbGlua3M6IHouYm9vbGVhbigpLFxuICAgIHRhYmxlczogei5ib29sZWFuKCksXG4gICAgZXh0ZW5kVGFibGVzOiB6LmJvb2xlYW4oKSxcbiAgfSksXG59KTtcbi8vIERlZmluZSB0aGUgQ29udGV4dE9wdGlvbnMgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRPcHRpb25zIGV4dGVuZHMgei5pbmZlcjx0eXBlb2YgY29udGV4dE9wdGlvbnNTY2hlbWE+IHt9XG5cbi8vIERlZmluZSB0aGUgWm9kIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY29udGV4dFNldHRpbmdzIG9iamVjdFxuY29uc3QgY29udGV4dFNldHRpbmdzU2NoZW1hID0gei5vYmplY3Qoe1xuICBhcHA6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcXVlcnk6IHoub2JqZWN0KHt9KS5vcHRpb25hbCgpLFxuICBjb250ZXh0T3B0aW9uczogY29udGV4dE9wdGlvbnNTY2hlbWEsXG59KTtcbi8vIERlZmluZSB0aGUgQ29udGV4dFNldHRpbmdzIGludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0U2V0dGluZ3MgZXh0ZW5kcyB6LmluZmVyPHR5cGVvZiBjb250ZXh0U2V0dGluZ3NTY2hlbWE+IHt9XG5cbi8vIERlZmluZSB0aGUgWm9kIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgdWlTZXR0aW5ncyBvYmplY3RcbmNvbnN0IHVpU2V0dGluZ3NTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGRpc3BsYXk6IHouYm9vbGVhbigpLFxuICBzZXJ2aWNlc01vZGVsczogei5ib29sZWFuKCksXG4gIGZ1bmN0aW9uczogei5ib29sZWFuKCksXG4gIHRlbXBlcmF0dXJlOiB6LmJvb2xlYW4oKSxcbiAgdG9wX3A6IHouYm9vbGVhbigpLFxuICBtYXhUb2tlbnM6IHouYm9vbGVhbigpLFxuICBkZWJ1Zzogei5ib29sZWFuKCksXG4gIGRpc3BsYXlTeXN0ZW1Qcm9tcHQ6IHouYm9vbGVhbigpLFxuICBzeXN0ZW1Qcm9tcHQ6IHouc3RyaW5nKCksXG4gIGRpc3BsYXlVc2VyUHJvbXB0OiB6LmJvb2xlYW4oKSxcbiAgdXNlclByb21wdDogei5zdHJpbmcoKSxcbn0pO1xuLy8gRGVmaW5lIHRoZSBVaVNldHRpbmdzIGludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBVaVNldHRpbmdzIGV4dGVuZHMgei5pbmZlcjx0eXBlb2YgdWlTZXR0aW5nc1NjaGVtYT4ge31cblxuLy8gRGVmaW5lIHRoZSBab2QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBlbnRpcmUgQ2hhdENvbmZpZyBvYmplY3RcbmV4cG9ydCBjb25zdCBjaGF0Q29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICBnbG9iYWxTZXR0aW5nczogZ2xvYmFsU2V0dGluZ3NTY2hlbWEsXG4gIHNlcnZpY2VTZXR0aW5nczogc2VydmljZVNldHRpbmdzU2NoZW1hLFxuICBjb250ZXh0U2V0dGluZ3M6IGNvbnRleHRTZXR0aW5nc1NjaGVtYSxcbiAgdWlTZXR0aW5nczogdWlTZXR0aW5nc1NjaGVtYSxcbiAgZnVuY3Rpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBkZWJ1Zzogei5ib29sZWFuKCksXG4gIHNhdmVDaGF0czogei5ib29sZWFuKClcbn0pO1xuLy8gRGVmaW5lIHRoZSBVaVNldHRpbmdzIGludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29uZmlnIGV4dGVuZHMgei5pbmZlcjx0eXBlb2YgY2hhdENvbmZpZ1NjaGVtYT4ge31cblxuLy8gRE9ORVxuZXhwb3J0IGludGVyZmFjZSBDaGF0UGF5bG9hZCB7XG4gIGZ1bmN0aW9uczogc3RyaW5nW107XG4gIGRlYnVnOiBib29sZWFuO1xuICBzZXJ2aWNlU2V0dGluZ3M6IFNlcnZpY2VTZXR0aW5ncztcbiAgY29udGV4dFNldHRpbmdzOiBDb250ZXh0U2V0dGluZ3M7XG4gIGhpc3Rvcnk6IENoYXRNZXNzYWdlW107XG4gIGluc3RhbmNlSWQ/OiBzdHJpbmc7XG4gIHNhdmVkQ2hhdElkPzogc3RyaW5nO1xufVxuLy8gRE9ORVxuZXhwb3J0IHR5cGUgQWN0aW9uTWVzc2FnZSA9IHtcbiAgZ3VpZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZ1xuICBkaXNwbGF5VmFsdWU/OiBzdHJpbmc7XG4gIGV4ZWN1dGlvblRpbWU/OiBudW1iZXI7XG59XG4vLyBET05FXG5leHBvcnQgaW50ZXJmYWNlIFRleHRDaHVua3NPcHRpb25zIHtcbiAgZXh0ZW5kTW9kZT86ICdOb25lJyB8ICdTZW50ZW5jZScgfCAnQ2hhcnMnO1xuICBleHRlbmRTY29wZT86IG51bWJlcjtcbn1cbi8vIERPTkVcbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGEge1xuICBsYXN0UmVxdWVzdDogc3RyaW5nO1xuICBwcm9tcHRUb2tlbkNvdW50OiBudW1iZXI7XG4gIGNvbXBsZXRpb25Ub2tlbkNvdW50OiBudW1iZXI7XG4gIHBlcmlvZFRva2VuczogbnVtYmVyO1xuICByZXNldEhvdXJzOiBudW1iZXI7XG4gIHRva2VuQ291bnQ6IG51bWJlcjtcbiAgbmV4dFJlc2V0OiBzdHJpbmc7XG4gIGxhc3RSZXNldFVUQzogc3RyaW5nO1xuICBuZXh0UmVzZXRVVEM6IHN0cmluZztcbiAgbWF4UXVvdGFSZWFjaGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIExpc3Qgb2YgZXZlbnRzIGRhdGEgdGhhdCBjYW4gYmUgZW1pdHRlZCBieSB0aGUgd2Vic29ja2V0IGNoYXQgZW5kcG9pbnRcbiAqL1xuLy8gRE9ORVxuZXhwb3J0IHR5cGUgUXVvdGFFdmVudCA9IHsgcXVvdGE6IFF1b3RhIH07XG5leHBvcnQgdHlwZSBNZXNzYWdlRXZlbnQgPSBzdHJpbmc7XG5leHBvcnQgdHlwZSBDb250ZXh0TWVzc2FnZUV2ZW50ID0geyBjb250ZW50OiBzdHJpbmc7IG1ldGFkYXRhOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQgfTtcbmV4cG9ydCB0eXBlIEVycm9yRXZlbnQgPSBzdHJpbmc7XG5leHBvcnQgdHlwZSBBY3Rpb25TdGFydEV2ZW50ID0geyBndWlkOiBzdHJpbmc7IGRpc3BsYXlOYW1lOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIEFjdGlvblJlc3VsdEV2ZW50ID0geyBndWlkOiBzdHJpbmc7IGRpc3BsYXlWYWx1ZTogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBBY3Rpb25TdG9wRXZlbnQgPSB7IGd1aWQ6IHN0cmluZzsgZXhlY3V0aW9uVGltZTogbnVtYmVyIH07XG5leHBvcnQgdHlwZSBIaXN0b3J5RXZlbnQgPSB7IGhpc3Rvcnk6IFJhd01lc3NhZ2VbXTsgZXhlY3V0aW9uVGltZTogc3RyaW5nIH07XG5cbi8qKlxuICogRGF0YSBlbWl0dGVkIGJ5IHRoZSBodHRwIGNoYXQgZW5kcG9pbnRcbiAqL1xuLy8gRE9ORVxuZXhwb3J0IHR5cGUgSHR0cENoYXRSZXNwb25zZSA9IHtcbiAgcXVvdGE6IFF1b3RhO1xuICBkZWJ1ZzogYW55O1xuICBjb250ZXh0OiB7IGNvbnRlbnQ6IHN0cmluZzsgYWRkaXRpb25hbFByb3BlcnRpZXM6IENoYXRDb250ZXh0QXR0YWNobWVudCB9W107XG4gIGFjdGlvbnM6IEFjdGlvbk1lc3NhZ2VbXTtcbiAgaGlzdG9yeTogUmF3TWVzc2FnZVtdO1xuICBleGVjdXRpb25UaW1lOiBzdHJpbmc7XG59XG4vLyBET05FXG5leHBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IHtcbiAgaGFuZGxlcjogKGRhdGE6IFQpID0+IHZvaWQ7XG4gIGlzR2xvYmFsSGFuZGxlcjogYm9vbGVhbjtcbn07XG4iXX0=