@hivegpt/hiveai-angular 0.0.201 → 0.0.203

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 (48) hide show
  1. package/README.md +24 -24
  2. package/bundles/hivegpt-hiveai-angular.umd.js +1969 -1984
  3. package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
  4. package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
  5. package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
  6. package/environments/environment.d.ts +14 -14
  7. package/environments/environment.d.ts.map +1 -1
  8. package/esm2015/environments/environment.js +15 -15
  9. package/esm2015/hivegpt-hiveai-angular.js +10 -10
  10. package/esm2015/lib/components/NotificationSocket.js +39 -39
  11. package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +1105 -1120
  12. package/esm2015/lib/components/chatbot/chatbot.component.js +50 -50
  13. package/esm2015/lib/components/conversation.service.js +45 -45
  14. package/esm2015/lib/components/socket-service.service.js +69 -69
  15. package/esm2015/lib/components/video-player/video-player.component.js +123 -123
  16. package/esm2015/lib/hivegpt.module.js +19 -19
  17. package/esm2015/lib/models/video.js +2 -2
  18. package/esm2015/lib/pipes/safe-html.pipe.js +19 -19
  19. package/esm2015/lib/utils/utils.js +36 -36
  20. package/esm2015/public-api.js +7 -7
  21. package/fesm2015/hivegpt-hiveai-angular.js +1467 -1482
  22. package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
  23. package/hivegpt-hiveai-angular.d.ts +9 -9
  24. package/hivegpt-hiveai-angular.d.ts.map +1 -1
  25. package/hivegpt-hiveai-angular.metadata.json +1 -1
  26. package/lib/components/NotificationSocket.d.ts +4 -4
  27. package/lib/components/NotificationSocket.d.ts.map +1 -1
  28. package/lib/components/chat-drawer/chat-drawer.component.d.ts +178 -178
  29. package/lib/components/chat-drawer/chat-drawer.component.d.ts.map +1 -1
  30. package/lib/components/chatbot/chatbot.component.d.ts +35 -35
  31. package/lib/components/chatbot/chatbot.component.d.ts.map +1 -1
  32. package/lib/components/conversation.service.d.ts +12 -12
  33. package/lib/components/conversation.service.d.ts.map +1 -1
  34. package/lib/components/socket-service.service.d.ts +18 -18
  35. package/lib/components/socket-service.service.d.ts.map +1 -1
  36. package/lib/components/video-player/video-player.component.d.ts +35 -35
  37. package/lib/components/video-player/video-player.component.d.ts.map +1 -1
  38. package/lib/hivegpt.module.d.ts +2 -2
  39. package/lib/hivegpt.module.d.ts.map +1 -1
  40. package/lib/models/video.d.ts +34 -34
  41. package/lib/models/video.d.ts.map +1 -1
  42. package/lib/pipes/safe-html.pipe.d.ts +7 -7
  43. package/lib/pipes/safe-html.pipe.d.ts.map +1 -1
  44. package/lib/utils/utils.d.ts +2 -2
  45. package/lib/utils/utils.d.ts.map +1 -1
  46. package/package.json +1 -1
  47. package/public-api.d.ts +3 -3
  48. package/public-api.d.ts.map +1 -1
@@ -1,1120 +1,1105 @@
1
- // import { Platform } from '@angular/cdk/platform';
2
- import { HttpClient, HttpHeaders } from '@angular/common/http';
3
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewChildren, } from '@angular/core';
4
- import { DomSanitizer } from '@angular/platform-browser';
5
- import { of } from 'rxjs';
6
- import { catchError, switchMap } from 'rxjs/operators';
7
- import { formatNow, formatTimeStamps } from '../../utils/utils';
8
- import { dev_environment, prod_environment } from '../../../environments/environment';
9
- import { ConversationService } from '../conversation.service';
10
- import { SocketService } from '../socket-service.service';
11
- export class ChatDrawerComponent {
12
- constructor(cdr, http, sanitizer, elementRef, renderer, socketService, conversationService
13
- // private platform: Platform
14
- ) {
15
- this.cdr = cdr;
16
- this.http = http;
17
- this.sanitizer = sanitizer;
18
- this.elementRef = elementRef;
19
- this.renderer = renderer;
20
- this.socketService = socketService;
21
- this.conversationService = conversationService;
22
- this.bodyOverflowClass = 'body-overflow-hidden';
23
- this.isCollapsedTrue = false;
24
- this.copilotName = "HiveXGPT";
25
- this.feedbackEvent = new EventEmitter();
26
- this.onCloseEvent = new EventEmitter();
27
- this.openPage = new EventEmitter();
28
- this.sessionActions = new EventEmitter();
29
- this.closeBot = new EventEmitter();
30
- this.connectWithUser = new EventEmitter();
31
- this.scheduleMeeting = new EventEmitter();
32
- this.autogenKey = "Autogen_eDJTtEU-NB0RtIpzq1w";
33
- this.addToMyAgendaAction = "add_to_my_agenda";
34
- this.myUpcomingSessionAction = "my_upcomming_session";
35
- this.connectOrFollowAction = "connect_or_follow";
36
- this.aiResponse = '';
37
- this.chatLog = [];
38
- this.decoder = new TextDecoder();
39
- this.feedbackDone = false;
40
- this.greetingMsg = '';
41
- this.hasBackdropValue = false;
42
- this.input = '';
43
- this.listenerAdded = false;
44
- this.loading = false;
45
- this.mode = 'over';
46
- this.quickPrompts = [];
47
- this.thumbsDownMsgIndex = 0;
48
- this.userName = '';
49
- this.showStartAgain = false;
50
- this.isIOSDevice = false;
51
- this.showFeedBackIconsIndex = null;
52
- this.temperature = 1;
53
- this.speakers = [];
54
- this.isChatingWithAi = false;
55
- this.readAllChunks = (stream) => {
56
- const reader = stream.getReader();
57
- const allSuggestions = [];
58
- reader.closed.catch((err) => {
59
- if (err) {
60
- console.error('Error reading stream: ', err);
61
- }
62
- this.isChatingWithAi = false;
63
- this.scrollToBottom();
64
- return;
65
- });
66
- return new ReadableStream({
67
- start: (controller) => {
68
- return this.pump(controller, reader, allSuggestions);
69
- },
70
- });
71
- };
72
- this.isDropdownOpen = false;
73
- this.selectedAgents = [];
74
- this.allSelected = false;
75
- this.isCollapsed = false;
76
- this.isCollapsedForGraph = false;
77
- this.isCollapsedForFGraph = false;
78
- // [
79
- // {
80
- // "title": "AI News January 2024: In-Depth and Concise - The AI Track",
81
- // "desc": "Each month, we compile significant news, trends, and happenings in AI, providing detailed summaries with key points in bullet form for concise yet complete understanding.",
82
- // "link": "https://theaitrack.com/ai-news-january-2024/"
83
- // },
84
- // {
85
- // "title": "Top AI News, January 2024 - Everypixel Journal",
86
- // "desc": "In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.",
87
- // "link": "https://journal.everypixel.com/top-ai-news-january-2024"
88
- // },
89
- // {
90
- // "title": "AI News July 2024: In-Depth and Concise - The AI Track",
91
- // "desc": "This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.",
92
- // "link": "https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/"
93
- // },
94
- // {
95
- // "title": "January news roundup: What's new in the world of AI? - Pluralsight",
96
- // "desc": "OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.",
97
- // "link": "https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024"
98
- // },
99
- // {
100
- // "title": "AI News August 2024: In-Depth and Concise - The AI Track",
101
- // "desc": "This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.",
102
- // "link": "https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/"
103
- // }
104
- // ]
105
- this.dateTime = { now: new Date().toISOString() };
106
- this.isDrawerOpen = true;
107
- this.chatMain = new ElementRef(null);
108
- // if (this.platform.IOS) {
109
- // this.isIOSDevice = true;
110
- // }
111
- }
112
- ngOnInit() {
113
- this.environment = this.isDev ? dev_environment : prod_environment;
114
- // this.fetchMyConnections().subscribe();
115
- // this.fetchPendingRequests().subscribe();
116
- this.changeTemperature(this.temperature);
117
- this.fetchBotConfig().subscribe((res) => {
118
- this.cdr.markForCheck();
119
- this.fetchChatHistory().subscribe((response) => {
120
- this.loading = false;
121
- this.mapChatHistory(response);
122
- this.cdr.markForCheck();
123
- }, (err) => {
124
- console.error('Error fetching chat history:', err);
125
- });
126
- }, (err) => {
127
- console.error('Error fetching chat history:', err);
128
- });
129
- this.fetchAgents();
130
- this.cdr.markForCheck();
131
- this.initializeSocket();
132
- setTimeout(() => {
133
- this.listenSockets();
134
- }, 200);
135
- }
136
- initializeSocket() {
137
- ;
138
- const conversation_id = this.conversationService.getKey(this.botId);
139
- this.socketService.registerUserSpecificHiveSocket(this.botId, conversation_id);
140
- }
141
- listenSockets() {
142
- this.eventSubscription = this.conversationService
143
- .getUserSpecificNotification()
144
- .subscribe((res) => {
145
- var _a, _b;
146
- // Check if OtherFields exists in the response
147
- if ((_a = res === null || res === void 0 ? void 0 : res.m) === null || _a === void 0 ? void 0 : _a.OtherFields) {
148
- const { conversation_id, bot_id, message_id, answer, web_results, financial_graphs, execution_graphs, online_search_terms, suggestions } = (_b = res === null || res === void 0 ? void 0 : res.m) === null || _b === void 0 ? void 0 : _b.OtherFields;
149
- var currentChatMessage = this.chatLog.find(p => p._id == message_id);
150
- if (!currentChatMessage) {
151
- currentChatMessage = {
152
- _id: message_id,
153
- type: 'ai',
154
- time: formatNow(this.timezone),
155
- };
156
- this.chatLog.push(currentChatMessage);
157
- this.showFeedBackIconsIndex = this.chatLog.length - 1;
158
- }
159
- // Handle the fields based on their presence
160
- if (online_search_terms && Array.isArray(online_search_terms)) {
161
- console.log('Online Search Terms:', online_search_terms);
162
- currentChatMessage.searchTerms = online_search_terms;
163
- this.cdr.markForCheck();
164
- }
165
- if (web_results && Array.isArray(web_results)) {
166
- console.log('Web Results:', web_results);
167
- currentChatMessage.sourcesList = web_results;
168
- currentChatMessage.displayedSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(0, 3); // First 3 cards
169
- currentChatMessage.remainingSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(3); // Remaining items
170
- this.cdr.markForCheck();
171
- }
172
- if (answer) {
173
- this.isChatingWithAi = false;
174
- console.log('Answer:', answer);
175
- currentChatMessage.message = this.processMessageForDisplay(answer);
176
- this.cdr.markForCheck();
177
- this.scrollToBottom();
178
- }
179
- if (financial_graphs && Array.isArray(financial_graphs)) {
180
- console.log('Financial Graphs:', financial_graphs);
181
- currentChatMessage.financialGraphs = financial_graphs;
182
- this.cdr.markForCheck();
183
- }
184
- if (execution_graphs && Array.isArray(execution_graphs)) {
185
- console.log('Execution Graphs:', execution_graphs);
186
- currentChatMessage.executionGraphs = execution_graphs;
187
- this.cdr.markForCheck();
188
- }
189
- if (suggestions && Array.isArray(suggestions)) {
190
- console.log('suggestions:', suggestions);
191
- currentChatMessage.relatedListItems = suggestions;
192
- this.cdr.markForCheck();
193
- // Process online search terms as needed
194
- }
195
- // Add any other fields and their processing here
196
- }
197
- else {
198
- console.warn('OtherFields is missing in the response');
199
- }
200
- }, (err) => {
201
- this.eventSubscription.unsubscribe();
202
- console.error('Error in fetching data from socket', err);
203
- });
204
- }
205
- initializeSocketAndListen() {
206
- }
207
- handleEvent(data, type) {
208
- switch (type) {
209
- case 'webresult':
210
- break;
211
- case 'answer':
212
- break;
213
- case 'graph':
214
- break;
215
- default:
216
- break;
217
- }
218
- }
219
- ngOnDestroy() {
220
- if (this.eventSubscription) {
221
- this.eventSubscription.unsubscribe();
222
- }
223
- //this.socketService.close();
224
- }
225
- changeTemperature(newTemperature) {
226
- if (this.loading)
227
- return;
228
- this.temperature = newTemperature;
229
- const wrapper = document.querySelector('.hivegpt-chat-wrapper');
230
- // Remove existing theme classes from body
231
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.remove('creative', 'balanced', 'precise');
232
- switch (newTemperature) {
233
- case 0:
234
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('creative');
235
- break;
236
- case 1:
237
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('balanced');
238
- break;
239
- case 2:
240
- wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('precise');
241
- break;
242
- default:
243
- break;
244
- }
245
- }
246
- onStartAgain() {
247
- if (this.loading)
248
- return;
249
- this.showStartAgain = false;
250
- this.chatLog = [];
251
- this.chatLog.push({
252
- type: 'ai',
253
- message: this.greetingMsg ||
254
- this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
255
- time: formatNow(this.timezone),
256
- });
257
- this.archieveMessages().subscribe();
258
- }
259
- archieveMessages() {
260
- const headers = new HttpHeaders({
261
- 'Content-Type': 'application/json',
262
- 'x-api-key': this.apiKey,
263
- });
264
- const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;
265
- return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
266
- return of(res);
267
- }), catchError((error) => {
268
- return of(null);
269
- }));
270
- }
271
- fetchBotConfig() {
272
- this.loading = true;
273
- const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;
274
- return this.http.get(url).pipe(switchMap((res) => {
275
- var _a;
276
- this.botName = res.Name;
277
- this.botIcon = res.Icon;
278
- this.botSkills = res === null || res === void 0 ? void 0 : res.Skills;
279
- this.greetingMsg = res.Greeting;
280
- this.thumbsDownMessages = ((_a = res === null || res === void 0 ? void 0 : res.NegativeResponses) === null || _a === void 0 ? void 0 : _a.length) ? res.NegativeResponses
281
- : [
282
- "We are sorry we've not been able to answer your question.<br/> However, our dedicated support team is happy to help. <span class='feedback-link' style='cursor: pointer; text-decoration: underline; font-weight: 700; color: #17235B;'>Please click here</span> and a human agent will assist you as soon as possible",
283
- ];
284
- this.quickPrompts = res.QuickPrompts;
285
- this.cdr.markForCheck();
286
- this.loading = false;
287
- return of(res);
288
- }), catchError((error) => {
289
- console.error('Error fetching chatbot config: ', error);
290
- this.loading = false;
291
- return of(null);
292
- }));
293
- }
294
- fetchChatHistory() {
295
- this.loading = true;
296
- this.conversationKey = this.conversationService.getKey(this.botId);
297
- const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}`;
298
- const headers = new HttpHeaders({
299
- 'accept': 'application/json'
300
- });
301
- return this.http.get(url, { headers }).pipe(catchError(this.handleError('fetchConversation')));
302
- }
303
- handleError(operation = 'operation', result) {
304
- return (error) => {
305
- console.error(`${operation} failed: ${error.message}`);
306
- return of(result);
307
- };
308
- }
309
- // fetchChatHistory() {
310
- // this.loading = true;
311
- // const headers = new HttpHeaders({
312
- // 'Content-Type': 'application/json',
313
- // 'x-api-key': this.apiKey,
314
- // });
315
- // return this.http
316
- // .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })
317
- // .pipe(
318
- // switchMap((res: any) => {
319
- // this.loading = false;
320
- // return of(res);
321
- // }),
322
- // catchError((error: any) => {
323
- // console.error('Error fetching chat history: ', error);
324
- // this.loading = false;
325
- // return of(null);
326
- // })
327
- // );
328
- // }
329
- mapChatHistory(chats) {
330
- var _a;
331
- this.chatLog.push({
332
- type: 'ai',
333
- message: this.greetingMsg ||
334
- this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
335
- time: formatNow(this.timezone),
336
- });
337
- if (chats && ((_a = chats === null || chats === void 0 ? void 0 : chats.Messages) === null || _a === void 0 ? void 0 : _a.length)) {
338
- chats === null || chats === void 0 ? void 0 : chats.Messages.forEach((chat) => {
339
- if (chat.Type == "user") {
340
- this.chatLog.push({
341
- type: 'user',
342
- message: this.processMessageForDisplay(chat.Text),
343
- time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
344
- copied: false,
345
- isCollapsedTrue: false
346
- });
347
- }
348
- if (chat.Type == "ai") {
349
- var sourcesList = chat.WebLinks || [];
350
- var displayedSources = chat.WebLinks.slice(0, 3); // First 3 cards
351
- var remainingSources = chat.WebLinks.slice(3); // Remaining items
352
- this.chatLog.push({
353
- type: 'ai',
354
- message: this.processMessageForDisplay(chat.Text),
355
- executionGraphs: chat.ExecutionGraphs,
356
- searchTerms: chat.SearchTerms,
357
- sourcesList: sourcesList,
358
- displayedSources: displayedSources,
359
- remainingSources: remainingSources,
360
- time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
361
- copied: false,
362
- isCollapsedTrue: false
363
- });
364
- this.showFeedBackIconsIndex = this.chatLog.length - 1;
365
- }
366
- });
367
- this.showStartAgain = true;
368
- }
369
- this.scrollToBottom();
370
- this.cdr.markForCheck();
371
- }
372
- processMessage(message) {
373
- if (!message || !((message === null || message === void 0 ? void 0 : message.length) > 0)) {
374
- return '';
375
- }
376
- // console.log('here is my message')
377
- // console.log(message);
378
- message = message.trim();
379
- const markdownLinkRegex = /\[([^[]+)]\(([^)]+)\)/g;
380
- const urlRegex = /(?<!href=")\bhttps?:\/\/\S+(?<![.,])/gi;
381
- if (markdownLinkRegex.test(message)) {
382
- const html = message.replace(markdownLinkRegex, '<a href="$2" target="_blank">$1</a>');
383
- //console.log('Sanitized message: ', message);
384
- return this.sanitizeHtml(html);
385
- }
386
- if (urlRegex.test(message)) {
387
- const html = message.replace(urlRegex, '<a href="$&" target="_blank">$&</a>');
388
- // console.log('Sanitized message: ', message);
389
- return this.sanitizeHtml(html);
390
- }
391
- message = message.replace(/(?:\r\n|\r|\n)/g, '<br>');
392
- message = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
393
- // Convert Markdown headers to HTML headers
394
- message = message.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
395
- const level = hashes.length;
396
- return `<h${level}>${text}</h${level}>`;
397
- });
398
- this.cdr.markForCheck();
399
- const sanitizedMessage = this.sanitizeHtml(message);
400
- return sanitizedMessage;
401
- }
402
- ngAfterViewChecked() {
403
- const feedbackLinks = this.elementRef.nativeElement.querySelectorAll('.feedback-link');
404
- feedbackLinks.forEach((link) => {
405
- link.addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
406
- });
407
- // if (this.elementRef.nativeElement.querySelector('.feedback-link')) {
408
- // this.elementRef.nativeElement
409
- // .querySelector('.feedback-link')
410
- // .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
411
- // }
412
- }
413
- sanitizeHtml(html) {
414
- return this.sanitizer.bypassSecurityTrustHtml(html);
415
- }
416
- onFeedbackClick(value) {
417
- this.feedbackEvent.emit(value);
418
- }
419
- onClose() {
420
- this.renderer.removeClass(document.body, this.bodyOverflowClass);
421
- this.onCloseEvent.emit();
422
- }
423
- sendMessageWithTile(prompt) {
424
- this.input = prompt;
425
- this.fetchData();
426
- this.scrollToBottom();
427
- }
428
- fetchData() {
429
- var _a;
430
- this.input = (_a = this.input) === null || _a === void 0 ? void 0 : _a.trim();
431
- if (!this.input || this.loading) {
432
- return;
433
- }
434
- this.chatLog.push({
435
- type: 'user',
436
- message: this.processMessageForDisplay(this.input),
437
- time: formatNow(this.timezone),
438
- copied: false,
439
- isCollapsedTrue: false
440
- });
441
- this.cdr.markForCheck();
442
- this.aiResponse = '';
443
- this.isChatingWithAi = true;
444
- const url = `${this.environment.BASE_URL}/ai/ask`; // +
445
- // (this.useOpenAi === false ? '/llm-hf' : '');
446
- fetch(url, {
447
- method: 'POST',
448
- headers: {
449
- 'Content-Type': 'application/json',
450
- 'x-api-key': this.apiKey,
451
- },
452
- body: JSON.stringify({
453
- user_question: this.input,
454
- user_id: this.userId,
455
- bot_id: this.botId,
456
- message_id: this.conversationService.generateKey(),
457
- // temperature: this.temperature,
458
- // event_id: this.eventId,
459
- // token: this.s27UserToken,
460
- agents: this.agents.filter(p => p.selected).map(p => p.id),
461
- conversation_id: this.conversationKey
462
- }),
463
- })
464
- // Retrieve its body as ReadableStream
465
- .then((response) => {
466
- //return this.readAllChunks(response.body);
467
- return of(null);
468
- })
469
- .catch((err) => {
470
- console.error('Err: ', err);
471
- this.isChatingWithAi = false;
472
- });
473
- this.input = '';
474
- }
475
- fetchDataFor(msg) {
476
- const inputMsg = msg === null || msg === void 0 ? void 0 : msg.trim();
477
- if (!inputMsg || this.loading) {
478
- return;
479
- }
480
- this.scrollToBottom();
481
- this.chatLog.push({
482
- type: 'user',
483
- message: this.processMessageForDisplay(inputMsg),
484
- time: formatNow(this.timezone),
485
- copied: false,
486
- isCollapsedTrue: false
487
- });
488
- this.cdr.markForCheck();
489
- this.aiResponse = '';
490
- this.isChatingWithAi = true;
491
- const url = `${this.environment.BASE_URL}/ai/ask`; // +
492
- // (this.useOpenAi === false ? '/llm-hf' : '');
493
- fetch(url, {
494
- method: 'POST',
495
- headers: {
496
- 'Content-Type': 'application/json',
497
- 'x-api-key': this.apiKey,
498
- },
499
- body: JSON.stringify({
500
- user_question: inputMsg,
501
- user_id: this.userId,
502
- bot_id: this.botId,
503
- message_id: this.conversationService.generateKey(),
504
- // temperature: this.temperature,
505
- // event_id: this.eventId,
506
- // token: this.s27UserToken,
507
- agents: this.agents.filter(p => p.selected).map(p => p.id),
508
- conversation_id: this.conversationKey
509
- }),
510
- })
511
- // Retrieve its body as ReadableStream
512
- .then((response) => {
513
- return this.readAllChunks(response.body);
514
- })
515
- .catch((err) => {
516
- console.error('Err: ', err);
517
- this.isChatingWithAi = false;
518
- });
519
- this.input = '';
520
- }
521
- fetchSmallTalk() {
522
- this.loading = true;
523
- this.cdr.markForCheck();
524
- const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;
525
- this.http
526
- .get(url, {
527
- headers: {
528
- 'x-api-key': this.apiKey,
529
- },
530
- })
531
- .pipe(catchError((error) => {
532
- console.error('Error while fetching small talk:', error);
533
- return of(null);
534
- }))
535
- .subscribe((response) => {
536
- this.loading = false;
537
- this.cdr.markForCheck();
538
- if (!response) {
539
- return;
540
- }
541
- if (response && response.smallTalk) {
542
- this.chatLog.push({
543
- type: 'ai',
544
- message: this.processMessage(response.smallTalk),
545
- time: formatNow(this.timezone),
546
- isFeedbackMsg: true,
547
- });
548
- this.showFeedBackIconsIndex = this.chatLog.length - 2;
549
- // this.scrollToBottom();
550
- this.cdr.markForCheck();
551
- }
552
- });
553
- }
554
- pump(controller, reader, allSuggestions) {
555
- reader.read().then(({ done, value }) => {
556
- var _a, _b, _c, _d;
557
- const lastItem = this.chatLog[this.chatLog.length - 1];
558
- if (done) {
559
- lastItem.message = this.processMessageForDisplay(lastItem.message);
560
- this.chatLog.pop();
561
- this.chatLog.push(lastItem);
562
- if (allSuggestions === null || allSuggestions === void 0 ? void 0 : allSuggestions.length) {
563
- this.chatLog.push({
564
- type: 'suggestions',
565
- suggestions: allSuggestions
566
- });
567
- }
568
- controller.close();
569
- this.isChatingWithAi = false;
570
- // this.scrollToBottom();
571
- this.cdr.markForCheck();
572
- this.showStartAgain = true;
573
- // setTimeout(() => {
574
- // this.fetchSmallTalk();
575
- // },1000)
576
- return;
577
- }
578
- let decodedChunk = this.decoder.decode(value, { stream: true });
579
- this.aiResponse += decodedChunk;
580
- if (lastItem.type === 'ai') {
581
- const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\/sug>/g);
582
- if (suggestionsMatch) {
583
- suggestionsMatch.forEach((match) => {
584
- this.aiResponse = this.aiResponse.replace(match, "");
585
- allSuggestions.push(match === null || match === void 0 ? void 0 : match.replace(/<\/?sug>/g, ""));
586
- });
587
- }
588
- lastItem.message = this.aiResponse;
589
- this.cdr.markForCheck();
590
- }
591
- else {
592
- this.isChatingWithAi = false;
593
- let aiFormattedData;
594
- try {
595
- console.log('parsing json ');
596
- aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));
597
- }
598
- catch (e) {
599
- try {
600
- console.log('parsing json 2');
601
- aiFormattedData = JSON.parse(this.aiResponse);
602
- }
603
- catch (e) { }
604
- }
605
- console.log('parsing json done');
606
- if (aiFormattedData && ((_a = aiFormattedData === null || aiFormattedData === void 0 ? void 0 : aiFormattedData.section_id) === null || _a === void 0 ? void 0 : _a.length) > 0) {
607
- if (aiFormattedData.section_id == 'company_search' || aiFormattedData.section_id == 'user_search' || aiFormattedData.section_id == 'industry_company_search') {
608
- this.fetchMyConnections().subscribe();
609
- this.fetchPendingRequests().subscribe();
610
- }
611
- if (aiFormattedData.section_id == this.myUpcomingSessionAction) {
612
- var speakerIds = [];
613
- (_b = aiFormattedData.content) === null || _b === void 0 ? void 0 : _b.forEach(session => {
614
- speakerIds = [...speakerIds, ...session.speakers];
615
- });
616
- if ((speakerIds === null || speakerIds === void 0 ? void 0 : speakerIds.length) > 0)
617
- this.getSpeakersByStaffIds(speakerIds);
618
- }
619
- if (aiFormattedData.section_id == this.addToMyAgendaAction && ((_c = aiFormattedData.content) === null || _c === void 0 ? void 0 : _c.length) > 0) {
620
- this.openPage.next({
621
- sectionId: aiFormattedData.section_id,
622
- sessionIds: aiFormattedData.content
623
- });
624
- }
625
- if (aiFormattedData.section_id == this.connectOrFollowAction) {
626
- let usersLen = (_d = aiFormattedData.content) === null || _d === void 0 ? void 0 : _d.length;
627
- if (usersLen > 1) {
628
- this.openPage.next({
629
- sectionId: "open_networking_drawer",
630
- search: aiFormattedData.content
631
- });
632
- }
633
- else if (usersLen == 1) {
634
- this.openPage.next({
635
- sectionId: aiFormattedData.section_id,
636
- connetUserIds: [aiFormattedData.content[0].userId]
637
- });
638
- }
639
- }
640
- if (aiFormattedData.is_open_page == "true") {
641
- this.openPage.next({
642
- sectionId: aiFormattedData.section_id,
643
- search: aiFormattedData.content
644
- });
645
- if (this.isMobileBrowser()) {
646
- aiFormattedData.message += "\n\n" + '<a id="closeBotNow">Click Here</a> to see results.';
647
- }
648
- }
649
- this.chatLog.push({
650
- type: 'ai',
651
- message: aiFormattedData.message,
652
- action: aiFormattedData,
653
- time: formatNow(this.timezone)
654
- });
655
- if (this.isMobileBrowser()) {
656
- setTimeout(() => {
657
- this.addCloseBotClickEvent();
658
- }, 500);
659
- }
660
- this.aiResponse = "";
661
- }
662
- else {
663
- this.chatLog.push({
664
- type: 'ai',
665
- message: this.aiResponse,
666
- time: formatNow(this.timezone),
667
- });
668
- }
669
- this.showFeedBackIconsIndex = this.chatLog.length - 1;
670
- this.cdr.markForCheck();
671
- }
672
- this.scrollToBottom();
673
- // Enqueue the next data chunk into our target stream
674
- controller.enqueue(value);
675
- this.pump(controller, reader, allSuggestions);
676
- });
677
- }
678
- submitFeedback(flag) {
679
- this.feedbackDone = true;
680
- this.showFeedBackIconsIndex = null;
681
- const url = `${this.environment.BASE_URL}/bot/feedback`;
682
- fetch(url, {
683
- method: 'POST',
684
- headers: {
685
- 'Content-Type': 'application/json',
686
- 'x-api-key': this.apiKey,
687
- },
688
- body: JSON.stringify({ flag, user_id: this.userId, bot_id: this.botId }),
689
- }).then(() => {
690
- if (flag) {
691
- this.chatLog.push({
692
- type: 'ai',
693
- message: this.thumbsUpMessage ||
694
- `Great. May I assist you with anything else?`,
695
- time: formatNow(this.timezone),
696
- isFeedbackMsg: true,
697
- });
698
- this.scrollToBottom();
699
- this.cdr.markForCheck();
700
- this.feedbackDone = false;
701
- this.showFeedBackIconsIndex = null;
702
- return;
703
- }
704
- this.chatLog.push({
705
- type: 'ai',
706
- message: this.processMessage(this.thumbsDownMessages[this.thumbsDownMsgIndex]),
707
- time: formatNow(this.timezone),
708
- isFeedbackMsg: true,
709
- });
710
- this.thumbsDownMsgIndex =
711
- (this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;
712
- this.scrollToBottom();
713
- this.cdr.markForCheck();
714
- this.feedbackDone = false;
715
- this.showFeedBackIconsIndex = null;
716
- });
717
- }
718
- handleSubmit() {
719
- this.fetchData();
720
- this.scrollToBottom();
721
- }
722
- handleUpClick(idx) {
723
- if (this.feedbackDone) {
724
- return;
725
- }
726
- this.submitFeedback(true);
727
- this.chatLog[idx].liked = !this.chatLog[idx].liked;
728
- if (this.chatLog[idx].unliked) {
729
- this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
730
- }
731
- this.cdr.markForCheck();
732
- }
733
- handleDownClick(idx) {
734
- if (this.feedbackDone)
735
- return;
736
- this.submitFeedback(false);
737
- this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
738
- if (this.chatLog[idx].liked)
739
- this.chatLog[idx].liked = !this.chatLog[idx].liked;
740
- }
741
- handleCopyClick(index) {
742
- // Copy the message to the clipboard
743
- const contentToCopy = this.chatLog[index].message;
744
- navigator.clipboard.writeText(contentToCopy).then(() => {
745
- // Indicate that the message was copied
746
- this.chatLog[index].copied = true;
747
- this.cdr.detectChanges();
748
- // Reset the copied state after a delay
749
- setTimeout(() => {
750
- this.chatLog[index].copied = false;
751
- this.cdr.detectChanges();
752
- }, 2000); // Reset after 2 seconds
753
- });
754
- }
755
- scrollToBottom() {
756
- let counter = 0;
757
- const interval = setInterval(() => {
758
- this.chatMain.nativeElement.scrollTop =
759
- this.chatMain.nativeElement.scrollHeight;
760
- if (counter++ > 5)
761
- clearInterval(interval);
762
- }, 5);
763
- }
764
- handleAction(action) {
765
- console.info("incoming action from the chatbot AI");
766
- console.info(action);
767
- if (action === null || action === void 0 ? void 0 : action.content) {
768
- }
769
- }
770
- ngAfterViewInit() {
771
- // Check if the drawer is initially open and apply overflow hidden to body if so
772
- if (this.drawer.opened) {
773
- this.setBodyOverflow();
774
- }
775
- // Listen to changes in the drawer being opened or closed
776
- this.drawer.openedChange.subscribe((opened) => {
777
- if (opened) {
778
- this.setBodyOverflow();
779
- }
780
- else {
781
- this.removeBodyOverflow();
782
- }
783
- });
784
- this.drawer.openedChange.subscribe((opened) => {
785
- if (opened) {
786
- setTimeout(() => {
787
- if (this.myTextarea && this.myTextarea.nativeElement) {
788
- this.myTextarea.nativeElement.focus(); // Focus on the textarea
789
- }
790
- });
791
- }
792
- });
793
- }
794
- setBodyOverflow() {
795
- this.renderer.addClass(document.body, this.bodyOverflowClass);
796
- }
797
- removeBodyOverflow() {
798
- this.renderer.removeClass(document.body, this.bodyOverflowClass);
799
- }
800
- getSpeakersByStaffIds(ids) {
801
- const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;
802
- fetch(url, {
803
- method: 'POST',
804
- headers: {
805
- 'Content-Type': 'application/json',
806
- 'Authorization': "Bearer " + "your_token_here",
807
- },
808
- body: JSON.stringify(ids),
809
- })
810
- .then((response) => {
811
- if (response.ok) {
812
- return response.json(); // Parse the JSON body of the response
813
- }
814
- else {
815
- throw new Error('Network response was not ok.');
816
- }
817
- })
818
- .then((data) => {
819
- if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
820
- data.forEach(speaker => {
821
- this.speakers[speaker.id] = speaker;
822
- });
823
- this.cdr.markForCheck();
824
- }
825
- })
826
- .catch((err) => {
827
- console.error('Error fetching data:', err);
828
- this.loading = false;
829
- });
830
- }
831
- performSessionAction(sessionId, action) {
832
- this.sessionActions.next({
833
- sessionId,
834
- action
835
- });
836
- }
837
- addCloseBotClickEvent() {
838
- const element = this.elementRef.nativeElement.querySelector('#closeBotNow');
839
- if (element) {
840
- this.renderer.listen(element, 'click', () => {
841
- this.closeBot.next();
842
- });
843
- }
844
- }
845
- isMobileBrowser() {
846
- return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
847
- }
848
- connectToUser(userId) {
849
- this.connectWithUser.emit({
850
- connect: !this.canDisconnect(userId),
851
- userId
852
- });
853
- setTimeout(() => {
854
- this.fetchMyConnections().subscribe(res => {
855
- this.cdr.markForCheck();
856
- });
857
- this.fetchPendingRequests().subscribe(res => {
858
- this.cdr.markForCheck();
859
- });
860
- }, 500);
861
- }
862
- scheduleMeetingWithUser(user) {
863
- this.scheduleMeeting.emit(user);
864
- }
865
- canConnect(userId) {
866
- return !(this.canDisconnect(userId) || this.pendingRequests.find(a => a == userId));
867
- }
868
- canDisconnect(userId) {
869
- return this.myConnections.find(conn => conn.userId == userId);
870
- }
871
- fetchPendingRequests() {
872
- const headers = new HttpHeaders({
873
- 'Content-Type': 'application/json',
874
- 'apiKey': this.autogenKey
875
- });
876
- return this.http
877
- .get(`${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`, { headers })
878
- .pipe(switchMap((res) => {
879
- this.pendingRequests = res;
880
- this.cdr.markForCheck();
881
- return of(res);
882
- }), catchError((error) => {
883
- console.error('Error fetching pending requests: ', error);
884
- return of(null);
885
- }));
886
- }
887
- fetchMyConnections() {
888
- const headers = new HttpHeaders({
889
- 'Content-Type': 'application/json',
890
- 'apiKey': this.autogenKey
891
- });
892
- return this.http
893
- .get(`${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`, { headers })
894
- .pipe(switchMap((res) => {
895
- this.myConnections = res;
896
- this.cdr.markForCheck();
897
- return of(res);
898
- }), catchError((error) => {
899
- console.error('Error fetching pending requests: ', error);
900
- return of(null);
901
- }));
902
- }
903
- // Toggle the dropdown visibility
904
- toggleDropdown() {
905
- this.isDropdownOpen = !this.isDropdownOpen;
906
- }
907
- onSelectAll(event) {
908
- var _a;
909
- (_a = this.agents) === null || _a === void 0 ? void 0 : _a.forEach(agent => agent.selected = false);
910
- this.cdr.detectChanges();
911
- }
912
- onAgentChange(agent) {
913
- //agent.selected = !agent.selected;
914
- //console.log(agent);
915
- let agentFound = this.agents.filter(p => p.id == agent.id);
916
- if (agentFound && agentFound.length > 0) {
917
- agentFound[0].selected = !agentFound[0].selected;
918
- this.cdr.detectChanges();
919
- }
920
- this.cdr.detectChanges();
921
- }
922
- areAllSelected() {
923
- var _a;
924
- return (_a = this.agents) === null || _a === void 0 ? void 0 : _a.every(agent => !agent.selected);
925
- }
926
- getDropdownHeaderText() {
927
- var _a;
928
- const selectedAgents = (_a = this.agents) === null || _a === void 0 ? void 0 : _a.filter(agent => agent.selected);
929
- if (selectedAgents && (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) === 0) {
930
- return 'All Agents';
931
- }
932
- else {
933
- return (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) > 1 ? `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agents Selected` : `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agent Selected`;
934
- }
935
- }
936
- fetchAgents_http() {
937
- this.loading = true;
938
- const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;
939
- const headers = new HttpHeaders({
940
- 'Content-Type': 'application/json'
941
- });
942
- return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
943
- if (res) {
944
- this.agents = res.map(agent => (Object.assign(Object.assign({}, agent), { selected: false })));
945
- }
946
- this.cdr.markForCheck();
947
- return of(res);
948
- }), catchError((error) => {
949
- console.error('Error fetching chatbot config: ', error);
950
- return of(null);
951
- }));
952
- }
953
- fetchAgents() {
954
- this.fetchAgents_http()
955
- .subscribe();
956
- }
957
- // events/${eventId}/users-connections
958
- processMessageForDisplay(markdown) {
959
- if (!markdown || !(markdown.length > 0)) {
960
- console.error('Input Markdown is null or empty');
961
- return '';
962
- }
963
- //console.log('Markdown input:', markdown);
964
- // Convert Markdown headers to HTML headers
965
- let html = markdown.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
966
- const level = hashes.length;
967
- return `<h${level}>${text}</h${level}>`;
968
- });
969
- // console.log('After header conversion:', html);
970
- // Convert Markdown links to HTML links
971
- html = html.replace(/\[([^\]]+)]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
972
- // console.log('After link conversion:', html);
973
- // Convert Markdown bold to HTML strong
974
- html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
975
- //console.log('After bold conversion:', html);
976
- // Convert new lines to <br> tags
977
- html = html.replace(/(?:\r\n|\r|\n)/g, '<br>');
978
- // console.log('After line breaks conversion:', html);
979
- // Optional: Sanitize the HTML to prevent XSS
980
- const sanitizedHtml = this.sanitizeHtml(html);
981
- // console.log('Sanitized HTML:', sanitizedHtml);
982
- return sanitizedHtml;
983
- }
984
- toggleCollapse() {
985
- this.isCollapsed = !this.isCollapsed;
986
- this.cdr.detectChanges();
987
- }
988
- toggleCollapseGraph() {
989
- this.isCollapsedForGraph = !this.isCollapsedForGraph;
990
- this.cdr.detectChanges();
991
- }
992
- toggleCollapseFGraph() {
993
- this.isCollapsedForFGraph = !this.isCollapsedForFGraph;
994
- this.cdr.detectChanges();
995
- }
996
- // Extracts the domain from a URL
997
- getDomainName(url) {
998
- try {
999
- const { hostname } = new URL(url);
1000
- return hostname.replace(/^www\./, ''); // Remove 'www.' if present
1001
- }
1002
- catch (_a) {
1003
- return 'unknown';
1004
- }
1005
- }
1006
- // Generates the favicon URL
1007
- getFaviconUrl(url) {
1008
- const domain = this.getDomainName(url);
1009
- return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;
1010
- }
1011
- onCardClick() {
1012
- this.sourcesDrawer.open();
1013
- const button = document.getElementById('botcloseplaygroundbutton');
1014
- if (button) {
1015
- button.style.display = 'none';
1016
- }
1017
- }
1018
- onCloseSource() {
1019
- this.sourcesDrawer.close();
1020
- this.isDrawerOpen = false;
1021
- this.cdr.detectChanges(); // Trigger change detection if needed
1022
- this.onDrawerClosed();
1023
- }
1024
- onDrawerClosed() {
1025
- setTimeout(() => {
1026
- this.isDrawerOpen = true;
1027
- this.cdr.detectChanges(); // Trigger change detection if needed
1028
- // Use ngClass to dynamically apply the class
1029
- const button = document.getElementById('botcloseplaygroundbutton');
1030
- if (button) {
1031
- button.style.display = 'block';
1032
- }
1033
- }, 1000);
1034
- }
1035
- toggleDrawer(todo) {
1036
- this.isDrawerOpen = todo;
1037
- this.cdr.detectChanges();
1038
- this.updateButtonVisibility();
1039
- }
1040
- updateButtonVisibility() {
1041
- const button = document.getElementById('botcloseplaygroundbutton');
1042
- if (button) {
1043
- button.style.display = this.isDrawerOpen ? 'block' : 'none';
1044
- }
1045
- }
1046
- openLinkInNewTab(link) {
1047
- window.open(link, '_blank');
1048
- }
1049
- }
1050
- ChatDrawerComponent.decorators = [
1051
- { type: Component, args: [{
1052
- selector: 'hivegpt-chat-drawer',
1053
- template: "<mat-drawer-container class=\"hivegpt-chat-wrapper\" [ngClass]=\"{'mat-drawer-container-has-open': isDrawerOpen}\"\n [class.ios-device]=\"isIOSDevice\" [hasBackdrop]=\"hasBackdropValue\">\n\n <mat-drawer class=\"drawer\" #drawer [position]=\"'start'\" [mode]=\"'over'\" opened=\"true\"\n [class.full-width-drawer]=\"fullView\" [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \">\n <mat-drawer-content>\n\n <div class=\"chat-main\">\n <!-- <div class=\"chat-header\">\n <h2> -->\n <!-- {{eventName}} -->\n <!-- </h2> -->\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\n <span class=\"material-symbols-outlined\">\n close\n </span>\n </button> -->\n <!-- </div> -->\n\n <div class=\"innerChat\" #chatMain>\n <div class=\"\">\n <div class=\"title\">\n <h2><span> {{botName}} <i><svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\n fill=\"#E2F6FA\"></path>\n <path\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\n fill=\"url(#paint0_linear_174_9166)\"></path>\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\n transform=\"rotate(-73.8316 63.725 21.0347)\"\n fill=\"url(#paint1_linear_174_9166)\"></rect>\n <path\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\n fill=\"url(#paint2_linear_174_9166)\"></path>\n <path\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\n fill=\"url(#paint3_linear_174_9166)\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\n fill=\"url(#paint4_linear_174_9166)\"></path>\n <defs>\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"74.6954\" y1=\"9.02441\"\n x2=\"74.6954\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6EC6E3\"></stop>\n <stop offset=\"1\" stop-color=\"#5361C7\"></stop>\n </linearGradient>\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"64.8625\" y1=\"21.0347\"\n x2=\"64.2597\" y2=\"43.0438\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"white\" stop-opacity=\"0.47\"></stop>\n <stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\"></stop>\n </linearGradient>\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"31.02\" y1=\"9.02441\"\n x2=\"31.02\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#5F8ED4\"></stop>\n <stop offset=\"1\" stop-color=\"#4F54C3\"></stop>\n </linearGradient>\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"54.7875\" y1=\"42.5752\"\n x2=\"75.425\" y2=\"71.3377\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#5975CC\"></stop>\n <stop offset=\"1\" stop-color=\"#0043A6\" stop-opacity=\"0\"></stop>\n </linearGradient>\n <linearGradient id=\"paint4_linear_174_9166\" x1=\"40.8125\" y1=\"66.3502\"\n x2=\"73.8\" y2=\"66.3502\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#D0F0F7\"></stop>\n <stop offset=\"1\" stop-color=\"white\"></stop>\n </linearGradient>\n </defs>\n </svg></i> </span></h2>\n <p>AI-powered <span>copilot</span></p>\n </div>\n <div class=\"chatType\" style=\"display:none\">\n <h4 class=\"labelChat\">Choose a conversation style</h4>\n <ul>\n <li (click)=\"changeTemperature(0)\">\n <button [ngClass]=\"{active: temperature === 0}\">\n <span class=\"top-section-title\">\n More Creative\n </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{active: temperature === 1}\">\n <span class=\"top-section-title\">\n More Balanced\n </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{active: temperature === 2}\">\n <span class=\"top-section-title\">\n More Precise\n </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div class=\"chat bot\" *ngFor=\"let chat of chatLog; let i = index\">\n\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"researchingCard\">\n <div *ngIf=\"(chat?.searchTerms && chat?.searchTerms.length>0) || (chat?.sourcesList && chat?.sourcesList.length >0)\"\n class=\"card-header d-flex align-items-center\" (click)=\"toggleCollapse()\">\n <span class=\"icon\"><i class=\"bx bx-plus-circle bx-sm\"></i></span>\n <span class=\"ml-2\">Researching <i id=\"toggleIcon\" class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{'fa-chevron-down': isCollapsed,'fa-chevron-up': !isCollapsed }\"></i></span>\n\n </div>\n <div *ngIf=\"chat?.searchTerms && chat?.searchTerms.length>0\"\n [ngClass]=\"{'collapse': isCollapsed}\">\n <ul class=\"list-group list-group-flush\">\n <li *ngFor=\"let term of chat?.searchTerms\" class=\"list-group-item\">Searching for\n <strong>{{term}}</strong>\n </li>\n </ul>\n\n <h5 class=\"mt-2\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length >0\"><i\n class='bx bx-unite'></i> Sources</h5>\n <div class=\"sources-container\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length >0\">\n <div class=\"source-card\"\n *ngFor=\"let source of chat?.displayedSources; let i = index\">\n <div>\n <div class=\"source-title\">{{source.title}}</div>\n <div class=\"source-url\">\n <img class=\"relative block\" [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\">\n {{getDomainName(source.link)}}\n </div>\n <div class=\"popup\">\n <div class=\"source-url\" (click)=\"openLinkInNewTab(source.link)\">\n <img class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\">\n {{getDomainName(source.link)}}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">{{source.title}}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">{{source.desc}}</p>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"chat?.remainingSources && chat?.remainingSources.length > 0\">\n <div class=\"source-card\" (click)=\"onCardClick($event)\">\n <div>\n <div class=\"source-title\"><img\n *ngFor=\"let source of chat?.remainingSources; let i = index\"\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"></div>\n <div class=\"source-url\">\n\n View {{chat?.remainingSources.length}} more\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n </div>\n </div>\n\n <div *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\" [ngStyle]=\"{\n background:\n chat?.type === 'ai' && bgBubbleAi\n ? ''\n : chat?.type === 'user' && bgBubbleUser\n ? ''\n : ''\n }\">\n <p *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\" [ngStyle]=\"{\n background:\n chat?.type === 'ai' && messageTextColorAi\n ? ''\n : chat?.type === 'user' && messageTextColorUser\n ? ''\n : '',\n color:\n chat?.type === 'ai' && messageTextColorAi\n ? ''\n : chat?.type === 'user' && messageTextColorUser\n ? ''\n : ''\n }\" [innerHTML]=\"chat?.message\">\n </p>\n\n </div>\n <div class=\"exicution mt-2\"\n *ngIf=\"showFeedBackIconsIndex === i && chat?.type === 'ai' && (chat?.financialGraphs && chat?.financialGraphs.length >0) \">\n <h5 *ngIf=\"chat?.type === 'ai'\"><i class='bx bx-network-chart'></i> Graphs <i\n (click)=\"toggleCollapseFGraph()\" class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForFGraph,'fas fa-chevron-up': !isCollapsedForFGraph }\"></i>\n </h5>\n <img *ngFor=\"let image of chat?.financialGraphs\"\n [ngClass]=\"{'collapse': isCollapsedForFGraph}\" [src]=\"image\" alt=\"\">\n </div>\n <div class=\"exicution mt-2\"\n *ngIf=\"chat?.type === 'ai' && (chat?.executionGraphs && chat?.executionGraphs?.length > 0) \">\n <h5 *ngIf=\"chat?.type === 'ai'\"><i class='bx bx-network-chart'></i> Execution Path\n Diagram\n For Data Visualization Workflow <i (click)=\"toggleCollapseGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForGraph,'fas fa-chevron-up': !isCollapsedForGraph }\"></i>\n </h5>\n <img *ngFor=\"let image of chat?.executionGraphs\"\n [ngClass]=\"{'collapse': isCollapsedForGraph}\" [src]=\"image\" alt=\"\">\n </div>\n <div class=\"Related mt-2\"\n *ngIf=\"showFeedBackIconsIndex === i && (chat?.relatedListItems && chat?.relatedListItems.length > 0)\">\n <h5 *ngIf=\"chat?.type === 'ai'\"><i class='bx bx-list-check'></i> Related</h5>\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\n <li (click)=\"fetchDataFor(item)\">{{ item }}</li>\n </ng-container>\n\n </ul>\n\n </div>\n </div>\n </div>\n <div class=\"cta\" *ngIf=\"showFeedBackIconsIndex === i\">\n <div class=\"copyBox\" title=\"Copy\" style=\"float: right;\">\n <button title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\" class=\"copy\"\n [class.active]=\"chat?.copied\" (click)=\"handleCopyClick(i)\">\n <i *ngIf=\"chat?.copied\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\" />\n </svg>\n\n </i>\n <i *ngIf=\"!chat?.copied\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\n fill=\"#566563\" />\n </svg>\n </i>\n </button>\n <button class=\"up copy\" title=\"Like\" [class.active]=\"chat?.liked\"\n (click)=\"handleUpClick(i)\">\n <i *ngIf=\"chat?.liked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\n fill=\"#17235B\" />\n <path\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\n fill=\"#17235B\" />\n </svg>\n </i>\n <i *ngIf=\"!chat?.liked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n <path\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n </svg>\n </i>\n </button>\n <button class=\"down copy\" title=\"Dislike\" [class.active]=\"chat?.unliked\"\n (click)=\"handleDownClick(i)\">\n <i *ngIf=\"chat?.unliked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\n fill=\"#17235B\" />\n\n <path\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\n fill=\"#17235B\" />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.unliked\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n <path\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\n fill=\"#566563\" stroke=\"#566563\" />\n </svg>\n </i>\n </button>\n\n </div>\n\n </div>\n <div class=\"time-cta\"\n [ngClass]=\"{'time-cta din': showFeedBackIconsIndex===i, 'time-cta': showFeedBackIconsIndex!=i}\">\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'ai'\">\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n {{ \"Assistant\" }} - {{ chat?.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\n <img src=\"https://e1cdn.social27.com/digitalevents/chatbot/user-chatbot-icon.svg\">\n <div class=\"dateTime\">\n You - {{ chat?.time }}\n </div>\n </div>\n\n\n </div>\n\n </div>\n\n <div class=\"cta-faqs quick-prompts-extended\" *ngIf=\"i == 0 && quickPrompts?.length\">\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\n (click)=\"sendMessageWithTile(tile.prompt)\">\n Q: {{ tile.text }}\n </div> -->\n <div class=\"cta_suggestions\">\n <button *ngFor=\"let tile of quickPrompts\" (click)=\"sendMessageWithTile(tile.prompt)\">\n <ng-container *ngIf=\"tile\">{{tile.text}}</ng-container>\n </button>\n </div>\n\n </div>\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <p [innerHTML]=\"processMessageForDisplay(botSkills)\"> </p> &nbsp;\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.suggestions?.length\">\n <h4 class=\"labelChat\">Here are some things EventsGPT Copilot can help you do:</h4>\n <div class=\"cta_suggestions\">\n <button *ngFor=\"let suggestion of chat?.suggestions\"\n (click)=\"sendMessageWithTile(suggestion)\">\n <ng-container *ngIf=\"suggestion\">{{suggestion}}</ng-container>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"chat?.action?.section_id == 'company_search' || chat?.action?.section_id == 'user_search' || chat?.action?.section_id == 'industry_company_search'\">\n <div class=\"box\">\n <div class=\"tiktokwrapper\">\n <div class=\"tiktokshell\" *ngFor=\"let user of chat?.action.users\">\n <div class=\"videoPhotobox\">\n <ng-conatiner *ngIf=\"user?.photoPath && !user.userVideosModel\">\n <img [src]=\"user?.photoPath\">\n </ng-conatiner>\n <ng-conatiner *ngIf=\"user.userVideosModel\">\n <app-video-player *ngIf=\"user?.userVideosModel\" [isDev]=\"isDev\"\n [currentUserId]=\"userId\" [videoObj]=\"user?.userVideosModel\"\n [user]=\"user\" [eventId]=\"eventId\" type=\"1\">\n </app-video-player>\n </ng-conatiner>\n\n </div>\n\n <div class=\"noPhoto\" *ngIf=\"!user?.photoPath && !user.userVideosModel\">\n <h3>{{user.firstName | slice:0:1}}{{user.lastName | slice:0:1}}</h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\">\n </div>\n <div class=\"onshell-content\">\n <div class=\"title-shell\">\n <h3>{{user.firstName}} {{user.lastName}}</h3>\n <h3 class=\"companyName\">{{user.company}}</h3>\n </div>\n <div class=\"button-shell\">\n <button class=\"Connectbtn\"\n (click)=\"connectToUser(user.userId)\">{{canConnect(user.userId) ?\n 'Connect' : canDisconnect(user.userId) ? 'Disconnect' : 'Request\n Sent'}}</button>\n <button class=\"schedulebtn\"\n (click)=\"scheduleMeetingWithUser(user)\">Schedule</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.action?.section_id == myUpcomingSessionAction\">\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\n <div class=\"list-view\">\n <div class=\"session-detail-wrapper card-background-session\"\n *ngFor=\"let upcomingSession of chat?.action.content\">\n <div class=\"thumbnail \"><img alt=\"Introduction to the Imaging Radar Academy\"\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\n class=\"\">\n <!---->\n <!---->\n <!----><button class=\"play-btn color-primary \"\n title=\"Play Session: Introduction to the Imaging Radar Academy\"><span\n class=\"material-icons notranslate \"> play_circle_outline\n </span>\n <!---->\n </button>\n <!---->\n <!---->\n </div>\n <!---->\n <!---->\n <div class=\"content p-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex flex-column\">\n <p class=\"fs-xs mb-0 body-text-color \">\n {{upcomingSession.dateTimeRange.start | date:'MM-dd-yyyy\n HH:mm':'UTC'}} - {{upcomingSession.dateTimeRange.end |\n date:'MM-dd-yyyy HH:mm':'UTC'}} {{upcomingSession.timeZone.id}}\n </p>\n <!---->\n <!---->\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\n <!---->\n </div>\n <div class=\"d-flex align-items-center actions px-2\">\n <!---->\n <button\n (click)=\"performSessionAction(upcomingSession.id, 'view-session')\"\n class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"><span\n class=\"material-icons notranslate\"> remove_red_eye\n </span>\n </button>\n\n <button\n (click)=\"performSessionAction(upcomingSession.id, 'add-to-agenda')\"\n class=\"s27-btn-icon body-text-color \"><span\n class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\">\n event_available </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button (click)=\"performSessionAction(upcomingSession.id, 'play')\"\n class=\"s27-btn-icon body-text-color \"\n title=\"Copy session link to share\"><span\n class=\"material-icons notranslate\"> play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">{{upcomingSession.title}}</h2>\n <div class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\">\n </div>\n <ul class=\"speakers grid-2-cols\"\n *ngFor=\"let speakerId of upcomingSession.speakers\">\n <li class=\"\">\n <div class=\"image \" title=\"Blair Wunderlich\"><img\n alt=\"Blair Wunderlich\"\n [src]=\"speakers[speakerId]?.photoPath\" class=\"\">\n <!---->\n <!---->\n <!---->\n </div>\n <!---->\n <div class=\"content pl-3 \" style=\"text-transform: none;\">\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\n {{speakers[speakerId]?.firstName}}\n {{speakers[speakerId]?.lastName}}</div>\n <div class=\"color-secondary fs-xxs\">\n {{speakers[speakerId]?.jobTitle}}</div>\n <div class=\"color-secondary fs-xxs\">\n {{speakers[speakerId]?.company}}</div>\n </div>\n <!---->\n </li>\n </ul>\n <!---->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"chat bot\" *ngIf=\"isChatingWithAi\">\n\n <div class=\"chat-box\">\n <div class=\"o-media__body\">\n <div class=\"o-vertical-spacing\">\n <h3 class=\"blog-post__headline\">\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\n </h3>\n <p>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n </p>\n </div>\n </div>\n\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n {{ \"Assistant\" }} - {{ chat?.time ? chat?.time : (dateTime.now |\n date:'shortTime') }}\n\n </div>\n </div>\n\n\n\n </div>\n </div>\n\n </div>\n <div class=\"chat bot\" *ngIf=\"loading\">\n <div class=\"chat-box\">\n <div class=\"o-media__body\">\n <div class=\"o-vertical-spacing\">\n <h3 class=\"blog-post__headline\">\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\n </h3>\n <p>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\n </p>\n </div>\n </div>\n\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n {{ \"Loading..\" }}\n\n </div>\n </div>\n\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div class=\"chatFooterWrapper\">\n <div class=\"chat-footer\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\n <div class=\"dropdown-header\">\n <span>{{ getDropdownHeaderText() }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n <path d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <label (click)=\"onSelectAll()\">\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\n All\n </label>\n <label *ngFor=\"let agent of agents\" (click)=\"onAgentChange(agent)\">\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\n {{ agent.agentName }}\n </label>\n </div>\n </div>\n\n\n <div class=\"border-shape\">\n <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput />\n\n </div>\n <div class=\"cta-footer\">\n <button class=\"btn cta-chat\" (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\">\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\"\n height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\">\n </path>\n </svg>\n <!-- SEND -->\n </button>\n </div>\n </div>\n <div class=\"text-left note-section\">\n <div class=\"note\">\n <i>\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\n fill=\"#E2F6FA\"></path>\n <path\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\n fill=\"url(#paint0_linear_174_9166)\"></path>\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\n transform=\"rotate(-73.8316 63.725 21.0347)\" fill=\"url(#paint1_linear_174_9166)\">\n </rect>\n <path\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\n fill=\"url(#paint2_linear_174_9166)\"></path>\n <path\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\n fill=\"url(#paint3_linear_174_9166)\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\n fill=\"#C4C4C4\"></path>\n <defs>\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"87.9736\" y1=\"7.88186\" x2=\"7.52095\"\n y2=\"100.482\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#E8F6F9\"></stop>\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\n </linearGradient>\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"63.8012\" y1=\"37.3264\" x2=\"66.6714\"\n y2=\"24.7281\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#C2E4E7\"></stop>\n <stop offset=\"1\" stop-color=\"#F3F8F8\" stop-opacity=\"0\"></stop>\n </linearGradient>\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"52.8387\" y1=\"30.822\" x2=\"27.7411\"\n y2=\"77.8896\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#E8F6F9\"></stop>\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\n </linearGradient>\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"89.7622\" y1=\"51.5494\" x2=\"73.8328\"\n y2=\"68.4825\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A0E6E9\"></stop>\n <stop offset=\"1\" stop-color=\"#D6F7F9\" stop-opacity=\"0\"></stop>\n </linearGradient>\n </defs>\n </svg>\n </i>\n <span class=\"text\">Your personal or company information is kept private and secure within this\n chat?.</span>\n </div>\n </div>\n </div>\n </mat-drawer-content>\n\n\n\n </mat-drawer>\n <mat-drawer class=\"drawer\" style=\"width: 45%;\" #sourcesDrawer [position]=\"'end'\" [mode]=\"'over'\" [style.background]=\"'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \">\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n\n <div class=\"container-fluid\">\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"onCloseSource()\">\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{chat?.sourcesList.length}} Sources</h1>\n <!-- <p>Tell me about latest news from Mistral about AI agents announcement done this month</p> -->\n <hr />\n <ul class=\"sources-list\">\n <li *ngFor=\"let item of chat?.sourcesList;let si=index\">\n <input type=\"checkbox\" id=\"source1\">\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\n <label for=\"source1\">\n <span class=\"source-title\"><span class=\"ml-1\">{{si+1}}.</span>{{item.title}}</span>\n <span class=\"image-container\">\n <img class=\"relative block\" [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\"> <span>\n {{getDomainName(item.link)}}</span>\n </span>\n <span class=\"source-description\">{{item.desc}}</span>\n </label>\n </div>\n </li>\n\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>",
1054
- changeDetection: ChangeDetectionStrategy.OnPush,
1055
- styles: ["@import url(\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\");::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-wrapper{background:transparent!important;height:100%;inset:0;opacity:0;position:fixed;visibility:hidden;z-index:999999}.hivegpt-chat-wrapper.mat-drawer-container-has-open{background:transparent!important;opacity:1;transition:all .3s;visibility:visible;z-index:999999}.hivegpt-chat-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-wrapper mat-drawer{background-color:#fafafa!important;background-image:none!important;max-width:800px;width:100%}.hivegpt-chat-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;font-size:36px;font-weight:500;letter-spacing:-.72px;line-height:108%;margin:0;text-transform:uppercase}.hivegpt-chat-wrapper .chat-header .closeIcon{align-items:center;background:transparent;border:none;border-radius:50%;display:inline-flex;font-size:18px;height:35px;justify-content:center;outline:none;padding:0;position:absolute;right:12px;top:16px;width:35px}.hivegpt-chat-wrapper .chat-main{display:flex;flex:1;flex-direction:column;justify-content:space-between;overflow-y:auto;width:100%}.hivegpt-chat-wrapper .chat-main .innerChat{overflow-y:auto;padding:20px 40px 10px;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box{max-width:80%;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box .message{background:hsla(0,0%,94.9%,.7);border-radius:6px 6px 10px 0;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);margin-bottom:10px;margin-top:20px;min-height:60px;padding:18px 20px;position:relative}.hivegpt-chat-wrapper .chat-main .chat-box .message p{color:#111;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;text-align:left;white-space:pre-line}.hivegpt-chat-wrapper .chat-main .chat-box .message p a{color:#17235b!important;cursor:pointer!important;font-weight:700;text-decoration:underline}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta{align-items:end;bottom:-7px;display:inline-flex;gap:10px;grid-gap:10px;position:relative;right:-10px;z-index:5}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-wrapper .chat-main .chat.bot .chat-box .message{border-radius:6px 6px 10px 0}.hivegpt-chat-wrapper .chat-main .chat.user{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box{margin-left:auto}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#8b4ead -10.61%,#761c79 84.59%);border-radius:20px 20px 0 20px;color:#fff}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message p{color:#fff;text-align:left}.hivegpt-chat-wrapper .chat-main .chat.user .dateTime{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .time-cta{justify-content:flex-end}.hivegpt-chat-wrapper .chat-main .chat .Icon_TimeSTamp{align-content:center;align-items:center;display:flex;justify-content:center}.hivegpt-chat-wrapper .chat-main .chat .dateTime{color:#566563;font-family:Segoe UI,sans-serif;font-size:13px;font-style:normal;font-weight:500;line-height:140%;margin:0 5px}.hivegpt-chat-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-wrapper .chatFooterWrapper{background:#fff;border-radius:6px 6px 0 0!important;margin-top:5px!important;padding:10px 14px}.hivegpt-chat-wrapper .chatFooterWrapper .note{align-items:center;border-radius:6px;color:#1b75bb;display:inline-flex;font-size:11px;gap:8px;line-height:1;margin:0 auto 4px;padding:4px 8px}.hivegpt-chat-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note i svg{height:18px;width:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:4px 0 0;position:relative}.hivegpt-chat-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-wrapper .chat-footer .form-control::-moz-placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;position:absolute;right:10px;text-align:right}.hivegpt-chat-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;background:transparent!important;border:none;border-radius:0;box-shadow:0 1px 2px 0 rgba(16,24,40,.05);display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-again{background:#17235b;border:1px solid #17235b;color:#fff}.hivegpt-chat-wrapper .cta-faqs{align-items:flex-end;display:flex;flex-direction:column;flex-wrap:wrap;gap:8px;margin-left:auto;max-width:80%;padding:10px 0 0}.hivegpt-chat-wrapper .cta-faqs .cta{background:transparent;border:1px solid #c9a893;border-radius:20px 20px 0 20px;color:#333;cursor:pointer;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;min-height:44px;padding:12px 20px;text-align:left;text-decoration:none;transition:all .3s;white-space:pre-line}.spinner{align-items:center;display:flex;gap:2px;justify-content:center}.spinner>div{animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both;background-color:#173330;border-radius:100%;display:inline-block;height:5px;width:5px}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.time-cta{align-items:center;display:flex;gap:8px;justify-content:start;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width:767px){.hivegpt-chat-wrapper .chat-main .innerChat{padding:0 24px 10px}.hivegpt-chat-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-wrapper .chat-header .closeIcon{height:28px;right:8px;top:8px;width:28px}.hivegpt-chat-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{align-items:center;background:#17235b;border:#17235b;border-radius:50%;color:#fff;display:inline-flex;font-size:24px;height:50px;justify-content:center;width:50px}textarea{caret-color:#000}.labelChat{font-size:14px;font-weight:400;margin:0 0 10px}.chatType h4{color:#566563;text-align:center}.chatType ul{align-items:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px rgba(0,0,0,.12),0 1.6px 3.6px rgba(0,0,0,.16);display:flex;justify-content:center;list-style:none;margin:0 0 20px;padding:4px}.chatType ul li{flex:1}.chatType ul li button{align-items:center;background:#fff;border:none;border-radius:10px;font-weight:600;min-height:48px;padding:.375rem;text-align:center;text-shadow:1px 0 rgba(0,0,0,.2);width:100%}.chatType ul li button.active{background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);box-shadow:0 1px 2px 0 rgba(16,24,40,.05);color:#fff}.cta_suggestions{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{background:#fff;border:1px solid #174ae4;border-radius:10px;box-shadow:0 1.6px 3.6px 0 rgba(0,0,0,.13),0 .3px .9px 0 rgba(0,0,0,.1);color:#1543cd;font-size:14px;font-weight:600;line-height:1.2;padding:8px 12px;position:relative;text-align:left;transition:all .3s}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.user .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #06f}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%);color:#fff}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:50px}.title h2{font-size:28px;margin:0 0 10px}.title h2 span{align-items:center;color:#000;display:inline-flex;gap:10px}.title h2 i{color:#06f;font-size:30px;line-height:1}.title h2 i svg{height:30px;width:30px}.title p{font-weight:600;margin:0}.title p span{color:#06f}.agenda-items-wrapper{padding-bottom:15px;padding-top:15px}@media (max-width:576px){.list-view .session-detail-wrapper{border:none;flex-direction:column}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{-webkit-box-orient:vertical;-webkit-line-clamp:1;display:-webkit-box;font-size:20px;margin-bottom:8px;overflow:hidden}.card-background-session .session-description{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:#111!important;display:-webkit-box;font-size:14px;overflow:hidden}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{align-items:center;display:flex;height:160px;justify-content:center;min-width:160px;position:relative;width:160px}.thumbnail img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}@media (max-width:576px){.thumbnail{height:160px;min-height:unset;width:100%}}.thumbnail .play-btn{align-items:center;background-color:transparent;border:0;bottom:0;display:flex;font-size:60px;justify-content:center;left:0;position:absolute;right:0;top:0;width:100%}.thumbnail .play-btn span{font-size:80px;text-shadow:0 0 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{margin-bottom:0;margin-top:10px;padding:0}.speakers li{align-items:unset;display:flex}.speakers li .content{font-size:12px!important}.speakers .image{border-radius:100%;height:40px;min-width:40px;overflow:hidden;width:40px}.speakers img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.grid-2-cols{display:grid;grid-gap:15px;grid-template-columns:calc(55% - 10px) calc(50% - 10px);padding-right:20px}@media (max-width:768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width:575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape{background:#fff;border:1px solid #ced4da;border-radius:4px;min-height:60px;overflow:hidden;padding:0;width:100%}.border-shape .form-control-1{background:none!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.border-shape .form-control-1:focus{box-shadow:none;outline:none}.border-shape .s27-scroll::-webkit-scrollbar{border-radius:30px;width:3px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{display:table;height:275px;margin:10px 0;width:100%}.tiktokwrapper{display:grid;gap:10px;grid-template-columns:repeat(2,1fr);height:100%}.tiktokwrapper .tiktokshell{background:#3d2b8f;border:2px solid #fff;border-radius:5px;box-shadow:0 0 6px #494949;height:100%;min-height:275px;min-width:160px;position:relative;width:100%}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;bottom:0;height:100%;left:0;position:absolute;width:100%;z-index:6}.tiktokwrapper .videoPhotobox{bottom:0;height:272px;left:0;overflow:hidden;position:absolute;width:auto;z-index:6}.tiktokwrapper .videoPhotobox video{-o-object-fit:cover;border-radius:0;cursor:pointer;height:270px;object-fit:cover;outline:0;transition:.3s ease-in-out;width:100%}.tiktokwrapper .videoPhotobox img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.tiktokwrapper .playBtn{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;width:40px;z-index:10}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;z-index:6}.tiktokwrapper .noPhoto h3{color:#fff;font-size:46px}.tiktokwrapper .onshell-content{bottom:10px;left:5px;position:absolute;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;color:#fff;font-size:11px;margin:0 1px;padding:4px 7px;text-transform:capitalize}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#06f,#06f)!important}.skeleton-box{background-color:#dddbdd;display:inline-block;height:1em;overflow:hidden;position:relative}.skeleton-box:after{animation:shimmer 5s infinite;background-image:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.2) 20%,hsla(0,0%,100%,.5) 60%,hsla(0,0%,100%,0));bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:translateX(-100%)}@keyframes shimmer{to{transform:translateX(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{color:#6b6b6b;font-size:.85em}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{fill:#566563;height:18px;width:18px}.copyBox{background:hsla(0,0%,100%,.7019607843);border-radius:13px;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);color:#566563;display:flex;gap:12px;padding:5px 10px;position:relative;width:105px}.copyBox button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{align-items:center;background-color:#f5f5f5;border-top:1px solid #ccc;flex-direction:column;justify-content:center;padding:10px}.chat-footer{align-items:center;background:#fff;border-radius:5px;display:flex;margin-bottom:10px;padding:10px;width:100%}.dropdown-wrapper{margin-right:10px;position:relative}.dropdown-header{align-items:center;background:#ebebeb;border-radius:4px;color:#414141!important;cursor:pointer;display:flex;font-size:1rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px rgba(0,0,0,.1);display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:160px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;font-size:16px;padding:5px 15px}.dropdown-menu label input{height:16px;width:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{border:1px solid #ddd;border-radius:5px;padding:10px;width:100%}.cta-footer{align-items:center;display:flex}.btn.cta-chat{background-color:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;padding:10px 15px}.btn.cta-chat svg{vertical-align:middle}.text-left .note-section{align-items:center;background:#fff;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);display:flex;margin-top:10px;max-width:800px;padding:10px;width:100%}.text-left .note{align-items:center;color:#555;display:flex}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{background:#fffefe;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px rgba(0,0,0,.1);margin-bottom:10px;overflow:hidden;width:18rem}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{background-color:#f8f9fa;color:#6c757d;padding:10px;text-align:center}.list-container{list-style:none;padding:0}.list-container li{border-bottom:1px solid #ccc;font-size:12px;margin-bottom:5px;padding:5px}.list-container li:hover{color:#06f;cursor:pointer}.collapsible-container{margin-bottom:5px;overflow:hidden;width:100%}.collapsible-header{cursor:pointer;display:flex;padding:15px}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{background-color:#f8f9fa;color:#333;padding:15px;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:20px auto}.card-header{-moz-user-select:none;-webkit-user-select:none;background:none;border-bottom:0;cursor:pointer;padding:0;user-select:none}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.list-group-item{font-size:14px}.sources-container{align-items:flex-start;display:flex;gap:15px}.source-card{background-color:#f0f3f5;border-radius:10px;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;padding:15px;position:relative;transition:box-shadow .3s ease;width:100%}.popup{background-color:#fff;border-radius:5px;box-shadow:0 4px 8px rgba(0,0,0,.2);left:50%;opacity:0;padding:10px;position:absolute;top:100%;transform:translateX(-50%) translateY(-10px);transition:opacity .3s ease,transform .3s ease;visibility:hidden;white-space:normal;width:100%;z-index:10}.popup h5{font-size:14px;font-weight:600;line-height:1.2;margin:5px 0 10px}.popup p{font-size:12px;line-height:1.4;margin:0}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{color:#000;text-decoration:none}.popup .source-url:hover{color:#007bff;cursor:pointer;text-decoration:underline}.source-card:hover .popup{opacity:1;transform:translateX(-50%) translateY(-15px);visibility:visible}.source-card:hover{box-shadow:0 4px 8px rgba(0,0,0,.1);transform:scale(1.05)}.source-title{-webkit-box-orient:vertical;-webkit-line-clamp:2;display:-webkit-box;font-size:14px;font-weight:500;height:55px;line-height:1.5;overflow:hidden;text-align:left;text-overflow:ellipsis}.source-title img{margin-left:10px;width:20px}.source-url{align-items:center;color:#6c757d;display:flex;font-size:12px;text-align:left}.source-url img{border-radius:50%;height:16px;margin-right:5px;width:16px}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{align-items:flex-start;display:flex;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{flex-shrink:0;margin-right:15px;margin-top:8px}.sourceDraweContainer .source-content{background-color:#f5f2f2;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);cursor:pointer;flex:1;padding:12px}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{display:block;font-size:1rem;font-weight:500;height:auto!important;margin-bottom:4px}.sourceDraweContainer .source-description{display:block;font-size:.875rem}.sourceDraweContainer .image-container{align-items:center;display:flex;margin:10px 0}.sourceDraweContainer .image-container img{-o-object-fit:cover;border:1px solid #ddd;border-radius:50%;height:16px;margin-right:5px;object-fit:cover;width:16px}.sourceDraweContainer .image-container span{color:#555;font-size:13px}.closeButtonSource{background:none!important;border-color:transparent!important;box-shadow:none!important;color:inherit;cursor:pointer;float:right;margin-top:20px;transition:color .2s ease-in-out}.closeButtonSource.closeplaygroundbutton{display:none!important}"]
1056
- },] }
1057
- ];
1058
- ChatDrawerComponent.ctorParameters = () => [
1059
- { type: ChangeDetectorRef },
1060
- { type: HttpClient },
1061
- { type: DomSanitizer },
1062
- { type: ElementRef },
1063
- { type: Renderer2 },
1064
- { type: SocketService },
1065
- { type: ConversationService }
1066
- ];
1067
- ChatDrawerComponent.propDecorators = {
1068
- chatMain: [{ type: ViewChild, args: ['chatMain',] }],
1069
- closePlaygroundButtons: [{ type: ViewChildren, args: ['closeplaygroundbutton',] }],
1070
- drawer: [{ type: ViewChild, args: ['drawer',] }],
1071
- sourcesDrawer: [{ type: ViewChild, args: ['sourcesDrawer',] }],
1072
- myTextarea: [{ type: ViewChild, args: ['myTextarea', { static: false },] }],
1073
- copilotName: [{ type: Input }],
1074
- firstName: [{ type: Input }],
1075
- lastName: [{ type: Input }],
1076
- apiKey: [{ type: Input }],
1077
- bgBubbleAi: [{ type: Input }],
1078
- bgBubbleUser: [{ type: Input }],
1079
- bgGradient: [{ type: Input }],
1080
- botName: [{ type: Input }],
1081
- botSkills: [{ type: Input }],
1082
- botId: [{ type: Input }],
1083
- closeButtonColor: [{ type: Input }],
1084
- closeButtonbgColor: [{ type: Input }],
1085
- credentials: [{ type: Input }],
1086
- dateTimeColor: [{ type: Input }],
1087
- dateTextColor: [{ type: Input }],
1088
- eventId: [{ type: Input }],
1089
- s27UserToken: [{ type: Input }],
1090
- eventName: [{ type: Input }],
1091
- botIcon: [{ type: Input }],
1092
- formFieldBgColor: [{ type: Input }],
1093
- formFieldTextColor: [{ type: Input }],
1094
- fullView: [{ type: Input }],
1095
- gradientColors: [{ type: Input }],
1096
- greeting: [{ type: Input }],
1097
- messageTextColorAi: [{ type: Input }],
1098
- messageTextColorUser: [{ type: Input }],
1099
- rules: [{ type: Input }],
1100
- sendButtonColor: [{ type: Input }],
1101
- sendButtonTextColor: [{ type: Input }],
1102
- showClose: [{ type: Input }],
1103
- thumbsDownMessages: [{ type: Input }],
1104
- thumbsUpMessage: [{ type: Input }],
1105
- timezone: [{ type: Input }],
1106
- unknownResponses: [{ type: Input }],
1107
- useOpenAi: [{ type: Input }],
1108
- userId: [{ type: Input }],
1109
- isDev: [{ type: Input }],
1110
- againButtonColor: [{ type: Input }],
1111
- againButtonTextColor: [{ type: Input }],
1112
- feedbackEvent: [{ type: Output }],
1113
- onCloseEvent: [{ type: Output }],
1114
- openPage: [{ type: Output }],
1115
- sessionActions: [{ type: Output }],
1116
- closeBot: [{ type: Output }],
1117
- connectWithUser: [{ type: Output }],
1118
- scheduleMeeting: [{ type: Output }]
1119
- };
1120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9tdWRkYXNzaXJuYXl5ZXIvRGV2ZWxvcG1lbnQvU29jaWFsMjcvSGl2ZUFJLVBhY2thZ2VzL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9EQUFvRDtBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFTMUQsTUFBTSxPQUFPLG1CQUFtQjtJQXdGOUIsWUFDVSxHQUFzQixFQUN0QixJQUFnQixFQUNoQixTQUF1QixFQUN2QixVQUFzQixFQUN0QixRQUFtQixFQUNuQixhQUE0QixFQUM1QixtQkFB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QUNMLEtBQUs7MEJBQ0wsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7c0JBQ0wsS0FBSzsyQkFDTCxLQUFLO3dCQUNMLEtBQUs7c0JBQ0wsS0FBSzsrQkFDTCxLQUFLO2lDQUNMLEtBQUs7dUJBQ0wsS0FBSzs2QkFDTCxLQUFLO3VCQUNMLEtBQUs7aUNBQ0wsS0FBSzttQ0FDTCxLQUFLO29CQUNMLEtBQUs7OEJBQ0wsS0FBSztrQ0FDTCxLQUFLO3dCQUNMLEtBQUs7aUNBQ0wsS0FBSzs4QkFDTCxLQUFLO3VCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7b0JBQ0wsS0FBSzsrQkFFTCxLQUFLO21DQUNMLEtBQUs7NEJBQ0wsTUFBTTsyQkFDTixNQUFNO3VCQUNOLE1BQU07NkJBQ04sTUFBTTt1QkFDTixNQUFNOzhCQUNOLE1BQU07OEJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RHJhd2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmb3JtYXROb3csIGZvcm1hdFRpbWVTdGFtcHMgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgeyBkZXZfZW52aXJvbm1lbnQsIHByb2RfZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvbnZlcnNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNvY2tldFNlcnZpY2UgfSBmcm9tICcuLi9zb2NrZXQtc2VydmljZS5zZXJ2aWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LWNoYXQtZHJhd2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENoYXREcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCdjaGF0TWFpbicpIHByaXZhdGUgY2hhdE1haW46IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oJ2Nsb3NlcGxheWdyb3VuZGJ1dHRvbicpIGNsb3NlUGxheWdyb3VuZEJ1dHRvbnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnZHJhd2VyJykgZHJhd2VyITogTWF0RHJhd2VyO1xuICBAVmlld0NoaWxkKCdzb3VyY2VzRHJhd2VyJykgc291cmNlc0RyYXdlciE6IE1hdERyYXdlcjtcbiAgcHJpdmF0ZSBib2R5T3ZlcmZsb3dDbGFzcyA9ICdib2R5LW92ZXJmbG93LWhpZGRlbic7XG4gIEBWaWV3Q2hpbGQoJ215VGV4dGFyZWEnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgbXlUZXh0YXJlYSE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47IC8vIFJlZmVyZW5jZSB0byB0aGUgdGV4dGFyZWFcbiAgaXNDb2xsYXBzZWRUcnVlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvcGlsb3ROYW1lOiBzdHJpbmcgPSBcIkhpdmVYR1BUXCI7XG4gIEBJbnB1dCgpIGZpcnN0TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgbGFzdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaUtleSE6IHN0cmluZztcbiAgQElucHV0KCkgYmdCdWJibGVBaSE6IHN0cmluZztcbiAgQElucHV0KCkgYmdCdWJibGVVc2VyITogc3RyaW5nO1xuICBASW5wdXQoKSBiZ0dyYWRpZW50ITogc3RyaW5nW107XG4gIEBJbnB1dCgpIGJvdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdFNraWxscyE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNsb3NlQnV0dG9uQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNsb3NlQnV0dG9uYmdDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgY3JlZGVudGlhbHMhOiBbXTtcbiAgQElucHV0KCkgZGF0ZVRpbWVDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgZGF0ZVRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgZXZlbnRJZCE6IHN0cmluZztcbiAgQElucHV0KCkgczI3VXNlclRva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdEljb24hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZEJnQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZFRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgZnVsbFZpZXchOiBib29sZWFuO1xuICBASW5wdXQoKSBncmFkaWVudENvbG9ycyE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBncmVldGluZyE6IHN0cmluZztcbiAgQElucHV0KCkgbWVzc2FnZVRleHRDb2xvckFpITogc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlVGV4dENvbG9yVXNlciE6IHN0cmluZztcbiAgQElucHV0KCkgcnVsZXMhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbmRCdXR0b25Db2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgc2VuZEJ1dHRvblRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0Nsb3NlITogYm9vbGVhbjtcbiAgQElucHV0KCkgdGh1bWJzRG93bk1lc3NhZ2VzITogc3RyaW5nW107XG4gIEBJbnB1dCgpIHRodW1ic1VwTWVzc2FnZSE6IHN0cmluZztcbiAgQElucHV0KCkgdGltZXpvbmUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVua25vd25SZXNwb25zZXMhOiBbXTtcbiAgQElucHV0KCkgdXNlT3BlbkFpITogYm9vbGVhbjtcbiAgQElucHV0KCkgdXNlcklkITogc3RyaW5nO1xuICBASW5wdXQoKSBpc0RldiE6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgYWdhaW5CdXR0b25Db2xvciE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBhZ2FpbkJ1dHRvblRleHRDb2xvciE6IHN0cmluZ1tdO1xuICBAT3V0cHV0KCkgZmVlZGJhY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgb25DbG9zZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb3BlblBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlc3Npb25BY3Rpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZUJvdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY29ubmVjdFdpdGhVc2VyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzY2hlZHVsZU1lZXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBhdXRvZ2VuS2V5ID0gXCJBdXRvZ2VuX2VESlR0RVUtTkIwUnRJcHpxMXdcIlxuICBhZGRUb015QWdlbmRhQWN0aW9uID0gXCJhZGRfdG9fbXlfYWdlbmRhXCI7XG4gIG15VXBjb21pbmdTZXNzaW9uQWN0aW9uID0gXCJteV91cGNvbW1pbmdfc2Vzc2lvblwiO1xuICBjb25uZWN0T3JGb2xsb3dBY3Rpb24gPSBcImNvbm5lY3Rfb3JfZm9sbG93XCI7XG4gIGFpUmVzcG9uc2U6IHN0cmluZyA9ICcnO1xuICBjaGF0TG9nOiBhbnlbXSA9IFtdO1xuICBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGZlZWRiYWNrRG9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICBncmVldGluZ01zZzogc3RyaW5nID0gJyc7XG4gIGhhc0JhY2tkcm9wVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5wdXQ6IHN0cmluZyA9ICcnO1xuICBsaXN0ZW5lckFkZGVkID0gZmFsc2U7XG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbW9kZTogc3RyaW5nID0gJ292ZXInO1xuICBxdWlja1Byb21wdHM6IGFueVtdID0gW107XG4gIHRodW1ic0Rvd25Nc2dJbmRleCA9IDA7XG4gIHVzZXJOYW1lOiBzdHJpbmcgPSAnJztcbiAgc2hvd1N0YXJ0QWdhaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNJT1NEZXZpY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0ZlZWRCYWNrSWNvbnNJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHRlbXBlcmF0dXJlOiBudW1iZXIgPSAxO1xuICBzcGVha2VycyA9IFtdO1xuICBlbnZpcm9ubWVudDoge1xuICAgIFVTRVJTX0FQSSxcbiAgICBCQVNFX1VSTCxcbiAgICBBR0VOVFNfQVBJXG4gIH07XG4gIHBlbmRpbmdSZXF1ZXN0czogYW55O1xuICBteUNvbm5lY3Rpb25zOiBhbnk7XG4gIGNvbnZlcnNhdGlvbktleTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgc29ja2V0U2VydmljZTogU29ja2V0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbnZlcnNhdGlvblNlcnZpY2U6IENvbnZlcnNhdGlvblNlcnZpY2VcbiAgICAvLyBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVxuICApIHtcbiAgICB0aGlzLmNoYXRNYWluID0gbmV3IEVsZW1lbnRSZWYobnVsbCk7XG5cbiAgICAvLyBpZiAodGhpcy5wbGF0Zm9ybS5JT1MpIHtcbiAgICAvLyAgIHRoaXMuaXNJT1NEZXZpY2UgPSB0cnVlO1xuICAgIC8vIH1cblxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuaXNEZXYgPyBkZXZfZW52aXJvbm1lbnQgOiBwcm9kX2Vudmlyb25tZW50O1xuXG4gICAgLy8gdGhpcy5mZXRjaE15Q29ubmVjdGlvbnMoKS5zdWJzY3JpYmUoKTtcbiAgICAvLyB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmNoYW5nZVRlbXBlcmF0dXJlKHRoaXMudGVtcGVyYXR1cmUpO1xuICAgIHRoaXMuZmV0Y2hCb3RDb25maWcoKS5zdWJzY3JpYmUoXG4gICAgICAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHRoaXMuZmV0Y2hDaGF0SGlzdG9yeSgpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5tYXBDaGF0SGlzdG9yeShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTonLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTonLCBlcnIpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5mZXRjaEFnZW50cygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNvY2tldCgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5saXN0ZW5Tb2NrZXRzKCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuICBwcml2YXRlIGV2ZW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIGluaXRpYWxpemVTb2NrZXQoKSB7XG4gICAgO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbl9pZCA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkodGhpcy5ib3RJZCk7XG5cbiAgICB0aGlzLnNvY2tldFNlcnZpY2UucmVnaXN0ZXJVc2VyU3BlY2lmaWNIaXZlU29ja2V0KHRoaXMuYm90SWQsIGNvbnZlcnNhdGlvbl9pZCk7XG4gIH1cblxuICBzdWJzY3JpcHRpb25OZXc6IGFueTtcbiAgc29ja2V0RGF0YTogYW55O1xuXG4gIGxpc3RlblNvY2tldHMoKSB7XG4gICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZVxuICAgICAgLmdldFVzZXJTcGVjaWZpY05vdGlmaWNhdGlvbigpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgT3RoZXJGaWVsZHMgZXhpc3RzIGluIHRoZSByZXNwb25zZVxuICAgICAgICAgIGlmIChyZXM/Lm0/Lk90aGVyRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCB7IFxuICAgICAgICAgICAgICBjb252ZXJzYXRpb25faWQsIFxuICAgICAgICAgICAgICBib3RfaWQsIFxuICAgICAgICAgICAgICBtZXNzYWdlX2lkLFxuICAgICAgICAgICAgICBhbnN3ZXIsIFxuICAgICAgICAgICAgICB3ZWJfcmVzdWx0cywgXG4gICAgICAgICAgICAgIGZpbmFuY2lhbF9ncmFwaHMsIFxuICAgICAgICAgICAgICBleGVjdXRpb25fZ3JhcGhzLCBcbiAgICAgICAgICAgICAgb25saW5lX3NlYXJjaF90ZXJtcywgXG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zXG4gICAgICAgICAgICB9ID0gcmVzPy5tPy5PdGhlckZpZWxkcztcblxuICAgICAgICAgICAgdmFyIGN1cnJlbnRDaGF0TWVzc2FnZSA9IHRoaXMuY2hhdExvZy5maW5kKHAgPT4gcC5faWQgPT0gbWVzc2FnZV9pZCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZighY3VycmVudENoYXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBfaWQ6IG1lc3NhZ2VfaWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaChjdXJyZW50Q2hhdE1lc3NhZ2UpO1xuICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBmaWVsZHMgYmFzZWQgb24gdGhlaXIgcHJlc2VuY2VcbiAgICAgICAgICAgIGlmIChvbmxpbmVfc2VhcmNoX3Rlcm1zICYmIEFycmF5LmlzQXJyYXkob25saW5lX3NlYXJjaF90ZXJtcykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ09ubGluZSBTZWFyY2ggVGVybXM6Jywgb25saW5lX3NlYXJjaF90ZXJtcyk7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5zZWFyY2hUZXJtcyA9IG9ubGluZV9zZWFyY2hfdGVybXM7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod2ViX3Jlc3VsdHMgJiYgQXJyYXkuaXNBcnJheSh3ZWJfcmVzdWx0cykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dlYiBSZXN1bHRzOicsIHdlYl9yZXN1bHRzKTtcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnNvdXJjZXNMaXN0ID0gd2ViX3Jlc3VsdHM7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5kaXNwbGF5ZWRTb3VyY2VzID0gd2ViX3Jlc3VsdHM/LnNsaWNlKDAsIDMpOyAvLyBGaXJzdCAzIGNhcmRzXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5yZW1haW5pbmdTb3VyY2VzID0gd2ViX3Jlc3VsdHM/LnNsaWNlKDMpOyAvLyBSZW1haW5pbmcgaXRlbXNcbiAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFuc3dlcikge1xuICAgICAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQW5zd2VyOicsIGFuc3dlcik7XG5cbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLm1lc3NhZ2UgPSB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShhbnN3ZXIpO1xuICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmluYW5jaWFsX2dyYXBocyAmJiBBcnJheS5pc0FycmF5KGZpbmFuY2lhbF9ncmFwaHMpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaW5hbmNpYWwgR3JhcGhzOicsIGZpbmFuY2lhbF9ncmFwaHMpO1xuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuZmluYW5jaWFsR3JhcGhzID0gZmluYW5jaWFsX2dyYXBocztcbiAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleGVjdXRpb25fZ3JhcGhzICYmIEFycmF5LmlzQXJyYXkoZXhlY3V0aW9uX2dyYXBocykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0V4ZWN1dGlvbiBHcmFwaHM6JywgZXhlY3V0aW9uX2dyYXBocyk7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5leGVjdXRpb25HcmFwaHMgPSBleGVjdXRpb25fZ3JhcGhzO1xuICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zICYmIEFycmF5LmlzQXJyYXkoc3VnZ2VzdGlvbnMpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdWdnZXN0aW9uczonLCBzdWdnZXN0aW9ucyk7XG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5yZWxhdGVkTGlzdEl0ZW1zID0gc3VnZ2VzdGlvbnM7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAvLyBQcm9jZXNzIG9ubGluZSBzZWFyY2ggdGVybXMgYXMgbmVlZGVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBhbnkgb3RoZXIgZmllbGRzIGFuZCB0aGVpciBwcm9jZXNzaW5nIGhlcmVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPdGhlckZpZWxkcyBpcyBtaXNzaW5nIGluIHRoZSByZXNwb25zZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBmZXRjaGluZyBkYXRhIGZyb20gc29ja2V0JywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGluaXRpYWxpemVTb2NrZXRBbmRMaXN0ZW4oKSB7XG5cbiAgfVxuICBoYW5kbGVFdmVudChkYXRhOiBhbnksIHR5cGU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnd2VicmVzdWx0JzpcblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fuc3dlcic6XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdncmFwaCc6XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLy90aGlzLnNvY2tldFNlcnZpY2UuY2xvc2UoKTtcbiAgfVxuICBjaGFuZ2VUZW1wZXJhdHVyZShuZXdUZW1wZXJhdHVyZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMudGVtcGVyYXR1cmUgPSBuZXdUZW1wZXJhdHVyZTtcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhpdmVncHQtY2hhdC13cmFwcGVyJylcbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgdGhlbWUgY2xhc3NlcyBmcm9tIGJvZHlcbiAgICB3cmFwcGVyPy5jbGFzc0xpc3QucmVtb3ZlKCdjcmVhdGl2ZScsICdiYWxhbmNlZCcsICdwcmVjaXNlJyk7XG5cbiAgICBzd2l0Y2ggKG5ld1RlbXBlcmF0dXJlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ2NyZWF0aXZlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdiYWxhbmNlZCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgncHJlY2lzZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RhcnRBZ2FpbigpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IGZhbHNlO1xuICAgIHRoaXMuY2hhdExvZyA9IFtdO1xuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICdhaScsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnIHx8XG4gICAgICAgIHRoaXMucHJvY2Vzc01lc3NhZ2UoXG4gICAgICAgICAgXCJHcmVldGluZ3MhIEknbSB5b3VyIENPUDI4IHZpcnR1YWwgYXNzaXN0YW50LiBIYXZlIHF1ZXN0aW9ucyBhYm91dCB0aGUgZXZlbnQ/IEknbSBoZXJlIHRvIGhlbHAuXCJcbiAgICAgICAgKSxcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICB9KTtcbiAgICB0aGlzLmFyY2hpZXZlTWVzc2FnZXMoKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFyY2hpZXZlTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgIH0pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9jbGVhci1oaXN0b3J5LyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoQm90Q29uZmlnKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90cz9ib3RfaWQ9JHt0aGlzLmJvdElkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmJvdE5hbWUgPSByZXMuTmFtZTtcbiAgICAgICAgdGhpcy5ib3RJY29uID0gcmVzLkljb247XG4gICAgICAgIHRoaXMuYm90U2tpbGxzID0gcmVzPy5Ta2lsbHM7XG4gICAgICAgIHRoaXMuZ3JlZXRpbmdNc2cgPSByZXMuR3JlZXRpbmc7XG5cbiAgICAgICAgdGhpcy50aHVtYnNEb3duTWVzc2FnZXMgPSByZXM/Lk5lZ2F0aXZlUmVzcG9uc2VzPy5sZW5ndGhcbiAgICAgICAgICA/IHJlcy5OZWdhdGl2ZVJlc3BvbnNlc1xuICAgICAgICAgIDogW1xuICAgICAgICAgICAgXCJXZSBhcmUgc29ycnkgd2UndmUgbm90IGJlZW4gYWJsZSB0byBhbnN3ZXIgeW91ciBxdWVzdGlvbi48YnIvPiBIb3dldmVyLCBvdXIgZGVkaWNhdGVkIHN1cHBvcnQgdGVhbSBpcyBoYXBweSB0byBoZWxwLiA8c3BhbiBjbGFzcz0nZmVlZGJhY2stbGluaycgc3R5bGU9J2N1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjMTcyMzVCOyc+UGxlYXNlIGNsaWNrIGhlcmU8L3NwYW4+IGFuZCBhIGh1bWFuIGFnZW50IHdpbGwgYXNzaXN0IHlvdSBhcyBzb29uIGFzIHBvc3NpYmxlXCIsXG4gICAgICAgICAgXTtcbiAgICAgICAgdGhpcy5xdWlja1Byb21wdHMgPSByZXMuUXVpY2tQcm9tcHRzO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0Ym90IGNvbmZpZzogJywgZXJyb3IpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2hDaGF0SGlzdG9yeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jb252ZXJzYXRpb25LZXkgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQpO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbktleX1gO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ2FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcjxhbnk+KCdmZXRjaENvbnZlcnNhdGlvbicpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yPFQ+KG9wZXJhdGlvbiA9ICdvcGVyYXRpb24nLCByZXN1bHQ/OiBUKSB7XG4gICAgcmV0dXJuIChlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxUPiA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gb2YocmVzdWx0IGFzIFQpO1xuICAgIH07XG4gIH1cbiAgLy8gZmV0Y2hDaGF0SGlzdG9yeSgpIHtcbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAvLyAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgLy8gICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgLy8gICB9KTtcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwXG4gIC8vICAgICAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbktleX1gLCB7IGhlYWRlcnMgfSlcbiAgLy8gICAgIC5waXBlKFxuICAvLyAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gIC8vICAgICAgIH0pLFxuICAvLyAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OiAnLCBlcnJvcik7XG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAvLyAgICAgICB9KVxuICAvLyAgICAgKTtcbiAgLy8gfVxuXG4gIG1hcENoYXRIaXN0b3J5KGNoYXRzOiBhbnkpIHtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgdGhpcy5ncmVldGluZ01zZyB8fFxuICAgICAgICB0aGlzLnByb2Nlc3NNZXNzYWdlKFxuICAgICAgICAgIFwiR3JlZXRpbmdzISBJJ20geW91ciBDT1AyOCB2aXJ0dWFsIGFzc2lzdGFudC4gSGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGV2ZW50PyBJJ20gaGVyZSB0byBoZWxwLlwiXG4gICAgICAgICksXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgfSk7XG4gICAgaWYgKGNoYXRzICYmIGNoYXRzPy5NZXNzYWdlcz8ubGVuZ3RoKSB7XG4gICAgICBjaGF0cz8uTWVzc2FnZXMuZm9yRWFjaCgoY2hhdDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGF0LlR5cGUgPT0gXCJ1c2VyXCIpIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAndXNlcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShjaGF0LlRleHQpLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGF0LlR5cGUgPT0gXCJhaVwiKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZXNMaXN0ID0gY2hhdC5XZWJMaW5rcyB8fCBbXTtcbiAgICAgICAgICB2YXIgZGlzcGxheWVkU291cmNlcyA9IGNoYXQuV2ViTGlua3Muc2xpY2UoMCwgMyk7IC8vIEZpcnN0IDMgY2FyZHNcbiAgICAgICAgICB2YXIgcmVtYWluaW5nU291cmNlcyA9IGNoYXQuV2ViTGlua3Muc2xpY2UoMyk7IC8vIFJlbWFpbmluZyBpdGVtc1xuXG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dCksXG4gICAgICAgICAgICBleGVjdXRpb25HcmFwaHM6IGNoYXQuRXhlY3V0aW9uR3JhcGhzLFxuICAgICAgICAgICAgc2VhcmNoVGVybXM6IGNoYXQuU2VhcmNoVGVybXMsXG4gICAgICAgICAgICBzb3VyY2VzTGlzdDogc291cmNlc0xpc3QsXG4gICAgICAgICAgICBkaXNwbGF5ZWRTb3VyY2VzOiBkaXNwbGF5ZWRTb3VyY2VzLFxuICAgICAgICAgICAgcmVtYWluaW5nU291cmNlczogcmVtYWluaW5nU291cmNlcyxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNob3dTdGFydEFnYWluID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvY2Vzc01lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIGlmICghbWVzc2FnZSB8fCAhKG1lc3NhZ2U/Lmxlbmd0aCA+IDApKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2hlcmUgaXMgbXkgbWVzc2FnZScpXG4gICAgLy8gY29uc29sZS5sb2cobWVzc2FnZSk7XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZS50cmltKCk7XG5cbiAgICBjb25zdCBtYXJrZG93bkxpbmtSZWdleCA9IC9cXFsoW15bXSspXVxcKChbXildKylcXCkvZztcbiAgICBjb25zdCB1cmxSZWdleCA9IC8oPzwhaHJlZj1cIilcXGJodHRwcz86XFwvXFwvXFxTKyg/PCFbLixdKS9naTtcblxuICAgIGlmIChtYXJrZG93bkxpbmtSZWdleC50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICBjb25zdCBodG1sID0gbWVzc2FnZS5yZXBsYWNlKFxuICAgICAgICBtYXJrZG93bkxpbmtSZWdleCxcbiAgICAgICAgJzxhIGhyZWY9XCIkMlwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcbiAgICAgICk7XG4gICAgICAvL2NvbnNvbGUubG9nKCdTYW5pdGl6ZWQgbWVzc2FnZTogJywgbWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XG4gICAgfVxuXG4gICAgaWYgKHVybFJlZ2V4LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBtZXNzYWdlLnJlcGxhY2UoXG4gICAgICAgIHVybFJlZ2V4LFxuICAgICAgICAnPGEgaHJlZj1cIiQmXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JCY8L2E+J1xuICAgICAgKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdTYW5pdGl6ZWQgbWVzc2FnZTogJywgbWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XG4gICAgfVxuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csICc8YnI+Jyk7XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyB0byBIVE1MIGhlYWRlcnNcbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBjb25zdCBzYW5pdGl6ZWRNZXNzYWdlID0gdGhpcy5zYW5pdGl6ZUh0bWwobWVzc2FnZSk7XG4gICAgcmV0dXJuIHNhbml0aXplZE1lc3NhZ2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgY29uc3QgZmVlZGJhY2tMaW5rcyA9XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmVlZGJhY2stbGluaycpO1xuICAgIGZlZWRiYWNrTGlua3MuZm9yRWFjaCgobGluazogYW55KSA9PiB7XG4gICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdjbGljaycsXG4gICAgICAgIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICAvLyBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrLWxpbmsnKSkge1xuICAgIC8vICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAvLyAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjay1saW5rJylcbiAgICAvLyAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkZlZWRiYWNrQ2xpY2suYmluZCh0aGlzLCAnemVuZGVzaycpKTtcbiAgICAvLyB9XG4gIH1cblxuICBzYW5pdGl6ZUh0bWwoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcbiAgfVxuXG4gIG9uRmVlZGJhY2tDbGljayh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5mZWVkYmFja0V2ZW50LmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25DbG9zZSgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xuICAgIHRoaXMub25DbG9zZUV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlV2l0aFRpbGUocHJvbXB0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlucHV0ID0gcHJvbXB0O1xuICAgIHRoaXMuZmV0Y2hEYXRhKCk7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICB9XG4gIGlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICBmZXRjaERhdGEoKSB7XG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuaW5wdXQ/LnRyaW0oKTtcbiAgICBpZiAoIXRoaXMuaW5wdXQgfHwgdGhpcy5sb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgdHlwZTogJ3VzZXInLFxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkodGhpcy5pbnB1dCksXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG5cbiAgICBjb25zdCB1cmwgPVxuICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYWkvYXNrYC8vICtcbiAgICAvLyAodGhpcy51c2VPcGVuQWkgPT09IGZhbHNlID8gJy9sbG0taGYnIDogJycpO1xuICAgIGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHVzZXJfcXVlc3Rpb246IHRoaXMuaW5wdXQsXG4gICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlcklkLFxuICAgICAgICBib3RfaWQ6IHRoaXMuYm90SWQsXG4gICAgICAgIG1lc3NhZ2VfaWQ6IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZW5lcmF0ZUtleSgpLFxuICAgICAgICAvLyB0ZW1wZXJhdHVyZTogdGhpcy50ZW1wZXJhdHVyZSxcbiAgICAgICAgLy8gIGV2ZW50X2lkOiB0aGlzLmV2ZW50SWQsXG4gICAgICAgIC8vIHRva2VuOiB0aGlzLnMyN1VzZXJUb2tlbixcbiAgICAgICAgYWdlbnRzOiB0aGlzLmFnZW50cy5maWx0ZXIocCA9PiBwLnNlbGVjdGVkKS5tYXAocCA9PiBwLmlkKSxcbiAgICAgICAgY29udmVyc2F0aW9uX2lkOiB0aGlzLmNvbnZlcnNhdGlvbktleVxuICAgICAgfSksXG4gICAgfSlcbiAgICAgIC8vIFJldHJpZXZlIGl0cyBib2R5IGFzIFJlYWRhYmxlU3RyZWFtXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5yZWFkQWxsQ2h1bmtzKHJlc3BvbnNlLmJvZHkpOyAgICAgICAgXG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnI6ICcsIGVycik7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIHRoaXMuaW5wdXQgPSAnJztcbiAgfVxuICBmZXRjaERhdGFGb3IobXNnKSB7XG4gICAgY29uc3QgaW5wdXRNc2cgPSBtc2c/LnRyaW0oKTtcbiAgICBpZiAoIWlucHV0TXNnIHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgdHlwZTogJ3VzZXInLFxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoaW5wdXRNc2cpLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XG4gICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSB0cnVlO1xuXG4gICAgY29uc3QgdXJsID1cbiAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fza2AvLyArXG4gICAgLy8gKHRoaXMudXNlT3BlbkFpID09PSBmYWxzZSA/ICcvbGxtLWhmJyA6ICcnKTtcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB1c2VyX3F1ZXN0aW9uOiBpbnB1dE1zZyxcbiAgICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXG4gICAgICAgIGJvdF9pZDogdGhpcy5ib3RJZCxcbiAgICAgICAgbWVzc2FnZV9pZDogdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdlbmVyYXRlS2V5KCksXG4gICAgICAgIC8vIHRlbXBlcmF0dXJlOiB0aGlzLnRlbXBlcmF0dXJlLFxuICAgICAgICAvLyAgZXZlbnRfaWQ6IHRoaXMuZXZlbnRJZCxcbiAgICAgICAgLy8gdG9rZW46IHRoaXMuczI3VXNlclRva2VuLFxuICAgICAgICBhZ2VudHM6IHRoaXMuYWdlbnRzLmZpbHRlcihwID0+IHAuc2VsZWN0ZWQpLm1hcChwID0+IHAuaWQpLFxuICAgICAgICBjb252ZXJzYXRpb25faWQ6IHRoaXMuY29udmVyc2F0aW9uS2V5XG4gICAgICB9KSxcbiAgICB9KVxuICAgICAgLy8gUmV0cmlldmUgaXRzIGJvZHkgYXMgUmVhZGFibGVTdHJlYW1cbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkQWxsQ2h1bmtzKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VycjogJywgZXJyKTtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5pbnB1dCA9ICcnO1xuICB9XG4gIGZldGNoU21hbGxUYWxrKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3Qvc21hbGwtdGFsay8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcblxuICAgIHRoaXMuaHR0cFxuICAgICAgLmdldDx7IHNtYWxsVGFsazogc3RyaW5nIH0+KHVybCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGZldGNoaW5nIHNtYWxsIHRhbGs6JywgZXJyb3IpO1xuXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc21hbGxUYWxrKSB7XG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2UocmVzcG9uc2Uuc21hbGxUYWxrKSxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDI7XG4gICAgICAgICAgLy8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlYWRBbGxDaHVua3MgPSAoc3RyZWFtOiBhbnkpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgY29uc3QgYWxsU3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWFkZXIuY2xvc2VkLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWFkaW5nIHN0cmVhbTogJywgZXJyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgc3RhcnQ6IChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1bXAoY29udHJvbGxlciwgcmVhZGVyLCBhbGxTdWdnZXN0aW9ucyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1bXAoY29udHJvbGxlcjogYW55LCByZWFkZXI6IGFueSwgYWxsU3VnZ2VzdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7IGRvbmUsIHZhbHVlIH06IGFueSkgPT4ge1xuICAgICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLmNoYXRMb2dbdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBsYXN0SXRlbS5tZXNzYWdlID0gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkobGFzdEl0ZW0ubWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY2hhdExvZy5wb3AoKTtcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2gobGFzdEl0ZW0pO1xuICAgICAgICBpZiAoYWxsU3VnZ2VzdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdzdWdnZXN0aW9ucycsXG4gICAgICAgICAgICBzdWdnZXN0aW9uczogYWxsU3VnZ2VzdGlvbnNcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnNob3dTdGFydEFnYWluID0gdHJ1ZTtcblxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICB0aGlzLmZldGNoU21hbGxUYWxrKCk7XG4gICAgICAgIC8vIH0sMTAwMClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVjb2RlZENodW5rID0gdGhpcy5kZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICB0aGlzLmFpUmVzcG9uc2UgKz0gZGVjb2RlZENodW5rO1xuICAgICAgaWYgKGxhc3RJdGVtLnR5cGUgPT09ICdhaScpIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNNYXRjaCA9IHRoaXMuYWlSZXNwb25zZS5tYXRjaCgvPHN1Zz4oLio/KTxcXC9zdWc+L2cpO1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbnNNYXRjaCkge1xuICAgICAgICAgIHN1Z2dlc3Rpb25zTWF0Y2guZm9yRWFjaCgobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9IHRoaXMuYWlSZXNwb25zZS5yZXBsYWNlKG1hdGNoLCBcIlwiKTtcbiAgICAgICAgICAgIGFsbFN1Z2dlc3Rpb25zLnB1c2gobWF0Y2g/LnJlcGxhY2UoLzxcXC8/c3VnPi9nLCBcIlwiKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0SXRlbS5tZXNzYWdlID0gdGhpcy5haVJlc3BvbnNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGFpRm9ybWF0dGVkRGF0YTogYW55O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiAnKVxuICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZSh0aGlzLmFpUmVzcG9uc2UpKVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gMicpXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEgPSBKU09OLnBhcnNlKHRoaXMuYWlSZXNwb25zZSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gZG9uZScpXG5cbiAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YSAmJiBhaUZvcm1hdHRlZERhdGE/LnNlY3Rpb25faWQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ2NvbXBhbnlfc2VhcmNoJyB8fCBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAndXNlcl9zZWFyY2gnIHx8IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICdpbmR1c3RyeV9jb21wYW55X3NlYXJjaCcpIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMubXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzcGVha2VySWRzID0gW107XG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuY29udGVudD8uZm9yRWFjaChzZXNzaW9uID0+IHtcbiAgICAgICAgICAgICAgc3BlYWtlcklkcyA9IFsuLi5zcGVha2VySWRzLCAuLi5zZXNzaW9uLnNwZWFrZXJzXVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChzcGVha2VySWRzPy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICB0aGlzLmdldFNwZWFrZXJzQnlTdGFmZklkcyhzcGVha2VySWRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5hZGRUb015QWdlbmRhQWN0aW9uICYmIGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxuICAgICAgICAgICAgICBzZXNzaW9uSWRzOiBhaUZvcm1hdHRlZERhdGEuY29udGVudFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5jb25uZWN0T3JGb2xsb3dBY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCB1c2Vyc0xlbiA9IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodXNlcnNMZW4gPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgICAgc2VjdGlvbklkOiBcIm9wZW5fbmV0d29ya2luZ19kcmF3ZXJcIixcbiAgICAgICAgICAgICAgICBzZWFyY2g6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1c2Vyc0xlbiA9PSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgICAgc2VjdGlvbklkOiBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCxcbiAgICAgICAgICAgICAgICBjb25uZXRVc2VySWRzOiBbYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRbMF0udXNlcklkXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuaXNfb3Blbl9wYWdlID09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxuICAgICAgICAgICAgICBzZWFyY2g6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVCcm93c2VyKCkpIHtcbiAgICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLm1lc3NhZ2UgKz0gXCJcXG5cXG5cIiArICc8YSBpZD1cImNsb3NlQm90Tm93XCI+Q2xpY2sgSGVyZTwvYT4gdG8gc2VlIHJlc3VsdHMuJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICAgICAgbWVzc2FnZTogYWlGb3JtYXR0ZWREYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICBhY3Rpb246IGFpRm9ybWF0dGVkRGF0YSxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVCcm93c2VyKCkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZENsb3NlQm90Q2xpY2tFdmVudCgpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmFpUmVzcG9uc2UgPSBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmFpUmVzcG9uc2UsXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcblxuICAgICAgLy8gRW5xdWV1ZSB0aGUgbmV4dCBkYXRhIGNodW5rIGludG8gb3VyIHRhcmdldCBzdHJlYW1cbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLnB1bXAoY29udHJvbGxlciwgcmVhZGVyLCBhbGxTdWdnZXN0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBzdWJtaXRGZWVkYmFjayhmbGFnOiBib29sZWFuKSB7XG4gICAgdGhpcy5mZWVkYmFja0RvbmUgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90L2ZlZWRiYWNrYDtcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBmbGFnLCB1c2VyX2lkOiB0aGlzLnVzZXJJZCwgYm90X2lkOiB0aGlzLmJvdElkIH0pLFxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgIHRoaXMudGh1bWJzVXBNZXNzYWdlIHx8XG4gICAgICAgICAgICBgR3JlYXQuIE1heSBJIGFzc2lzdCB5b3Ugd2l0aCBhbnl0aGluZyBlbHNlP2AsXG4gICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZmVlZGJhY2tEb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKFxuICAgICAgICAgIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzW3RoaXMudGh1bWJzRG93bk1zZ0luZGV4XVxuICAgICAgICApLFxuICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMudGh1bWJzRG93bk1zZ0luZGV4ID1cbiAgICAgICAgKHRoaXMudGh1bWJzRG93bk1zZ0luZGV4ICsgMSkgJSB0aGlzLnRodW1ic0Rvd25NZXNzYWdlcy5sZW5ndGg7XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuZmVlZGJhY2tEb25lID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlU3VibWl0KCkge1xuICAgIHRoaXMuZmV0Y2hEYXRhKCk7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICB9XG5cbiAgaGFuZGxlVXBDbGljayhpZHg6IGFueSkge1xuICAgIGlmICh0aGlzLmZlZWRiYWNrRG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3VibWl0RmVlZGJhY2sodHJ1ZSk7XG4gICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XG5cbiAgICBpZiAodGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCkge1xuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaGFuZGxlRG93bkNsaWNrKGlkeDogYW55KSB7XG4gICAgaWYgKHRoaXMuZmVlZGJhY2tEb25lKSByZXR1cm47XG4gICAgdGhpcy5zdWJtaXRGZWVkYmFjayhmYWxzZSk7XG4gICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS5saWtlZClcbiAgICAgIHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkO1xuICB9XG4gIGhhbmRsZUNvcHlDbGljayhpbmRleDogYW55KSB7XG4gICAgLy8gQ29weSB0aGUgbWVzc2FnZSB0byB0aGUgY2xpcGJvYXJkXG4gICAgY29uc3QgY29udGVudFRvQ29weSA9IHRoaXMuY2hhdExvZ1tpbmRleF0ubWVzc2FnZTtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb250ZW50VG9Db3B5KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIGNvcGllZFxuICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgLy8gUmVzZXQgdGhlIGNvcGllZCBzdGF0ZSBhZnRlciBhIGRlbGF5XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSwgMjAwMCk7IC8vIFJlc2V0IGFmdGVyIDIgc2Vjb25kc1xuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsVG9Cb3R0b20oKSB7XG4gICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICAgIHRoaXMuY2hhdE1haW4ubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICBpZiAoY291bnRlcisrID4gNSkgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgfSwgNSk7XG4gIH1cblxuICBoYW5kbGVBY3Rpb24oYWN0aW9uOiBhbnkpIHtcbiAgICBjb25zb2xlLmluZm8oXCJpbmNvbWluZyBhY3Rpb24gZnJvbSB0aGUgY2hhdGJvdCBBSVwiKVxuICAgIGNvbnNvbGUuaW5mbyhhY3Rpb24pXG5cbiAgICBpZiAoYWN0aW9uPy5jb250ZW50KSB7XG5cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRyYXdlciBpcyBpbml0aWFsbHkgb3BlbiBhbmQgYXBwbHkgb3ZlcmZsb3cgaGlkZGVuIHRvIGJvZHkgaWYgc29cbiAgICBpZiAodGhpcy5kcmF3ZXIub3BlbmVkKSB7XG4gICAgICB0aGlzLnNldEJvZHlPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSBkcmF3ZXIgYmVpbmcgb3BlbmVkIG9yIGNsb3NlZFxuICAgIHRoaXMuZHJhd2VyLm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoKG9wZW5lZDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKG9wZW5lZCkge1xuICAgICAgICB0aGlzLnNldEJvZHlPdmVyZmxvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVCb2R5T3ZlcmZsb3coKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZHJhd2VyLm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoKG9wZW5lZCkgPT4ge1xuICAgICAgaWYgKG9wZW5lZCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5teVRleHRhcmVhICYmIHRoaXMubXlUZXh0YXJlYS5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLm15VGV4dGFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpOyAvLyBGb2N1cyBvbiB0aGUgdGV4dGFyZWFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRCb2R5T3ZlcmZsb3coKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQm9keU92ZXJmbG93KCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5ib2R5T3ZlcmZsb3dDbGFzcyk7XG4gIH1cblxuICBnZXRTcGVha2Vyc0J5U3RhZmZJZHMoaWRzKSB7XG4gICAgY29uc3QgdXJsID1cbiAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L3VzZXJzL2dldC1ieS1zdGFmZi1pZHNgXG4gICAgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIFwieW91cl90b2tlbl9oZXJlXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoaWRzKSxcbiAgICB9KVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7IC8vIFBhcnNlIHRoZSBKU09OIGJvZHkgb2YgdGhlIHJlc3BvbnNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2suJyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRhdGEuZm9yRWFjaChzcGVha2VyID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3BlYWtlcnNbc3BlYWtlci5pZF0gPSBzcGVha2VyO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBkYXRhOicsIGVycik7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uSWQsIGFjdGlvbikge1xuICAgIHRoaXMuc2Vzc2lvbkFjdGlvbnMubmV4dCh7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBhY3Rpb25cbiAgICB9KTtcbiAgfVxuXG4gIGFkZENsb3NlQm90Q2xpY2tFdmVudCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2Nsb3NlQm90Tm93Jyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZUJvdC5uZXh0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc01vYmlsZUJyb3dzZXIoKSB7XG4gICAgcmV0dXJuIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIGNvbm5lY3RUb1VzZXIodXNlcklkKSB7XG4gICAgdGhpcy5jb25uZWN0V2l0aFVzZXIuZW1pdCh7XG4gICAgICBjb25uZWN0OiAhdGhpcy5jYW5EaXNjb25uZWN0KHVzZXJJZCksXG4gICAgICB1c2VySWRcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mZXRjaE15Q29ubmVjdGlvbnMoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgc2NoZWR1bGVNZWV0aW5nV2l0aFVzZXIodXNlcikge1xuICAgIHRoaXMuc2NoZWR1bGVNZWV0aW5nLmVtaXQodXNlcik7XG4gIH1cblxuICBjYW5Db25uZWN0KHVzZXJJZCkge1xuICAgIHJldHVybiAhKHRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpIHx8IHRoaXMucGVuZGluZ1JlcXVlc3RzLmZpbmQoYSA9PiBhID09IHVzZXJJZCkpXG4gIH1cblxuICBjYW5EaXNjb25uZWN0KHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLm15Q29ubmVjdGlvbnMuZmluZChjb25uID0+IGNvbm4udXNlcklkID09IHVzZXJJZClcbiAgfVxuXG4gIGZldGNoUGVuZGluZ1JlcXVlc3RzKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdhcGlLZXknOiB0aGlzLmF1dG9nZW5LZXlcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KFxuICAgICAgICBgJHt0aGlzLmVudmlyb25tZW50LlVTRVJTX0FQSX0vZXZlbnRzLyR7dGhpcy5ldmVudElkfS9jb25uZWN0aW9uLXJlcXVlc3RzL2F1dG9nZW4vcGVuZGluZy1zZW50LXJlcXVlc3RzP3VzZXJJZD0ke3RoaXMudXNlcklkfWAsXG4gICAgICAgIHsgaGVhZGVycyB9XG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gcmVzO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHBlbmRpbmcgcmVxdWVzdHM6ICcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgZmV0Y2hNeUNvbm5lY3Rpb25zKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdhcGlLZXknOiB0aGlzLmF1dG9nZW5LZXlcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KFxuICAgICAgICBgJHt0aGlzLmVudmlyb25tZW50LlVTRVJTX0FQSX0vZXZlbnRzLyR7dGhpcy5ldmVudElkfS91c2Vycy1jb25uZWN0aW9ucy9hdXRvZ2VuP3VzZXJJZD0ke3RoaXMudXNlcklkfWAsXG4gICAgICAgIHsgaGVhZGVycyB9XG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubXlDb25uZWN0aW9ucyA9IHJlcztcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBwZW5kaW5nIHJlcXVlc3RzOiAnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG5cbiAgaXNEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWdlbnRzOiBhbnk7XG4gIHNlbGVjdGVkQWdlbnRzID0gW107XG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XG4gIC8vIFRvZ2dsZSB0aGUgZHJvcGRvd24gdmlzaWJpbGl0eVxuICB0b2dnbGVEcm9wZG93bigpIHtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gIXRoaXMuaXNEcm9wZG93bk9wZW47XG4gIH1cblxuICBvblNlbGVjdEFsbChldmVudDogRXZlbnQpOiB2b2lkIHtcblxuICAgIHRoaXMuYWdlbnRzPy5mb3JFYWNoKGFnZW50ID0+IGFnZW50LnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICB9XG5cbiAgb25BZ2VudENoYW5nZShhZ2VudDogYW55KTogdm9pZCB7XG4gICAgLy9hZ2VudC5zZWxlY3RlZCA9ICFhZ2VudC5zZWxlY3RlZDtcbiAgICAvL2NvbnNvbGUubG9nKGFnZW50KTtcbiAgICBsZXQgYWdlbnRGb3VuZCA9IHRoaXMuYWdlbnRzLmZpbHRlcihwID0+IHAuaWQgPT0gYWdlbnQuaWQpO1xuICAgIGlmIChhZ2VudEZvdW5kICYmIGFnZW50Rm91bmQubGVuZ3RoID4gMCkge1xuICAgICAgYWdlbnRGb3VuZFswXS5zZWxlY3RlZCA9ICFhZ2VudEZvdW5kWzBdLnNlbGVjdGVkO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBhcmVBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZ2VudHM/LmV2ZXJ5KGFnZW50ID0+ICFhZ2VudC5zZWxlY3RlZCk7XG4gIH1cblxuICBnZXREcm9wZG93bkhlYWRlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3RlZEFnZW50cyA9IHRoaXMuYWdlbnRzPy5maWx0ZXIoYWdlbnQgPT4gYWdlbnQuc2VsZWN0ZWQpO1xuICAgIGlmIChzZWxlY3RlZEFnZW50cyAmJiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ0FsbCBBZ2VudHMnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aCA+IDEgPyBgJHtzZWxlY3RlZEFnZW50cz8ubGVuZ3RofSBBZ2VudHMgU2VsZWN0ZWRgIDogYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnQgU2VsZWN0ZWRgO1xuICAgIH1cbiAgfVxuICBmZXRjaEFnZW50c19odHRwKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5BR0VOVFNfQVBJfS9Db1BpbG90LyR7dGhpcy5ib3RJZH0vYWN0aXZlLWFnZW50c2A7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCB7fSwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLmFnZW50cyA9IHJlcy5tYXAoYWdlbnQgPT4gKHtcbiAgICAgICAgICAgIC4uLmFnZW50LFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0Ym90IGNvbmZpZzogJywgZXJyb3IpO1xuXG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG5cbiAgZmV0Y2hBZ2VudHMoKSB7XG4gICAgdGhpcy5mZXRjaEFnZW50c19odHRwKClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG5cblxuICAvLyBldmVudHMvJHtldmVudElkfS91c2Vycy1jb25uZWN0aW9uc1xuICBwcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkobWFya2Rvd246IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBpZiAoIW1hcmtkb3duIHx8ICEobWFya2Rvd24ubGVuZ3RoID4gMCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0lucHV0IE1hcmtkb3duIGlzIG51bGwgb3IgZW1wdHknKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvL2NvbnNvbGUubG9nKCdNYXJrZG93biBpbnB1dDonLCBtYXJrZG93bik7XG5cbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGhlYWRlcnMgdG8gSFRNTCBoZWFkZXJzXG4gICAgbGV0IGh0bWwgPSBtYXJrZG93bi5yZXBsYWNlKC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XG4gICAgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXIgaGVhZGVyIGNvbnZlcnNpb246JywgaHRtbCk7XG5cbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGxpbmtzIHRvIEhUTUwgbGlua3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXFsoW15cXF1dKyldXFwoKFteKV0rKVxcKS9nLCAnPGEgaHJlZj1cIiQyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+Jyk7XG5cbiAgICAvLyAgY29uc29sZS5sb2coJ0FmdGVyIGxpbmsgY29udmVyc2lvbjonLCBodG1sKTtcblxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gYm9sZCB0byBIVE1MIHN0cm9uZ1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcKlxcKiguKj8pXFwqXFwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+Jyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdBZnRlciBib2xkIGNvbnZlcnNpb246JywgaHRtbCk7XG5cbiAgICAvLyBDb252ZXJ0IG5ldyBsaW5lcyB0byA8YnI+IHRhZ3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC8oPzpcXHJcXG58XFxyfFxcbikvZywgJzxicj4nKTtcblxuICAgIC8vICBjb25zb2xlLmxvZygnQWZ0ZXIgbGluZSBicmVha3MgY29udmVyc2lvbjonLCBodG1sKTtcblxuICAgIC8vIE9wdGlvbmFsOiBTYW5pdGl6ZSB0aGUgSFRNTCB0byBwcmV2ZW50IFhTU1xuICAgIGNvbnN0IHNhbml0aXplZEh0bWwgPSB0aGlzLnNhbml0aXplSHRtbChodG1sKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdTYW5pdGl6ZWQgSFRNTDonLCBzYW5pdGl6ZWRIdG1sKTtcblxuICAgIHJldHVybiBzYW5pdGl6ZWRIdG1sO1xuICB9XG4gIGlzQ29sbGFwc2VkID0gZmFsc2U7XG4gIGlzQ29sbGFwc2VkRm9yR3JhcGggPSBmYWxzZTtcbiAgaXNDb2xsYXBzZWRGb3JGR3JhcGggPSBmYWxzZTtcbiAgdG9nZ2xlQ29sbGFwc2UoKSB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9ICF0aGlzLmlzQ29sbGFwc2VkO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbGxhcHNlR3JhcGgoKSB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZEZvckdyYXBoID0gIXRoaXMuaXNDb2xsYXBzZWRGb3JHcmFwaDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgdG9nZ2xlQ29sbGFwc2VGR3JhcGgoKSB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZEZvckZHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yRkdyYXBoO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICAvLyAgIFtcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBKYW51YXJ5IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJFYWNoIG1vbnRoLCB3ZSBjb21waWxlIHNpZ25pZmljYW50IG5ld3MsIHRyZW5kcywgYW5kIGhhcHBlbmluZ3MgaW4gQUksIHByb3ZpZGluZyBkZXRhaWxlZCBzdW1tYXJpZXMgd2l0aCBrZXkgcG9pbnRzIGluIGJ1bGxldCBmb3JtIGZvciBjb25jaXNlIHlldCBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nLlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWphbnVhcnktMjAyNC9cIlxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIlRvcCBBSSBOZXdzLCBKYW51YXJ5IDIwMjQgLSBFdmVyeXBpeGVsIEpvdXJuYWxcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIkluIHRoaXMgbW9udGhseSByb3VuZHVwLCB3ZSBzcG90bGlnaHQgdGhlIHRvcCBBSSBuZXdzIHN0b3JpZXMgZnJvbSBKYW51YXJ5LCBpbmNsdWRpbmcgdGhlIE9wZW5BSSB2cy4gVGhlIE5ldyBZb3JrIFRpbWVzIExhd3N1aXQuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL2pvdXJuYWwuZXZlcnlwaXhlbC5jb20vdG9wLWFpLW5ld3MtamFudWFyeS0yMDI0XCJcbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJBSSBOZXdzIEp1bHkgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIlRoaXMgcGFnZSBmZWF0dXJlcyBBSSBOZXdzIGZvciBKdWx5IDIwMjQsIGhpZ2hsaWdodGluZyBzaWduaWZpY2FudCBldmVudHMgc3VjaCBhcyBDYW52YSBhY3F1aXJpbmcgTGVvbmFyZG8gQUkuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3RoZWFpdHJhY2suY29tL2FpLW5ld3MtanVseS0yMDI0LWluLWRlcHRoLWFuZC1jb25jaXNlL1wiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiSmFudWFyeSBuZXdzIHJvdW5kdXA6IFdoYXQncyBuZXcgaW4gdGhlIHdvcmxkIG9mIEFJPyAtIFBsdXJhbHNpZ2h0XCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJPcGVuQUnigJlzIG5ldyBHUFQgc3RvcmUsIGJ1c2luZXNzLXJlYWR5IENoYXRHUFQgcGxhbnMsIGFuZCBhIHByZWRpY3RlZCByaXNlIGluIEFJLXBvd2VyZWQgY3liZXJjcmltZS5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vd3d3LnBsdXJhbHNpZ2h0LmNvbS9yZXNvdXJjZXMvYmxvZy9kYXRhL2FpLXRoaXMtbW9udGgtamFudWFyeS0yMDI0XCJcbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJBSSBOZXdzIEF1Z3VzdCAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiVGhpcyBwYWdlIGZlYXR1cmVzIEFJIE5ld3MgZm9yIEF1Z3VzdCAyMDI0LCB3aXRoIGhpZ2hsaWdodHMgc3VjaCBhcyBOdmlkaWEgZGVsYXlpbmcgdGhlIOKAnEJsYWNrd2VsbOKAnSBCMjAwIEFJIGNoaXBzIGRlbGl2ZXJ5LlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWF1Z3VzdC0yMDI0LWluLWRlcHRoLWFuZC1jb25jaXNlLWR1cGxpY2F0ZS9cIlxuICAvLyAgIH1cbiAgLy8gXVxuICBkYXRlVGltZSA9IHsgbm93OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfTtcbiAgLy8gRXh0cmFjdHMgdGhlIGRvbWFpbiBmcm9tIGEgVVJMXG4gIGdldERvbWFpbk5hbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgICByZXR1cm4gaG9zdG5hbWUucmVwbGFjZSgvXnd3d1xcLi8sICcnKTsgLy8gUmVtb3ZlICd3d3cuJyBpZiBwcmVzZW50XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdlbmVyYXRlcyB0aGUgZmF2aWNvbiBVUkxcbiAgZ2V0RmF2aWNvblVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9tYWluID0gdGhpcy5nZXREb21haW5OYW1lKHVybCk7XG4gICAgcmV0dXJuIGBodHRwczovL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP3N6PTEyOCZkb21haW49JHtkb21haW59YDtcbiAgfVxuICBvbkNhcmRDbGljaygpOiB2b2lkIHtcblxuICAgIHRoaXMuc291cmNlc0RyYXdlci5vcGVuKCk7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuICBvbkNsb3NlU291cmNlKCkge1xuICAgIHRoaXMuc291cmNlc0RyYXdlci5jbG9zZSgpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVlZGVkXG4gICAgdGhpcy5vbkRyYXdlckNsb3NlZCgpO1xuICB9XG4gIG9uRHJhd2VyQ2xvc2VkKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVlZGVkXG4gICAgICAvLyBVc2UgbmdDbGFzcyB0byBkeW5hbWljYWxseSBhcHBseSB0aGUgY2xhc3NcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG4gIGlzRHJhd2VyT3BlbiA9IHRydWU7XG5cbiAgdG9nZ2xlRHJhd2VyKHRvZG8pIHtcbiAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IHRvZG87XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlQnV0dG9uVmlzaWJpbGl0eSgpO1xuICB9XG4gIHVwZGF0ZUJ1dHRvblZpc2liaWxpdHkoKSB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gdGhpcy5pc0RyYXdlck9wZW4gPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIH1cbiAgfVxuICBvcGVuTGlua0luTmV3VGFiKGxpbms6IHN0cmluZyk6IHZvaWQge1xuICAgIHdpbmRvdy5vcGVuKGxpbmssICdfYmxhbmsnKTtcbiAgfVxuXG59XG4iXX0=
1
+ // import { Platform } from '@angular/cdk/platform';
2
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewChildren, } from '@angular/core';
4
+ import { DomSanitizer } from '@angular/platform-browser';
5
+ import { of } from 'rxjs';
6
+ import { catchError, switchMap } from 'rxjs/operators';
7
+ import { formatNow, formatTimeStamps } from '../../utils/utils';
8
+ import { dev_environment, prod_environment } from '../../../environments/environment';
9
+ import { ConversationService } from '../conversation.service';
10
+ import { SocketService } from '../socket-service.service';
11
+ export class ChatDrawerComponent {
12
+ constructor(cdr, http, sanitizer, elementRef, renderer, socketService, conversationService
13
+ // private platform: Platform
14
+ ) {
15
+ this.cdr = cdr;
16
+ this.http = http;
17
+ this.sanitizer = sanitizer;
18
+ this.elementRef = elementRef;
19
+ this.renderer = renderer;
20
+ this.socketService = socketService;
21
+ this.conversationService = conversationService;
22
+ this.bodyOverflowClass = 'body-overflow-hidden';
23
+ this.isCollapsedTrue = false;
24
+ this.copilotName = "HiveXGPT";
25
+ this.feedbackEvent = new EventEmitter();
26
+ this.onCloseEvent = new EventEmitter();
27
+ this.openPage = new EventEmitter();
28
+ this.sessionActions = new EventEmitter();
29
+ this.closeBot = new EventEmitter();
30
+ this.connectWithUser = new EventEmitter();
31
+ this.scheduleMeeting = new EventEmitter();
32
+ this.autogenKey = "Autogen_eDJTtEU-NB0RtIpzq1w";
33
+ this.addToMyAgendaAction = "add_to_my_agenda";
34
+ this.myUpcomingSessionAction = "my_upcomming_session";
35
+ this.connectOrFollowAction = "connect_or_follow";
36
+ this.aiResponse = '';
37
+ this.chatLog = [];
38
+ this.decoder = new TextDecoder();
39
+ this.feedbackDone = false;
40
+ this.greetingMsg = '';
41
+ this.hasBackdropValue = false;
42
+ this.input = '';
43
+ this.listenerAdded = false;
44
+ this.loading = false;
45
+ this.mode = 'over';
46
+ this.quickPrompts = [];
47
+ this.thumbsDownMsgIndex = 0;
48
+ this.userName = '';
49
+ this.showStartAgain = false;
50
+ this.isIOSDevice = false;
51
+ this.showFeedBackIconsIndex = null;
52
+ this.temperature = 1;
53
+ this.speakers = [];
54
+ this.isChatingWithAi = false;
55
+ this.readAllChunks = (stream) => {
56
+ const reader = stream.getReader();
57
+ const allSuggestions = [];
58
+ reader.closed.catch((err) => {
59
+ if (err) {
60
+ console.error('Error reading stream: ', err);
61
+ }
62
+ this.isChatingWithAi = false;
63
+ this.scrollToBottom();
64
+ return;
65
+ });
66
+ return new ReadableStream({
67
+ start: (controller) => {
68
+ return this.pump(controller, reader, allSuggestions);
69
+ },
70
+ });
71
+ };
72
+ this.isDropdownOpen = false;
73
+ this.selectedAgents = [];
74
+ this.allSelected = false;
75
+ this.isCollapsed = false;
76
+ this.isCollapsedForGraph = false;
77
+ this.isCollapsedForFGraph = false;
78
+ // [
79
+ // {
80
+ // "title": "AI News January 2024: In-Depth and Concise - The AI Track",
81
+ // "desc": "Each month, we compile significant news, trends, and happenings in AI, providing detailed summaries with key points in bullet form for concise yet complete understanding.",
82
+ // "link": "https://theaitrack.com/ai-news-january-2024/"
83
+ // },
84
+ // {
85
+ // "title": "Top AI News, January 2024 - Everypixel Journal",
86
+ // "desc": "In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.",
87
+ // "link": "https://journal.everypixel.com/top-ai-news-january-2024"
88
+ // },
89
+ // {
90
+ // "title": "AI News July 2024: In-Depth and Concise - The AI Track",
91
+ // "desc": "This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.",
92
+ // "link": "https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/"
93
+ // },
94
+ // {
95
+ // "title": "January news roundup: What's new in the world of AI? - Pluralsight",
96
+ // "desc": "OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.",
97
+ // "link": "https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024"
98
+ // },
99
+ // {
100
+ // "title": "AI News August 2024: In-Depth and Concise - The AI Track",
101
+ // "desc": "This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.",
102
+ // "link": "https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/"
103
+ // }
104
+ // ]
105
+ this.dateTime = { now: new Date().toISOString() };
106
+ this.isDrawerOpen = true;
107
+ this.chatMain = new ElementRef(null);
108
+ // if (this.platform.IOS) {
109
+ // this.isIOSDevice = true;
110
+ // }
111
+ }
112
+ ngOnInit() {
113
+ this.environment = this.isDev ? dev_environment : prod_environment;
114
+ // this.fetchMyConnections().subscribe();
115
+ // this.fetchPendingRequests().subscribe();
116
+ this.changeTemperature(this.temperature);
117
+ this.fetchBotConfig().subscribe((res) => {
118
+ this.cdr.markForCheck();
119
+ this.fetchChatHistory().subscribe((response) => {
120
+ this.loading = false;
121
+ this.mapChatHistory(response);
122
+ this.cdr.markForCheck();
123
+ }, (err) => {
124
+ console.error('Error fetching chat history:', err);
125
+ });
126
+ }, (err) => {
127
+ console.error('Error fetching chat history:', err);
128
+ });
129
+ this.fetchAgents();
130
+ this.cdr.markForCheck();
131
+ this.initializeSocket();
132
+ setTimeout(() => {
133
+ this.listenSockets();
134
+ }, 200);
135
+ }
136
+ initializeSocket() {
137
+ ;
138
+ const conversation_id = this.conversationService.getKey(this.botId);
139
+ this.socketService.registerUserSpecificHiveSocket(this.botId, conversation_id);
140
+ }
141
+ listenSockets() {
142
+ this.eventSubscription = this.conversationService
143
+ .getUserSpecificNotification()
144
+ .subscribe((res) => {
145
+ var _a, _b;
146
+ // Check if OtherFields exists in the response
147
+ if ((_a = res === null || res === void 0 ? void 0 : res.m) === null || _a === void 0 ? void 0 : _a.OtherFields) {
148
+ const { conversation_id, bot_id, message_id, answer, web_results, financial_graphs, execution_graphs, online_search_terms, suggestions } = (_b = res === null || res === void 0 ? void 0 : res.m) === null || _b === void 0 ? void 0 : _b.OtherFields;
149
+ var currentChatMessage = this.chatLog.find(p => p._id == message_id);
150
+ if (!currentChatMessage) {
151
+ currentChatMessage = {
152
+ _id: message_id,
153
+ type: 'ai',
154
+ time: formatNow(this.timezone),
155
+ };
156
+ this.chatLog.push(currentChatMessage);
157
+ this.showFeedBackIconsIndex = this.chatLog.length - 1;
158
+ }
159
+ // Handle the fields based on their presence
160
+ if (online_search_terms && Array.isArray(online_search_terms)) {
161
+ console.log('Online Search Terms:', online_search_terms);
162
+ currentChatMessage.searchTerms = online_search_terms;
163
+ this.cdr.markForCheck();
164
+ }
165
+ if (web_results && Array.isArray(web_results)) {
166
+ console.log('Web Results:', web_results);
167
+ currentChatMessage.sourcesList = web_results;
168
+ currentChatMessage.displayedSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(0, 3); // First 3 cards
169
+ currentChatMessage.remainingSources = web_results === null || web_results === void 0 ? void 0 : web_results.slice(3); // Remaining items
170
+ this.cdr.markForCheck();
171
+ }
172
+ if (answer) {
173
+ this.isChatingWithAi = false;
174
+ console.log('Answer:', answer);
175
+ currentChatMessage.message = this.processMessageForDisplay(answer);
176
+ this.cdr.markForCheck();
177
+ this.scrollToBottom();
178
+ }
179
+ if (financial_graphs && Array.isArray(financial_graphs)) {
180
+ console.log('Financial Graphs:', financial_graphs);
181
+ currentChatMessage.financialGraphs = financial_graphs;
182
+ this.cdr.markForCheck();
183
+ }
184
+ if (execution_graphs && Array.isArray(execution_graphs)) {
185
+ console.log('Execution Graphs:', execution_graphs);
186
+ currentChatMessage.executionGraphs = execution_graphs;
187
+ this.cdr.markForCheck();
188
+ }
189
+ if (suggestions && Array.isArray(suggestions)) {
190
+ console.log('suggestions:', suggestions);
191
+ currentChatMessage.relatedListItems = suggestions;
192
+ this.cdr.markForCheck();
193
+ // Process online search terms as needed
194
+ }
195
+ // Add any other fields and their processing here
196
+ }
197
+ else {
198
+ console.warn('OtherFields is missing in the response');
199
+ }
200
+ }, (err) => {
201
+ this.eventSubscription.unsubscribe();
202
+ console.error('Error in fetching data from socket', err);
203
+ });
204
+ }
205
+ initializeSocketAndListen() {
206
+ }
207
+ handleEvent(data, type) {
208
+ switch (type) {
209
+ case 'webresult':
210
+ break;
211
+ case 'answer':
212
+ break;
213
+ case 'graph':
214
+ break;
215
+ default:
216
+ break;
217
+ }
218
+ }
219
+ ngOnDestroy() {
220
+ if (this.eventSubscription) {
221
+ this.eventSubscription.unsubscribe();
222
+ }
223
+ //this.socketService.close();
224
+ }
225
+ changeTemperature(newTemperature) {
226
+ if (this.loading)
227
+ return;
228
+ this.temperature = newTemperature;
229
+ const wrapper = document.querySelector('.hivegpt-chat-wrapper');
230
+ // Remove existing theme classes from body
231
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.remove('creative', 'balanced', 'precise');
232
+ switch (newTemperature) {
233
+ case 0:
234
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('creative');
235
+ break;
236
+ case 1:
237
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('balanced');
238
+ break;
239
+ case 2:
240
+ wrapper === null || wrapper === void 0 ? void 0 : wrapper.classList.add('precise');
241
+ break;
242
+ default:
243
+ break;
244
+ }
245
+ }
246
+ onStartAgain() {
247
+ if (this.loading)
248
+ return;
249
+ this.showStartAgain = false;
250
+ this.chatLog = [];
251
+ this.chatLog.push({
252
+ type: 'ai',
253
+ message: this.greetingMsg ||
254
+ this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
255
+ time: formatNow(this.timezone),
256
+ });
257
+ this.archieveMessages().subscribe();
258
+ }
259
+ archieveMessages() {
260
+ const headers = new HttpHeaders({
261
+ 'Content-Type': 'application/json',
262
+ 'x-api-key': this.apiKey,
263
+ });
264
+ const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;
265
+ return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
266
+ return of(res);
267
+ }), catchError((error) => {
268
+ return of(null);
269
+ }));
270
+ }
271
+ fetchBotConfig() {
272
+ this.loading = true;
273
+ const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;
274
+ return this.http.get(url).pipe(switchMap((res) => {
275
+ var _a;
276
+ this.botName = res.Name;
277
+ this.botIcon = res.Icon;
278
+ this.botSkills = res === null || res === void 0 ? void 0 : res.Skills;
279
+ this.greetingMsg = res.Greeting;
280
+ this.thumbsDownMessages = ((_a = res === null || res === void 0 ? void 0 : res.NegativeResponses) === null || _a === void 0 ? void 0 : _a.length) ? res.NegativeResponses
281
+ : [
282
+ "We are sorry we've not been able to answer your question.<br/> However, our dedicated support team is happy to help. <span class='feedback-link' style='cursor: pointer; text-decoration: underline; font-weight: 700; color: #17235B;'>Please click here</span> and a human agent will assist you as soon as possible",
283
+ ];
284
+ this.quickPrompts = res.QuickPrompts;
285
+ this.cdr.markForCheck();
286
+ this.loading = false;
287
+ return of(res);
288
+ }), catchError((error) => {
289
+ console.error('Error fetching chatbot config: ', error);
290
+ this.loading = false;
291
+ return of(null);
292
+ }));
293
+ }
294
+ fetchChatHistory() {
295
+ this.loading = true;
296
+ this.conversationKey = this.conversationService.getKey(this.botId);
297
+ const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}`;
298
+ const headers = new HttpHeaders({
299
+ 'accept': 'application/json'
300
+ });
301
+ return this.http.get(url, { headers }).pipe(catchError(this.handleError('fetchConversation')));
302
+ }
303
+ handleError(operation = 'operation', result) {
304
+ return (error) => {
305
+ console.error(`${operation} failed: ${error.message}`);
306
+ return of(result);
307
+ };
308
+ }
309
+ // fetchChatHistory() {
310
+ // this.loading = true;
311
+ // const headers = new HttpHeaders({
312
+ // 'Content-Type': 'application/json',
313
+ // 'x-api-key': this.apiKey,
314
+ // });
315
+ // return this.http
316
+ // .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })
317
+ // .pipe(
318
+ // switchMap((res: any) => {
319
+ // this.loading = false;
320
+ // return of(res);
321
+ // }),
322
+ // catchError((error: any) => {
323
+ // console.error('Error fetching chat history: ', error);
324
+ // this.loading = false;
325
+ // return of(null);
326
+ // })
327
+ // );
328
+ // }
329
+ mapChatHistory(chats) {
330
+ var _a;
331
+ this.chatLog.push({
332
+ type: 'ai',
333
+ message: this.greetingMsg ||
334
+ this.processMessage("Greetings! I'm your COP28 virtual assistant. Have questions about the event? I'm here to help."),
335
+ time: formatNow(this.timezone),
336
+ });
337
+ if (chats && ((_a = chats === null || chats === void 0 ? void 0 : chats.Messages) === null || _a === void 0 ? void 0 : _a.length)) {
338
+ chats === null || chats === void 0 ? void 0 : chats.Messages.forEach((chat) => {
339
+ if (chat.Type == "user") {
340
+ this.chatLog.push({
341
+ type: 'user',
342
+ message: this.processMessageForDisplay(chat.Text),
343
+ time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
344
+ copied: false,
345
+ isCollapsedTrue: false
346
+ });
347
+ }
348
+ if (chat.Type == "ai") {
349
+ var sourcesList = chat.WebLinks || [];
350
+ var displayedSources = chat.WebLinks.slice(0, 3); // First 3 cards
351
+ var remainingSources = chat.WebLinks.slice(3); // Remaining items
352
+ this.chatLog.push({
353
+ type: 'ai',
354
+ message: this.processMessageForDisplay(chat.Text),
355
+ executionGraphs: chat.ExecutionGraphs,
356
+ searchTerms: chat.SearchTerms,
357
+ sourcesList: sourcesList,
358
+ displayedSources: displayedSources,
359
+ remainingSources: remainingSources,
360
+ time: formatTimeStamps(this.timezone, chat.InsertTimestamp),
361
+ copied: false,
362
+ isCollapsedTrue: false
363
+ });
364
+ this.showFeedBackIconsIndex = this.chatLog.length - 1;
365
+ }
366
+ });
367
+ this.showStartAgain = true;
368
+ }
369
+ this.scrollToBottom();
370
+ this.cdr.markForCheck();
371
+ }
372
+ processMessage(message) {
373
+ if (!message || !((message === null || message === void 0 ? void 0 : message.length) > 0)) {
374
+ return '';
375
+ }
376
+ // console.log('here is my message')
377
+ // console.log(message);
378
+ message = message.trim();
379
+ const markdownLinkRegex = /\[([^[]+)]\(([^)]+)\)/g;
380
+ const urlRegex = /(?<!href=")\bhttps?:\/\/\S+(?<![.,])/gi;
381
+ if (markdownLinkRegex.test(message)) {
382
+ const html = message.replace(markdownLinkRegex, '<a href="$2" target="_blank">$1</a>');
383
+ //console.log('Sanitized message: ', message);
384
+ return this.sanitizeHtml(html);
385
+ }
386
+ if (urlRegex.test(message)) {
387
+ const html = message.replace(urlRegex, '<a href="$&" target="_blank">$&</a>');
388
+ // console.log('Sanitized message: ', message);
389
+ return this.sanitizeHtml(html);
390
+ }
391
+ message = message.replace(/(?:\r\n|\r|\n)/g, '<br>');
392
+ message = message.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
393
+ // Convert Markdown headers to HTML headers
394
+ message = message.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
395
+ const level = hashes.length;
396
+ return `<h${level}>${text}</h${level}>`;
397
+ });
398
+ this.cdr.markForCheck();
399
+ const sanitizedMessage = this.sanitizeHtml(message);
400
+ return sanitizedMessage;
401
+ }
402
+ ngAfterViewChecked() {
403
+ const feedbackLinks = this.elementRef.nativeElement.querySelectorAll('.feedback-link');
404
+ feedbackLinks.forEach((link) => {
405
+ link.addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
406
+ });
407
+ // if (this.elementRef.nativeElement.querySelector('.feedback-link')) {
408
+ // this.elementRef.nativeElement
409
+ // .querySelector('.feedback-link')
410
+ // .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));
411
+ // }
412
+ }
413
+ sanitizeHtml(html) {
414
+ return this.sanitizer.bypassSecurityTrustHtml(html);
415
+ }
416
+ onFeedbackClick(value) {
417
+ this.feedbackEvent.emit(value);
418
+ }
419
+ onClose() {
420
+ this.renderer.removeClass(document.body, this.bodyOverflowClass);
421
+ this.onCloseEvent.emit();
422
+ }
423
+ sendMessageWithTile(prompt) {
424
+ this.input = prompt;
425
+ this.fetchData();
426
+ this.scrollToBottom();
427
+ }
428
+ fetchData() {
429
+ var _a;
430
+ this.input = (_a = this.input) === null || _a === void 0 ? void 0 : _a.trim();
431
+ if (!this.input || this.loading) {
432
+ return;
433
+ }
434
+ this.chatLog.push({
435
+ type: 'user',
436
+ message: this.processMessageForDisplay(this.input),
437
+ time: formatNow(this.timezone),
438
+ copied: false,
439
+ isCollapsedTrue: false
440
+ });
441
+ this.cdr.markForCheck();
442
+ this.aiResponse = '';
443
+ this.isChatingWithAi = true;
444
+ const url = `${this.environment.BASE_URL}/ai/ask`; // +
445
+ // (this.useOpenAi === false ? '/llm-hf' : '');
446
+ fetch(url, {
447
+ method: 'POST',
448
+ headers: {
449
+ 'Content-Type': 'application/json',
450
+ 'x-api-key': this.apiKey,
451
+ },
452
+ body: JSON.stringify({
453
+ user_question: this.input,
454
+ user_id: this.userId,
455
+ bot_id: this.botId,
456
+ message_id: this.conversationService.generateKey(),
457
+ agents: this.agents.filter(p => p.selected).map(p => p.id),
458
+ conversation_id: this.conversationKey,
459
+ }),
460
+ })
461
+ .catch((err) => {
462
+ console.error('Error: ', err);
463
+ this.isChatingWithAi = false;
464
+ });
465
+ this.input = '';
466
+ }
467
+ fetchDataFor(msg) {
468
+ const inputMsg = msg === null || msg === void 0 ? void 0 : msg.trim();
469
+ if (!inputMsg || this.loading) {
470
+ return;
471
+ }
472
+ this.scrollToBottom();
473
+ this.chatLog.push({
474
+ type: 'user',
475
+ message: this.processMessageForDisplay(inputMsg),
476
+ time: formatNow(this.timezone),
477
+ copied: false,
478
+ isCollapsedTrue: false
479
+ });
480
+ this.cdr.markForCheck();
481
+ this.aiResponse = '';
482
+ this.isChatingWithAi = true;
483
+ const url = `${this.environment.BASE_URL}/ai/ask`; // +
484
+ // (this.useOpenAi === false ? '/llm-hf' : '');
485
+ fetch(url, {
486
+ method: 'POST',
487
+ headers: {
488
+ 'Content-Type': 'application/json',
489
+ 'x-api-key': this.apiKey,
490
+ },
491
+ body: JSON.stringify({
492
+ user_question: this.input,
493
+ user_id: this.userId,
494
+ bot_id: this.botId,
495
+ message_id: this.conversationService.generateKey(),
496
+ agents: this.agents.filter(p => p.selected).map(p => p.id),
497
+ conversation_id: this.conversationKey,
498
+ }),
499
+ })
500
+ .catch((err) => {
501
+ console.error('Error: ', err);
502
+ this.isChatingWithAi = false;
503
+ });
504
+ this.input = '';
505
+ }
506
+ fetchSmallTalk() {
507
+ this.loading = true;
508
+ this.cdr.markForCheck();
509
+ const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;
510
+ this.http
511
+ .get(url, {
512
+ headers: {
513
+ 'x-api-key': this.apiKey,
514
+ },
515
+ })
516
+ .pipe(catchError((error) => {
517
+ console.error('Error while fetching small talk:', error);
518
+ return of(null);
519
+ }))
520
+ .subscribe((response) => {
521
+ this.loading = false;
522
+ this.cdr.markForCheck();
523
+ if (!response) {
524
+ return;
525
+ }
526
+ if (response && response.smallTalk) {
527
+ this.chatLog.push({
528
+ type: 'ai',
529
+ message: this.processMessage(response.smallTalk),
530
+ time: formatNow(this.timezone),
531
+ isFeedbackMsg: true,
532
+ });
533
+ this.showFeedBackIconsIndex = this.chatLog.length - 2;
534
+ // this.scrollToBottom();
535
+ this.cdr.markForCheck();
536
+ }
537
+ });
538
+ }
539
+ pump(controller, reader, allSuggestions) {
540
+ reader.read().then(({ done, value }) => {
541
+ var _a, _b, _c, _d;
542
+ const lastItem = this.chatLog[this.chatLog.length - 1];
543
+ if (done) {
544
+ lastItem.message = this.processMessageForDisplay(lastItem.message);
545
+ this.chatLog.pop();
546
+ this.chatLog.push(lastItem);
547
+ if (allSuggestions === null || allSuggestions === void 0 ? void 0 : allSuggestions.length) {
548
+ this.chatLog.push({
549
+ type: 'suggestions',
550
+ suggestions: allSuggestions
551
+ });
552
+ }
553
+ controller.close();
554
+ this.isChatingWithAi = false;
555
+ // this.scrollToBottom();
556
+ this.cdr.markForCheck();
557
+ this.showStartAgain = true;
558
+ // setTimeout(() => {
559
+ // this.fetchSmallTalk();
560
+ // },1000)
561
+ return;
562
+ }
563
+ let decodedChunk = this.decoder.decode(value, { stream: true });
564
+ this.aiResponse += decodedChunk;
565
+ if (lastItem.type === 'ai') {
566
+ const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\/sug>/g);
567
+ if (suggestionsMatch) {
568
+ suggestionsMatch.forEach((match) => {
569
+ this.aiResponse = this.aiResponse.replace(match, "");
570
+ allSuggestions.push(match === null || match === void 0 ? void 0 : match.replace(/<\/?sug>/g, ""));
571
+ });
572
+ }
573
+ lastItem.message = this.aiResponse;
574
+ this.cdr.markForCheck();
575
+ }
576
+ else {
577
+ this.isChatingWithAi = false;
578
+ let aiFormattedData;
579
+ try {
580
+ console.log('parsing json ');
581
+ aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));
582
+ }
583
+ catch (e) {
584
+ try {
585
+ console.log('parsing json 2');
586
+ aiFormattedData = JSON.parse(this.aiResponse);
587
+ }
588
+ catch (e) { }
589
+ }
590
+ console.log('parsing json done');
591
+ if (aiFormattedData && ((_a = aiFormattedData === null || aiFormattedData === void 0 ? void 0 : aiFormattedData.section_id) === null || _a === void 0 ? void 0 : _a.length) > 0) {
592
+ if (aiFormattedData.section_id == 'company_search' || aiFormattedData.section_id == 'user_search' || aiFormattedData.section_id == 'industry_company_search') {
593
+ this.fetchMyConnections().subscribe();
594
+ this.fetchPendingRequests().subscribe();
595
+ }
596
+ if (aiFormattedData.section_id == this.myUpcomingSessionAction) {
597
+ var speakerIds = [];
598
+ (_b = aiFormattedData.content) === null || _b === void 0 ? void 0 : _b.forEach(session => {
599
+ speakerIds = [...speakerIds, ...session.speakers];
600
+ });
601
+ if ((speakerIds === null || speakerIds === void 0 ? void 0 : speakerIds.length) > 0)
602
+ this.getSpeakersByStaffIds(speakerIds);
603
+ }
604
+ if (aiFormattedData.section_id == this.addToMyAgendaAction && ((_c = aiFormattedData.content) === null || _c === void 0 ? void 0 : _c.length) > 0) {
605
+ this.openPage.next({
606
+ sectionId: aiFormattedData.section_id,
607
+ sessionIds: aiFormattedData.content
608
+ });
609
+ }
610
+ if (aiFormattedData.section_id == this.connectOrFollowAction) {
611
+ let usersLen = (_d = aiFormattedData.content) === null || _d === void 0 ? void 0 : _d.length;
612
+ if (usersLen > 1) {
613
+ this.openPage.next({
614
+ sectionId: "open_networking_drawer",
615
+ search: aiFormattedData.content
616
+ });
617
+ }
618
+ else if (usersLen == 1) {
619
+ this.openPage.next({
620
+ sectionId: aiFormattedData.section_id,
621
+ connetUserIds: [aiFormattedData.content[0].userId]
622
+ });
623
+ }
624
+ }
625
+ if (aiFormattedData.is_open_page == "true") {
626
+ this.openPage.next({
627
+ sectionId: aiFormattedData.section_id,
628
+ search: aiFormattedData.content
629
+ });
630
+ if (this.isMobileBrowser()) {
631
+ aiFormattedData.message += "\n\n" + '<a id="closeBotNow">Click Here</a> to see results.';
632
+ }
633
+ }
634
+ this.chatLog.push({
635
+ type: 'ai',
636
+ message: aiFormattedData.message,
637
+ action: aiFormattedData,
638
+ time: formatNow(this.timezone)
639
+ });
640
+ if (this.isMobileBrowser()) {
641
+ setTimeout(() => {
642
+ this.addCloseBotClickEvent();
643
+ }, 500);
644
+ }
645
+ this.aiResponse = "";
646
+ }
647
+ else {
648
+ this.chatLog.push({
649
+ type: 'ai',
650
+ message: this.aiResponse,
651
+ time: formatNow(this.timezone),
652
+ });
653
+ }
654
+ this.showFeedBackIconsIndex = this.chatLog.length - 1;
655
+ this.cdr.markForCheck();
656
+ }
657
+ this.scrollToBottom();
658
+ // Enqueue the next data chunk into our target stream
659
+ controller.enqueue(value);
660
+ this.pump(controller, reader, allSuggestions);
661
+ });
662
+ }
663
+ submitFeedback(flag) {
664
+ this.feedbackDone = true;
665
+ this.showFeedBackIconsIndex = null;
666
+ const url = `${this.environment.BASE_URL}/bot/feedback`;
667
+ fetch(url, {
668
+ method: 'POST',
669
+ headers: {
670
+ 'Content-Type': 'application/json',
671
+ 'x-api-key': this.apiKey,
672
+ },
673
+ body: JSON.stringify({ flag, user_id: this.userId, bot_id: this.botId }),
674
+ }).then(() => {
675
+ if (flag) {
676
+ this.chatLog.push({
677
+ type: 'ai',
678
+ message: this.thumbsUpMessage ||
679
+ `Great. May I assist you with anything else?`,
680
+ time: formatNow(this.timezone),
681
+ isFeedbackMsg: true,
682
+ });
683
+ this.scrollToBottom();
684
+ this.cdr.markForCheck();
685
+ this.feedbackDone = false;
686
+ this.showFeedBackIconsIndex = null;
687
+ return;
688
+ }
689
+ this.chatLog.push({
690
+ type: 'ai',
691
+ message: this.processMessage(this.thumbsDownMessages[this.thumbsDownMsgIndex]),
692
+ time: formatNow(this.timezone),
693
+ isFeedbackMsg: true,
694
+ });
695
+ this.thumbsDownMsgIndex =
696
+ (this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;
697
+ this.scrollToBottom();
698
+ this.cdr.markForCheck();
699
+ this.feedbackDone = false;
700
+ this.showFeedBackIconsIndex = null;
701
+ });
702
+ }
703
+ handleSubmit() {
704
+ this.fetchData();
705
+ this.scrollToBottom();
706
+ }
707
+ handleUpClick(idx) {
708
+ if (this.feedbackDone) {
709
+ return;
710
+ }
711
+ this.submitFeedback(true);
712
+ this.chatLog[idx].liked = !this.chatLog[idx].liked;
713
+ if (this.chatLog[idx].unliked) {
714
+ this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
715
+ }
716
+ this.cdr.markForCheck();
717
+ }
718
+ handleDownClick(idx) {
719
+ if (this.feedbackDone)
720
+ return;
721
+ this.submitFeedback(false);
722
+ this.chatLog[idx].unliked = !this.chatLog[idx].unliked;
723
+ if (this.chatLog[idx].liked)
724
+ this.chatLog[idx].liked = !this.chatLog[idx].liked;
725
+ }
726
+ handleCopyClick(index) {
727
+ // Copy the message to the clipboard
728
+ const contentToCopy = this.chatLog[index].message;
729
+ navigator.clipboard.writeText(contentToCopy).then(() => {
730
+ // Indicate that the message was copied
731
+ this.chatLog[index].copied = true;
732
+ this.cdr.detectChanges();
733
+ // Reset the copied state after a delay
734
+ setTimeout(() => {
735
+ this.chatLog[index].copied = false;
736
+ this.cdr.detectChanges();
737
+ }, 2000); // Reset after 2 seconds
738
+ });
739
+ }
740
+ scrollToBottom() {
741
+ let counter = 0;
742
+ const interval = setInterval(() => {
743
+ this.chatMain.nativeElement.scrollTop =
744
+ this.chatMain.nativeElement.scrollHeight;
745
+ if (counter++ > 5)
746
+ clearInterval(interval);
747
+ }, 5);
748
+ }
749
+ handleAction(action) {
750
+ console.info("incoming action from the chatbot AI");
751
+ console.info(action);
752
+ if (action === null || action === void 0 ? void 0 : action.content) {
753
+ }
754
+ }
755
+ ngAfterViewInit() {
756
+ // Check if the drawer is initially open and apply overflow hidden to body if so
757
+ if (this.drawer.opened) {
758
+ this.setBodyOverflow();
759
+ }
760
+ // Listen to changes in the drawer being opened or closed
761
+ this.drawer.openedChange.subscribe((opened) => {
762
+ if (opened) {
763
+ this.setBodyOverflow();
764
+ }
765
+ else {
766
+ this.removeBodyOverflow();
767
+ }
768
+ });
769
+ this.drawer.openedChange.subscribe((opened) => {
770
+ if (opened) {
771
+ setTimeout(() => {
772
+ if (this.myTextarea && this.myTextarea.nativeElement) {
773
+ this.myTextarea.nativeElement.focus(); // Focus on the textarea
774
+ }
775
+ });
776
+ }
777
+ });
778
+ }
779
+ setBodyOverflow() {
780
+ this.renderer.addClass(document.body, this.bodyOverflowClass);
781
+ }
782
+ removeBodyOverflow() {
783
+ this.renderer.removeClass(document.body, this.bodyOverflowClass);
784
+ }
785
+ getSpeakersByStaffIds(ids) {
786
+ const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;
787
+ fetch(url, {
788
+ method: 'POST',
789
+ headers: {
790
+ 'Content-Type': 'application/json',
791
+ 'Authorization': "Bearer " + "your_token_here",
792
+ },
793
+ body: JSON.stringify(ids),
794
+ })
795
+ .then((response) => {
796
+ if (response.ok) {
797
+ return response.json(); // Parse the JSON body of the response
798
+ }
799
+ else {
800
+ throw new Error('Network response was not ok.');
801
+ }
802
+ })
803
+ .then((data) => {
804
+ if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
805
+ data.forEach(speaker => {
806
+ this.speakers[speaker.id] = speaker;
807
+ });
808
+ this.cdr.markForCheck();
809
+ }
810
+ })
811
+ .catch((err) => {
812
+ console.error('Error fetching data:', err);
813
+ this.loading = false;
814
+ });
815
+ }
816
+ performSessionAction(sessionId, action) {
817
+ this.sessionActions.next({
818
+ sessionId,
819
+ action
820
+ });
821
+ }
822
+ addCloseBotClickEvent() {
823
+ const element = this.elementRef.nativeElement.querySelector('#closeBotNow');
824
+ if (element) {
825
+ this.renderer.listen(element, 'click', () => {
826
+ this.closeBot.next();
827
+ });
828
+ }
829
+ }
830
+ isMobileBrowser() {
831
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
832
+ }
833
+ connectToUser(userId) {
834
+ this.connectWithUser.emit({
835
+ connect: !this.canDisconnect(userId),
836
+ userId
837
+ });
838
+ setTimeout(() => {
839
+ this.fetchMyConnections().subscribe(res => {
840
+ this.cdr.markForCheck();
841
+ });
842
+ this.fetchPendingRequests().subscribe(res => {
843
+ this.cdr.markForCheck();
844
+ });
845
+ }, 500);
846
+ }
847
+ scheduleMeetingWithUser(user) {
848
+ this.scheduleMeeting.emit(user);
849
+ }
850
+ canConnect(userId) {
851
+ return !(this.canDisconnect(userId) || this.pendingRequests.find(a => a == userId));
852
+ }
853
+ canDisconnect(userId) {
854
+ return this.myConnections.find(conn => conn.userId == userId);
855
+ }
856
+ fetchPendingRequests() {
857
+ const headers = new HttpHeaders({
858
+ 'Content-Type': 'application/json',
859
+ 'apiKey': this.autogenKey
860
+ });
861
+ return this.http
862
+ .get(`${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`, { headers })
863
+ .pipe(switchMap((res) => {
864
+ this.pendingRequests = res;
865
+ this.cdr.markForCheck();
866
+ return of(res);
867
+ }), catchError((error) => {
868
+ console.error('Error fetching pending requests: ', error);
869
+ return of(null);
870
+ }));
871
+ }
872
+ fetchMyConnections() {
873
+ const headers = new HttpHeaders({
874
+ 'Content-Type': 'application/json',
875
+ 'apiKey': this.autogenKey
876
+ });
877
+ return this.http
878
+ .get(`${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`, { headers })
879
+ .pipe(switchMap((res) => {
880
+ this.myConnections = res;
881
+ this.cdr.markForCheck();
882
+ return of(res);
883
+ }), catchError((error) => {
884
+ console.error('Error fetching pending requests: ', error);
885
+ return of(null);
886
+ }));
887
+ }
888
+ // Toggle the dropdown visibility
889
+ toggleDropdown() {
890
+ this.isDropdownOpen = !this.isDropdownOpen;
891
+ }
892
+ onSelectAll(event) {
893
+ var _a;
894
+ (_a = this.agents) === null || _a === void 0 ? void 0 : _a.forEach(agent => agent.selected = false);
895
+ this.cdr.detectChanges();
896
+ }
897
+ onAgentChange(agent) {
898
+ //agent.selected = !agent.selected;
899
+ //console.log(agent);
900
+ let agentFound = this.agents.filter(p => p.id == agent.id);
901
+ if (agentFound && agentFound.length > 0) {
902
+ agentFound[0].selected = !agentFound[0].selected;
903
+ this.cdr.detectChanges();
904
+ }
905
+ this.cdr.detectChanges();
906
+ }
907
+ areAllSelected() {
908
+ var _a;
909
+ return (_a = this.agents) === null || _a === void 0 ? void 0 : _a.every(agent => !agent.selected);
910
+ }
911
+ getDropdownHeaderText() {
912
+ var _a;
913
+ const selectedAgents = (_a = this.agents) === null || _a === void 0 ? void 0 : _a.filter(agent => agent.selected);
914
+ if (selectedAgents && (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) === 0) {
915
+ return 'All Agents';
916
+ }
917
+ else {
918
+ return (selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length) > 1 ? `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agents Selected` : `${selectedAgents === null || selectedAgents === void 0 ? void 0 : selectedAgents.length} Agent Selected`;
919
+ }
920
+ }
921
+ fetchAgents_http() {
922
+ this.loading = true;
923
+ const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;
924
+ const headers = new HttpHeaders({
925
+ 'Content-Type': 'application/json'
926
+ });
927
+ return this.http.post(url, {}, { headers }).pipe(switchMap((res) => {
928
+ if (res) {
929
+ this.agents = res.map(agent => (Object.assign(Object.assign({}, agent), { selected: false })));
930
+ }
931
+ this.cdr.markForCheck();
932
+ return of(res);
933
+ }), catchError((error) => {
934
+ console.error('Error fetching chatbot config: ', error);
935
+ return of(null);
936
+ }));
937
+ }
938
+ fetchAgents() {
939
+ this.fetchAgents_http()
940
+ .subscribe();
941
+ }
942
+ // events/${eventId}/users-connections
943
+ processMessageForDisplay(markdown) {
944
+ if (!markdown || !(markdown.length > 0)) {
945
+ console.error('Input Markdown is null or empty');
946
+ return '';
947
+ }
948
+ //console.log('Markdown input:', markdown);
949
+ // Convert Markdown headers to HTML headers
950
+ let html = markdown.replace(/^(#{1,6})\s+(.*)$/gm, (match, hashes, text) => {
951
+ const level = hashes.length;
952
+ return `<h${level}>${text}</h${level}>`;
953
+ });
954
+ // console.log('After header conversion:', html);
955
+ // Convert Markdown links to HTML links
956
+ html = html.replace(/\[([^\]]+)]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
957
+ // console.log('After link conversion:', html);
958
+ // Convert Markdown bold to HTML strong
959
+ html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
960
+ //console.log('After bold conversion:', html);
961
+ // Convert new lines to <br> tags
962
+ html = html.replace(/(?:\r\n|\r|\n)/g, '<br>');
963
+ // console.log('After line breaks conversion:', html);
964
+ // Optional: Sanitize the HTML to prevent XSS
965
+ const sanitizedHtml = this.sanitizeHtml(html);
966
+ // console.log('Sanitized HTML:', sanitizedHtml);
967
+ return sanitizedHtml;
968
+ }
969
+ toggleCollapse() {
970
+ this.isCollapsed = !this.isCollapsed;
971
+ this.cdr.detectChanges();
972
+ }
973
+ toggleCollapseGraph() {
974
+ this.isCollapsedForGraph = !this.isCollapsedForGraph;
975
+ this.cdr.detectChanges();
976
+ }
977
+ toggleCollapseFGraph() {
978
+ this.isCollapsedForFGraph = !this.isCollapsedForFGraph;
979
+ this.cdr.detectChanges();
980
+ }
981
+ // Extracts the domain from a URL
982
+ getDomainName(url) {
983
+ try {
984
+ const { hostname } = new URL(url);
985
+ return hostname.replace(/^www\./, ''); // Remove 'www.' if present
986
+ }
987
+ catch (_a) {
988
+ return 'unknown';
989
+ }
990
+ }
991
+ // Generates the favicon URL
992
+ getFaviconUrl(url) {
993
+ const domain = this.getDomainName(url);
994
+ return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;
995
+ }
996
+ onCardClick() {
997
+ this.sourcesDrawer.open();
998
+ const button = document.getElementById('botcloseplaygroundbutton');
999
+ if (button) {
1000
+ button.style.display = 'none';
1001
+ }
1002
+ }
1003
+ onCloseSource() {
1004
+ this.sourcesDrawer.close();
1005
+ this.isDrawerOpen = false;
1006
+ this.cdr.detectChanges(); // Trigger change detection if needed
1007
+ this.onDrawerClosed();
1008
+ }
1009
+ onDrawerClosed() {
1010
+ setTimeout(() => {
1011
+ this.isDrawerOpen = true;
1012
+ this.cdr.detectChanges(); // Trigger change detection if needed
1013
+ // Use ngClass to dynamically apply the class
1014
+ const button = document.getElementById('botcloseplaygroundbutton');
1015
+ if (button) {
1016
+ button.style.display = 'block';
1017
+ }
1018
+ }, 1000);
1019
+ }
1020
+ toggleDrawer(todo) {
1021
+ this.isDrawerOpen = todo;
1022
+ this.cdr.detectChanges();
1023
+ this.updateButtonVisibility();
1024
+ }
1025
+ updateButtonVisibility() {
1026
+ const button = document.getElementById('botcloseplaygroundbutton');
1027
+ if (button) {
1028
+ button.style.display = this.isDrawerOpen ? 'block' : 'none';
1029
+ }
1030
+ }
1031
+ openLinkInNewTab(link) {
1032
+ window.open(link, '_blank');
1033
+ }
1034
+ }
1035
+ ChatDrawerComponent.decorators = [
1036
+ { type: Component, args: [{
1037
+ selector: 'hivegpt-chat-drawer',
1038
+ template: "<mat-drawer-container class=\"hivegpt-chat-wrapper\" [ngClass]=\"{'mat-drawer-container-has-open': isDrawerOpen}\"\r\n [class.ios-device]=\"isIOSDevice\" [hasBackdrop]=\"hasBackdropValue\">\r\n\r\n <mat-drawer class=\"drawer\" #drawer [position]=\"'start'\" [mode]=\"'over'\" opened=\"true\"\r\n [class.full-width-drawer]=\"fullView\" [style.background]=\"\r\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\r\n \">\r\n <mat-drawer-content>\r\n\r\n <div class=\"chat-main\">\r\n <!-- <div class=\"chat-header\">\r\n <h2> -->\r\n <!-- {{eventName}} -->\r\n <!-- </h2> -->\r\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\r\n <span class=\"material-symbols-outlined\">\r\n close\r\n </span>\r\n </button> -->\r\n <!-- </div> -->\r\n\r\n <div class=\"innerChat\" #chatMain>\r\n <div class=\"\">\r\n <div class=\"title\">\r\n <h2><span> {{botName}} <i><svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\r\n fill=\"#E2F6FA\"></path>\r\n <path\r\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\r\n fill=\"url(#paint0_linear_174_9166)\"></path>\r\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\r\n transform=\"rotate(-73.8316 63.725 21.0347)\"\r\n fill=\"url(#paint1_linear_174_9166)\"></rect>\r\n <path\r\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\r\n fill=\"url(#paint2_linear_174_9166)\"></path>\r\n <path\r\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\r\n fill=\"url(#paint3_linear_174_9166)\"></path>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\r\n fill=\"url(#paint4_linear_174_9166)\"></path>\r\n <defs>\r\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"74.6954\" y1=\"9.02441\"\r\n x2=\"74.6954\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#6EC6E3\"></stop>\r\n <stop offset=\"1\" stop-color=\"#5361C7\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"64.8625\" y1=\"21.0347\"\r\n x2=\"64.2597\" y2=\"43.0438\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"white\" stop-opacity=\"0.47\"></stop>\r\n <stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"31.02\" y1=\"9.02441\"\r\n x2=\"31.02\" y2=\"95.3002\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#5F8ED4\"></stop>\r\n <stop offset=\"1\" stop-color=\"#4F54C3\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"54.7875\" y1=\"42.5752\"\r\n x2=\"75.425\" y2=\"71.3377\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#5975CC\"></stop>\r\n <stop offset=\"1\" stop-color=\"#0043A6\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint4_linear_174_9166\" x1=\"40.8125\" y1=\"66.3502\"\r\n x2=\"73.8\" y2=\"66.3502\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#D0F0F7\"></stop>\r\n <stop offset=\"1\" stop-color=\"white\"></stop>\r\n </linearGradient>\r\n </defs>\r\n </svg></i> </span></h2>\r\n <p>AI-powered <span>copilot</span></p>\r\n </div>\r\n <div class=\"chatType\" style=\"display:none\">\r\n <h4 class=\"labelChat\">Choose a conversation style</h4>\r\n <ul>\r\n <li (click)=\"changeTemperature(0)\">\r\n <button [ngClass]=\"{active: temperature === 0}\">\r\n <span class=\"top-section-title\">\r\n More Creative\r\n </span>\r\n </button>\r\n </li>\r\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\r\n <button [ngClass]=\"{active: temperature === 1}\">\r\n <span class=\"top-section-title\">\r\n More Balanced\r\n </span>\r\n </button>\r\n </li>\r\n <li (click)=\"changeTemperature(2)\">\r\n <button [ngClass]=\"{active: temperature === 2}\">\r\n <span class=\"top-section-title\">\r\n More Precise\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <!-- chattype -->\r\n <div class=\"chat bot\" *ngFor=\"let chat of chatLog; let i = index\">\r\n\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n <div class=\"researchingCard\">\r\n <div *ngIf=\"(chat?.searchTerms && chat?.searchTerms.length>0) || (chat?.sourcesList && chat?.sourcesList.length >0)\"\r\n class=\"card-header d-flex align-items-center\" (click)=\"toggleCollapse()\">\r\n <span class=\"icon\"><i class=\"bx bx-plus-circle bx-sm\"></i></span>\r\n <span class=\"ml-2\">Researching <i id=\"toggleIcon\" class=\"toggle-icon ml-2 fa\"\r\n [ngClass]=\"{'fa-chevron-down': isCollapsed,'fa-chevron-up': !isCollapsed }\"></i></span>\r\n\r\n </div>\r\n <div *ngIf=\"chat?.searchTerms && chat?.searchTerms.length>0\"\r\n [ngClass]=\"{'collapse': isCollapsed}\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li *ngFor=\"let term of chat?.searchTerms\" class=\"list-group-item\">Searching for\r\n <strong>{{term}}</strong>\r\n </li>\r\n </ul>\r\n\r\n <h5 class=\"mt-2\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length >0\"><i\r\n class='bx bx-unite'></i> Sources</h5>\r\n <div class=\"sources-container\" *ngIf=\"chat?.sourcesList && chat?.sourcesList.length >0\">\r\n <div class=\"source-card\"\r\n *ngFor=\"let source of chat?.displayedSources; let i = index\">\r\n <div>\r\n <div class=\"source-title\">{{source.title}}</div>\r\n <div class=\"source-url\">\r\n <img class=\"relative block\" [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\">\r\n {{getDomainName(source.link)}}\r\n </div>\r\n <div class=\"popup\">\r\n <div class=\"source-url\" (click)=\"openLinkInNewTab(source.link)\">\r\n <img class=\"relative block\"\r\n [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\">\r\n {{getDomainName(source.link)}}\r\n </div>\r\n <h5 (click)=\"openLinkInNewTab(source.link)\">{{source.title}}\r\n </h5>\r\n <p (click)=\"openLinkInNewTab(source.link)\">{{source.desc}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"chat?.remainingSources && chat?.remainingSources.length > 0\">\r\n <div class=\"source-card\" (click)=\"onCardClick($event)\">\r\n <div>\r\n <div class=\"source-title\"><img\r\n *ngFor=\"let source of chat?.remainingSources; let i = index\"\r\n class=\"relative block\"\r\n [src]=\"getFaviconUrl(source.link)\"\r\n [alt]=\"getDomainName(source.link) + ' favicon'\"></div>\r\n <div class=\"source-url\">\r\n\r\n View {{chat?.remainingSources.length}} more\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\" [ngStyle]=\"{\r\n background:\r\n chat?.type === 'ai' && bgBubbleAi\r\n ? ''\r\n : chat?.type === 'user' && bgBubbleUser\r\n ? ''\r\n : ''\r\n }\">\r\n <p *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\" [ngStyle]=\"{\r\n background:\r\n chat?.type === 'ai' && messageTextColorAi\r\n ? ''\r\n : chat?.type === 'user' && messageTextColorUser\r\n ? ''\r\n : '',\r\n color:\r\n chat?.type === 'ai' && messageTextColorAi\r\n ? ''\r\n : chat?.type === 'user' && messageTextColorUser\r\n ? ''\r\n : ''\r\n }\" [innerHTML]=\"chat?.message\">\r\n </p>\r\n\r\n </div>\r\n <div class=\"exicution mt-2\"\r\n *ngIf=\"showFeedBackIconsIndex === i && chat?.type === 'ai' && (chat?.financialGraphs && chat?.financialGraphs.length >0) \">\r\n <h5 *ngIf=\"chat?.type === 'ai'\"><i class='bx bx-network-chart'></i> Graphs <i\r\n (click)=\"toggleCollapseFGraph()\" class=\"toggle-icon ml-2 fa\"\r\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForFGraph,'fas fa-chevron-up': !isCollapsedForFGraph }\"></i>\r\n </h5>\r\n <img *ngFor=\"let image of chat?.financialGraphs\" class=\"graph-img\"\r\n [ngClass]=\"{'collapse': isCollapsedForFGraph}\" [src]=\"image\" alt=\"\">\r\n </div>\r\n <div class=\"exicution mt-2\"\r\n *ngIf=\"chat?.type === 'ai' && (chat?.executionGraphs && chat?.executionGraphs?.length > 0) \">\r\n <h5 *ngIf=\"chat?.type === 'ai'\"><i class='bx bx-network-chart'></i> Execution Path\r\n Diagram\r\n For Data Visualization Workflow <i (click)=\"toggleCollapseGraph()\"\r\n class=\"toggle-icon ml-2 fa\"\r\n [ngClass]=\"{'fas fa-chevron-down': isCollapsedForGraph,'fas fa-chevron-up': !isCollapsedForGraph }\"></i>\r\n </h5>\r\n <img *ngFor=\"let image of chat?.executionGraphs\" class=\"graph-img\"\r\n [ngClass]=\"{'collapse': isCollapsedForGraph}\" [src]=\"image\" alt=\"\">\r\n </div>\r\n <div class=\"Related mt-2\"\r\n *ngIf=\"showFeedBackIconsIndex === i && (chat?.relatedListItems && chat?.relatedListItems.length > 0)\">\r\n <h5 *ngIf=\"chat?.type === 'ai'\"><i class='bx bx-list-check'></i> Related</h5>\r\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\r\n <ul class=\"list-container\">\r\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\r\n <li (click)=\"fetchDataFor(item)\">{{ item }}</li>\r\n </ng-container>\r\n\r\n </ul>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cta\" *ngIf=\"showFeedBackIconsIndex === i\">\r\n <div class=\"copyBox\" title=\"Copy\" style=\"float: right;\">\r\n <button title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\" class=\"copy\"\r\n [class.active]=\"chat?.copied\" (click)=\"handleCopyClick(i)\">\r\n <i *ngIf=\"chat?.copied\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\r\n fill=\"#566563\" />\r\n </svg>\r\n\r\n </i>\r\n <i *ngIf=\"!chat?.copied\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\r\n fill=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n <button class=\"up copy\" title=\"Like\" [class.active]=\"chat?.liked\"\r\n (click)=\"handleUpClick(i)\">\r\n <i *ngIf=\"chat?.liked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\r\n fill=\"#17235B\" />\r\n <path\r\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\r\n fill=\"#17235B\" />\r\n </svg>\r\n </i>\r\n <i *ngIf=\"!chat?.liked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n <path\r\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n <button class=\"down copy\" title=\"Dislike\" [class.active]=\"chat?.unliked\"\r\n (click)=\"handleDownClick(i)\">\r\n <i *ngIf=\"chat?.unliked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\r\n fill=\"#17235B\" />\r\n\r\n <path\r\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\r\n fill=\"#17235B\" />\r\n </svg>\r\n </i>\r\n\r\n <i *ngIf=\"!chat?.unliked\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n <path\r\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\r\n fill=\"#566563\" stroke=\"#566563\" />\r\n </svg>\r\n </i>\r\n </button>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"time-cta\"\r\n [ngClass]=\"{'time-cta din': showFeedBackIconsIndex===i, 'time-cta': showFeedBackIconsIndex!=i}\">\r\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'ai'\">\r\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n {{ \"Assistant\" }} - {{ chat?.time }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\r\n <img src=\"https://e1cdn.social27.com/digitalevents/chatbot/user-chatbot-icon.svg\">\r\n <div class=\"dateTime\">\r\n You - {{ chat?.time }}\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"cta-faqs quick-prompts-extended\" *ngIf=\"i == 0 && quickPrompts?.length\">\r\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\r\n (click)=\"sendMessageWithTile(tile.prompt)\">\r\n Q: {{ tile.text }}\r\n </div> -->\r\n <div class=\"cta_suggestions\">\r\n <button *ngFor=\"let tile of quickPrompts\" (click)=\"sendMessageWithTile(tile.prompt)\">\r\n <ng-container *ngIf=\"tile\">{{tile.text}}</ng-container>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\r\n <div class=\"chat-box\">\r\n <div class=\"message\">\r\n <p [innerHTML]=\"processMessageForDisplay(botSkills)\"> </p> &nbsp;\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"chat?.suggestions?.length\">\r\n <h4 class=\"labelChat\">Here are some things EventsGPT Copilot can help you do:</h4>\r\n <div class=\"cta_suggestions\">\r\n <button *ngFor=\"let suggestion of chat?.suggestions\"\r\n (click)=\"sendMessageWithTile(suggestion)\">\r\n <ng-container *ngIf=\"suggestion\">{{suggestion}}</ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"chat?.action?.section_id == 'company_search' || chat?.action?.section_id == 'user_search' || chat?.action?.section_id == 'industry_company_search'\">\r\n <div class=\"box\">\r\n <div class=\"tiktokwrapper\">\r\n <div class=\"tiktokshell\" *ngFor=\"let user of chat?.action.users\">\r\n <div class=\"videoPhotobox\">\r\n <ng-conatiner *ngIf=\"user?.photoPath && !user.userVideosModel\">\r\n <img [src]=\"user?.photoPath\">\r\n </ng-conatiner>\r\n <ng-conatiner *ngIf=\"user.userVideosModel\">\r\n <app-video-player *ngIf=\"user?.userVideosModel\" [isDev]=\"isDev\"\r\n [currentUserId]=\"userId\" [videoObj]=\"user?.userVideosModel\"\r\n [user]=\"user\" [eventId]=\"eventId\" type=\"1\">\r\n </app-video-player>\r\n </ng-conatiner>\r\n\r\n </div>\r\n\r\n <div class=\"noPhoto\" *ngIf=\"!user?.photoPath && !user.userVideosModel\">\r\n <h3>{{user.firstName | slice:0:1}}{{user.lastName | slice:0:1}}</h3>\r\n </div>\r\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\">\r\n </div>\r\n <div class=\"onshell-content\">\r\n <div class=\"title-shell\">\r\n <h3>{{user.firstName}} {{user.lastName}}</h3>\r\n <h3 class=\"companyName\">{{user.company}}</h3>\r\n </div>\r\n <div class=\"button-shell\">\r\n <button class=\"Connectbtn\"\r\n (click)=\"connectToUser(user.userId)\">{{canConnect(user.userId) ?\r\n 'Connect' : canDisconnect(user.userId) ? 'Disconnect' : 'Request\r\n Sent'}}</button>\r\n <button class=\"schedulebtn\"\r\n (click)=\"scheduleMeetingWithUser(user)\">Schedule</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"chat?.action?.section_id == myUpcomingSessionAction\">\r\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\r\n <div class=\"list-view\">\r\n <div class=\"session-detail-wrapper card-background-session\"\r\n *ngFor=\"let upcomingSession of chat?.action.content\">\r\n <div class=\"thumbnail \"><img alt=\"Introduction to the Imaging Radar Academy\"\r\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\r\n class=\"\">\r\n <!---->\r\n <!---->\r\n <!----><button class=\"play-btn color-primary \"\r\n title=\"Play Session: Introduction to the Imaging Radar Academy\"><span\r\n class=\"material-icons notranslate \"> play_circle_outline\r\n </span>\r\n <!---->\r\n </button>\r\n <!---->\r\n <!---->\r\n </div>\r\n <!---->\r\n <!---->\r\n <div class=\"content p-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"d-flex flex-column\">\r\n <p class=\"fs-xs mb-0 body-text-color \">\r\n {{upcomingSession.dateTimeRange.start | date:'MM-dd-yyyy\r\n HH:mm':'UTC'}} - {{upcomingSession.dateTimeRange.end |\r\n date:'MM-dd-yyyy HH:mm':'UTC'}} {{upcomingSession.timeZone.id}}\r\n </p>\r\n <!---->\r\n <!---->\r\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\r\n <!---->\r\n </div>\r\n <div class=\"d-flex align-items-center actions px-2\">\r\n <!---->\r\n <button\r\n (click)=\"performSessionAction(upcomingSession.id, 'view-session')\"\r\n class=\"s27-btn-icon body-text-color\"\r\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"><span\r\n class=\"material-icons notranslate\"> remove_red_eye\r\n </span>\r\n </button>\r\n\r\n <button\r\n (click)=\"performSessionAction(upcomingSession.id, 'add-to-agenda')\"\r\n class=\"s27-btn-icon body-text-color \"><span\r\n class=\"material-icons notranslate\"\r\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\">\r\n event_available </span>\r\n </button>\r\n <!---->\r\n <!---->\r\n <!---->\r\n <!---->\r\n\r\n <button (click)=\"performSessionAction(upcomingSession.id, 'play')\"\r\n class=\"s27-btn-icon body-text-color \"\r\n title=\"Copy session link to share\"><span\r\n class=\"material-icons notranslate\"> play_circle_outline\r\n </span>\r\n </button>\r\n <!---->\r\n </div>\r\n </div>\r\n <h2 class=\"body-text-color\">{{upcomingSession.title}}</h2>\r\n <div class=\"session-description color-secondary\"\r\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\">\r\n </div>\r\n <ul class=\"speakers grid-2-cols\"\r\n *ngFor=\"let speakerId of upcomingSession.speakers\">\r\n <li class=\"\">\r\n <div class=\"image \" title=\"Blair Wunderlich\"><img\r\n alt=\"Blair Wunderlich\"\r\n [src]=\"speakers[speakerId]?.photoPath\" class=\"\">\r\n <!---->\r\n <!---->\r\n <!---->\r\n </div>\r\n <!---->\r\n <div class=\"content pl-3 \" style=\"text-transform: none;\">\r\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\r\n {{speakers[speakerId]?.firstName}}\r\n {{speakers[speakerId]?.lastName}}</div>\r\n <div class=\"color-secondary fs-xxs\">\r\n {{speakers[speakerId]?.jobTitle}}</div>\r\n <div class=\"color-secondary fs-xxs\">\r\n {{speakers[speakerId]?.company}}</div>\r\n </div>\r\n <!---->\r\n </li>\r\n </ul>\r\n <!---->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat bot\" *ngIf=\"isChatingWithAi\">\r\n\r\n <div class=\"chat-box\">\r\n <div class=\"o-media__body\">\r\n <div class=\"o-vertical-spacing\">\r\n <h3 class=\"blog-post__headline\">\r\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\r\n </h3>\r\n <p>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-cta\">\r\n <div class=\"Icon_TimeSTamp\">\r\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n {{ \"Assistant\" }} - {{ chat?.time ? chat?.time : (dateTime.now |\r\n date:'shortTime') }}\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"chat bot\" *ngIf=\"loading\">\r\n <div class=\"chat-box\">\r\n <div class=\"o-media__body\">\r\n <div class=\"o-vertical-spacing\">\r\n <h3 class=\"blog-post__headline\">\r\n <span class=\"skeleton-box\" style=\"width:55%;\"></span>\r\n </h3>\r\n <p>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:90%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:83%;\"></span>\r\n <span class=\"skeleton-box\" style=\"width:80%;\"></span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-cta\">\r\n <div class=\"Icon_TimeSTamp\">\r\n <img [src]=\"botIcon\" [alt]=\"botName || 'Assistant'\">\r\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\r\n {{ \"Loading..\" }}\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div #chatMain></div> -->\r\n <div class=\"chatFooterWrapper\">\r\n <div class=\"chat-footer\">\r\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\r\n <div class=\"dropdown-header\">\r\n <span>{{ getDropdownHeaderText() }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\r\n <path d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </div>\r\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\r\n <label (click)=\"onSelectAll()\">\r\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\r\n All\r\n </label>\r\n <label *ngFor=\"let agent of agents\" (click)=\"onAgentChange(agent)\">\r\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\r\n {{ agent.agentName }}\r\n </label>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"border-shape\">\r\n <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\r\n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\r\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\r\n (keyup.enter)=\"handleSubmit()\" #myInput />\r\n\r\n </div>\r\n <div class=\"cta-footer\">\r\n <button class=\"btn cta-chat\" (click)=\"handleSubmit()\"\r\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\r\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\">\r\n <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\"\r\n height=\"1em\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\">\r\n </path>\r\n </svg>\r\n <!-- SEND -->\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"text-left note-section\">\r\n <div class=\"note\">\r\n <i>\r\n <svg width=\"30\" height=\"30\" viewBox=\"0 0 106 105\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M52.8578 104.318C52.8645 104.32 52.8713 104.323 52.878 104.325V104.311C74.7711 96.9781 115.49 69.0948 103.537 16.0875C79.9227 8.17267 59.9557 2.08167 52.878 0.0118542V0C52.8713 0.0019722 52.8645 0.00394726 52.8578 0.00592613C52.851 0.00394726 52.8442 0.0019722 52.8375 0V0.0118542C45.7599 2.08167 25.7928 8.17267 2.17802 16.0875C-9.77459 69.0948 30.9444 96.9781 52.8375 104.311V104.325C52.8442 104.323 52.851 104.32 52.8578 104.318Z\"\r\n fill=\"#E2F6FA\"></path>\r\n <path\r\n d=\"M52.8409 95.3002V9.02441C58.6643 10.7266 75.2028 15.7706 94.7694 22.3286C104.66 66.1922 70.9382 89.2528 52.8409 95.3002Z\"\r\n fill=\"url(#paint0_linear_174_9166)\"></path>\r\n <rect x=\"63.725\" y=\"21.0347\" width=\"2.275\" height=\"29.6903\" rx=\"1.1375\"\r\n transform=\"rotate(-73.8316 63.725 21.0347)\" fill=\"url(#paint1_linear_174_9166)\">\r\n </rect>\r\n <path\r\n d=\"M52.8745 95.3002V9.02441C47.0511 10.7266 30.5127 15.7706 10.9461 22.3286C1.0553 66.1922 34.7772 89.2528 52.8745 95.3002Z\"\r\n fill=\"url(#paint2_linear_174_9166)\"></path>\r\n <path\r\n d=\"M67.1131 34.3431L43.2493 56.165C41.5673 57.7031 41.5085 60.3337 43.1202 61.9454L68.0846 86.9097C69.4975 88.3227 71.7364 88.4762 73.3289 87.2693L89.8566 74.7444C90.8029 74.0273 91.3817 72.9269 91.4364 71.7409L91.7769 64.3639C91.8163 63.5106 91.5814 62.667 91.1067 61.9568L73.138 35.0723C71.7767 33.0355 68.9209 32.6899 67.1131 34.3431Z\"\r\n fill=\"url(#paint3_linear_174_9166)\"></path>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M68.6302 31.8839C69.0923 31.6059 69.6441 31.5177 70.1698 31.6379C70.6955 31.758 71.1542 32.0771 71.4497 32.5282L73.5143 35.6772C73.7834 36.0886 73.8986 36.5818 73.8394 37.0698C73.7803 37.5579 73.5506 38.0093 73.191 38.3445L73.1848 38.3528L73.1556 38.3799L73.0367 38.4905L72.5675 38.9388C69.9711 41.4572 67.4535 44.0555 65.0183 46.7299C60.4366 51.7683 54.9958 58.3624 51.3338 64.7604C50.3119 66.5456 47.8157 66.9293 46.335 65.3882L32.8111 51.3366C32.6173 51.1352 32.466 50.8968 32.3661 50.6357C32.2663 50.3746 32.2199 50.0961 32.2298 49.8168C32.2398 49.5374 32.3057 49.2629 32.4239 49.0095C32.542 48.7562 32.7098 48.5292 32.9175 48.342L37.0049 44.6549C37.3641 44.3311 37.8247 44.1422 38.3078 44.1205C38.7909 44.0988 39.2666 44.2457 39.6534 44.5361L46.554 49.71C57.3335 39.0806 63.4459 35.0016 68.6302 31.8839Z\"\r\n fill=\"#C4C4C4\"></path>\r\n <defs>\r\n <linearGradient id=\"paint0_linear_174_9166\" x1=\"87.9736\" y1=\"7.88186\" x2=\"7.52095\"\r\n y2=\"100.482\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#E8F6F9\"></stop>\r\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint1_linear_174_9166\" x1=\"63.8012\" y1=\"37.3264\" x2=\"66.6714\"\r\n y2=\"24.7281\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#C2E4E7\"></stop>\r\n <stop offset=\"1\" stop-color=\"#F3F8F8\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint2_linear_174_9166\" x1=\"52.8387\" y1=\"30.822\" x2=\"27.7411\"\r\n y2=\"77.8896\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#E8F6F9\"></stop>\r\n <stop offset=\"1\" stop-color=\"#CEFAF9\"></stop>\r\n </linearGradient>\r\n <linearGradient id=\"paint3_linear_174_9166\" x1=\"89.7622\" y1=\"51.5494\" x2=\"73.8328\"\r\n y2=\"68.4825\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stop-color=\"#A0E6E9\"></stop>\r\n <stop offset=\"1\" stop-color=\"#D6F7F9\" stop-opacity=\"0\"></stop>\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n </i>\r\n <span class=\"text\">Your personal or company information is kept private and secure within this\r\n chat?.</span>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n\r\n\r\n\r\n </mat-drawer>\r\n <mat-drawer class=\"drawer\" style=\"width: 45%;\" #sourcesDrawer [position]=\"'end'\" [mode]=\"'over'\" [style.background]=\"'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\r\n \">\r\n <mat-drawer-content>\r\n <div class=\"sourceDraweContainer\">\r\n\r\n <div class=\"container-fluid\">\r\n <button mat-icon-button class=\"closeButtonSource\" (click)=\"onCloseSource()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <h1>{{chat?.sourcesList.length}} Sources</h1>\r\n <!-- <p>Tell me about latest news from Mistral about AI agents announcement done this month</p> -->\r\n <hr />\r\n <ul class=\"sources-list\">\r\n <li *ngFor=\"let item of chat?.sourcesList;let si=index\">\r\n <input type=\"checkbox\" id=\"source1\">\r\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\r\n <label for=\"source1\">\r\n <span class=\"source-title\"><span class=\"ml-1\">{{si+1}}.</span>{{item.title}}</span>\r\n <span class=\"image-container\">\r\n <img class=\"relative block\" [src]=\"getFaviconUrl(item.link)\"\r\n [alt]=\"getDomainName(item.link) + ' favicon'\"> <span>\r\n {{getDomainName(item.link)}}</span>\r\n </span>\r\n <span class=\"source-description\">{{item.desc}}</span>\r\n </label>\r\n </div>\r\n </li>\r\n\r\n </ul>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n </mat-drawer>\r\n</mat-drawer-container>",
1039
+ changeDetection: ChangeDetectionStrategy.OnPush,
1040
+ styles: ["@import url(\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\");::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb,::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-wrapper{background:transparent!important;height:100%;inset:0;opacity:0;position:fixed;visibility:hidden;z-index:999999}.hivegpt-chat-wrapper.mat-drawer-container-has-open{background:transparent!important;opacity:1;transition:all .3s;visibility:visible;z-index:999999}.hivegpt-chat-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-wrapper mat-drawer{background-color:#fafafa!important;background-image:none!important;max-width:800px;width:100%}.hivegpt-chat-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;font-size:36px;font-weight:500;letter-spacing:-.72px;line-height:108%;margin:0;text-transform:uppercase}.hivegpt-chat-wrapper .chat-header .closeIcon{align-items:center;background:transparent;border:none;border-radius:50%;display:inline-flex;font-size:18px;height:35px;justify-content:center;outline:none;padding:0;position:absolute;right:12px;top:16px;width:35px}.hivegpt-chat-wrapper .chat-main{display:flex;flex:1;flex-direction:column;justify-content:space-between;overflow-y:auto;width:100%}.hivegpt-chat-wrapper .chat-main .innerChat{overflow-y:auto;padding:20px 40px 10px;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box{max-width:80%;width:100%}.hivegpt-chat-wrapper .chat-main .chat-box .message{background:hsla(0,0%,94.9%,.7);border-radius:6px 6px 10px 0;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);margin-bottom:10px;margin-top:20px;min-height:60px;padding:18px 20px;position:relative}.hivegpt-chat-wrapper .chat-main .chat-box .message p{color:#111;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;text-align:left;white-space:pre-line}.hivegpt-chat-wrapper .chat-main .chat-box .message p a{color:#17235b!important;cursor:pointer!important;font-weight:700;text-decoration:underline}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta{align-items:end;bottom:-7px;display:inline-flex;gap:10px;grid-gap:10px;position:relative;right:-10px;z-index:5}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-wrapper .chat-main .chat.bot .chat-box .message{border-radius:6px 6px 10px 0}.hivegpt-chat-wrapper .chat-main .chat.user{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box{margin-left:auto}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#8b4ead -10.61%,#761c79 84.59%);border-radius:20px 20px 0 20px;color:#fff}.hivegpt-chat-wrapper .chat-main .chat.user .chat-box .message p{color:#fff;text-align:left}.hivegpt-chat-wrapper .chat-main .chat.user .dateTime{text-align:right}.hivegpt-chat-wrapper .chat-main .chat.user .time-cta{justify-content:flex-end}.hivegpt-chat-wrapper .chat-main .chat .Icon_TimeSTamp{align-content:center;align-items:center;display:flex;justify-content:center}.hivegpt-chat-wrapper .chat-main .chat .dateTime{color:#566563;font-family:Segoe UI,sans-serif;font-size:13px;font-style:normal;font-weight:500;line-height:140%;margin:0 5px}.hivegpt-chat-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-wrapper .chatFooterWrapper{background:#fff;border-radius:6px 6px 0 0!important;margin-top:5px!important;padding:10px 14px}.hivegpt-chat-wrapper .chatFooterWrapper .note{align-items:center;border-radius:6px;color:#1b75bb;display:inline-flex;font-size:11px;gap:8px;line-height:1;margin:0 auto 4px;padding:4px 8px}.hivegpt-chat-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note i svg{height:18px;width:18px}.hivegpt-chat-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:4px 0 0;position:relative}.hivegpt-chat-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-wrapper .chat-footer .form-control::-moz-placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;position:absolute;right:10px;text-align:right}.hivegpt-chat-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;background:transparent!important;border:none;border-radius:0;box-shadow:0 1px 2px 0 rgba(16,24,40,.05);display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-again{background:#17235b;border:1px solid #17235b;color:#fff}.hivegpt-chat-wrapper .cta-faqs{align-items:flex-end;display:flex;flex-direction:column;flex-wrap:wrap;gap:8px;margin-left:auto;max-width:80%;padding:10px 0 0}.hivegpt-chat-wrapper .cta-faqs .cta{background:transparent;border:1px solid #c9a893;border-radius:20px 20px 0 20px;color:#333;cursor:pointer;font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;min-height:44px;padding:12px 20px;text-align:left;text-decoration:none;transition:all .3s;white-space:pre-line}.spinner{align-items:center;display:flex;gap:2px;justify-content:center}.spinner>div{animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both;background-color:#173330;border-radius:100%;display:inline-block;height:5px;width:5px}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.time-cta{align-items:center;display:flex;gap:8px;justify-content:start;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width:767px){.hivegpt-chat-wrapper .chat-main .innerChat{padding:0 24px 10px}.hivegpt-chat-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-wrapper .chat-header .closeIcon{height:28px;right:8px;top:8px;width:28px}.hivegpt-chat-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{align-items:center;background:#17235b;border:#17235b;border-radius:50%;color:#fff;display:inline-flex;font-size:24px;height:50px;justify-content:center;width:50px}textarea{caret-color:#000}.labelChat{font-size:14px;font-weight:400;margin:0 0 10px}.chatType h4{color:#566563;text-align:center}.chatType ul{align-items:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px rgba(0,0,0,.12),0 1.6px 3.6px rgba(0,0,0,.16);display:flex;justify-content:center;list-style:none;margin:0 0 20px;padding:4px}.chatType ul li{flex:1}.chatType ul li button{align-items:center;background:#fff;border:none;border-radius:10px;font-weight:600;min-height:48px;padding:.375rem;text-align:center;text-shadow:1px 0 rgba(0,0,0,.2);width:100%}.chatType ul li button.active{background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);box-shadow:0 1px 2px 0 rgba(16,24,40,.05);color:#fff}.cta_suggestions{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{background:#fff;border:1px solid #174ae4;border-radius:10px;box-shadow:0 1.6px 3.6px 0 rgba(0,0,0,.13),0 .3px .9px 0 rgba(0,0,0,.1);color:#1543cd;font-size:14px;font-weight:600;line-height:1.2;padding:8px 12px;position:relative;text-align:left;transition:all .3s}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.user .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #06f}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.user .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%);color:#fff}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:50px}.title h2{font-size:28px;margin:0 0 10px}.title h2 span{align-items:center;color:#000;display:inline-flex;gap:10px}.title h2 i{color:#06f;font-size:30px;line-height:1}.title h2 i svg{height:30px;width:30px}.title p{font-weight:600;margin:0}.title p span{color:#06f}.agenda-items-wrapper{padding-bottom:15px;padding-top:15px}@media (max-width:576px){.list-view .session-detail-wrapper{border:none;flex-direction:column}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{-webkit-box-orient:vertical;-webkit-line-clamp:1;display:-webkit-box;font-size:20px;margin-bottom:8px;overflow:hidden}.card-background-session .session-description{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:#111!important;display:-webkit-box;font-size:14px;overflow:hidden}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{align-items:center;display:flex;height:160px;justify-content:center;min-width:160px;position:relative;width:160px}.thumbnail img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}@media (max-width:576px){.thumbnail{height:160px;min-height:unset;width:100%}}.thumbnail .play-btn{align-items:center;background-color:transparent;border:0;bottom:0;display:flex;font-size:60px;justify-content:center;left:0;position:absolute;right:0;top:0;width:100%}.thumbnail .play-btn span{font-size:80px;text-shadow:0 0 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{margin-bottom:0;margin-top:10px;padding:0}.speakers li{align-items:unset;display:flex}.speakers li .content{font-size:12px!important}.speakers .image{border-radius:100%;height:40px;min-width:40px;overflow:hidden;width:40px}.speakers img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.grid-2-cols{display:grid;grid-gap:15px;grid-template-columns:calc(55% - 10px) calc(50% - 10px);padding-right:20px}@media (max-width:768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width:575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape{background:#fff;border:1px solid #ced4da;border-radius:4px;min-height:60px;overflow:hidden;padding:0;width:100%}.border-shape .form-control-1{background:none!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.border-shape .form-control-1:focus{box-shadow:none;outline:none}.border-shape .s27-scroll::-webkit-scrollbar{border-radius:30px;width:3px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{display:table;height:275px;margin:10px 0;width:100%}.tiktokwrapper{display:grid;gap:10px;grid-template-columns:repeat(2,1fr);height:100%}.tiktokwrapper .tiktokshell{background:#3d2b8f;border:2px solid #fff;border-radius:5px;box-shadow:0 0 6px #494949;height:100%;min-height:275px;min-width:160px;position:relative;width:100%}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;bottom:0;height:100%;left:0;position:absolute;width:100%;z-index:6}.tiktokwrapper .videoPhotobox{bottom:0;height:272px;left:0;overflow:hidden;position:absolute;width:auto;z-index:6}.tiktokwrapper .videoPhotobox video{-o-object-fit:cover;border-radius:0;cursor:pointer;height:270px;object-fit:cover;outline:0;transition:.3s ease-in-out;width:100%}.tiktokwrapper .videoPhotobox img{-o-object-fit:cover;height:100%;object-fit:cover;width:100%}.tiktokwrapper .playBtn{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;width:40px;z-index:10}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{align-items:center;border:none;cursor:pointer;display:flex;height:40px;justify-content:center;left:0;margin:0 auto;position:absolute;right:0;top:105px;transition:all 1s;z-index:6}.tiktokwrapper .noPhoto h3{color:#fff;font-size:46px}.tiktokwrapper .onshell-content{bottom:10px;left:5px;position:absolute;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;color:#fff;font-size:11px;margin:0 1px;padding:4px 7px;text-transform:capitalize}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#06f,#06f)!important}.skeleton-box{background-color:#dddbdd;display:inline-block;height:1em;overflow:hidden;position:relative}.skeleton-box:after{animation:shimmer 5s infinite;background-image:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.2) 20%,hsla(0,0%,100%,.5) 60%,hsla(0,0%,100%,0));bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:translateX(-100%)}@keyframes shimmer{to{transform:translateX(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{color:#6b6b6b;font-size:.85em}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{fill:#566563;height:18px;width:18px}.copyBox{background:hsla(0,0%,100%,.7019607843);border-radius:13px;box-shadow:0 .3px .9px rgba(0,0,0,.1215686275),0 1.6px 3.6px rgba(0,0,0,.1607843137);color:#566563;display:flex;gap:12px;padding:5px 10px;position:relative;width:105px}.copyBox button{background:transparent;border:none;color:#566563;cursor:pointer;padding:0;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{align-items:center;background-color:#f5f5f5;border-top:1px solid #ccc;flex-direction:column;justify-content:center;padding:10px}.chat-footer{align-items:center;background:#fff;border-radius:5px;display:flex;margin-bottom:10px;padding:10px;width:100%}.dropdown-wrapper{margin-right:10px;position:relative}.dropdown-header{align-items:center;background:#ebebeb;border-radius:4px;color:#414141!important;cursor:pointer;display:flex;font-size:1rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px rgba(0,0,0,.1);display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:160px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;font-size:16px;padding:5px 15px}.dropdown-menu label input{height:16px;width:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{border:1px solid #ddd;border-radius:5px;padding:10px;width:100%}.cta-footer{align-items:center;display:flex}.btn.cta-chat{background-color:#007bff;border:none;border-radius:5px;color:#fff;cursor:pointer;padding:10px 15px}.btn.cta-chat svg{vertical-align:middle}.text-left .note-section{align-items:center;background:#fff;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1);display:flex;margin-top:10px;max-width:800px;padding:10px;width:100%}.text-left .note{align-items:center;color:#555;display:flex}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{background:#fffefe;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px rgba(0,0,0,.1);margin-bottom:10px;overflow:hidden;width:18rem}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{background-color:#f8f9fa;color:#6c757d;padding:10px;text-align:center}.list-container{list-style:none;padding:0}.list-container li{border-bottom:1px solid #ccc;font-size:12px;margin-bottom:5px;padding:5px}.list-container li:hover{color:#06f;cursor:pointer}.collapsible-container{margin-bottom:5px;overflow:hidden;width:100%}.collapsible-header{cursor:pointer;display:flex;padding:15px}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{background-color:#f8f9fa;color:#333;padding:15px;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:20px auto}.card-header{-moz-user-select:none;-webkit-user-select:none;background:none;border-bottom:0;cursor:pointer;padding:0;user-select:none}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.list-group-item{font-size:14px}.sources-container{align-items:flex-start;display:flex;gap:15px}.source-card{background-color:#f0f3f5;border-radius:10px;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;padding:15px;position:relative;transition:box-shadow .3s ease;width:100%}.popup{background-color:#fff;border-radius:5px;box-shadow:0 4px 8px rgba(0,0,0,.2);left:50%;opacity:0;padding:10px;position:absolute;top:100%;transform:translateX(-50%) translateY(-10px);transition:opacity .3s ease,transform .3s ease;visibility:hidden;white-space:normal;width:100%;z-index:10}.popup h5{font-size:14px;font-weight:600;line-height:1.2;margin:5px 0 10px}.popup p{font-size:12px;line-height:1.4;margin:0}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{color:#000;text-decoration:none}.popup .source-url:hover{color:#007bff;cursor:pointer;text-decoration:underline}.source-card:hover .popup{opacity:1;transform:translateX(-50%) translateY(-15px);visibility:visible}.source-card:hover{box-shadow:0 4px 8px rgba(0,0,0,.1);transform:scale(1.05)}.source-title{-webkit-box-orient:vertical;-webkit-line-clamp:2;display:-webkit-box;font-size:14px;font-weight:500;height:55px;line-height:1.5;overflow:hidden;text-align:left;text-overflow:ellipsis}.source-title img{margin-left:10px;width:20px}.source-url{align-items:center;color:#6c757d;display:flex;font-size:12px;text-align:left}.source-url img{border-radius:50%;height:16px;margin-right:5px;width:16px}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{align-items:flex-start;display:flex;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{flex-shrink:0;margin-right:15px;margin-top:8px}.sourceDraweContainer .source-content{background-color:#f5f2f2;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,.1);cursor:pointer;flex:1;padding:12px}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{display:block;font-size:1rem;font-weight:500;height:auto!important;margin-bottom:4px}.sourceDraweContainer .source-description{display:block;font-size:.875rem}.sourceDraweContainer .image-container{align-items:center;display:flex;margin:10px 0}.sourceDraweContainer .image-container img{-o-object-fit:cover;border:1px solid #ddd;border-radius:50%;height:16px;margin-right:5px;object-fit:cover;width:16px}.sourceDraweContainer .image-container span{color:#555;font-size:13px}.closeButtonSource{background:none!important;border-color:transparent!important;box-shadow:none!important;color:inherit;cursor:pointer;float:right;margin-top:20px;transition:color .2s ease-in-out}.closeButtonSource.closeplaygroundbutton{display:none!important}.graph-img{width:100%}"]
1041
+ },] }
1042
+ ];
1043
+ ChatDrawerComponent.ctorParameters = () => [
1044
+ { type: ChangeDetectorRef },
1045
+ { type: HttpClient },
1046
+ { type: DomSanitizer },
1047
+ { type: ElementRef },
1048
+ { type: Renderer2 },
1049
+ { type: SocketService },
1050
+ { type: ConversationService }
1051
+ ];
1052
+ ChatDrawerComponent.propDecorators = {
1053
+ chatMain: [{ type: ViewChild, args: ['chatMain',] }],
1054
+ closePlaygroundButtons: [{ type: ViewChildren, args: ['closeplaygroundbutton',] }],
1055
+ drawer: [{ type: ViewChild, args: ['drawer',] }],
1056
+ sourcesDrawer: [{ type: ViewChild, args: ['sourcesDrawer',] }],
1057
+ myTextarea: [{ type: ViewChild, args: ['myTextarea', { static: false },] }],
1058
+ copilotName: [{ type: Input }],
1059
+ firstName: [{ type: Input }],
1060
+ lastName: [{ type: Input }],
1061
+ apiKey: [{ type: Input }],
1062
+ bgBubbleAi: [{ type: Input }],
1063
+ bgBubbleUser: [{ type: Input }],
1064
+ bgGradient: [{ type: Input }],
1065
+ botName: [{ type: Input }],
1066
+ botSkills: [{ type: Input }],
1067
+ botId: [{ type: Input }],
1068
+ closeButtonColor: [{ type: Input }],
1069
+ closeButtonbgColor: [{ type: Input }],
1070
+ credentials: [{ type: Input }],
1071
+ dateTimeColor: [{ type: Input }],
1072
+ dateTextColor: [{ type: Input }],
1073
+ eventId: [{ type: Input }],
1074
+ s27UserToken: [{ type: Input }],
1075
+ eventName: [{ type: Input }],
1076
+ botIcon: [{ type: Input }],
1077
+ formFieldBgColor: [{ type: Input }],
1078
+ formFieldTextColor: [{ type: Input }],
1079
+ fullView: [{ type: Input }],
1080
+ gradientColors: [{ type: Input }],
1081
+ greeting: [{ type: Input }],
1082
+ messageTextColorAi: [{ type: Input }],
1083
+ messageTextColorUser: [{ type: Input }],
1084
+ rules: [{ type: Input }],
1085
+ sendButtonColor: [{ type: Input }],
1086
+ sendButtonTextColor: [{ type: Input }],
1087
+ showClose: [{ type: Input }],
1088
+ thumbsDownMessages: [{ type: Input }],
1089
+ thumbsUpMessage: [{ type: Input }],
1090
+ timezone: [{ type: Input }],
1091
+ unknownResponses: [{ type: Input }],
1092
+ useOpenAi: [{ type: Input }],
1093
+ userId: [{ type: Input }],
1094
+ isDev: [{ type: Input }],
1095
+ againButtonColor: [{ type: Input }],
1096
+ againButtonTextColor: [{ type: Input }],
1097
+ feedbackEvent: [{ type: Output }],
1098
+ onCloseEvent: [{ type: Output }],
1099
+ openPage: [{ type: Output }],
1100
+ sessionActions: [{ type: Output }],
1101
+ closeBot: [{ type: Output }],
1102
+ connectWithUser: [{ type: Output }],
1103
+ scheduleMeeting: [{ type: Output }]
1104
+ };
1105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L2hpdmVHUFQtQUktcGFja2FnZXMvSGl2ZUFJLVBhY2thZ2VzL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9EQUFvRDtBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFTMUQsTUFBTSxPQUFPLG1CQUFtQjtJQXdGOUIsWUFDVSxHQUFzQixFQUN0QixJQUFnQixFQUNoQixTQUF1QixFQUN2QixVQUFzQixFQUN0QixRQUFtQixFQUNuQixhQUE0QixFQUM1QixtQkFBd0M7SUFDaEQsNkJBQTZCOztRQVBy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dUJBQ04sTUFBTTs2QkFDTixNQUFNO3VCQUNOLE1BQU07OEJBQ04sTUFBTTs4QkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERyYXdlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBmb3JtYXROb3csIGZvcm1hdFRpbWVTdGFtcHMgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IGRldl9lbnZpcm9ubWVudCwgcHJvZF9lbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IENvbnZlcnNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb252ZXJzYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU29ja2V0U2VydmljZSB9IGZyb20gJy4uL3NvY2tldC1zZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaGl2ZWdwdC1jaGF0LWRyYXdlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jaGF0LWRyYXdlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hhdERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnY2hhdE1haW4nKSBwcml2YXRlIGNoYXRNYWluOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2Nsb3NlcGxheWdyb3VuZGJ1dHRvbicpIGNsb3NlUGxheWdyb3VuZEJ1dHRvbnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuICBAVmlld0NoaWxkKCdkcmF3ZXInKSBkcmF3ZXIhOiBNYXREcmF3ZXI7XHJcbiAgQFZpZXdDaGlsZCgnc291cmNlc0RyYXdlcicpIHNvdXJjZXNEcmF3ZXIhOiBNYXREcmF3ZXI7XHJcbiAgcHJpdmF0ZSBib2R5T3ZlcmZsb3dDbGFzcyA9ICdib2R5LW92ZXJmbG93LWhpZGRlbic7XHJcbiAgQFZpZXdDaGlsZCgnbXlUZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIG15VGV4dGFyZWEhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+OyAvLyBSZWZlcmVuY2UgdG8gdGhlIHRleHRhcmVhXHJcbiAgaXNDb2xsYXBzZWRUcnVlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY29waWxvdE5hbWU6IHN0cmluZyA9IFwiSGl2ZVhHUFRcIjtcclxuICBASW5wdXQoKSBmaXJzdE5hbWUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbGFzdE5hbWUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYXBpS2V5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJnQnViYmxlQWkhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYmdCdWJibGVVc2VyITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJnR3JhZGllbnQhOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBib3ROYW1lITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJvdFNraWxscyE6IHN0cmluZztcclxuICBASW5wdXQoKSBib3RJZCE6IHN0cmluZztcclxuICBASW5wdXQoKSBjbG9zZUJ1dHRvbkNvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNsb3NlQnV0dG9uYmdDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBjcmVkZW50aWFscyE6IFtdO1xyXG4gIEBJbnB1dCgpIGRhdGVUaW1lQ29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGF0ZVRleHRDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBldmVudElkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHMyN1VzZXJUb2tlbiE6IHN0cmluZztcclxuICBASW5wdXQoKSBldmVudE5hbWUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYm90SWNvbiE6IHN0cmluZztcclxuICBASW5wdXQoKSBmb3JtRmllbGRCZ0NvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGZvcm1GaWVsZFRleHRDb2xvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBmdWxsVmlldyE6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZ3JhZGllbnRDb2xvcnMhOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBncmVldGluZyE6IHN0cmluZztcclxuICBASW5wdXQoKSBtZXNzYWdlVGV4dENvbG9yQWkhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWVzc2FnZVRleHRDb2xvclVzZXIhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcnVsZXMhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2VuZEJ1dHRvbkNvbG9yITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNlbmRCdXR0b25UZXh0Q29sb3IhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd0Nsb3NlITogYm9vbGVhbjtcclxuICBASW5wdXQoKSB0aHVtYnNEb3duTWVzc2FnZXMhOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSB0aHVtYnNVcE1lc3NhZ2UhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdGltZXpvbmUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdW5rbm93blJlc3BvbnNlcyE6IFtdO1xyXG4gIEBJbnB1dCgpIHVzZU9wZW5BaSE6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgdXNlcklkITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzRGV2ITogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgYWdhaW5CdXR0b25Db2xvciE6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIGFnYWluQnV0dG9uVGV4dENvbG9yITogc3RyaW5nW107XHJcbiAgQE91dHB1dCgpIGZlZWRiYWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25DbG9zZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBvcGVuUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZXNzaW9uQWN0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjbG9zZUJvdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjb25uZWN0V2l0aFVzZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2NoZWR1bGVNZWV0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIGF1dG9nZW5LZXkgPSBcIkF1dG9nZW5fZURKVHRFVS1OQjBSdElwenExd1wiXHJcbiAgYWRkVG9NeUFnZW5kYUFjdGlvbiA9IFwiYWRkX3RvX215X2FnZW5kYVwiO1xyXG4gIG15VXBjb21pbmdTZXNzaW9uQWN0aW9uID0gXCJteV91cGNvbW1pbmdfc2Vzc2lvblwiO1xyXG4gIGNvbm5lY3RPckZvbGxvd0FjdGlvbiA9IFwiY29ubmVjdF9vcl9mb2xsb3dcIjtcclxuICBhaVJlc3BvbnNlOiBzdHJpbmcgPSAnJztcclxuICBjaGF0TG9nOiBhbnlbXSA9IFtdO1xyXG4gIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICBmZWVkYmFja0RvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBncmVldGluZ01zZzogc3RyaW5nID0gJyc7XHJcbiAgaGFzQmFja2Ryb3BWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlucHV0OiBzdHJpbmcgPSAnJztcclxuICBsaXN0ZW5lckFkZGVkID0gZmFsc2U7XHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1vZGU6IHN0cmluZyA9ICdvdmVyJztcclxuICBxdWlja1Byb21wdHM6IGFueVtdID0gW107XHJcbiAgdGh1bWJzRG93bk1zZ0luZGV4ID0gMDtcclxuICB1c2VyTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgc2hvd1N0YXJ0QWdhaW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0lPU0RldmljZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dGZWVkQmFja0ljb25zSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHRlbXBlcmF0dXJlOiBudW1iZXIgPSAxO1xyXG4gIHNwZWFrZXJzID0gW107XHJcbiAgZW52aXJvbm1lbnQ6IHtcclxuICAgIFVTRVJTX0FQSSxcclxuICAgIEJBU0VfVVJMLFxyXG4gICAgQUdFTlRTX0FQSVxyXG4gIH07XHJcbiAgcGVuZGluZ1JlcXVlc3RzOiBhbnk7XHJcbiAgbXlDb25uZWN0aW9uczogYW55O1xyXG4gIGNvbnZlcnNhdGlvbktleTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHNvY2tldFNlcnZpY2U6IFNvY2tldFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbnZlcnNhdGlvblNlcnZpY2U6IENvbnZlcnNhdGlvblNlcnZpY2VcclxuICAgIC8vIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNoYXRNYWluID0gbmV3IEVsZW1lbnRSZWYobnVsbCk7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMucGxhdGZvcm0uSU9TKSB7XHJcbiAgICAvLyAgIHRoaXMuaXNJT1NEZXZpY2UgPSB0cnVlO1xyXG4gICAgLy8gfVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuaXNEZXYgPyBkZXZfZW52aXJvbm1lbnQgOiBwcm9kX2Vudmlyb25tZW50O1xyXG5cclxuICAgIC8vIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XHJcbiAgICAvLyB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VUZW1wZXJhdHVyZSh0aGlzLnRlbXBlcmF0dXJlKTtcclxuICAgIHRoaXMuZmV0Y2hCb3RDb25maWcoKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICAgICAgdGhpcy5mZXRjaENoYXRIaXN0b3J5KCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm1hcENoYXRIaXN0b3J5KHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3Rvcnk6JywgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLmZldGNoQWdlbnRzKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVNvY2tldCgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGVuU29ja2V0cygpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBldmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGluaXRpYWxpemVTb2NrZXQoKSB7XHJcbiAgICA7XHJcbiAgICBjb25zdCBjb252ZXJzYXRpb25faWQgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQpO1xyXG5cclxuICAgIHRoaXMuc29ja2V0U2VydmljZS5yZWdpc3RlclVzZXJTcGVjaWZpY0hpdmVTb2NrZXQodGhpcy5ib3RJZCwgY29udmVyc2F0aW9uX2lkKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmlwdGlvbk5ldzogYW55O1xyXG4gIHNvY2tldERhdGE6IGFueTtcclxuXHJcbiAgbGlzdGVuU29ja2V0cygpIHtcclxuICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2VcclxuICAgICAgLmdldFVzZXJTcGVjaWZpY05vdGlmaWNhdGlvbigpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlcykgPT4ge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgT3RoZXJGaWVsZHMgZXhpc3RzIGluIHRoZSByZXNwb25zZVxyXG4gICAgICAgICAgaWYgKHJlcz8ubT8uT3RoZXJGaWVsZHMpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZCxcclxuICAgICAgICAgICAgICBib3RfaWQsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZV9pZCxcclxuICAgICAgICAgICAgICBhbnN3ZXIsXHJcbiAgICAgICAgICAgICAgd2ViX3Jlc3VsdHMsXHJcbiAgICAgICAgICAgICAgZmluYW5jaWFsX2dyYXBocyxcclxuICAgICAgICAgICAgICBleGVjdXRpb25fZ3JhcGhzLFxyXG4gICAgICAgICAgICAgIG9ubGluZV9zZWFyY2hfdGVybXMsXHJcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNcclxuICAgICAgICAgICAgfSA9IHJlcz8ubT8uT3RoZXJGaWVsZHM7XHJcblxyXG4gICAgICAgICAgICB2YXIgY3VycmVudENoYXRNZXNzYWdlID0gdGhpcy5jaGF0TG9nLmZpbmQocCA9PiBwLl9pZCA9PSBtZXNzYWdlX2lkKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY3VycmVudENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgICAgX2lkOiBtZXNzYWdlX2lkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKGN1cnJlbnRDaGF0TWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgZmllbGRzIGJhc2VkIG9uIHRoZWlyIHByZXNlbmNlXHJcbiAgICAgICAgICAgIGlmIChvbmxpbmVfc2VhcmNoX3Rlcm1zICYmIEFycmF5LmlzQXJyYXkob25saW5lX3NlYXJjaF90ZXJtcykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnT25saW5lIFNlYXJjaCBUZXJtczonLCBvbmxpbmVfc2VhcmNoX3Rlcm1zKTtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc2VhcmNoVGVybXMgPSBvbmxpbmVfc2VhcmNoX3Rlcm1zO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2ViX3Jlc3VsdHMgJiYgQXJyYXkuaXNBcnJheSh3ZWJfcmVzdWx0cykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2ViIFJlc3VsdHM6Jywgd2ViX3Jlc3VsdHMpO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5zb3VyY2VzTGlzdCA9IHdlYl9yZXN1bHRzO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5kaXNwbGF5ZWRTb3VyY2VzID0gd2ViX3Jlc3VsdHM/LnNsaWNlKDAsIDMpOyAvLyBGaXJzdCAzIGNhcmRzXHJcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnJlbWFpbmluZ1NvdXJjZXMgPSB3ZWJfcmVzdWx0cz8uc2xpY2UoMyk7IC8vIFJlbWFpbmluZyBpdGVtc1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGFuc3dlcikge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Fuc3dlcjonLCBhbnN3ZXIpO1xyXG5cclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGFuc3dlcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmluYW5jaWFsX2dyYXBocyAmJiBBcnJheS5pc0FycmF5KGZpbmFuY2lhbF9ncmFwaHMpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmFuY2lhbCBHcmFwaHM6JywgZmluYW5jaWFsX2dyYXBocyk7XHJcbiAgICAgICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLmZpbmFuY2lhbEdyYXBocyA9IGZpbmFuY2lhbF9ncmFwaHM7XHJcbiAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChleGVjdXRpb25fZ3JhcGhzICYmIEFycmF5LmlzQXJyYXkoZXhlY3V0aW9uX2dyYXBocykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXhlY3V0aW9uIEdyYXBoczonLCBleGVjdXRpb25fZ3JhcGhzKTtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuZXhlY3V0aW9uR3JhcGhzID0gZXhlY3V0aW9uX2dyYXBocztcclxuICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zICYmIEFycmF5LmlzQXJyYXkoc3VnZ2VzdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Z2dlc3Rpb25zOicsIHN1Z2dlc3Rpb25zKTtcclxuICAgICAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UucmVsYXRlZExpc3RJdGVtcyA9IHN1Z2dlc3Rpb25zO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgIC8vIFByb2Nlc3Mgb25saW5lIHNlYXJjaCB0ZXJtcyBhcyBuZWVkZWRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQWRkIGFueSBvdGhlciBmaWVsZHMgYW5kIHRoZWlyIHByb2Nlc3NpbmcgaGVyZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPdGhlckZpZWxkcyBpcyBtaXNzaW5nIGluIHRoZSByZXNwb25zZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ldmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZmV0Y2hpbmcgZGF0YSBmcm9tIHNvY2tldCcsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVNvY2tldEFuZExpc3RlbigpIHtcclxuXHJcbiAgfVxyXG4gIGhhbmRsZUV2ZW50KGRhdGE6IGFueSwgdHlwZTogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnd2VicmVzdWx0JzpcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Fuc3dlcic6XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdncmFwaCc6XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmV2ZW50U3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIC8vdGhpcy5zb2NrZXRTZXJ2aWNlLmNsb3NlKCk7XHJcbiAgfVxyXG4gIGNoYW5nZVRlbXBlcmF0dXJlKG5ld1RlbXBlcmF0dXJlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcclxuICAgIHRoaXMudGVtcGVyYXR1cmUgPSBuZXdUZW1wZXJhdHVyZTtcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGl2ZWdwdC1jaGF0LXdyYXBwZXInKVxyXG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHRoZW1lIGNsYXNzZXMgZnJvbSBib2R5XHJcbiAgICB3cmFwcGVyPy5jbGFzc0xpc3QucmVtb3ZlKCdjcmVhdGl2ZScsICdiYWxhbmNlZCcsICdwcmVjaXNlJyk7XHJcblxyXG4gICAgc3dpdGNoIChuZXdUZW1wZXJhdHVyZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgnY3JlYXRpdmUnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ2JhbGFuY2VkJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdwcmVjaXNlJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblN0YXJ0QWdhaW4oKSB7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XHJcbiAgICB0aGlzLnNob3dTdGFydEFnYWluID0gZmFsc2U7XHJcbiAgICB0aGlzLmNoYXRMb2cgPSBbXTtcclxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgbWVzc2FnZTpcclxuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnIHx8XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzTWVzc2FnZShcclxuICAgICAgICAgIFwiR3JlZXRpbmdzISBJJ20geW91ciBDT1AyOCB2aXJ0dWFsIGFzc2lzdGFudC4gSGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGV2ZW50PyBJJ20gaGVyZSB0byBoZWxwLlwiXHJcbiAgICAgICAgKSxcclxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFyY2hpZXZlTWVzc2FnZXMoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGFyY2hpZXZlTWVzc2FnZXMoKSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3QvY2xlYXItaGlzdG9yeS8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IGhlYWRlcnMgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBvZihyZXMpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hCb3RDb25maWcoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90cz9ib3RfaWQ9JHt0aGlzLmJvdElkfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmJvdE5hbWUgPSByZXMuTmFtZTtcclxuICAgICAgICB0aGlzLmJvdEljb24gPSByZXMuSWNvbjtcclxuICAgICAgICB0aGlzLmJvdFNraWxscyA9IHJlcz8uU2tpbGxzO1xyXG4gICAgICAgIHRoaXMuZ3JlZXRpbmdNc2cgPSByZXMuR3JlZXRpbmc7XHJcblxyXG4gICAgICAgIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzID0gcmVzPy5OZWdhdGl2ZVJlc3BvbnNlcz8ubGVuZ3RoXHJcbiAgICAgICAgICA/IHJlcy5OZWdhdGl2ZVJlc3BvbnNlc1xyXG4gICAgICAgICAgOiBbXHJcbiAgICAgICAgICAgIFwiV2UgYXJlIHNvcnJ5IHdlJ3ZlIG5vdCBiZWVuIGFibGUgdG8gYW5zd2VyIHlvdXIgcXVlc3Rpb24uPGJyLz4gSG93ZXZlciwgb3VyIGRlZGljYXRlZCBzdXBwb3J0IHRlYW0gaXMgaGFwcHkgdG8gaGVscC4gPHNwYW4gY2xhc3M9J2ZlZWRiYWNrLWxpbmsnIHN0eWxlPSdjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogIzE3MjM1QjsnPlBsZWFzZSBjbGljayBoZXJlPC9zcGFuPiBhbmQgYSBodW1hbiBhZ2VudCB3aWxsIGFzc2lzdCB5b3UgYXMgc29vbiBhcyBwb3NzaWJsZVwiLFxyXG4gICAgICAgICAgXTtcclxuICAgICAgICB0aGlzLnF1aWNrUHJvbXB0cyA9IHJlcy5RdWlja1Byb21wdHM7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXRib3QgY29uZmlnOiAnLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZldGNoQ2hhdEhpc3RvcnkoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbnZlcnNhdGlvbktleSA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkodGhpcy5ib3RJZCk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25LZXl9YDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnYWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgaGVhZGVycyB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3I8YW55PignZmV0Y2hDb252ZXJzYXRpb24nKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUVycm9yPFQ+KG9wZXJhdGlvbiA9ICdvcGVyYXRpb24nLCByZXN1bHQ/OiBUKSB7XHJcbiAgICByZXR1cm4gKGVycm9yOiBhbnkpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xyXG4gICAgICByZXR1cm4gb2YocmVzdWx0IGFzIFQpO1xyXG4gICAgfTtcclxuICB9XHJcbiAgLy8gZmV0Y2hDaGF0SGlzdG9yeSgpIHtcclxuICAvLyAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAvLyAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAvLyAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5odHRwXHJcbiAgLy8gICAgIC5nZXQoYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uS2V5fWAsIHsgaGVhZGVycyB9KVxyXG4gIC8vICAgICAucGlwZShcclxuICAvLyAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAvLyAgICAgICAgIHJldHVybiBvZihyZXMpO1xyXG4gIC8vICAgICAgIH0pLFxyXG4gIC8vICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcclxuICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTogJywgZXJyb3IpO1xyXG4gIC8vICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgLy8gICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgLy8gICAgICAgfSlcclxuICAvLyAgICAgKTtcclxuICAvLyB9XHJcblxyXG4gIG1hcENoYXRIaXN0b3J5KGNoYXRzOiBhbnkpIHtcclxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgbWVzc2FnZTpcclxuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnIHx8XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzTWVzc2FnZShcclxuICAgICAgICAgIFwiR3JlZXRpbmdzISBJJ20geW91ciBDT1AyOCB2aXJ0dWFsIGFzc2lzdGFudC4gSGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIGV2ZW50PyBJJ20gaGVyZSB0byBoZWxwLlwiXHJcbiAgICAgICAgKSxcclxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgfSk7XHJcbiAgICBpZiAoY2hhdHMgJiYgY2hhdHM/Lk1lc3NhZ2VzPy5sZW5ndGgpIHtcclxuICAgICAgY2hhdHM/Lk1lc3NhZ2VzLmZvckVhY2goKGNoYXQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjaGF0LlR5cGUgPT0gXCJ1c2VyXCIpIHtcclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ3VzZXInLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShjaGF0LlRleHQpLFxyXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIGNoYXQuSW5zZXJ0VGltZXN0YW1wKSxcclxuICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaGF0LlR5cGUgPT0gXCJhaVwiKSB7XHJcbiAgICAgICAgICB2YXIgc291cmNlc0xpc3QgPSBjaGF0LldlYkxpbmtzIHx8IFtdO1xyXG4gICAgICAgICAgdmFyIGRpc3BsYXllZFNvdXJjZXMgPSBjaGF0LldlYkxpbmtzLnNsaWNlKDAsIDMpOyAvLyBGaXJzdCAzIGNhcmRzXHJcbiAgICAgICAgICB2YXIgcmVtYWluaW5nU291cmNlcyA9IGNoYXQuV2ViTGlua3Muc2xpY2UoMyk7IC8vIFJlbWFpbmluZyBpdGVtc1xyXG5cclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KSxcclxuICAgICAgICAgICAgZXhlY3V0aW9uR3JhcGhzOiBjaGF0LkV4ZWN1dGlvbkdyYXBocyxcclxuICAgICAgICAgICAgc2VhcmNoVGVybXM6IGNoYXQuU2VhcmNoVGVybXMsXHJcbiAgICAgICAgICAgIHNvdXJjZXNMaXN0OiBzb3VyY2VzTGlzdCxcclxuICAgICAgICAgICAgZGlzcGxheWVkU291cmNlczogZGlzcGxheWVkU291cmNlcyxcclxuICAgICAgICAgICAgcmVtYWluaW5nU291cmNlczogcmVtYWluaW5nU291cmNlcyxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFNhZmVIdG1sIHtcclxuICAgIGlmICghbWVzc2FnZSB8fCAhKG1lc3NhZ2U/Lmxlbmd0aCA+IDApKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnaGVyZSBpcyBteSBtZXNzYWdlJylcclxuICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xyXG5cclxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnRyaW0oKTtcclxuXHJcbiAgICBjb25zdCBtYXJrZG93bkxpbmtSZWdleCA9IC9cXFsoW15bXSspXVxcKChbXildKylcXCkvZztcclxuICAgIGNvbnN0IHVybFJlZ2V4ID0gLyg/PCFocmVmPVwiKVxcYmh0dHBzPzpcXC9cXC9cXFMrKD88IVsuLF0pL2dpO1xyXG5cclxuICAgIGlmIChtYXJrZG93bkxpbmtSZWdleC50ZXN0KG1lc3NhZ2UpKSB7XHJcbiAgICAgIGNvbnN0IGh0bWwgPSBtZXNzYWdlLnJlcGxhY2UoXHJcbiAgICAgICAgbWFya2Rvd25MaW5rUmVnZXgsXHJcbiAgICAgICAgJzxhIGhyZWY9XCIkMlwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPidcclxuICAgICAgKTtcclxuICAgICAgLy9jb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVybFJlZ2V4LnRlc3QobWVzc2FnZSkpIHtcclxuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcclxuICAgICAgICB1cmxSZWdleCxcclxuICAgICAgICAnPGEgaHJlZj1cIiQmXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JCY8L2E+J1xyXG4gICAgICApO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnU2FuaXRpemVkIG1lc3NhZ2U6ICcsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csICc8YnI+Jyk7XHJcblxyXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcclxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyB0byBIVE1MIGhlYWRlcnNcclxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoL14oI3sxLDZ9KVxccysoLiopJC9nbSwgKG1hdGNoLCBoYXNoZXMsIHRleHQpID0+IHtcclxuICAgICAgY29uc3QgbGV2ZWwgPSBoYXNoZXMubGVuZ3RoO1xyXG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIGNvbnN0IHNhbml0aXplZE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplSHRtbChtZXNzYWdlKTtcclxuICAgIHJldHVybiBzYW5pdGl6ZWRNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgY29uc3QgZmVlZGJhY2tMaW5rcyA9XHJcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5mZWVkYmFjay1saW5rJyk7XHJcbiAgICBmZWVkYmFja0xpbmtzLmZvckVhY2goKGxpbms6IGFueSkgPT4ge1xyXG4gICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2NsaWNrJyxcclxuICAgICAgICB0aGlzLm9uRmVlZGJhY2tDbGljay5iaW5kKHRoaXMsICd6ZW5kZXNrJylcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgLy8gaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjay1saW5rJykpIHtcclxuICAgIC8vICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgIC8vICAgICAucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrLWxpbmsnKVxyXG4gICAgLy8gICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBzYW5pdGl6ZUh0bWwoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xyXG4gIH1cclxuXHJcbiAgb25GZWVkYmFja0NsaWNrKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZmVlZGJhY2tFdmVudC5lbWl0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2UoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xyXG4gICAgdGhpcy5vbkNsb3NlRXZlbnQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgc2VuZE1lc3NhZ2VXaXRoVGlsZShwcm9tcHQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5pbnB1dCA9IHByb21wdDtcclxuICAgIHRoaXMuZmV0Y2hEYXRhKCk7XHJcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgfVxyXG4gIGlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG4gIGZldGNoRGF0YSgpIHtcclxuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmlucHV0Py50cmltKCk7XHJcbiAgICBpZiAoIXRoaXMuaW5wdXQgfHwgdGhpcy5sb2FkaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgIHR5cGU6ICd1c2VyJyxcclxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkodGhpcy5pbnB1dCksXHJcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgY29waWVkOiBmYWxzZSxcclxuICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XHJcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgdXJsID1cclxuICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYWkvYXNrYC8vICtcclxuICAgIC8vICh0aGlzLnVzZU9wZW5BaSA9PT0gZmFsc2UgPyAnL2xsbS1oZicgOiAnJyk7XHJcbiAgICBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcclxuICAgICAgfSxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIHVzZXJfcXVlc3Rpb246IHRoaXMuaW5wdXQsXHJcbiAgICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXHJcbiAgICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxyXG4gICAgICAgIG1lc3NhZ2VfaWQ6IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZW5lcmF0ZUtleSgpLFxyXG4gICAgICAgIGFnZW50czogdGhpcy5hZ2VudHMuZmlsdGVyKHAgPT4gcC5zZWxlY3RlZCkubWFwKHAgPT4gcC5pZCksXHJcbiAgICAgICAgY29udmVyc2F0aW9uX2lkOiB0aGlzLmNvbnZlcnNhdGlvbktleSxcclxuICAgICAgfSksXHJcbiAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAnLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5wdXQgPSAnJztcclxuICB9XHJcbiAgZmV0Y2hEYXRhRm9yKG1zZykge1xyXG4gICAgY29uc3QgaW5wdXRNc2cgPSBtc2c/LnRyaW0oKTtcclxuICAgIGlmICghaW5wdXRNc2cgfHwgdGhpcy5sb2FkaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcclxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgdHlwZTogJ3VzZXInLFxyXG4gICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShpbnB1dE1zZyksXHJcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgY29waWVkOiBmYWxzZSxcclxuICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XHJcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgdXJsID1cclxuICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYWkvYXNrYC8vICtcclxuICAgIC8vICh0aGlzLnVzZU9wZW5BaSA9PT0gZmFsc2UgPyAnL2xsbS1oZicgOiAnJyk7XHJcbiAgICBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcclxuICAgICAgfSxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIHVzZXJfcXVlc3Rpb246IHRoaXMuaW5wdXQsXHJcbiAgICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXHJcbiAgICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxyXG4gICAgICAgIG1lc3NhZ2VfaWQ6IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZW5lcmF0ZUtleSgpLFxyXG4gICAgICAgIGFnZW50czogdGhpcy5hZ2VudHMuZmlsdGVyKHAgPT4gcC5zZWxlY3RlZCkubWFwKHAgPT4gcC5pZCksXHJcbiAgICAgICAgY29udmVyc2F0aW9uX2lkOiB0aGlzLmNvbnZlcnNhdGlvbktleSxcclxuICAgICAgfSksXHJcbiAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAnLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5wdXQgPSAnJztcclxuICB9XHJcbiAgZmV0Y2hTbWFsbFRhbGsoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90L3NtYWxsLXRhbGsvJHt0aGlzLmJvdElkfS8ke3RoaXMudXNlcklkfWA7XHJcblxyXG4gICAgdGhpcy5odHRwXHJcbiAgICAgIC5nZXQ8eyBzbWFsbFRhbGs6IHN0cmluZyB9Pih1cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGZldGNoaW5nIHNtYWxsIHRhbGs6JywgZXJyb3IpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zbWFsbFRhbGspIHtcclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ2FpJyxcclxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZShyZXNwb25zZS5zbWFsbFRhbGspLFxyXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXHJcbiAgICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAyO1xyXG4gICAgICAgICAgLy8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlYWRBbGxDaHVua3MgPSAoc3RyZWFtOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcclxuICAgIGNvbnN0IGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIHJlYWRlci5jbG9zZWQuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWFkaW5nIHN0cmVhbTogJywgZXJyKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcclxuICAgICAgc3RhcnQ6IChjb250cm9sbGVyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHVtcChjb250cm9sbGVyLCByZWFkZXIsIGFsbFN1Z2dlc3Rpb25zKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIHB1bXAoY29udHJvbGxlcjogYW55LCByZWFkZXI6IGFueSwgYWxsU3VnZ2VzdGlvbnM6IHN0cmluZ1tdKSB7XHJcbiAgICByZWFkZXIucmVhZCgpLnRoZW4oKHsgZG9uZSwgdmFsdWUgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgbGFzdEl0ZW0ubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGxhc3RJdGVtLm1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuY2hhdExvZy5wb3AoKTtcclxuICAgICAgICB0aGlzLmNoYXRMb2cucHVzaChsYXN0SXRlbSk7XHJcbiAgICAgICAgaWYgKGFsbFN1Z2dlc3Rpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ3N1Z2dlc3Rpb25zJyxcclxuICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGFsbFN1Z2dlc3Rpb25zXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgIHRoaXMuZmV0Y2hTbWFsbFRhbGsoKTtcclxuICAgICAgICAvLyB9LDEwMDApXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGVjb2RlZENodW5rID0gdGhpcy5kZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XHJcbiAgICAgIHRoaXMuYWlSZXNwb25zZSArPSBkZWNvZGVkQ2h1bms7XHJcbiAgICAgIGlmIChsYXN0SXRlbS50eXBlID09PSAnYWknKSB7XHJcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNNYXRjaCA9IHRoaXMuYWlSZXNwb25zZS5tYXRjaCgvPHN1Zz4oLio/KTxcXC9zdWc+L2cpO1xyXG4gICAgICAgIGlmIChzdWdnZXN0aW9uc01hdGNoKSB7XHJcbiAgICAgICAgICBzdWdnZXN0aW9uc01hdGNoLmZvckVhY2goKG1hdGNoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9IHRoaXMuYWlSZXNwb25zZS5yZXBsYWNlKG1hdGNoLCBcIlwiKTtcclxuICAgICAgICAgICAgYWxsU3VnZ2VzdGlvbnMucHVzaChtYXRjaD8ucmVwbGFjZSgvPFxcLz9zdWc+L2csIFwiXCIpKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGFzdEl0ZW0ubWVzc2FnZSA9IHRoaXMuYWlSZXNwb25zZTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgYWlGb3JtYXR0ZWREYXRhOiBhbnk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uICcpXHJcbiAgICAgICAgICBhaUZvcm1hdHRlZERhdGEgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gMicpXHJcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uIGRvbmUnKVxyXG5cclxuICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhICYmIGFpRm9ybWF0dGVkRGF0YT8uc2VjdGlvbl9pZD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICdjb21wYW55X3NlYXJjaCcgfHwgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gJ3VzZXJfc2VhcmNoJyB8fCBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAnaW5kdXN0cnlfY29tcGFueV9zZWFyY2gnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5teVVwY29taW5nU2Vzc2lvbkFjdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgc3BlYWtlcklkcyA9IFtdO1xyXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuY29udGVudD8uZm9yRWFjaChzZXNzaW9uID0+IHtcclxuICAgICAgICAgICAgICBzcGVha2VySWRzID0gWy4uLnNwZWFrZXJJZHMsIC4uLnNlc3Npb24uc3BlYWtlcnNdXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNwZWFrZXJJZHM/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRTcGVha2Vyc0J5U3RhZmZJZHMoc3BlYWtlcklkcyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMuYWRkVG9NeUFnZW5kYUFjdGlvbiAmJiBhaUZvcm1hdHRlZERhdGEuY29udGVudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xyXG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXHJcbiAgICAgICAgICAgICAgc2Vzc2lvbklkczogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5jb25uZWN0T3JGb2xsb3dBY3Rpb24pIHtcclxuICAgICAgICAgICAgbGV0IHVzZXJzTGVuID0gYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKHVzZXJzTGVuID4gMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQ6IFwib3Blbl9uZXR3b3JraW5nX2RyYXdlclwiLFxyXG4gICAgICAgICAgICAgICAgc2VhcmNoOiBhaUZvcm1hdHRlZERhdGEuY29udGVudFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodXNlcnNMZW4gPT0gMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxyXG4gICAgICAgICAgICAgICAgY29ubmV0VXNlcklkczogW2FpRm9ybWF0dGVkRGF0YS5jb250ZW50WzBdLnVzZXJJZF1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5pc19vcGVuX3BhZ2UgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcclxuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxyXG4gICAgICAgICAgICAgIHNlYXJjaDogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xyXG4gICAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5tZXNzYWdlICs9IFwiXFxuXFxuXCIgKyAnPGEgaWQ9XCJjbG9zZUJvdE5vd1wiPkNsaWNrIEhlcmU8L2E+IHRvIHNlZSByZXN1bHRzLidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xyXG4gICAgICAgICAgICB0eXBlOiAnYWknLFxyXG4gICAgICAgICAgICBtZXNzYWdlOiBhaUZvcm1hdHRlZERhdGEubWVzc2FnZSxcclxuICAgICAgICAgICAgYWN0aW9uOiBhaUZvcm1hdHRlZERhdGEsXHJcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVCcm93c2VyKCkpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRDbG9zZUJvdENsaWNrRXZlbnQoKTtcclxuICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmFpUmVzcG9uc2UgPSBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuYWlSZXNwb25zZSxcclxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG5cclxuICAgICAgLy8gRW5xdWV1ZSB0aGUgbmV4dCBkYXRhIGNodW5rIGludG8gb3VyIHRhcmdldCBzdHJlYW1cclxuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcclxuICAgICAgdGhpcy5wdW1wKGNvbnRyb2xsZXIsIHJlYWRlciwgYWxsU3VnZ2VzdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRGZWVkYmFjayhmbGFnOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IHRydWU7XHJcbiAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSBudWxsO1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90L2ZlZWRiYWNrYDtcclxuICAgIGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZsYWcsIHVzZXJfaWQ6IHRoaXMudXNlcklkLCBib3RfaWQ6IHRoaXMuYm90SWQgfSksXHJcbiAgICB9KS50aGVuKCgpID0+IHtcclxuICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XHJcbiAgICAgICAgICB0eXBlOiAnYWknLFxyXG4gICAgICAgICAgbWVzc2FnZTpcclxuICAgICAgICAgICAgdGhpcy50aHVtYnNVcE1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgYEdyZWF0LiBNYXkgSSBhc3Npc3QgeW91IHdpdGggYW55dGhpbmcgZWxzZT9gLFxyXG4gICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxyXG4gICAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tEb25lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcclxuICAgICAgICB0eXBlOiAnYWknLFxyXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2UoXHJcbiAgICAgICAgICB0aGlzLnRodW1ic0Rvd25NZXNzYWdlc1t0aGlzLnRodW1ic0Rvd25Nc2dJbmRleF1cclxuICAgICAgICApLFxyXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcclxuICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50aHVtYnNEb3duTXNnSW5kZXggPVxyXG4gICAgICAgICh0aGlzLnRodW1ic0Rvd25Nc2dJbmRleCArIDEpICUgdGhpcy50aHVtYnNEb3duTWVzc2FnZXMubGVuZ3RoO1xyXG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSBudWxsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWJtaXQoKSB7XHJcbiAgICB0aGlzLmZldGNoRGF0YSgpO1xyXG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlVXBDbGljayhpZHg6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZmVlZGJhY2tEb25lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKHRydWUpO1xyXG4gICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQpIHtcclxuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRG93bkNsaWNrKGlkeDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHJldHVybjtcclxuICAgIHRoaXMuc3VibWl0RmVlZGJhY2soZmFsc2UpO1xyXG4gICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xyXG4gICAgaWYgKHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkKVxyXG4gICAgICB0aGlzLmNoYXRMb2dbaWR4XS5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS5saWtlZDtcclxuICB9XHJcbiAgaGFuZGxlQ29weUNsaWNrKGluZGV4OiBhbnkpIHtcclxuICAgIC8vIENvcHkgdGhlIG1lc3NhZ2UgdG8gdGhlIGNsaXBib2FyZFxyXG4gICAgY29uc3QgY29udGVudFRvQ29weSA9IHRoaXMuY2hhdExvZ1tpbmRleF0ubWVzc2FnZTtcclxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnRUb0NvcHkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBtZXNzYWdlIHdhcyBjb3BpZWRcclxuICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIC8vIFJlc2V0IHRoZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBkZWxheVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSwgMjAwMCk7IC8vIFJlc2V0IGFmdGVyIDIgc2Vjb25kc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzY3JvbGxUb0JvdHRvbSgpIHtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cclxuICAgICAgICB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICBpZiAoY291bnRlcisrID4gNSkgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICB9LCA1KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUFjdGlvbihhY3Rpb246IGFueSkge1xyXG4gICAgY29uc29sZS5pbmZvKFwiaW5jb21pbmcgYWN0aW9uIGZyb20gdGhlIGNoYXRib3QgQUlcIilcclxuICAgIGNvbnNvbGUuaW5mbyhhY3Rpb24pXHJcblxyXG4gICAgaWYgKGFjdGlvbj8uY29udGVudCkge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBkcmF3ZXIgaXMgaW5pdGlhbGx5IG9wZW4gYW5kIGFwcGx5IG92ZXJmbG93IGhpZGRlbiB0byBib2R5IGlmIHNvXHJcbiAgICBpZiAodGhpcy5kcmF3ZXIub3BlbmVkKSB7XHJcbiAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIGRyYXdlciBiZWluZyBvcGVuZWQgb3IgY2xvc2VkXHJcbiAgICB0aGlzLmRyYXdlci5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKChvcGVuZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2V0Qm9keU92ZXJmbG93KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVCb2R5T3ZlcmZsb3coKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kcmF3ZXIub3BlbmVkQ2hhbmdlLnN1YnNjcmliZSgob3BlbmVkKSA9PiB7XHJcbiAgICAgIGlmIChvcGVuZWQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm15VGV4dGFyZWEgJiYgdGhpcy5teVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5teVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsgLy8gRm9jdXMgb24gdGhlIHRleHRhcmVhXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRCb2R5T3ZlcmZsb3coKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVCb2R5T3ZlcmZsb3coKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3BlYWtlcnNCeVN0YWZmSWRzKGlkcykge1xyXG4gICAgY29uc3QgdXJsID1cclxuICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMvZ2V0LWJ5LXN0YWZmLWlkc2BcclxuICAgIGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBcIkJlYXJlciBcIiArIFwieW91cl90b2tlbl9oZXJlXCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcyksXHJcbiAgICB9KVxyXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7IC8vIFBhcnNlIHRoZSBKU09OIGJvZHkgb2YgdGhlIHJlc3BvbnNlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZGF0YS5mb3JFYWNoKHNwZWFrZXIgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNwZWFrZXJzW3NwZWFrZXIuaWRdID0gc3BlYWtlcjtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBkYXRhOicsIGVycik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbklkLCBhY3Rpb24pIHtcclxuICAgIHRoaXMuc2Vzc2lvbkFjdGlvbnMubmV4dCh7XHJcbiAgICAgIHNlc3Npb25JZCxcclxuICAgICAgYWN0aW9uXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZENsb3NlQm90Q2xpY2tFdmVudCgpIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2xvc2VCb3ROb3cnKTtcclxuICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdjbGljaycsICgpID0+IHtcclxuICAgICAgICB0aGlzLmNsb3NlQm90Lm5leHQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc01vYmlsZUJyb3dzZXIoKSB7XHJcbiAgICByZXR1cm4gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG4gIH1cclxuXHJcbiAgY29ubmVjdFRvVXNlcih1c2VySWQpIHtcclxuICAgIHRoaXMuY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xyXG4gICAgICBjb25uZWN0OiAhdGhpcy5jYW5EaXNjb25uZWN0KHVzZXJJZCksXHJcbiAgICAgIHVzZXJJZFxyXG4gICAgfSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIHNjaGVkdWxlTWVldGluZ1dpdGhVc2VyKHVzZXIpIHtcclxuICAgIHRoaXMuc2NoZWR1bGVNZWV0aW5nLmVtaXQodXNlcik7XHJcbiAgfVxyXG5cclxuICBjYW5Db25uZWN0KHVzZXJJZCkge1xyXG4gICAgcmV0dXJuICEodGhpcy5jYW5EaXNjb25uZWN0KHVzZXJJZCkgfHwgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZmluZChhID0+IGEgPT0gdXNlcklkKSlcclxuICB9XHJcblxyXG4gIGNhbkRpc2Nvbm5lY3QodXNlcklkKSB7XHJcbiAgICByZXR1cm4gdGhpcy5teUNvbm5lY3Rpb25zLmZpbmQoY29ubiA9PiBjb25uLnVzZXJJZCA9PSB1c2VySWQpXHJcbiAgfVxyXG5cclxuICBmZXRjaFBlbmRpbmdSZXF1ZXN0cygpIHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnYXBpS2V5JzogdGhpcy5hdXRvZ2VuS2V5XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLmdldChcclxuICAgICAgICBgJHt0aGlzLmVudmlyb25tZW50LlVTRVJTX0FQSX0vZXZlbnRzLyR7dGhpcy5ldmVudElkfS9jb25uZWN0aW9uLXJlcXVlc3RzL2F1dG9nZW4vcGVuZGluZy1zZW50LXJlcXVlc3RzP3VzZXJJZD0ke3RoaXMudXNlcklkfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzIH1cclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IHJlcztcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBmZXRjaE15Q29ubmVjdGlvbnMoKSB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ2FwaUtleSc6IHRoaXMuYXV0b2dlbktleVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5nZXQoXHJcbiAgICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMtY29ubmVjdGlvbnMvYXV0b2dlbj91c2VySWQ9JHt0aGlzLnVzZXJJZH1gLFxyXG4gICAgICAgIHsgaGVhZGVycyB9XHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5teUNvbm5lY3Rpb25zID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBwZW5kaW5nIHJlcXVlc3RzOiAnLCBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG5cclxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFnZW50czogYW55O1xyXG4gIHNlbGVjdGVkQWdlbnRzID0gW107XHJcbiAgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAvLyBUb2dnbGUgdGhlIGRyb3Bkb3duIHZpc2liaWxpdHlcclxuICB0b2dnbGVEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuYWdlbnRzPy5mb3JFYWNoKGFnZW50ID0+IGFnZW50LnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICB9XHJcblxyXG4gIG9uQWdlbnRDaGFuZ2UoYWdlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgLy9hZ2VudC5zZWxlY3RlZCA9ICFhZ2VudC5zZWxlY3RlZDtcclxuICAgIC8vY29uc29sZS5sb2coYWdlbnQpO1xyXG4gICAgbGV0IGFnZW50Rm91bmQgPSB0aGlzLmFnZW50cy5maWx0ZXIocCA9PiBwLmlkID09IGFnZW50LmlkKTtcclxuICAgIGlmIChhZ2VudEZvdW5kICYmIGFnZW50Rm91bmQubGVuZ3RoID4gMCkge1xyXG4gICAgICBhZ2VudEZvdW5kWzBdLnNlbGVjdGVkID0gIWFnZW50Rm91bmRbMF0uc2VsZWN0ZWQ7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGFyZUFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWdlbnRzPy5ldmVyeShhZ2VudCA9PiAhYWdlbnQuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RHJvcGRvd25IZWFkZXJUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEFnZW50cyA9IHRoaXMuYWdlbnRzPy5maWx0ZXIoYWdlbnQgPT4gYWdlbnQuc2VsZWN0ZWQpO1xyXG4gICAgaWYgKHNlbGVjdGVkQWdlbnRzICYmIHNlbGVjdGVkQWdlbnRzPy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuICdBbGwgQWdlbnRzJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID4gMSA/IGAke3NlbGVjdGVkQWdlbnRzPy5sZW5ndGh9IEFnZW50cyBTZWxlY3RlZGAgOiBgJHtzZWxlY3RlZEFnZW50cz8ubGVuZ3RofSBBZ2VudCBTZWxlY3RlZGA7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZldGNoQWdlbnRzX2h0dHAoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5BR0VOVFNfQVBJfS9Db1BpbG90LyR7dGhpcy5ib3RJZH0vYWN0aXZlLWFnZW50c2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwge30sIHsgaGVhZGVycyB9KS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgdGhpcy5hZ2VudHMgPSByZXMubWFwKGFnZW50ID0+ICh7XHJcbiAgICAgICAgICAgIC4uLmFnZW50LFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2VcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvZihyZXMpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0Ym90IGNvbmZpZzogJywgZXJyb3IpO1xyXG5cclxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIGZldGNoQWdlbnRzKCkge1xyXG4gICAgdGhpcy5mZXRjaEFnZW50c19odHRwKClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLyBldmVudHMvJHtldmVudElkfS91c2Vycy1jb25uZWN0aW9uc1xyXG4gIHByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShtYXJrZG93bjogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgaWYgKCFtYXJrZG93biB8fCAhKG1hcmtkb3duLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0lucHV0IE1hcmtkb3duIGlzIG51bGwgb3IgZW1wdHknKTtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY29uc29sZS5sb2coJ01hcmtkb3duIGlucHV0OicsIG1hcmtkb3duKTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGhlYWRlcnMgdG8gSFRNTCBoZWFkZXJzXHJcbiAgICBsZXQgaHRtbCA9IG1hcmtkb3duLnJlcGxhY2UoL14oI3sxLDZ9KVxccysoLiopJC9nbSwgKG1hdGNoLCBoYXNoZXMsIHRleHQpID0+IHtcclxuICAgICAgY29uc3QgbGV2ZWwgPSBoYXNoZXMubGVuZ3RoO1xyXG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXIgaGVhZGVyIGNvbnZlcnNpb246JywgaHRtbCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBsaW5rcyB0byBIVE1MIGxpbmtzXHJcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXFsoW15cXF1dKyldXFwoKFteKV0rKVxcKS9nLCAnPGEgaHJlZj1cIiQyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+Jyk7XHJcblxyXG4gICAgLy8gIGNvbnNvbGUubG9nKCdBZnRlciBsaW5rIGNvbnZlcnNpb246JywgaHRtbCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBib2xkIHRvIEhUTUwgc3Ryb25nXHJcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xyXG5cclxuICAgIC8vY29uc29sZS5sb2coJ0FmdGVyIGJvbGQgY29udmVyc2lvbjonLCBodG1sKTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IG5ldyBsaW5lcyB0byA8YnI+IHRhZ3NcclxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnPGJyPicpO1xyXG5cclxuICAgIC8vICBjb25zb2xlLmxvZygnQWZ0ZXIgbGluZSBicmVha3MgY29udmVyc2lvbjonLCBodG1sKTtcclxuXHJcbiAgICAvLyBPcHRpb25hbDogU2FuaXRpemUgdGhlIEhUTUwgdG8gcHJldmVudCBYU1NcclxuICAgIGNvbnN0IHNhbml0aXplZEh0bWwgPSB0aGlzLnNhbml0aXplSHRtbChodG1sKTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnU2FuaXRpemVkIEhUTUw6Jywgc2FuaXRpemVkSHRtbCk7XHJcblxyXG4gICAgcmV0dXJuIHNhbml0aXplZEh0bWw7XHJcbiAgfVxyXG4gIGlzQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgaXNDb2xsYXBzZWRGb3JHcmFwaCA9IGZhbHNlO1xyXG4gIGlzQ29sbGFwc2VkRm9yRkdyYXBoID0gZmFsc2U7XHJcbiAgdG9nZ2xlQ29sbGFwc2UoKSB7XHJcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDb2xsYXBzZUdyYXBoKCkge1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlZEZvckdyYXBoID0gIXRoaXMuaXNDb2xsYXBzZWRGb3JHcmFwaDtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgdG9nZ2xlQ29sbGFwc2VGR3JhcGgoKSB7XHJcbiAgICB0aGlzLmlzQ29sbGFwc2VkRm9yRkdyYXBoID0gIXRoaXMuaXNDb2xsYXBzZWRGb3JGR3JhcGg7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIC8vICAgW1xyXG4gIC8vICAge1xyXG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBKYW51YXJ5IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXHJcbiAgLy8gICAgIFwiZGVzY1wiOiBcIkVhY2ggbW9udGgsIHdlIGNvbXBpbGUgc2lnbmlmaWNhbnQgbmV3cywgdHJlbmRzLCBhbmQgaGFwcGVuaW5ncyBpbiBBSSwgcHJvdmlkaW5nIGRldGFpbGVkIHN1bW1hcmllcyB3aXRoIGtleSBwb2ludHMgaW4gYnVsbGV0IGZvcm0gZm9yIGNvbmNpc2UgeWV0IGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcuXCIsXHJcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1qYW51YXJ5LTIwMjQvXCJcclxuICAvLyAgIH0sXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIFwidGl0bGVcIjogXCJUb3AgQUkgTmV3cywgSmFudWFyeSAyMDI0IC0gRXZlcnlwaXhlbCBKb3VybmFsXCIsXHJcbiAgLy8gICAgIFwiZGVzY1wiOiBcIkluIHRoaXMgbW9udGhseSByb3VuZHVwLCB3ZSBzcG90bGlnaHQgdGhlIHRvcCBBSSBuZXdzIHN0b3JpZXMgZnJvbSBKYW51YXJ5LCBpbmNsdWRpbmcgdGhlIE9wZW5BSSB2cy4gVGhlIE5ldyBZb3JrIFRpbWVzIExhd3N1aXQuXCIsXHJcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vam91cm5hbC5ldmVyeXBpeGVsLmNvbS90b3AtYWktbmV3cy1qYW51YXJ5LTIwMjRcIlxyXG4gIC8vICAgfSxcclxuICAvLyAgIHtcclxuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgSnVseSAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxyXG4gIC8vICAgICBcImRlc2NcIjogXCJUaGlzIHBhZ2UgZmVhdHVyZXMgQUkgTmV3cyBmb3IgSnVseSAyMDI0LCBoaWdobGlnaHRpbmcgc2lnbmlmaWNhbnQgZXZlbnRzIHN1Y2ggYXMgQ2FudmEgYWNxdWlyaW5nIExlb25hcmRvIEFJLlwiLFxyXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3RoZWFpdHJhY2suY29tL2FpLW5ld3MtanVseS0yMDI0LWluLWRlcHRoLWFuZC1jb25jaXNlL1wiXHJcbiAgLy8gICB9LFxyXG4gIC8vICAge1xyXG4gIC8vICAgICBcInRpdGxlXCI6IFwiSmFudWFyeSBuZXdzIHJvdW5kdXA6IFdoYXQncyBuZXcgaW4gdGhlIHdvcmxkIG9mIEFJPyAtIFBsdXJhbHNpZ2h0XCIsXHJcbiAgLy8gICAgIFwiZGVzY1wiOiBcIk9wZW5BSeKAmXMgbmV3IEdQVCBzdG9yZSwgYnVzaW5lc3MtcmVhZHkgQ2hhdEdQVCBwbGFucywgYW5kIGEgcHJlZGljdGVkIHJpc2UgaW4gQUktcG93ZXJlZCBjeWJlcmNyaW1lLlwiLFxyXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3d3dy5wbHVyYWxzaWdodC5jb20vcmVzb3VyY2VzL2Jsb2cvZGF0YS9haS10aGlzLW1vbnRoLWphbnVhcnktMjAyNFwiXHJcbiAgLy8gICB9LFxyXG4gIC8vICAge1xyXG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBBdWd1c3QgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcclxuICAvLyAgICAgXCJkZXNjXCI6IFwiVGhpcyBwYWdlIGZlYXR1cmVzIEFJIE5ld3MgZm9yIEF1Z3VzdCAyMDI0LCB3aXRoIGhpZ2hsaWdodHMgc3VjaCBhcyBOdmlkaWEgZGVsYXlpbmcgdGhlIOKAnEJsYWNrd2VsbOKAnSBCMjAwIEFJIGNoaXBzIGRlbGl2ZXJ5LlwiLFxyXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3RoZWFpdHJhY2suY29tL2FpLW5ld3MtYXVndXN0LTIwMjQtaW4tZGVwdGgtYW5kLWNvbmNpc2UtZHVwbGljYXRlL1wiXHJcbiAgLy8gICB9XHJcbiAgLy8gXVxyXG4gIGRhdGVUaW1lID0geyBub3c6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9O1xyXG4gIC8vIEV4dHJhY3RzIHRoZSBkb21haW4gZnJvbSBhIFVSTFxyXG4gIGdldERvbWFpbk5hbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgeyBob3N0bmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICByZXR1cm4gaG9zdG5hbWUucmVwbGFjZSgvXnd3d1xcLi8sICcnKTsgLy8gUmVtb3ZlICd3d3cuJyBpZiBwcmVzZW50XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuICd1bmtub3duJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdlbmVyYXRlcyB0aGUgZmF2aWNvbiBVUkxcclxuICBnZXRGYXZpY29uVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZ2V0RG9tYWluTmFtZSh1cmwpO1xyXG4gICAgcmV0dXJuIGBodHRwczovL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP3N6PTEyOCZkb21haW49JHtkb21haW59YDtcclxuICB9XHJcbiAgb25DYXJkQ2xpY2soKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zb3VyY2VzRHJhd2VyLm9wZW4oKTtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcclxuICAgIGlmIChidXR0b24pIHtcclxuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uQ2xvc2VTb3VyY2UoKSB7XHJcbiAgICB0aGlzLnNvdXJjZXNEcmF3ZXIuY2xvc2UoKTtcclxuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcclxuICAgIHRoaXMub25EcmF3ZXJDbG9zZWQoKTtcclxuICB9XHJcbiAgb25EcmF3ZXJDbG9zZWQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcclxuICAgICAgLy8gVXNlIG5nQ2xhc3MgdG8gZHluYW1pY2FsbHkgYXBwbHkgdGhlIGNsYXNzXHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcclxuICAgICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgfVxyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG4gIGlzRHJhd2VyT3BlbiA9IHRydWU7XHJcblxyXG4gIHRvZ2dsZURyYXdlcih0b2RvKSB7XHJcbiAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IHRvZG87XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblZpc2liaWxpdHkoKTtcclxuICB9XHJcbiAgdXBkYXRlQnV0dG9uVmlzaWJpbGl0eSgpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcclxuICAgIGlmIChidXR0b24pIHtcclxuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmlzRHJhd2VyT3BlbiA/ICdibG9jaycgOiAnbm9uZSc7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9wZW5MaW5rSW5OZXdUYWIobGluazogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB3aW5kb3cub3BlbihsaW5rLCAnX2JsYW5rJyk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=