@sunbird-cb/toc 0.0.25 → 0.0.27

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 (26) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +3 -3
  4. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +15 -6
  5. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +7 -2
  6. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +3 -3
  7. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2 -2
  8. package/esm2022/lib/services/root.service.mjs +106 -0
  9. package/esm2022/public-api.mjs +2 -1
  10. package/fesm2022/sunbird-cb-toc.mjs +7801 -6424
  11. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  12. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +140 -0
  13. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts.map +1 -0
  14. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +20 -0
  15. package/lib/_collection/_common/ai-tutor/socket.service.d.ts.map +1 -0
  16. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +1 -1
  17. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +1 -1
  18. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +2 -1
  19. package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +1 -1
  20. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +29 -28
  21. package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +1 -1
  22. package/lib/services/root.service.d.ts +27 -0
  23. package/lib/services/root.service.d.ts.map +1 -0
  24. package/package.json +1 -1
  25. package/public-api.d.ts +1 -0
  26. package/public-api.d.ts.map +1 -1
@@ -0,0 +1,1169 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, Inject } from '@angular/core';
2
+ import { NavigationEnd } from '@angular/router';
3
+ import { WsEvents } from '@sunbird-cb/utils-v2';
4
+ // import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'
5
+ import cloneDeep from 'lodash/cloneDeep';
6
+ import { NonReleventFeedbackDialogComponent } from '../../../components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ import * as i2 from "@sunbird-cb/utils-v2";
10
+ import * as i3 from "./../../../services/root.service";
11
+ import * as i4 from "./socket.service";
12
+ import * as i5 from "@angular/material/legacy-dialog";
13
+ import * as i6 from "@angular/material/snack-bar";
14
+ import * as i7 from "@angular/common";
15
+ import * as i8 from "@angular/forms";
16
+ import * as i9 from "@angular/material/icon";
17
+ import * as i10 from "@angular/material/legacy-tooltip";
18
+ import * as i11 from "@angular/material/form-field";
19
+ import * as i12 from "@angular/material/select";
20
+ import * as i13 from "@angular/material/core";
21
+ export class AiTutorComponent {
22
+ constructor(route, configSvc, eventSvc, renderer, chatbotService, websocketService, dialog, matSnackBarNew, utilitySvc, environment, router) {
23
+ this.route = route;
24
+ this.configSvc = configSvc;
25
+ this.eventSvc = eventSvc;
26
+ this.renderer = renderer;
27
+ this.chatbotService = chatbotService;
28
+ this.websocketService = websocketService;
29
+ this.dialog = dialog;
30
+ this.matSnackBarNew = matSnackBarNew;
31
+ this.utilitySvc = utilitySvc;
32
+ this.router = router;
33
+ this.from = '';
34
+ this.userJourney = [];
35
+ this.showIcon = true;
36
+ this.categories = [];
37
+ this.language = [];
38
+ this.currentFilter = 'information';
39
+ this.selectedLaguage = 'en';
40
+ this.recomendedQns = {};
41
+ this.questionsAndAns = {};
42
+ this.userIcon = '';
43
+ this.more = false;
44
+ this.chatInformation = [];
45
+ this.chatIssues = [];
46
+ this.displayLoader = false;
47
+ this.expanded = false;
48
+ this.callText = '';
49
+ this.emailText = '';
50
+ this.searchQueryAItutor = '';
51
+ this.copiedIndex = -1;
52
+ this.random = Math.random().toString(36).slice(2);
53
+ this.iGOTAITutorResultArr = [];
54
+ this.maximize = true;
55
+ // tslint:disable
56
+ this.localization = {
57
+ 'en': {
58
+ 'Hi': 'Namaste',
59
+ 'information': 'Information',
60
+ 'issue': 'Issues',
61
+ 'categories': 'Show All Categories',
62
+ 'showmore': 'Show More'
63
+ },
64
+ 'hi': {
65
+ 'Hi': 'नमस्ते',
66
+ 'information': 'जानकारी',
67
+ 'issue': 'समस्या',
68
+ 'categories': 'सभी कैटगोरी दिखायें',
69
+ 'showmore': 'और दिखाओ'
70
+ }
71
+ };
72
+ this.colors = [
73
+ '#EB7181',
74
+ '#306933',
75
+ '#000000',
76
+ '#3670B2',
77
+ '#4E9E87',
78
+ '#7E4C8D',
79
+ ];
80
+ this.randomcolors = [
81
+ '#EB7181',
82
+ '#006400',
83
+ '#000000',
84
+ '#3670B2',
85
+ '#4E9E87',
86
+ '#7E4C8D',
87
+ ];
88
+ this.messages = [];
89
+ this.inputMessage = '';
90
+ this.aiTutorResultArr = [];
91
+ this.cloneSearchQuery = '';
92
+ this.jwtToken = '';
93
+ this.learningStyle = [
94
+ { title: 'None', subtitle: 'Learn with Natural query process' },
95
+ { title: 'Socratic Style', subtitle: 'Explore ideas through thoughtful questions.' },
96
+ { title: 'Storytelling', subtitle: 'Learn through relatable narratives and real-life examples.' },
97
+ ];
98
+ this.resultFetch = false;
99
+ this.authTokenHost = '';
100
+ this.NoneSocketHost = '';
101
+ this.SocraticeStyleHost = '';
102
+ this.StorytellingHost = '';
103
+ this.closeAIPopup = new EventEmitter();
104
+ this.containerHeight = 38;
105
+ this.isMobile = false;
106
+ this.showAITutorPopup = false;
107
+ this.chatId = '';
108
+ this.selectedLearningStyle = this.learningStyle[0];
109
+ this.environment = environment;
110
+ }
111
+ ngOnInit() {
112
+ this.isMobile = this.utilitySvc.isMobile;
113
+ if (this.environment?.sitePath?.includes('portal.igotkarmayogi.gov.in')) {
114
+ this.authTokenHost = 'learning-ai.prod.karmayogibharat.net';
115
+ this.NoneSocketHost = 'learning-ai.prod.karmayogibharat.net';
116
+ this.SocraticeStyleHost = 'learning-ai.prod.karmayogibharat.net';
117
+ this.StorytellingHost = 'learning-ai.prod.karmayogibharat.net';
118
+ }
119
+ else {
120
+ this.authTokenHost = 'learning-ai.uat.karmayogibharat.net';
121
+ this.NoneSocketHost = 'learning-ai.uat.karmayogibharat.net';
122
+ this.SocraticeStyleHost = 'learning-ai.uat.karmayogibharat.net';
123
+ this.StorytellingHost = 'learning-ai.uat.karmayogibharat.net';
124
+ }
125
+ this.userInfo = this.configSvc && this.configSvc.userProfile;
126
+ this.websocketService.getJWTToken().subscribe((data) => {
127
+ if (data && data['x-authenticated-user-token']) {
128
+ this.jwtToken = data['x-authenticated-user-token'];
129
+ //wss://learning-ai.uat.karmayogibharat.net/socratic/v1/
130
+ this.websocketService.connect(`wss://${this.authTokenHost}/ws?token=${this.jwtToken}`);
131
+ }
132
+ });
133
+ //let jwtToken = 'eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhMTk5WXh3UkxNQWpBb3JVRmJUSkl4YjZDWE1JdUk4WVp4Y0pLaGxMdHQwIn0.eyJqdGkiOiI4ZWQ2MzE1Yi02OGQ1LTRhZDktYWU3MC1hYzRiNjZmNjIzOWIiLCJleHAiOjE3NDQ4NTM3NDMsIm5iZiI6MCwiaWF0IjoxNzQ0ODEwNTQzLCJpc3MiOiJodHRwczovL3BvcnRhbC51YXQua2FybWF5b2dpYmhhcmF0Lm5ldC9hdXRoL3JlYWxtcy9zdW5iaXJkIiwic3ViIjoiZjo5MWVjOTVkMi1hM2Q1LTQxM2UtYjRlNC01M2IwZGNjOTY0ODU6Y2VlYzAyYzYtYzE5MS00OWZlLTg0NTYtNjYyNDVhOWE3ODM1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYWRtaW4tY2xpIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYjUyNTliYmMtZDVjYy00YWJkLThjY2UtZThlZTZiYjA4NGYyIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjQyMDAiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInNjb3BlIjoiIiwib3JnIjoiMDEzMzc4MzA5NTgyMzgxMDU2MCIsIm5hbWUiOiJTcHYgQWRtaW4iLCJ1c2VyX3JvbGVzIjpbIk1FTlRPUiIsIlBVQkxJQyIsIlNQVl9BRE1JTiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzcHZhZG1pbl9qZzJ5IiwiZ2l2ZW5fbmFtZSI6IlNwdiBBZG1pbiIsImZhbWlseV9uYW1lIjoiIiwiZW1haWwiOiJzcCoqKioqKioqKioqQHlvcG1haWwuY29tIn0.naO_FUNci_ImWHQIylfmMGI2B-85koIyb9Sfy0mOguPpLIKeiGZiLZvccP_I_1QUScBewOrrP3fYxeq8oU98dj7sQGmBFOoU1dSZClZce3U4QEjSiugcbxdiNHcQXlpZTyub5aAJE-ub9Hb1bhS_RQjTMUeDfh5wrlZz6Lqg7kdDh5esXFLibfnUcFqmFFqZBtN5iP2sbRCnCFyS1Vw5TEFKxTiGdRPYT-XUzNE_iZuQPm2z-zyK0FEc1E9odaiwwpW5hkn3TznDwwXe7VdJS2E-HtjujmI-naAqZ__R68SuLyRHuq_PGhj2TZ_rjoaVIhjlgiFqHfOVLUsRat8HpA'
134
+ this.router.events.subscribe((event) => {
135
+ if (event instanceof NavigationEnd) {
136
+ //certificate link check
137
+ this.isHubEnable = (event.url.includes('/certs') || event.url.includes('/public/certs')) ? false : true;
138
+ }
139
+ });
140
+ this.userInfo = this.configSvc && this.configSvc.userProfile;
141
+ // this.aiGlobalSearch()
142
+ this.checkForApiCalls();
143
+ this.enableScroll();
144
+ // tslint:disable-next-line: max-line-length
145
+ this.userIcon = this.userInfo && this.userInfo.profileImageUrl ? this.userInfo.profileImageUrl : '';
146
+ if (!this.userInfo.profileImageUrl && this.userInfo && this.userInfo.firstName) {
147
+ this.createInititals(this.userInfo.firstName);
148
+ }
149
+ const email = this.environment.supportEmail || 'mission.karmayogi@gov.in';
150
+ this.callText = `<a class='hint-text' target='_blank' href='https://bit.ly/44MJlo4'>Teams Call</a>&nbsp;`;
151
+ this.emailText = `<a class='hint-text' target='_blank' href='mailto:${email}'>${email}.</a>`;
152
+ const event = {
153
+ eventType: WsEvents.WsEventType.Telemetry,
154
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
155
+ data: {
156
+ edata: { type: 'click', "id": "ai-tutor-card-content", "pageid": `viewer/${this.content}`, "subType": this.selectedLearningStyle.title },
157
+ object: { id: this.content },
158
+ state: WsEvents.EnumTelemetrySubType.Loaded,
159
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
160
+ mode: 'view',
161
+ },
162
+ pageContext: { pageId: `viewer/${this.content}`, module: 'Learn' },
163
+ from: '',
164
+ to: 'Telemetry',
165
+ };
166
+ this.eventSvc.dispatchChatbotEvent(event);
167
+ const timestamp = Date.now();
168
+ this.chatId = `${this.configSvc.unMappedUser.userId}-${timestamp}`;
169
+ }
170
+ ngAfterViewInit() {
171
+ this.resizeTextarea(this.textArea?.nativeElement, '');
172
+ }
173
+ greetings() {
174
+ return this.localization[this.selectedLaguage]['Hi'] || 'Hi';
175
+ }
176
+ getInfoText(label) {
177
+ return this.localization[this.selectedLaguage][label] || label;
178
+ }
179
+ showMore() {
180
+ return this.localization[this.selectedLaguage]['showmore'] || 'Show More';
181
+ }
182
+ getData() {
183
+ const lang = {
184
+ information: 'IN',
185
+ issue: 'IS'
186
+ };
187
+ const tabType = {
188
+ lang: this.selectedLaguage,
189
+ config_type: lang[this.currentFilter]
190
+ };
191
+ this.displayLoader = true;
192
+ this.chatbotService.getChatData(tabType).subscribe((res) => {
193
+ if (res && res.payload && res.payload.config) {
194
+ this.setDataToLocalStorage(res.payload.config);
195
+ this.checkForApiCalls();
196
+ // this.initData(res.payload.config)
197
+ this.displayLoader = false;
198
+ }
199
+ });
200
+ }
201
+ setDataToLocalStorage(data) {
202
+ let localObject = {};
203
+ localObject = JSON.parse(localStorage.getItem('faq') || '{}');
204
+ localObject[this.selectedLaguage] = { ...localObject[this.selectedLaguage], [this.currentFilter]: data };
205
+ localStorage.setItem('faq', JSON.stringify(localObject));
206
+ this.toggleFilter(this.currentFilter === 'information' ? 'information' : this.currentFilter);
207
+ }
208
+ initData(_getData) {
209
+ // tslint:disable-next-line
210
+ // console.log(getData)
211
+ this.userJourney = [];
212
+ let userDetails = {
213
+ type: 'incoming',
214
+ message: '',
215
+ recommendedQues: this.getPriorityQuestion(1),
216
+ selectedValue: '',
217
+ title: '',
218
+ tab: 'information',
219
+ };
220
+ this.pushData(userDetails);
221
+ // this.pushData(userDetailsForIssues)
222
+ this.getQns();
223
+ }
224
+ getQns() {
225
+ this.responseData.quesMap.map((q) => {
226
+ this.questionsAndAns[q.quesId] = q;
227
+ });
228
+ }
229
+ selectLaguage(event) {
230
+ this.selectedLaguage = event.target.value;
231
+ localStorage.setItem('selectedLanguage', event.target.value);
232
+ this.chatInformation = [];
233
+ this.chatIssues = [];
234
+ this.checkForApiCalls();
235
+ }
236
+ readFromLocalStorage() {
237
+ let localStg = localStorage.getItem('result');
238
+ if (localStg) {
239
+ if (this.currentFilter === 'information') {
240
+ this.responseData = JSON.parse(localStg)[this.selectedLaguage].information;
241
+ }
242
+ else {
243
+ this.responseData = JSON.parse(localStg)[this.selectedLaguage].issue;
244
+ }
245
+ }
246
+ }
247
+ goToBottom() {
248
+ window.scrollTo(0, document.body.scrollHeight);
249
+ }
250
+ iconClick(type) {
251
+ this.showIcon = !this.showIcon;
252
+ this.currentFilter = 'information';
253
+ this.expanded = false;
254
+ if (type === 'start') {
255
+ this.disableScroll();
256
+ this.raiseChatStartTelemetry();
257
+ // this.toggleFilter(this.currentFilter)
258
+ }
259
+ else {
260
+ this.raiseChatEndTelemetry();
261
+ this.userJourney = [];
262
+ this.chatInformation = [];
263
+ this.chatIssues = [];
264
+ this.selectedLaguage = 'en';
265
+ this.currentFilter = 'information';
266
+ this.checkForApiCalls();
267
+ this.more = false;
268
+ this.enableScroll();
269
+ }
270
+ }
271
+ toggleFilter(tab) {
272
+ this.currentFilter = tab;
273
+ this.checkForApiCalls();
274
+ this.more = false;
275
+ }
276
+ selectedQuestion(question, data) {
277
+ data.selectedValue = question.quesID;
278
+ const sendMsg = {
279
+ type: 'sendMsg',
280
+ question: this.questionsAndAns[question.quesID].quesValue,
281
+ tab: this.currentFilter,
282
+ };
283
+ const incomingMsg = {
284
+ type: 'incoming',
285
+ // tslint:disable-next-line:max-line-length
286
+ message: this.questionsAndAns[question.quesID].ansVal.replace('<teams_call_link>', this.callText).replace('<email_configuration>', this.emailText),
287
+ recommendedQues: question.recommendedQues || [],
288
+ title: '',
289
+ relatedQes: 'above Question',
290
+ tab: this.currentFilter,
291
+ };
292
+ this.pushData(sendMsg);
293
+ this.pushData(incomingMsg);
294
+ this.raiseTemeletyInterat(question.quesID);
295
+ }
296
+ pushData(msg) {
297
+ this.userJourney = [];
298
+ if (this.currentFilter === 'information') {
299
+ this.chatInformation.push(msg);
300
+ this.userJourney = this.chatInformation;
301
+ }
302
+ else {
303
+ this.chatIssues.push(msg);
304
+ this.userJourney = this.chatIssues;
305
+ }
306
+ }
307
+ getuserjourney(tab) {
308
+ return this.userJourney.filter((j) => j.tab === tab);
309
+ }
310
+ getPriorityQuestion(priority) {
311
+ const recommendedQues = [];
312
+ const isLogedIn = this.userInfo ? 'Logged-In' : 'Not Logged-In';
313
+ this.responseData.recommendationMap.map((question) => {
314
+ question.recommendedQues.map((ques) => {
315
+ if (ques.priority === priority && (question.categoryType === isLogedIn || question.categoryType === 'Both')) {
316
+ recommendedQues.push(ques);
317
+ }
318
+ });
319
+ });
320
+ return recommendedQues;
321
+ }
322
+ showMoreQuestion() {
323
+ const showMoreQes = {
324
+ type: 'incoming',
325
+ message: '',
326
+ recommendedQues: this.getPriorityQuestion(1),
327
+ selectedValue: '',
328
+ title: '', //'Showing more questions',
329
+ };
330
+ this.pushData(showMoreQes);
331
+ }
332
+ showCategory(catItem) {
333
+ let incomingMsg = {
334
+ type: 'category',
335
+ message: '',
336
+ recommendedQues: [],
337
+ title: '',
338
+ relatedQes: `${catItem.catName}?`,
339
+ tab: this.currentFilter,
340
+ };
341
+ this.more = false;
342
+ if (catItem.catId === 'all') {
343
+ incomingMsg.title = '', // 'Here is the list of all the topics'
344
+ incomingMsg.relatedQes = '';
345
+ incomingMsg.recommendedQues = this.sortCategory();
346
+ }
347
+ else {
348
+ this.responseData.recommendationMap.forEach((element) => {
349
+ if (catItem.catId === element.catId) {
350
+ incomingMsg.type = 'incoming',
351
+ incomingMsg.recommendedQues = element.recommendedQues;
352
+ }
353
+ });
354
+ this.raiseCategotyTelemetry(catItem.catId);
355
+ }
356
+ const sendMsg = {
357
+ type: 'sendMsg',
358
+ question: catItem.catName,
359
+ };
360
+ this.pushData(sendMsg);
361
+ this.pushData(incomingMsg);
362
+ }
363
+ raiseCategotyTelemetry(catItem) {
364
+ const event = {
365
+ eventType: WsEvents.WsEventType.Telemetry,
366
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
367
+ data: {
368
+ edata: { type: 'click', id: catItem },
369
+ object: { id: catItem, type: 'Category' },
370
+ state: WsEvents.EnumTelemetrySubType.Interact,
371
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
372
+ mode: 'view',
373
+ },
374
+ pageContext: { pageId: '/chatbot', module: 'Assistant' },
375
+ from: '',
376
+ to: 'Telemetry',
377
+ };
378
+ this.eventSvc.dispatchChatbotEvent(event);
379
+ }
380
+ raiseChatStartTelemetry() {
381
+ const event = {
382
+ eventType: WsEvents.WsEventType.Telemetry,
383
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
384
+ data: {
385
+ edata: { type: '' },
386
+ object: { type: 'zse', id: 'asd' },
387
+ state: WsEvents.EnumTelemetrySubType.Loaded,
388
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
389
+ type: 'session',
390
+ mode: 'view',
391
+ },
392
+ pageContext: { pageId: '/chatbot', module: 'Assistant' },
393
+ from: '',
394
+ to: 'Telemetry',
395
+ };
396
+ this.eventSvc.dispatchChatbotEvent(event);
397
+ }
398
+ raiseChatEndTelemetry() {
399
+ const event = {
400
+ eventType: WsEvents.WsEventType.Telemetry,
401
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
402
+ data: {
403
+ edata: { type: '' },
404
+ object: {},
405
+ state: WsEvents.EnumTelemetrySubType.Unloaded,
406
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
407
+ type: 'session',
408
+ mode: 'view',
409
+ },
410
+ pageContext: { pageId: '/chatbot', module: 'Assistant' },
411
+ from: '',
412
+ to: 'Telemetry',
413
+ };
414
+ this.eventSvc.dispatchChatbotEvent(event);
415
+ }
416
+ raiseTemeletyInterat(idn) {
417
+ const event = {
418
+ eventType: WsEvents.WsEventType.Telemetry,
419
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
420
+ data: {
421
+ edata: { type: 'click', id: idn },
422
+ object: { id: idn, type: this.currentFilter.charAt(0).toUpperCase() + this.currentFilter.slice(1) },
423
+ state: WsEvents.EnumTelemetrySubType.Interact,
424
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
425
+ mode: 'view'
426
+ },
427
+ pageContext: { pageId: '/chatbot', module: 'Assistant' },
428
+ from: '',
429
+ to: 'Telemetry',
430
+ };
431
+ this.eventSvc.dispatchChatbotEvent(event);
432
+ }
433
+ checkForAIQuestionResponse() {
434
+ }
435
+ checkForApiCalls() {
436
+ this.selectedLaguage = localStorage.getItem('selectedLanguage') || 'en';
437
+ let localStg = JSON.parse(localStorage.getItem('faq') || '{}');
438
+ let languageStg = JSON.parse(localStorage.getItem('faq-languages') || '{}');
439
+ if (languageStg.length > 0) {
440
+ this.language = languageStg;
441
+ }
442
+ else {
443
+ this.getLanguages();
444
+ }
445
+ if (localStg && languageStg) {
446
+ if (localStg[this.selectedLaguage] && localStg[this.selectedLaguage][this.currentFilter]) {
447
+ const localStorageData = localStg[this.selectedLaguage][this.currentFilter];
448
+ this.userJourney = [];
449
+ if (this.currentFilter === 'information') {
450
+ if (this.chatInformation.length === 0) {
451
+ this.responseData = localStorageData;
452
+ this.initData(localStorageData);
453
+ }
454
+ else {
455
+ this.responseData = localStorageData;
456
+ this.userJourney = this.chatInformation;
457
+ }
458
+ }
459
+ else {
460
+ if (this.chatIssues.length === 0) {
461
+ this.responseData = localStorageData;
462
+ this.initData(localStorageData);
463
+ }
464
+ else {
465
+ this.responseData = localStorageData;
466
+ this.userJourney = this.chatIssues;
467
+ }
468
+ }
469
+ this.getQns();
470
+ this.getCategories();
471
+ }
472
+ else {
473
+ this.getLanguages();
474
+ // this.getData()
475
+ }
476
+ }
477
+ }
478
+ getCategories() {
479
+ this.categories = [{ catId: 'all', catName: this.localization[this.selectedLaguage]['categories'], priority: 0 }];
480
+ const categories = [];
481
+ const isLogedIn = this.userInfo ? 'Logged-In' : 'Not Logged-In';
482
+ this.responseData.recommendationMap.map((catandques) => {
483
+ this.responseData.categoryMap.map((cat) => {
484
+ if (catandques.catId === cat.catId && (catandques.categoryType === isLogedIn || catandques.categoryType === 'Both')) {
485
+ const category = {
486
+ catId: cat.catId,
487
+ catName: cat.catName,
488
+ priority: catandques.priority,
489
+ categoryType: catandques.categoryType,
490
+ };
491
+ categories.push(category);
492
+ }
493
+ });
494
+ });
495
+ if (categories.length < 6) {
496
+ this.categories = categories;
497
+ }
498
+ else {
499
+ this.categories = [...this.categories, ...categories];
500
+ }
501
+ }
502
+ sortCategory() {
503
+ // tslint:disable-next-line: max-line-length
504
+ return this.categories.sort((a, b) => a['priority'] > b['priority'] ? 1 : a['priority'] === b['priority'] ? 0 : -1);
505
+ }
506
+ getLanguages() {
507
+ this.displayLoader = true;
508
+ this.chatbotService.getLangugages().subscribe((resp) => {
509
+ if (resp && resp.status && resp.status.code === 200) {
510
+ this.language = resp.payload.languages;
511
+ localStorage.setItem('faq-languages', JSON.stringify(resp.payload.languages));
512
+ localStorage.setItem('selectedLanguage', this.selectedLaguage);
513
+ this.getData();
514
+ this.displayLoader = false;
515
+ }
516
+ });
517
+ }
518
+ ngAfterViewChecked() {
519
+ // this.scrollToBottom()
520
+ }
521
+ scrollToBottom() {
522
+ let messageContainer = document.getElementById('container-none');
523
+ if (messageContainer) {
524
+ messageContainer.scrollTo({ top: messageContainer.scrollHeight, behavior: 'smooth' });
525
+ }
526
+ }
527
+ clickOutside() {
528
+ this.iconClick('end');
529
+ }
530
+ disableScroll() {
531
+ this.renderer.addClass(document.body, 'disable-scroll');
532
+ }
533
+ enableScroll() {
534
+ this.renderer.removeClass(document.body, 'disable-scroll');
535
+ }
536
+ submitSearchQuery(textArea, event) {
537
+ if (!this.searchQueryAItutor.trim()) {
538
+ event.preventDefault(); // Prevents Enter key from adding a new line
539
+ }
540
+ if (!this.searchQueryAItutor.trim()) {
541
+ return false;
542
+ }
543
+ this.cloneSearchQuery = '';
544
+ this.cloneSearchQuery = cloneDeep(this.searchQueryAItutor);
545
+ this.searchQueryAItutor = this.searchQueryAItutor.trim();
546
+ this.searchQueryAItutor = '';
547
+ this.resetTextAreaHeight(textArea);
548
+ this.aiTutorResultArr.map((item, index) => {
549
+ if (item && (item.newMessage === '')) {
550
+ // delete this.aiTutorResultArr[index]
551
+ this.aiTutorResultArr.splice(index, 1);
552
+ }
553
+ });
554
+ this.resultFetch = false;
555
+ // this.searchQuery = 'Soil Erosion and Conservation'
556
+ let sendMsgObj = {
557
+ type: 'sendMsg',
558
+ tab: 'sarthi',
559
+ question: this.cloneSearchQuery
560
+ };
561
+ this.aiTutorResultArr.push(sendMsgObj);
562
+ this.aiTutorResultArr.push({ type: 'incoming', tab: 'sarthi', answer: '', newMessage: '' });
563
+ // this.searchQuery = ''
564
+ // this.aiGlobalSearch()
565
+ // this.getAiTutorMessage()
566
+ setTimeout(() => {
567
+ this.scrollToBottom();
568
+ }, 0);
569
+ this.sendAITutorMessage();
570
+ }
571
+ sendAITutorMessage() {
572
+ if (this.cloneSearchQuery) {
573
+ let message = {
574
+ message: this.cloneSearchQuery,
575
+ query: this.cloneSearchQuery,
576
+ folder_name: this.content //this.content
577
+ };
578
+ this.websocketService.sendMessage(message);
579
+ setTimeout(() => {
580
+ this.getAiTutorMessage();
581
+ }, 1000);
582
+ }
583
+ }
584
+ getAiTutorMessage() {
585
+ this.messageSubscription = this.websocketService
586
+ .getMessages()
587
+ .subscribe((message) => {
588
+ // this.messages.push(message);
589
+ this.aiTutorResult = message;
590
+ this.resultFetch = true;
591
+ this.aiTutorResultMessage();
592
+ // this.searchQueryAItutor = '';
593
+ });
594
+ }
595
+ aiTutorResultMessage() {
596
+ this.iGOTAITutorResultArr = [];
597
+ // let requestBody:any = {
598
+ // "query":this.cloneSearchQuery
599
+ // }
600
+ // this.chatbotService.aiGlobalSearch(requestBody).subscribe((data)=>{
601
+ // console.log('data--', data)
602
+ // })
603
+ // console.log('requestBody', requestBody)
604
+ // console.log('aiSearchResult', this.aiTutorResult)
605
+ // console.log('this.aiSearchResultArr', this.aiTutorResultArr)
606
+ const queryString = Object.entries(this.route.snapshot.queryParams)
607
+ .map(([key, value]) => `${encodeURI(key)}=${encodeURI(value)}`)
608
+ .join('&');
609
+ //const queryString = new URLSearchParams(this.route.snapshot.queryParams).toString();
610
+ // let arr:any = []
611
+ console.log('this.aiTutorResult--', this.aiTutorResult);
612
+ if (this.aiTutorResult && !this.aiTutorResult.answer && !this.aiTutorResult.retrievedChunks) {
613
+ this.aiTutorResult.retrievedChunks = [];
614
+ }
615
+ this.aiTutorResult.retrievedChunks && this.aiTutorResult.retrievedChunks.map((item) => {
616
+ let startTime = -1;
617
+ let endTime = -1;
618
+ let pageNumber = 1;
619
+ if (item && item?.ContentStart?.trim()) {
620
+ startTime = item?.ContentStart;
621
+ pageNumber = item?.ContentStart;
622
+ }
623
+ if (item && item?.ContentEnd?.trim()) {
624
+ endTime = item?.ContentEnd;
625
+ pageNumber = item?.ContentEnd;
626
+ }
627
+ pageNumber = pageNumber !== " " ? pageNumber : 1;
628
+ let resultObj = {
629
+ message: item.Name,
630
+ recommendedQues: '',
631
+ selectedValue: '',
632
+ title: item.Name,
633
+ content: item,
634
+ mimeType: item.MimeType,
635
+ contentType: item.ContentType,
636
+ artifactUrl: item.ArtifactURL,
637
+ description: item?.Description?.replace(/^\s{4,}/gm, ''),
638
+ identifier: item.Identifier,
639
+ contentStart: startTime,
640
+ contentEnd: endTime,
641
+ pageNumber: pageNumber ? pageNumber : 1,
642
+ query: this.aiTutorResult.query,
643
+ query_id: this.aiTutorResult.query_id,
644
+ feedback: '',
645
+ resourceLink: item.MimeType === 'application/pdf' ? `https://portal.igotkarmayogi.gov.in/viewer/pdf/${item.Identifier}?${queryString}&from=globalSearch&playerPreview=true&pn=${pageNumber}` :
646
+ (startTime <= 0 && endTime <= 0) ? `https://portal.igotkarmayogi.gov.in/viewer/video/${item.Identifier}?${queryString}&from=globalSearch&playerPreview=true` : `https://portal.igotkarmayogi.gov.in/viewer/video/${item.Identifier}?${queryString}&from=globalSearch&playerPreview=true&st=${startTime}&et=${endTime}`
647
+ };
648
+ // arr.push(resultObj)
649
+ this.iGOTAITutorResultArr.push(resultObj);
650
+ });
651
+ let answer = this.aiTutorResult.answer ? this.aiTutorResult.answer.trim().replace(/\n/g, '<br>') : "";
652
+ let shortAnswer = this.splitParagraphByWords(answer);
653
+ // console.log(this.aiTutorResult.retrievedChunks, { wordsCount: answer.trim().split(/\s+/).length, showLess: answer.trim().split(/\s+/).length > 30 ? true : false ,answer: answer, shortAnswer: shortAnswer ,result: this.iGOTAITutorResultArr, type: 'incoming', tab: 'sarthi',reterivedChunks: this.iGOTAITutorResultArr.retrievedChunks, showFromInternet: (!this.aiTutorResult.retrievedChunks ? true : false)});
654
+ this.aiTutorResultArr.push({ query: this.aiTutorResult.query, query_id: this.aiTutorResult.query_id, clientId: this.aiTutorResult.clientId, wordsCount: answer.trim().split(/\s+/).length, showLess: answer.trim().split(/\s+/).length > 30 ? true : false, answer: answer, shortAnswer: shortAnswer, result: this.iGOTAITutorResultArr, type: 'incoming', tab: 'sarthi', reterivedChunks: this.iGOTAITutorResultArr.retrievedChunks, showFromInternet: (!(this.aiTutorResult.answer) && !(this.aiTutorResult.retrievedChunks)) ? true : false });
655
+ this.aiTutorResultArr.map((item, index) => {
656
+ if (item && (item.newMessage === '')) {
657
+ // delete this.aiSearchResultArr[index]
658
+ this.aiTutorResultArr.splice(index, 1);
659
+ }
660
+ });
661
+ console.log('this.aiTutorResultArr---', this.aiTutorResultArr);
662
+ setTimeout(() => {
663
+ // this.scrollToBottom()
664
+ }, 0);
665
+ const event = {
666
+ eventType: WsEvents.WsEventType.Telemetry,
667
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
668
+ data: {
669
+ edata: { type: 'click', "id": "ai-tutor-card-content", "pageid": `viewer/${this.content}`, "subType": this.selectedLearningStyle.title },
670
+ object: {},
671
+ state: WsEvents.EnumTelemetrySubType.Interact,
672
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
673
+ mode: 'view',
674
+ },
675
+ pageContext: { pageId: `viewer/${this.content}`, module: 'Learn' },
676
+ from: '',
677
+ to: 'Telemetry',
678
+ };
679
+ this.eventSvc.dispatchChatbotEvent(event);
680
+ }
681
+ redirectToResource(item) {
682
+ let queryParams = { ...this.route.snapshot.queryParams };
683
+ console.log(queryParams);
684
+ // Remove specific parameters
685
+ delete queryParams.st;
686
+ delete queryParams.et;
687
+ delete queryParams.pn;
688
+ delete queryParams.from;
689
+ delete queryParams.playerPreview;
690
+ let queryString = '';
691
+ queryString = Object.entries(queryParams)
692
+ .map(([key, value]) => `${encodeURI(key)}=${encodeURI(value)}`)
693
+ .join('&');
694
+ let path = '';
695
+ path = (item.mimeType === 'application/pdf') ? `/viewer/pdf/${item.identifier}?${queryString}&from=globalSearch&playerPreview=true&pn=${item?.pageNumber}` :
696
+ (item?.contentStart <= 0 && item?.contentEnd <= 0) ? `/viewer/video/${item.identifier}?${queryString}&from=globalSearch&playerPreview=true` : `/viewer/video/${item.identifier}?${queryString}&from=globalSearch&playerPreview=true&st=${item?.contentStart}&et=${item?.contentEnd}`;
697
+ // console.log('path', path)
698
+ // window.open(path, '_blank')
699
+ if (this.isMobile) {
700
+ this.maximize = false;
701
+ }
702
+ this.router.navigateByUrl(path);
703
+ }
704
+ copyPath(item, cindex) {
705
+ const queryString = Object.entries(this.route.snapshot.queryParams)
706
+ .map(([key, value]) => `${encodeURI(key)}=${encodeURI(value)}`)
707
+ .join('&');
708
+ //const queryString = new URLSearchParams(this.route.snapshot.queryParams).toString();
709
+ const selBox = document.createElement('textarea');
710
+ selBox.style.position = 'fixed';
711
+ selBox.style.left = '0';
712
+ selBox.style.top = '0';
713
+ selBox.style.opacity = '0';
714
+ selBox.value = item.mimeType === 'application/pdf' ? `https://portal.igotkarmayogi.gov.in/viewer/pdf/${item.identifier}?${queryString}&from=globalSearch&playerPreview=true&pn=${item?.pageNumber}` :
715
+ (item?.contentStart <= 0 && item?.contentEnd <= 0) ? `https://portal.igotkarmayogi.gov.in/viewer/video/${item.identifier}?${queryString}&from=globalSearch&playerPreview=true` : `https://portal.igotkarmayogi.gov.in/viewer/video/${item.identifier}?${queryString}&from=globalSearch&playerPreview=true&st=${item?.contentStart}&et=${item?.contentEnd}`;
716
+ document.body.appendChild(selBox);
717
+ selBox.focus();
718
+ selBox.select();
719
+ document.execCommand('copy');
720
+ document.body.removeChild(selBox);
721
+ this.copiedIndex = cindex;
722
+ setTimeout(() => {
723
+ this.copiedIndex = -1;
724
+ }, 1000);
725
+ }
726
+ redirectToToc(chat) {
727
+ const event = {
728
+ eventType: WsEvents.WsEventType.Telemetry,
729
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
730
+ data: {
731
+ edata: { type: 'click', "id": "ai-tutor-card-content", "pageid": `viewer/${this.content}`, "subType": this.selectedLearningStyle.title },
732
+ object: { id: chat?.identifier, type: chat?.contentType },
733
+ state: WsEvents.EnumTelemetrySubType.Interact,
734
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
735
+ mode: 'view',
736
+ },
737
+ pageContext: { pageId: `viewer/${this.content}`, module: 'Learn' },
738
+ from: '',
739
+ to: 'Telemetry',
740
+ };
741
+ this.eventSvc.dispatchChatbotEvent(event);
742
+ let path = `https://portal.igotkarmayogi.gov.in/app/toc/${chat?.identifier}/overview`;
743
+ window.open(path, '_blank');
744
+ }
745
+ splitParagraphByWords(paragraph, wordsPerChunk = 30) {
746
+ const words = paragraph.trim().split(/\s+/);
747
+ const chunks = [];
748
+ for (let i = 0; i < wordsPerChunk; i++) {
749
+ chunks.push(words[i]);
750
+ }
751
+ return chunks.join(' ');
752
+ }
753
+ toggleShow(index, showType) {
754
+ if (showType === 'less') {
755
+ this.aiTutorResultArr[index]['showLess'] = true;
756
+ }
757
+ else {
758
+ this.aiTutorResultArr[index]['showLess'] = false;
759
+ }
760
+ }
761
+ get userInitials() {
762
+ return this.initials;
763
+ }
764
+ createInititals(name) {
765
+ const randomIndex = Math.floor(Math.random() * Math.floor(this.colors.length));
766
+ this.circleColor = this.colors[randomIndex];
767
+ if (this.randomcolors) {
768
+ const randomIndex1 = Math.floor(Math.random() * Math.floor(this.randomcolors.length));
769
+ this.circleColor = this.randomcolors[randomIndex1];
770
+ }
771
+ let initials = '';
772
+ const array = `${name} `.toString().split(' ');
773
+ if (array[0] !== 'undefined' && typeof array[1] !== 'undefined') {
774
+ initials += array[0].charAt(0);
775
+ initials += array[1].charAt(0);
776
+ }
777
+ else {
778
+ for (let i = 0; i < name.length; i += 1) {
779
+ if (name.charAt(i) === ' ') {
780
+ continue;
781
+ }
782
+ if (name && (name.charAt(i) === name.charAt(i))) {
783
+ initials += name.charAt(i);
784
+ if (initials.length === 2) {
785
+ break;
786
+ }
787
+ }
788
+ }
789
+ }
790
+ this.initials = initials.toUpperCase();
791
+ }
792
+ getLearningStyle() {
793
+ const timestamp = Date.now();
794
+ this.chatId = `${this.configSvc.unMappedUser.userId}-${timestamp}`;
795
+ if (this.selectedLearningStyle && this.selectedLearningStyle.title === 'Socratic Style') {
796
+ this.aiTutorResultArr = [];
797
+ this.websocketService.closeConnection();
798
+ this.chatId = `${this.configSvc.unMappedUser.userId}-${timestamp}`;
799
+ this.websocketService.connect(`wss://${this.SocraticeStyleHost}/socratic/v1/ws?token=${this.jwtToken}`);
800
+ }
801
+ else if (this.selectedLearningStyle && this.selectedLearningStyle.title === 'None') {
802
+ this.aiTutorResultArr = [];
803
+ this.websocketService.closeConnection();
804
+ this.chatId = `${this.configSvc.unMappedUser.userId}-${timestamp}`;
805
+ this.websocketService.connect(`wss://${this.NoneSocketHost}/ws?token=${this.jwtToken}`);
806
+ }
807
+ else if (this.selectedLearningStyle && this.selectedLearningStyle.title === 'Storytelling') {
808
+ this.aiTutorResultArr = [];
809
+ this.websocketService.closeConnection();
810
+ this.chatId = `${this.configSvc.unMappedUser.userId}-${timestamp}`;
811
+ this.websocketService.connect(`wss://${this.StorytellingHost}/storytelling/v1/ws?token=${this.jwtToken}`);
812
+ }
813
+ // console.log('selectedLearningStyle--', this.selectedLearningStyle)
814
+ }
815
+ raiseTelemetryForResource(item) {
816
+ const event = {
817
+ eventType: WsEvents.WsEventType.Telemetry,
818
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
819
+ data: {
820
+ edata: { type: 'click', "id": "ai-tutor-card-content", "pageid": `viewer/${this.content}`, "subType": this.selectedLearningStyle.title },
821
+ object: { id: item?.identifier, type: item?.contentType },
822
+ state: WsEvents.EnumTelemetrySubType.Interact,
823
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
824
+ mode: 'view',
825
+ },
826
+ pageContext: { pageId: `viewer/${this.content}`, module: 'Learn' },
827
+ from: '',
828
+ to: 'Telemetry',
829
+ };
830
+ this.eventSvc.dispatchChatbotEvent(event);
831
+ }
832
+ sharePositiveContentRating(item, index, cindex) {
833
+ let requestBody = {
834
+ "query_id": item?.query_id,
835
+ "response": this.aiTutorResultArr[index]['answer'],
836
+ "comments": "",
837
+ "is_liked": true,
838
+ "rating": "5",
839
+ "identifier": this.content,
840
+ "query": item.query,
841
+ chat_id: this.chatId,
842
+ user_id: this.configSvc.unMappedUser.userId,
843
+ };
844
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
845
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex])
846
+ this.aiTutorResultArr[index].result[cindex]['showLoader'] = true;
847
+ this.aiTutorResultArr[index].result[cindex]['showLoaderForUp'] = true;
848
+ }
849
+ //this.matSnackBar.open('Unable to fetch content data, due to some error!')
850
+ this.chatbotService.saveAIChatPositiveContentRating(requestBody, this.chatId, this.userInfo?.userId).subscribe((data) => {
851
+ if (data && data.status === 'success') {
852
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
853
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex])
854
+ this.aiTutorResultArr[index].result[cindex]['feedback'] = 'up';
855
+ this.aiTutorResultArr[index].result[cindex]['showLoader'] = false;
856
+ this.aiTutorResultArr[index].result[cindex]['showLoaderForUp'] = false;
857
+ }
858
+ this.matSnackBarNew.open('Thank you for your feedback.', 'X', { duration: 5000, panelClass: ['success'] });
859
+ }
860
+ else {
861
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
862
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex])
863
+ this.aiTutorResultArr[index].result[cindex]['showLoader'] = false;
864
+ this.aiTutorResultArr[index].result[cindex]['showLoaderForUp'] = false;
865
+ }
866
+ this.matSnackBarNew.open('Something is wrong. Please try again later.', 'X', { duration: 5000, panelClass: ['error'] });
867
+ }
868
+ });
869
+ }
870
+ openAIFeedbackPopup(item, index, cindex) {
871
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index] && this.aiTutorResultArr[index]) {
872
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex] && this.aiTutorResultArr[index].result[cindex]['feedback'] !== 'down') {
873
+ const dialogRef = this.dialog.open(NonReleventFeedbackDialogComponent, {
874
+ disableClose: true,
875
+ width: '502px',
876
+ panelClass: ['relevent-feedback-dialog'],
877
+ });
878
+ dialogRef.afterClosed().subscribe((result) => {
879
+ if (result) {
880
+ this.shareAIFeedback(item, result, index, cindex);
881
+ dialogRef.close();
882
+ }
883
+ else {
884
+ dialogRef.close();
885
+ }
886
+ });
887
+ }
888
+ else {
889
+ this.matSnackBarNew.open('You have already submitted feedback', 'X', { duration: 5000, panelClass: ['error'] });
890
+ }
891
+ }
892
+ }
893
+ shareAIFeedback(item, result, index, cindex) {
894
+ let requestBody = {
895
+ "query_id": item?.query_id,
896
+ "response": this.aiTutorResultArr[index]['answer'],
897
+ "comments": result,
898
+ "is_liked": false,
899
+ "rating": "0",
900
+ "identifier": this.content,
901
+ "query": item.query,
902
+ chat_id: this.chatId,
903
+ user_id: this.configSvc.unMappedUser.userId,
904
+ };
905
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
906
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex]) {
907
+ this.aiTutorResultArr[index].result[cindex]['showLoader'] = true;
908
+ this.aiTutorResultArr[index].result[cindex]['showLoaderForDown'] = true;
909
+ }
910
+ }
911
+ this.chatbotService.shareAIFeedback(requestBody, this.chatId, this.userInfo?.userId).subscribe((data) => {
912
+ if (data && data.status === 'success') {
913
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
914
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex])
915
+ this.aiTutorResultArr[index].result[cindex]['feedback'] = 'down';
916
+ this.aiTutorResultArr[index].result[cindex]['showLoader'] = false;
917
+ this.aiTutorResultArr[index].result[cindex]['showLoaderForDown'] = false;
918
+ }
919
+ this.matSnackBarNew.open('Thank you for your feedback.', 'X', { duration: 5000, panelClass: ['success'] });
920
+ }
921
+ else {
922
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
923
+ if (this.aiTutorResultArr[index].result && this.aiTutorResultArr[index].result[cindex])
924
+ this.aiTutorResultArr[index].result[cindex]['showLoader'] = false;
925
+ this.aiTutorResultArr[index].result[cindex]['showLoaderForDown'] = false;
926
+ }
927
+ this.matSnackBarNew.open('Something is wrong. Please try again later.', 'X', { duration: 5000, panelClass: ['error'] });
928
+ }
929
+ });
930
+ }
931
+ sharePositiveContentRatingForAnswer(item, index) {
932
+ let requestBody = {
933
+ "query_id": item.query_id,
934
+ "response": item.answer,
935
+ "comments": "",
936
+ "is_liked": true,
937
+ "rating": "5",
938
+ "identifier": this.content,
939
+ "query": item.query
940
+ };
941
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
942
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index])
943
+ this.aiTutorResultArr[index]['showLoader'] = true;
944
+ this.aiTutorResultArr[index]['showLoaderForUp'] = true;
945
+ }
946
+ //this.matSnackBar.open('Unable to fetch content data, due to some error!')
947
+ this.chatbotService.saveAIChatPositiveContentRating(requestBody, this.chatId, this.userInfo?.userId).subscribe((data) => {
948
+ if (data && data.status === 'success') {
949
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
950
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index])
951
+ this.aiTutorResultArr[index]['feedback'] = 'up';
952
+ this.aiTutorResultArr[index]['showLoader'] = false;
953
+ this.aiTutorResultArr[index]['showLoaderForUp'] = false;
954
+ }
955
+ this.matSnackBarNew.open('Thank you for your feedback.', 'X', { duration: 5000, panelClass: ['success'] });
956
+ }
957
+ else {
958
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
959
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index])
960
+ this.aiTutorResultArr[index]['showLoader'] = false;
961
+ this.aiTutorResultArr[index]['showLoaderForUp'] = false;
962
+ }
963
+ this.matSnackBarNew.open('Something is wrong. Please try again later.', 'X', { duration: 5000, panelClass: ['error'] });
964
+ }
965
+ });
966
+ }
967
+ openAIFeedbackPopupForAnswer(item, index) {
968
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index] && this.aiTutorResultArr[index]) {
969
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index] && this.aiTutorResultArr[index]['feedback'] !== 'down') {
970
+ const dialogRef = this.dialog.open(NonReleventFeedbackDialogComponent, {
971
+ disableClose: true,
972
+ width: '502px',
973
+ panelClass: ['relevent-feedback-dialog'],
974
+ });
975
+ dialogRef.afterClosed().subscribe((result) => {
976
+ if (result) {
977
+ this.shareAIForAnswerFeedback(item, result, index);
978
+ dialogRef.close();
979
+ }
980
+ else {
981
+ dialogRef.close();
982
+ }
983
+ });
984
+ }
985
+ else {
986
+ this.matSnackBarNew.open('You have already submitted feedback', 'X', { duration: 5000, panelClass: ['error'] });
987
+ }
988
+ }
989
+ }
990
+ shareAIForAnswerFeedback(item, result, index) {
991
+ let requestBody = {
992
+ "query_id": item.query_id,
993
+ "response": item?.answer,
994
+ "comments": result,
995
+ "is_liked": false,
996
+ "rating": "0",
997
+ "identifier": this.content,
998
+ "query": item.query
999
+ };
1000
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
1001
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index]) {
1002
+ this.aiTutorResultArr[index]['showLoader'] = true;
1003
+ this.aiTutorResultArr[index]['showLoaderForDown'] = true;
1004
+ }
1005
+ }
1006
+ this.chatbotService.shareAIFeedback(requestBody, this.chatId, this.userInfo?.userId).subscribe((data) => {
1007
+ if (data && data.status === 'success') {
1008
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
1009
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index])
1010
+ this.aiTutorResultArr[index]['feedback'] = 'down';
1011
+ this.aiTutorResultArr[index]['showLoader'] = false;
1012
+ this.aiTutorResultArr[index]['showLoaderForDown'] = false;
1013
+ }
1014
+ this.matSnackBarNew.open('Thank you for your feedback.', 'X', { duration: 5000, panelClass: ['success'] });
1015
+ }
1016
+ else {
1017
+ if (this.aiTutorResultArr && this.aiTutorResultArr.length && this.aiTutorResultArr[index]) {
1018
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index])
1019
+ this.aiTutorResultArr[index]['showLoader'] = false;
1020
+ this.aiTutorResultArr[index]['showLoaderForDown'] = false;
1021
+ }
1022
+ this.matSnackBarNew.open('Something is wrong. Please try again later.', 'X', { duration: 5000, panelClass: ['error'] });
1023
+ }
1024
+ });
1025
+ }
1026
+ callFromInternet(item, index) {
1027
+ this.aiTutorResultArr.push({ type: 'incoming', tab: 'sarthi', answer: '' });
1028
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index]['showFromInternet']) {
1029
+ this.aiTutorResultArr[index]['showFromInternet'] = false;
1030
+ }
1031
+ if (item && !item.answer) {
1032
+ let internetGlobalSearchRequest = {
1033
+ "query": this.cloneSearchQuery,
1034
+ "designation": this.userInfo?.professionalDetails && this.userInfo?.professionalDetails.length ? this.userInfo?.professionalDetails[0].designation : '',
1035
+ "department": this.userInfo?.departmentName ? this.userInfo?.departmentName : '',
1036
+ };
1037
+ this.chatbotService.aiGlobalSearchFromInternet(internetGlobalSearchRequest, '', this.userInfo?.userId).subscribe((idata) => {
1038
+ this.resultFetch = true;
1039
+ this.aiTutorResultArr.map((item, index) => {
1040
+ if (item && (item.newMessage === '')) {
1041
+ // delete this.aiSearchResultArr[index]
1042
+ this.aiTutorResultArr.splice(index, 1);
1043
+ }
1044
+ });
1045
+ let resultObj = {
1046
+ message: idata.answer,
1047
+ recommendedQues: '',
1048
+ selectedValue: '',
1049
+ title: idata.answer,
1050
+ content: idata,
1051
+ mimeType: idata,
1052
+ contentType: idata,
1053
+ artifactUrl: idata,
1054
+ description: idata.answer,
1055
+ identifier: idata,
1056
+ contentStart: idata,
1057
+ contentEnd: idata,
1058
+ pageNumber: idata,
1059
+ query: this.cloneSearchQuery,
1060
+ query_id: idata.query_id,
1061
+ resourceLink: '',
1062
+ feedback: '',
1063
+ fromInternet: true
1064
+ };
1065
+ this.iGOTAITutorResultArr.push(resultObj);
1066
+ let answer = idata.answer ? idata.answer.trim().replace(/\n/g, '<br>') : "";
1067
+ let shortAnswer = this.splitParagraphByWords(answer);
1068
+ this.aiTutorResultArr.push({ feedback: '', wordsCount: answer.trim().split(/\s+/).length, showLess: answer.trim().split(/\s+/).length > 30 ? true : false, answer: answer, shortAnswer: shortAnswer, result: this.iGOTAITutorResultArr, type: 'incoming', tab: 'sarthi', reterivedChunks: this.aiTutorResult.retrievedChunks, showFromInternet: false });
1069
+ this.aiTutorResultArr.map((item, index) => {
1070
+ if (item && (item.newMessage === '')) {
1071
+ // delete this.aiSearchResultArr[index]
1072
+ this.aiTutorResultArr.splice(index, 1);
1073
+ }
1074
+ });
1075
+ });
1076
+ }
1077
+ }
1078
+ rejectFromInternet(index) {
1079
+ if (this.aiTutorResultArr[index] && this.aiTutorResultArr[index]['showFromInternet']) {
1080
+ this.aiTutorResultArr[index]['showFromInternet'] = false;
1081
+ }
1082
+ this.resultFetch = true;
1083
+ this.aiTutorResultArr.map((item, index) => {
1084
+ if (item && (item.newMessage === '')) {
1085
+ // delete this.aiSearchResultArr[index]
1086
+ this.aiTutorResultArr.splice(index, 1);
1087
+ }
1088
+ });
1089
+ }
1090
+ ngOnDestroy() {
1091
+ // Clean up the subscription and WebSocket connection
1092
+ if (this.messageSubscription) {
1093
+ this.messageSubscription.unsubscribe();
1094
+ }
1095
+ const event = {
1096
+ eventType: WsEvents.WsEventType.Telemetry,
1097
+ eventLogLevel: WsEvents.WsEventLogLevel.Info,
1098
+ data: {
1099
+ edata: { type: 'click', "id": "ai-tutor-card-content", "pageid": `viewer/${this.content}`, "subType": this.selectedLearningStyle.title },
1100
+ object: { id: this.content },
1101
+ state: WsEvents.EnumTelemetrySubType.Unloaded,
1102
+ eventSubType: WsEvents.EnumTelemetrySubType.Chatbot,
1103
+ mode: 'view',
1104
+ },
1105
+ pageContext: { pageId: `viewer/${this.content}`, module: 'Learn' },
1106
+ from: '',
1107
+ to: 'Telemetry',
1108
+ };
1109
+ this.eventSvc.dispatchChatbotEvent(event);
1110
+ // this.websocketService.closeConnection();
1111
+ }
1112
+ resizeTextarea(textArea, _fromInput) {
1113
+ if (textArea) {
1114
+ textArea.style.height = 'auto'; // Reset height first
1115
+ requestAnimationFrame(() => {
1116
+ textArea.style.height = textArea.scrollHeight + 'px';
1117
+ const computed = getComputedStyle(textArea);
1118
+ const paddingTop = parseFloat(computed.paddingTop) || 0;
1119
+ const paddingBottom = parseFloat(computed.paddingBottom) || 0;
1120
+ const marginExtra = 0;
1121
+ this.containerHeight = textArea.scrollHeight + paddingTop + paddingBottom + marginExtra;
1122
+ });
1123
+ }
1124
+ }
1125
+ resetTextAreaHeight(_textArea) {
1126
+ if (this.textArea.nativeElement && this.textArea.nativeElement.style && this.textArea.nativeElement.style.height) {
1127
+ setTimeout(() => {
1128
+ this.searchQueryAItutor = this.searchQueryAItutor.trim();
1129
+ this.textArea.nativeElement.style.height = 'auto';
1130
+ this.textArea.nativeElement.style.height = '30px';
1131
+ const computed = getComputedStyle(this.textArea.nativeElement);
1132
+ const paddingTop = parseFloat(computed.paddingTop) || 0;
1133
+ const paddingBottom = parseFloat(computed.paddingBottom) || 0;
1134
+ const marginExtra = 0;
1135
+ this.containerHeight = 30 + paddingTop + paddingBottom + marginExtra;
1136
+ });
1137
+ }
1138
+ }
1139
+ closeAITutorPopup() {
1140
+ this.closeAIPopup.emit(true);
1141
+ }
1142
+ minimizeAITutor() {
1143
+ this.maximize = false;
1144
+ }
1145
+ maximizeAITutor() {
1146
+ this.maximize = true;
1147
+ }
1148
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AiTutorComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.ConfigurationsService }, { token: i2.EventService }, { token: i0.Renderer2 }, { token: i3.RootService }, { token: i4.WebSocketService }, { token: i5.MatLegacyDialog }, { token: i6.MatSnackBar }, { token: i2.UtilityService }, { token: "environment" }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1149
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AiTutorComponent, selector: "ws-widget-ai-tutor", inputs: { from: "from", content: "content", userJourney: "userJourney" }, outputs: { closeAIPopup: "closeAIPopup" }, viewQueries: [{ propertyName: "textArea", first: true, predicate: ["autoResizeTextarea"], descendants: true }], ngImport: i0, template: "<!-- <div class=\"tutor-container\">\n<div class=\"learning-type-container\">\n <mat-form-field appearance=\"none\">\n <select matNativeControl required class=\"section-dd\" >\n <option value=\"\">Select learning type here </option>\n <option value=\"\">None</option>\n <option value=\"\">Socratic</option>\n <option value=\"\">Story Telling</option>\n <option value=\"\">Summarisation</option>\n </select>\n </mat-form-field>\n</div>\n<div [ngClass]=\"from === 'chatbot' ? 'ai-tutor-container-chatbot':'ai-tutor-container'\" #scrollMe>\n <div class=\"message-container\" #scrollMe>\n <div class=\"start-chat\" *ngIf=\"aiTutorResultArr?.length === 0\">\n <h2 class=\"hey\">Hey<span *ngIf=\"userInfo?.firstName\">, {{userInfo?.firstName}}</span> </h2>\n <p>Welcome to Ai Tutor,\u2028Get instant explanations, step-by-step learning guidance, and customised learning tailored just for you.</p>\n </div>\n <ng-container *ngFor=\"let chat of aiTutorResultArr; let i =index\">\n <ng-container *ngIf=\"chat.type === 'incoming'\">\n <ng-container *ngIf=\"chat?.answer\">\n <div class=\"flex row-start incoming-msg margin-bottom-s\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/chatbot-ai-new.svg\"></div>\n \n <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount <= 30\" [innerHTML]=\"chat.answer\">\n </div>\n <div class=\"system-msg padding-xs\">\n <div *ngIf=\"chat?.wordsCount > 30\" [innerHTML]=\"chat?.showLess ? chat.shortAnswer : chat.answer\"></div>\n <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"!chat?.showLess\" (click)=\"toggleShow(i, 'less')\">Show Less</a>\n <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"chat?.showLess\" (click)=\"toggleShow(i, 'more')\">Show More</a>\n </div>\n \n\n </div>\n <ng-container *ngFor=\"let item of chat?.result; let ci=index\">\n <div class=\"system-msg-mimetype flex flex-col\" *ngIf=\"item?.contentType === 'Resource'\">\n <ng-container *ngIf=\"item?.mimeType === 'application/pdf'\">\n <div class=\"resource-icon\"><a [href]=\"item?.resourceLink\" target=\"_blank\"><img src=\"/assets/icons/ai-pdf-icon.jpg\"></a></div>\n <div class=\"resource-link\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Open Resource Link</a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"item?.mimeType === 'video/mp4'\">\n \n <div class=\"position-relative\">\n <div class=\"position-relative\">\n <img src=\"/assets/icons/ai-video-icon.jpg\">\n\n </div>\n <div class=\"content-duration\" *ngIf=\"item?.contentStart || item?.contentEnd\">\n <span *ngIf=\"item?.contentStart\">{{item?.contentStart}}</span>\n <span *ngIf=\"item?.contentEnd\">:{{item?.contentEnd}}</span>\n </div>\n </div>\n <div class=\"resource-link\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Open Resource Link</a>\n </div>\n </ng-container>\n </div>\n <div class=\"recommended-question my-5px\" [ngClass]=\"{'margin-left-5': item?.message }\">\n <div class=\"my-5px mr-2\">\n <ng-container *ngIf=\"item?.contentType !== 'Resource'\">\n <div class=\"btn-default\" (click)=\"redirectToToc(item)\">{{item?.title}}\n <mat-icon class=\"vertical-middle\">navigate_next</mat-icon>\n </div>\n <div>\n {{item?.description | slice : 0:50}}\n </div>\n </ng-container>\n </div>\n <div class=\"flex flex-row font-12\">\n <div class=\"cursor-pointer\" (click)=\"copyPath(item, ci)\">\n <mat-icon matTooltip=\"Copy\" aria-label=\"Copy\">content_copy</mat-icon>\n <span *ngIf=\"copiedIndex === ci\" class=\"copied-tooltip\">Link Copied!</span>\n </div>\n <div class=\"ml-2 mr-2\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are AI generated results</div>\n </div>\n </div>\n </ng-container>\n \n \n </ng-container>\n <ng-container *ngIf=\"!chat?.answer\">\n <div class=\"flex row-start incoming-msg margin-bottom-s\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/chatbot-ai-new.svg\"></div>\n <div class=\"loading-bar-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/loading_bar.gif\"></div>\n </div>\n \n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"chat.type === 'sendMsg'\">\n <div class=\"flex width-1-1 row-end padding-top-l padding-bottom-m\">\n <div class=\"user-seleted-question padding-xs\">\n {{chat?.question}}\n </div>\n <div class=\"user-icon\" *ngIf=\"userIcon\">\n <img alt=\"ai-icon\" src=\"{{userIcon}}\">\n </div>\n <div class=\"circle-s user-icon\" *ngIf=\"!userIcon\" [ngStyle]=\"{'background-color': circleColor }\">\n <div class=\"initials\" i18n-aria-label>\n {{ userInitials }} \n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div> \n</div>\n<div class=\"control-container\">\n <div class=\"border-gradient-rounded\">\n <div class=\"flex flex-row mx-5 justify-between\">\n\n <div class=\"query-box\">\n <input class=\"width-500\" type=\"text\" placeholder=\"Ask anything...\" [(ngModel)]=\"searchQueryAItutor\" (keydown.enter)=\"submitSearchQuery()\"/>\n \n </div>\n\n <div>\n <button type=\"button\" class=\"flex-auto-display send-btn\" (click)=\"submitSearchQuery()\" [disabled]=\"!searchQueryAItutor\">\n <mat-icon class=\"send-btn-icon\">send</mat-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n</div> -->\n\n<div class=\"overflow-y-hidden\" [ngClass]=\"(isMobile && !maximize ? 'ai-tutor-popup-minimize' : (isMobile ? 'ai-tutor-popup': ''))\">\n<div *ngIf=\"isMobile\">\n <div class=\"flex flex-row ai-tutor-mobile-header\">\n <div class=\"flex flex-row\">\n <div class=\"flex\">\n <span class=\"font-bold\">AI Tutor</span>\n </div> \n <div class=\"red-circle ml-5\">\n New\n </div>\n </div>\n <div class=\"flex flex-row justify-end\">\n <div *ngIf=\"maximize\" (click)=\"minimizeAITutor()\">\n <mat-icon>minimize</mat-icon>\n </div>\n <div *ngIf=\"!maximize\" (click)=\"maximizeAITutor()\">\n <mat-icon>maximize</mat-icon>\n </div>\n <div (click)=\"closeAITutorPopup()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n \n \n </div>\n</div>\n<div [hidden]=\"!maximize\">\n<div class=\"header\">\n <!-- <mat-form-field appearance=\"none\" style=\"width:100%\">\n <select matNativeControl required class=\"section-dd\" >\n <option value=\"\">You can also choose a learning style that suits you best from here.</option>\n <option value=\"\">None</option>\n <option value=\"\">Socratic</option>\n <option value=\"\">Story Telling</option>\n <option value=\"\">Summarisation</option>\n </select>\n </mat-form-field> -->\n <mat-form-field class=\"multiline-select\" appearance=\"fill\" style=\"width: 100%; height: 80px;\" floatLabel=\"never\">\n <mat-select class=\"multiline-select-box\" required [(value)]=\"selectedLearningStyle\" (selectionChange)=\"getLearningStyle()\">\n <mat-select-trigger class=\"multiline-select-box-trigger\">\n <div class=\"option-content\">\n <div class=\"title\">{{ selectedLearningStyle?.title }}</div>\n <div class=\"subtitle\">{{ selectedLearningStyle?.subtitle }}</div>\n </div>\n </mat-select-trigger>\n <mat-option class=\"multiline-select-option\" value=\"\" *ngFor=\"let item of learningStyle\" [value]=\"item\">\n <div class=\"option-content\">\n <div class=\"title\">{{item?.title}}</div>\n <div class=\"subtitle\">{{item?.subtitle}}</div>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n \n</div>\n\n<div class=\"container-none\" id=\"container-none\">\n <div [ngClass]=\"from === 'chatbot' ? 'ai-tutor-container-chatbot':'ai-tutor-container'\">\n <div class=\"message-container\" #scrollMe>\n <div class=\"start-chat\" *ngIf=\"aiTutorResultArr?.length === 0\">\n <h2 class=\"hey\">Hey<span *ngIf=\"userInfo?.firstName\">, {{userInfo?.firstName}}</span> </h2>\n <p>Welcome to AI Tutor,\u2028Get instant explanations, step-by-step learning guidance, and customised learning tailored just for you.</p>\n </div>\n <ng-container *ngFor=\"let chat of aiTutorResultArr; let i =index\">\n <ng-container *ngIf=\"chat.type === 'incoming'\">\n <ng-container *ngIf=\"chat?.answer || chat?.showFromInternet\">\n <div class=\"flex row-start incoming-msg margin-bottom-s\" *ngIf=\"chat?.answer\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/bot-chat-small.svg\"></div>\n \n <!-- <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount <= 30\" [innerHTML]=\"chat.answer\">\n </div> -->\n <div class=\"flex row-start incoming-msg margin-bottom-s\" *ngIf=\"chat?.showFromInternet\">\n <div class=\"system-msg padding-xs mx-10\">\n I couldn\u2019t find any relevant results for your query. Would you like me to search outside the iGOT platform for more information?\n </div>\n \n </div>\n <ng-container *ngIf=\"chat?.answer\">\n <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount <= 30\">\n <markdown [data]=\"chat?.answer\"></markdown>\n </div>\n \n <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount > 30\" >\n <!-- <div [innerHTML]=\"chat?.showLess ? chat.shortAnswer : chat.answer\"></div> -->\n <markdown [data]=\"chat?.answer\"></markdown>\n <!-- <markdown [data]=\"chat?.showLess ? chat.shortAnswer : chat.answer\"></markdown> -->\n <!-- <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"!chat?.showLess\" (click)=\"toggleShow(i, 'less')\">Show Less</a>\n <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"chat?.showLess\" (click)=\"toggleShow(i, 'more')\">Show More</a> -->\n </div>\n </ng-container>\n \n \n </div>\n \n <div *ngIf=\"chat?.showFromInternet\">\n <div class=\"flex row my-2 justify-start mx-10 my-5\">\n <div (click)=\"callFromInternet(chat, i)\">\n <button type=\"button\" class=\"web-button px-4 cursor-pointer\">\n <mat-icon class=\"web-search-icon\">search </mat-icon><span class=\"blue-color\">Search the web</span>\n </button>\n </div>\n <div (click)=\"rejectFromInternet(i)\" class=\"mx-2\">\n <button type=\"button\" class=\"web-button py-2 px-4 cursor-pointer\">\n <mat-icon class=\"web-close-icon\">close</mat-icon><span class=\"blue-color\">No</span>\n </button>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let item of chat?.result; let ci=index\">\n <div class=\"system-msg-mimetype flex flex-col\" *ngIf=\"item?.contentType === 'Resource'\">\n <ng-container *ngIf=\"item?.mimeType === 'application/pdf'\">\n <!-- <div class=\"resource-icon\"><a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <img src=\"/assets/icons/ai-pdf-icon.jpg\"></a>\n </div> -->\n <div class=\"recommended-question-for-resource mx-10\" (click)=\"redirectToResource(item);raiseTelemetryForResource(item)\">\n <!-- <div class=\"resource-icon\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <img src=\"/assets/ai-tutor/pdf.svg\">\n </a>\n <p>{{item?.message}}</p>\n </div> -->\n <div class=\"btn-default mb-2\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">\n <img class=\"vertical-middle h-w-34\" src=\"/assets/ai-tutor/pdf.svg\">\n </a>\n {{item?.title}}\n <mat-icon class=\"vertical-middle\" *ngIf=\"!(item?.fromInternet)\">navigate_next</mat-icon>\n </div>\n </div>\n <!-- <div class=\"resource-link\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Click to view</a>\n </div> -->\n </ng-container>\n <!-- <ng-container *ngIf=\"item?.mimeType === 'video/mp4'\">\n \n <div class=\"resource-icon\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <div class=\"position-relative\">\n <div class=\"position-relative\">\n <img src=\"/assets/icons/ai-video-icon.jpg\">\n \n </div>\n <div class=\"content-duration flex\" *ngIf=\"item?.contentStart > -1 && item?.contentEnd > -1 && !(item?.fromInternet)\">\n <span><mat-icon>access_time</mat-icon>&nbsp;&nbsp;</span>\n <span *ngIf=\"item?.contentStart > -1\">\n <span *ngIf=\"item?.contentStart > 0\">{{item?.contentStart | pipeDurationTransform: 'hms'}}</span>\n <span *ngIf=\"item.contentStart === '0'\">0</span>\n </span>\n <span *ngIf=\"item?.contentEnd > -1\">&nbsp;-&nbsp;{{item?.contentEnd | pipeDurationTransform: 'hms'}}</span>\n </div>\n </div>\n \n \n </a>\n </div>\n </ng-container> -->\n <ng-container *ngIf=\"item?.mimeType === 'video/mp4'\">\n <div class=\"recommended-question-for-resource mx-10\" (click)=\"redirectToResource(item);raiseTelemetryForResource(item)\">\n \n <div class=\"btn-default mb-2\">\n <div class=\"flex flex-row\">\n <div>\n <a [href]=\"item?.resourceLink\" target=\"_blank\">\n <img class=\"vertical-middle h-w-34\" src=\"/assets/ai-tutor/video.svg\">\n </a>\n </div>\n <div class=\"ml-1\">\n <span>{{item?.title}} </span>\n </div>\n <div>\n <span class=\"content-duration flex ml-1\" *ngIf=\"item?.contentStart > -1 && item?.contentEnd > -1 && !(item?.fromInternet)\">\n <span><mat-icon>access_time</mat-icon>&nbsp;&nbsp;</span>\n <span *ngIf=\"item?.contentStart > -1\">\n <span *ngIf=\"item?.contentStart > 0\">{{item?.contentStart | pipeDurationTransform: 'hms'}}</span>\n <span *ngIf=\"item.contentStart === '0'\">0</span>\n </span>\n <span *ngIf=\"item?.contentEnd > -1\">&nbsp;-&nbsp;{{item?.contentEnd | pipeDurationTransform: 'hms'}}</span>\n </span> \n </div>\n <div>\n <mat-icon class=\"vertical-middle\" *ngIf=\"!(item?.fromInternet)\">navigate_next</mat-icon>\n </div>\n </div>\n </div>\n <!-- <a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <div class=\"position-relative\">\n <div class=\"position-relative\">\n <img class=\"h-w-34\" src=\"/assets/ai-tutor/video.svg\">\n <p>{{item?.message}}</p>\n </div>\n <div class=\"content-duration flex\" *ngIf=\"item?.contentStart > -1 && item?.contentEnd > -1 && !(item?.fromInternet)\">\n <span><mat-icon>access_time</mat-icon>&nbsp;&nbsp;</span>\n <span *ngIf=\"item?.contentStart > -1\">\n <span *ngIf=\"item?.contentStart > 0\">{{item?.contentStart | pipeDurationTransform: 'hms'}}</span>\n <span *ngIf=\"item.contentStart === '0'\">0</span>\n </span>\n <span *ngIf=\"item?.contentEnd > -1\">&nbsp;-&nbsp;{{item?.contentEnd | pipeDurationTransform: 'hms'}}</span>\n </div>\n </div>\n \n \n </a> -->\n </div>\n </ng-container>\n <div class=\"flex flex-row cursor-pointer\">\n <!-- <div class=\"resource-link\" *ngIf=\"!(item?.fromInternet)\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Click to view</a>\n </div> -->\n <div class=\"cursor-pointer ml-10 mr-2 my-1\" (click)=\"copyPath(item, ci)\" *ngIf=\"item?.contentType === 'Resource' && !(item?.fromInternet)\">\n <mat-icon matTooltip=\"Copy\" aria-label=\"Copy\">content_copy</mat-icon>\n <span *ngIf=\"copiedIndex === ci\" class=\"copied-tooltip\">Link Copied!</span>\n </div>\n <!-- <div class=\"feefback-section flex flex-row my-1\" *ngIf=\"(item?.feedback)\">\n <div *ngIf=\"item?.feedback !== 'down'\"\n class=\"cursor-pointer feedback-icon mt-1\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" class=\"ml-2 cursor-pointer feedback-icon\">\n <img src=\"/assets/ai-tutor/fill-down.svg\">\n </div>\n </div>\n <div class=\"feefback-section flex flex-row my-1\" *ngIf=\"item?.feedback === ''\">\n <div *ngIf=\"item?.feedback !== 'down'\" (click)=\"sharePositiveContentRating(item,i, ci)\"\n class=\"cursor-pointer feedback-icon\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img src=\"/assets/ai-tutor/down.svg\">\n </div>\n </div> -->\n <div class=\"feefback-section flex flex-row my-1\">\n <div (click)=\"sharePositiveContentRating(item,i, ci)\" class=\"cursor-pointer feedback-icon mt-1\" \n >\n <img [ngClass]=\"'rotate-180'\" *ngIf=\"item?.feedback !== 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback === 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/up.svg\">\n <img *ngIf=\"item?.showLoaderForUp\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n <div (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img *ngIf=\"item?.feedback !== 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/down.svg\"> \n <img *ngIf=\"item?.feedback === 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/fill-down.svg\"> \n <img *ngIf=\"item?.showLoaderForDown\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n </div>\n <!-- <div class=\"flex flex-row font-12 mt-1\">\n <div class=\"ml-2 mr-2 cu\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are <span *ngIf=\"item?.fromInternet\">Web</span><span *ngIf=\"!(item?.fromInternet)\">AI</span> generated results</div>\n </div> -->\n <!-- <div class=\"feefback-section flex flex-row\">\n \n <div *ngIf=\"item?.feedback !== 'down'\" (click)=\"sharePositiveContentRating(item,i, ci)\"\n class=\"cursor-pointer feedback-icon\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon\"><img src=\"/assets/ai-tutor/down.svg\"></div>\n </div> -->\n </div>\n \n </div>\n <div class=\"recommended-question\" [ngClass]=\"{'ml-10': item?.message }\">\n <div class=\"my-5px mr-2 w-92\">\n <ng-container *ngIf=\"item?.contentType !== 'Resource' && !(item?.fromInternet)\">\n <div class=\"btn-default\" (click)=\"redirectToToc(item)\">{{item?.title}}\n <mat-icon class=\"vertical-middle\" *ngIf=\"!(item?.fromInternet)\">navigate_next</mat-icon>\n </div>\n <div class=\"recommended-question-desc\" *ngIf=\"!(item?.fromInternet)\">\n <!-- {{item?.description}} -->\n <markdown [data]=\"item?.description\"></markdown>\n </div>\n </ng-container>\n </div>\n <div class=\"flex flex-row font-12 mb-2\">\n <div class=\"cursor-pointer\" (click)=\"copyPath(item, ci)\" *ngIf=\"item?.contentType !== 'Resource' && !(item?.fromInternet)\">\n <mat-icon matTooltip=\"Copy\" aria-label=\"Copy\">content_copy</mat-icon>\n <span *ngIf=\"copiedIndex === ci\" class=\"copied-tooltip\">Link Copied!</span>\n </div>\n <!-- <div class=\"feefback-section flex flex-row\" *ngIf=\"item?.contentType !== 'Resource'\">\n \n <div *ngIf=\"item?.feedback !== 'down'\" (click)=\"sharePositiveContentRating(item, i,ci)\" \n class=\"cursor-pointer feedback-icon\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" (click)=\"openAIFeedbackPopup(item, i,ci)\" class=\"ml-2 cursor-pointer feedback-icon\"><img src=\"/assets/ai-tutor/down.svg\"></div>\n </div> -->\n <div class=\"feefback-section flex flex-row\" *ngIf=\"item?.contentType !== 'Resource'\">\n <div (click)=\"sharePositiveContentRating(item,i, ci)\" class=\"cursor-pointer feedback-icon mt-1\" \n >\n <img [ngClass]=\"'rotate-180'\" *ngIf=\"item?.feedback !== 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback === 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/up.svg\">\n <img *ngIf=\"item?.showLoaderForUp\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n <div (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img *ngIf=\"item?.feedback !== 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/down.svg\"> \n <img *ngIf=\"item?.feedback === 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/fill-down.svg\"> \n <img *ngIf=\"item?.showLoaderForDown\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n </div> \n </div>\n <!-- <div class=\"flex flex-row font-12 mt-1\" *ngIf=\"item?.contentType !== 'Resource'\">\n <div class=\"ml-2 mr-2 cu\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are <span *ngIf=\"item?.fromInternet\">Web</span><span *ngIf=\"!(item?.fromInternet)\">AI</span> generated results</div>\n </div> -->\n </div>\n </ng-container>\n <div class=\" flex flex-row ml-10\" *ngIf=\"chat?.answer && !(chat?.result?.length)\">\n <div (click)=\"sharePositiveContentRatingForAnswer(chat,i)\" class=\"cursor-pointer feedback-icon mt-1\" \n >\n <img [ngClass]=\"'rotate-180'\" *ngIf=\"chat?.feedback !== 'up' && !chat?.showLoaderForUp\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"chat?.feedback === 'up' && !chat?.showLoaderForUp\" src=\"/assets/ai-tutor/up.svg\">\n <img *ngIf=\"chat?.showLoaderForUp\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n <div (click)=\"openAIFeedbackPopupForAnswer(chat,i)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img *ngIf=\"chat?.feedback !== 'down' && !chat?.showLoaderForDown\" src=\"/assets/ai-tutor/down.svg\"> \n <img *ngIf=\"chat?.feedback === 'down' && !chat?.showLoaderForDown\" src=\"/assets/ai-tutor/fill-down.svg\"> \n <img *ngIf=\"chat?.showLoaderForDown\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n </div> \n <div class=\"flex flex-row font-12 mt-1 mb-1 ai-generated-content-container\" *ngIf=\"chat?.result?.length\">\n <div class=\"ml-5 mr-2 cu\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are <span *ngIf=\"item?.fromInternet\">Web</span><span *ngIf=\"!(item?.fromInternet)\">AI</span> generated results</div>\n </div>\n \n </ng-container>\n <ng-container>\n <div class=\"flex row-start incoming-msg margin-bottom-s\" *ngIf=\"chat?.newMessage === '' && !resultFetch\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/bot-chat-small.svg\"></div>\n <div class=\"loading-bar-icon flex flex-row vertical-middle\">\n <div class=\"mt-2\"><span class=\"blue-color\">Retrieving Results</span></div>\n <div><img alt=\"ai-icon\" src=\"/assets/icons/loading_bar.gif\"></div>\n </div>\n </div>\n \n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"chat.type === 'sendMsg'\">\n <div class=\"flex width-1-1 row-end padding-top-l padding-bottom-m\">\n <div class=\"user-seleted-question padding-xs\">\n {{chat?.question}}\n </div>\n <div class=\"user-icon\" *ngIf=\"userIcon\">\n <img alt=\"ai-icon\" src=\"{{userIcon}}\">\n </div>\n <div class=\"circle-s user-icon\" *ngIf=\"!userIcon\" [ngStyle]=\"{'background-color': circleColor }\">\n <div class=\"initials\" i18n-aria-label>\n {{ userInitials }} \n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div> \n </div>\n</div>\n\n<div class=\"footer\" [ngClass]=\"isMobile ? 'ai-popup-mobile-footer':''\">\n <div class=\"border-gradient-rounded\" [style.height.px]=\"containerHeight\">\n <div class=\"flex flex-row ml-5 mr-2 justify-between\">\n\n <div class=\"query-box\">\n <!-- <input class=\"width-500\" type=\"text\" placeholder=\"Ask anything...\" [(ngModel)]=\"searchQueryAItutor\" (keydown.enter)=\"submitSearchQuery()\"/> -->\n <textarea #autoResizeTextarea class=\"width-500\"\n placeholder=\"Ask Me Anything...\"\n (input)=\"resizeTextarea(autoResizeTextarea, 'fromInput')\"\n [(ngModel)]=\"searchQueryAItutor\" (keydown.enter)=\"submitSearchQuery(autoResizeTextarea, $event)\"\n rows=\"1\"\n >\n </textarea>\n \n </div>\n\n <div class=\"margin-top-2px\">\n <button type=\"button\" class=\"flex-auto-display send-btn\" (click)=\"submitSearchQuery(autoResizeTextarea, $event)\" [disabled]=\"!searchQueryAItutor\">\n <mat-icon class=\"send-btn-icon\">send</mat-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n</div>\n</div>", styles: [".hey{background:linear-gradient(90deg,#32b9dfde,#1b4ca1de);-webkit-background-clip:text;background-clip:text;color:transparent}.ai-generated-content{background:linear-gradient(90deg,#f3962f,#1b4ca1);-webkit-background-clip:text;background-clip:text;color:transparent}.ai-tutor-container .control-container{position:fixed;bottom:0;width:24%;z-index:2;background:#fff;height:40px}.ai-tutor-container-chatbot .control-container{position:fixed;bottom:100px;width:600px;margin:1%;z-index:2}.start-chat{text-align:center;padding-top:37.5%}.query-box{min-height:38px;transition:height .2s;width:100%}.query-box input{border:0;outline:0}.border-gradient-rounded{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:96%;min-height:36px;margin-left:1%;z-index:3}.send-btn{background-color:#fff!important;color:#1b4ca1!important;border:none!important;margin-left:14px}.ai-tutor-container-chatbot{background-image:url(/assets/ai-tutor/background.svg);height:90vh;width:525px}.message-container{z-index:2;position:relative;width:100%}.chatbot-icon-container{position:fixed;bottom:120px;right:0;cursor:pointer;height:90px;align-items:flex-start;display:flex;justify-content:center;width:auto;z-index:999999999}.chatbot-icon{position:absolute;right:30px;animation-delay:1s;transition:1s ease}.chatbot-icon-expanded{right:0}.expand-text{width:110px;display:flex;align-items:center;justify-content:center;background-color:#1b4ca1;color:#fff;font-size:18px;border-top:2px solid #fff;border-bottom:2px solid #fff;vertical-align:middle}.chatbot{width:610px;position:fixed;bottom:20px;right:50px;z-index:9999999999;border-radius:15px;background-color:#fff;box-shadow:0 6px 16px #0000003d;height:calc(100vh - 20%)}.cb-close{cursor:pointer}.cb-header{color:#fff!important;background-color:#1b4ca1;border-top-left-radius:15px;border-top-right-radius:15px;align-items:center;justify-content:space-between;position:absolute;width:100%;top:0}.cb-header .user-info-div{width:88%;justify-content:space-between}.cb-header .lang-select{height:32px;background-color:#fff;border-color:#00000029!important}.cb-header .user-name{padding-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:74%}.cb-content{background-color:#f0f3f4;overflow:auto}.cb-topics{padding:16px;background-color:#f5f5f5;overflow:auto}.cb-footer{border-bottom-left-radius:15px;border-bottom-right-radius:15px;background-color:#fff}.cb-footer .info{width:33%;padding:5px 0;align-items:center;display:flex;justify-content:center;flex-wrap:wrap;cursor:pointer}.cb-footer .info .info-text{font-size:10px;width:100%;text-align:center}.cb-footer .info .info-icon{height:24px}.br-br{border-bottom-right-radius:15px}.br-bl{border-bottom-left-radius:15px}.language{background-color:#0000000a}.active{background-color:#fbead1;border-top:3px solid rgb(239,149,30)}.active .mat-icon{color:#ef951e!important}.cat-list{margin:0;padding:0;width:100%;display:flex}.cat-item{padding:10px 16px;border-radius:21px;border:1px solid rgba(0,0,0,.16);background-color:#0000000a;opacity:1;color:#000000de;font-family:Lato-Regular,sans-serif;font-size:14px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:center;line-height:20px;width:fit-content;margin-right:12px;height:fit-content;cursor:pointer;white-space:nowrap}.lang-select{width:70px}.lang-select .mat-form-field-flex{background-color:#fff!important}.lang-select .mat-form-field-underline{background-color:transparent!important}.loader{position:absolute;left:50%;top:39%}.default-info .default-icon{width:60px;float:left;display:flex;flex-wrap:wrap}.default-info .default-msg{background-color:#0000000a;border:1px solid rgba(0,0,0,.16);border-radius:0 15px 15px;display:flex;flex-wrap:wrap}.chat-bot-icon{padding-top:8px}.row-start{justify-content:flex-start}.row-start .system-icon{padding-right:3px}.row-start .system-msg{background-color:#d1dbec;border:1px solid rgb(209,219,236);border-radius:0 15px 15px;display:flex;flex-wrap:wrap;min-width:auto;max-width:80%;height:100%;word-break:break-word}.row-start .system-msg ::ng-deep markdown *{margin:0}.recommended-question-desc ::ng-deep markdown *{margin:0;width:100%;word-wrap:break-word}.word-break{word-break:break-all;white-space:unset}.margin-left-5{margin-left:5%}.question-hint{font-weight:700}.recommended-question{display:flex;flex-wrap:wrap;height:fit-content}.recommended-question .rec-item{height:fit-content}.recommended-question .my-5px{margin-top:5px;margin-bottom:5px}.recommended-question .mr-5px{margin-right:5px}.recommended-question .btn-default{background:#d5c7c70a;border:1px solid #1B4CA1;color:#1b4ca1;padding:10px;font-size:14px;font-weight:700;cursor:pointer;border-radius:5px}.recommended-question .showmore-icon{align-items:flex-start}.recommended-question .btn-active{background:#000;border:1px solid rgba(0,0,0,.16);color:#fff}.btn-show-more,.btn-show-less{background:#1b4ca1;color:#fff;padding:10px 20px;font-size:14px;cursor:pointer;border-radius:40px}.row-end{justify-content:flex-end;height:100%}.row-end .user-seleted-question{background-color:#000;border-radius:15px 0 15px 15px;display:flex;flex-wrap:wrap;color:#fff;float:right;text-align:left;max-width:62%;word-break:break-word}.highlight-title{color:#1b4ca1}.incoming-msg{height:fit-content}.hint-text{color:#1b4ca1}@media only screen and (max-width: 600px){.chatbot{right:6px;bottom:67px}}@media only screen and (max-width: 390px){.chatbot{right:6px;bottom:67px}}.chatbot-wrapper{position:relative}.cb-content-wrapper{position:absolute;width:100%;top:64px;bottom:130px;max-height:100%;overflow:auto;box-sizing:border-box;background-color:#f0f3f4}.cb-footer-wrapper{position:absolute;width:100%;bottom:0}.my-5px{margin-top:5px;margin-bottom:5px}.mr-5px{margin-right:5px}*,:after,:before{box-sizing:border-box}::ng-deep .disable-scroll{overflow-x:hidden!important;overflow:hidden}@media only screen and (max-width: 600px){.chatbot{right:0;bottom:0;width:100%;height:100svh;z-index:999999999}.cb-footer-wrapper{bottom:0}.cb-content-wrapper{bottom:130px}.chatbot-icon-container{bottom:190px}.cb-header{border-top-left-radius:unset;border-top-right-radius:unset}.cb-footer{border-bottom-left-radius:unset;border-bottom-right-radius:unset}.br-br{border-bottom-right-radius:unset}.br-bl{border-bottom-left-radius:unset}}.feefback-section{margin-left:10px}.resource-icon{margin-left:10%}.resource-link{margin-left:40px}.resource-icon img{height:65px;width:115.25px}.font-12{font-size:12px}.vertical-middle{vertical-align:middle}.send-btn-icon{height:22px!important}.width-500{width:262px}.learning-type-container{width:98%}.section-dd{border:1px solid #ccc;padding:12px 16px;width:100%;height:65px;font-size:12px;font-weight:400;position:relative;z-index:2}.system-icon img{height:36px;width:36px}.circle-s{border-radius:50%;width:36px;height:36px;display:flex;justify-content:center;align-items:center;margin-left:4px}.circle-s img{border-radius:50%;width:100%;height:100%}.circle-s .initials{color:#fff;font-size:10px;line-height:12px;font-size:14px;letter-spacing:.2625px}.copied-tooltip{position:absolute;left:20%;transform:translate(-50%);background-color:#000;color:#fff;padding:4px 8px;border-radius:4px;font-size:12px;opacity:1;pointer-events:none;transition:opacity .3s ease;z-index:999}.loading-bar-icon img{height:50px;width:50px}.link{color:#1b4ca1;text-decoration:underline}.content-duration{position:relative;background:#f3962f;color:#fff;width:auto;border-radius:8px;text-align:center;bottom:11px;left:0;padding:0 5px;font-size:12px;display:flex;align-items:center;justify-content:center;margin-top:12px;white-space:nowrap}.content-duration .mat-icon{vertical-align:middle;color:#fff!important;height:14px!important;width:14px!important;font-size:14px}.position-relative{position:relative}.control-container{position:fixed;bottom:10px;z-index:2}.tutor-container{width:100%}.header{top:127px;width:100%;color:#fff;display:flex;align-items:flex-start;justify-content:flex-start}::ng-deep .header .mat-form-field{width:100%}.footer{bottom:0;width:100%;height:50px;color:#fff;display:flex;align-items:flex-end;justify-content:center;z-index:2}.container-none{margin-bottom:10px;padding:20px;height:calc(100vh - 261px);background:url(/assets/ai-tutor/background.svg);background-color:#f0f3f4;overflow-y:auto;overflow-x:hidden;position:relative;background-color:#ffffffe6;background-blend-mode:overlay}.option-content{display:flex;flex-direction:column;line-height:2}.option-content .title{font-weight:600}.option-content .subtitle{font-size:12px;color:gray}:host ::ng-deep .multiline-select .mat-mdc-select-value-text{white-space:pre-wrap!important}:host ::ng-deep .mat-pseudo-checkbox{display:none!important}:host ::ng-deep .mat-pseudo-checkbox-checked{display:none!important}:host ::ng-deep .multiline-select-option{background-color:#fff!important}:host ::ng-deep .player-content .mat-tab-label-active{opacity:1!important}.user-icon{margin-left:5px}.user-icon img{height:36px;width:36px;border-radius:50%}.w-92{width:92%}::ng-deep .copy-icon .material-icons{font-size:18px!important}::ng-deep .copy-icon .mat-icon{vertical-align:middle}.internet-result-query{background:#add8e6;border:1px solid #1B4CA1;color:#000;padding:10px;font-size:14px;font-weight:700;cursor:pointer;border-radius:5px}.blue-color{color:#1b4ca1;font-size:14px;font-weight:700}.web-button{background-color:#fff;color:#1b4ca1;border-radius:8px;padding:10px;border:1px solid #1B4CA1}.web-search-icon,.web-close-icon{color:#1b4ca1;vertical-align:middle}::ng-deep .mat-mdc-select-panel{background-color:#fff!important}.rotate-180{rotate:180deg}.feedback-icon{height:18px;width:18px}.recommended-question-for-resource{display:flex;flex-wrap:wrap;height:fit-content}.recommended-question-for-resource .rec-item{height:fit-content}.recommended-question-for-resource .my-5px{margin-top:5px;margin-bottom:5px}.recommended-question-for-resource .mr-5px{margin-right:5px}.recommended-question-for-resource .btn-default{background:#d5c7c70a;border:1px solid #F3962F;color:#1b4ca1;padding:10px;font-size:14px;font-weight:700;cursor:pointer;border-radius:5px}.recommended-question-for-resource .showmore-icon{align-items:flex-start}.recommended-question-for-resource .btn-active{background:#000;border:1px solid rgba(0,0,0,.16);color:#fff}.h-w-34{height:34px;width:34px}.border-gradient-rounded textarea{width:100%;border:none;resize:none;overflow:hidden;font-size:14px;font-family:Lato;box-sizing:border-box;min-height:32px;padding-top:5px}.border-gradient-rounded textarea:focus{outline:none;border:1px solid transparent}.overflow-y-hidden{overflow-y:hidden}.blue-loader-animation{width:18px;height:18px;animation:spin 2s linear infinite;transform-origin:center center}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.margin-top-2px{margin-top:2px}.recommended-question-desc ::ng-deep markdown pre{all:unset;display:revert;box-sizing:border-box;word-wrap:break-word;width:100%}.ai-tutor-popup{position:fixed;top:50px;z-index:999;background-color:#fff;width:100%}.ai-tutor-popup-minimize{position:fixed;bottom:65px;z-index:999;background-color:#fff;width:100%;border-top:3px solid #eff3f9}.ai-popup-mobile-footer{height:25px;bottom:70px;position:fixed}.ai-tutor-mobile-header{justify-content:space-between;padding:0 10px;border-bottom:1px solid #ccc;height:35px;margin-top:15px}.red-circle{background:red;opacity:1;color:#fff;padding:2px 10px;height:20px;width:50px;border-radius:2px;vertical-align:middle;display:flex;justify-content:center;align-items:center;margin-left:8px;margin-top:-10px}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i13.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "pipe", type: i2.PipeDurationTransformPipe, name: "pipeDurationTransform" }] }); }
1150
+ }
1151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AiTutorComponent, decorators: [{
1152
+ type: Component,
1153
+ args: [{ selector: 'ws-widget-ai-tutor', template: "<!-- <div class=\"tutor-container\">\n<div class=\"learning-type-container\">\n <mat-form-field appearance=\"none\">\n <select matNativeControl required class=\"section-dd\" >\n <option value=\"\">Select learning type here </option>\n <option value=\"\">None</option>\n <option value=\"\">Socratic</option>\n <option value=\"\">Story Telling</option>\n <option value=\"\">Summarisation</option>\n </select>\n </mat-form-field>\n</div>\n<div [ngClass]=\"from === 'chatbot' ? 'ai-tutor-container-chatbot':'ai-tutor-container'\" #scrollMe>\n <div class=\"message-container\" #scrollMe>\n <div class=\"start-chat\" *ngIf=\"aiTutorResultArr?.length === 0\">\n <h2 class=\"hey\">Hey<span *ngIf=\"userInfo?.firstName\">, {{userInfo?.firstName}}</span> </h2>\n <p>Welcome to Ai Tutor,\u2028Get instant explanations, step-by-step learning guidance, and customised learning tailored just for you.</p>\n </div>\n <ng-container *ngFor=\"let chat of aiTutorResultArr; let i =index\">\n <ng-container *ngIf=\"chat.type === 'incoming'\">\n <ng-container *ngIf=\"chat?.answer\">\n <div class=\"flex row-start incoming-msg margin-bottom-s\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/chatbot-ai-new.svg\"></div>\n \n <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount <= 30\" [innerHTML]=\"chat.answer\">\n </div>\n <div class=\"system-msg padding-xs\">\n <div *ngIf=\"chat?.wordsCount > 30\" [innerHTML]=\"chat?.showLess ? chat.shortAnswer : chat.answer\"></div>\n <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"!chat?.showLess\" (click)=\"toggleShow(i, 'less')\">Show Less</a>\n <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"chat?.showLess\" (click)=\"toggleShow(i, 'more')\">Show More</a>\n </div>\n \n\n </div>\n <ng-container *ngFor=\"let item of chat?.result; let ci=index\">\n <div class=\"system-msg-mimetype flex flex-col\" *ngIf=\"item?.contentType === 'Resource'\">\n <ng-container *ngIf=\"item?.mimeType === 'application/pdf'\">\n <div class=\"resource-icon\"><a [href]=\"item?.resourceLink\" target=\"_blank\"><img src=\"/assets/icons/ai-pdf-icon.jpg\"></a></div>\n <div class=\"resource-link\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Open Resource Link</a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"item?.mimeType === 'video/mp4'\">\n \n <div class=\"position-relative\">\n <div class=\"position-relative\">\n <img src=\"/assets/icons/ai-video-icon.jpg\">\n\n </div>\n <div class=\"content-duration\" *ngIf=\"item?.contentStart || item?.contentEnd\">\n <span *ngIf=\"item?.contentStart\">{{item?.contentStart}}</span>\n <span *ngIf=\"item?.contentEnd\">:{{item?.contentEnd}}</span>\n </div>\n </div>\n <div class=\"resource-link\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Open Resource Link</a>\n </div>\n </ng-container>\n </div>\n <div class=\"recommended-question my-5px\" [ngClass]=\"{'margin-left-5': item?.message }\">\n <div class=\"my-5px mr-2\">\n <ng-container *ngIf=\"item?.contentType !== 'Resource'\">\n <div class=\"btn-default\" (click)=\"redirectToToc(item)\">{{item?.title}}\n <mat-icon class=\"vertical-middle\">navigate_next</mat-icon>\n </div>\n <div>\n {{item?.description | slice : 0:50}}\n </div>\n </ng-container>\n </div>\n <div class=\"flex flex-row font-12\">\n <div class=\"cursor-pointer\" (click)=\"copyPath(item, ci)\">\n <mat-icon matTooltip=\"Copy\" aria-label=\"Copy\">content_copy</mat-icon>\n <span *ngIf=\"copiedIndex === ci\" class=\"copied-tooltip\">Link Copied!</span>\n </div>\n <div class=\"ml-2 mr-2\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are AI generated results</div>\n </div>\n </div>\n </ng-container>\n \n \n </ng-container>\n <ng-container *ngIf=\"!chat?.answer\">\n <div class=\"flex row-start incoming-msg margin-bottom-s\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/chatbot-ai-new.svg\"></div>\n <div class=\"loading-bar-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/loading_bar.gif\"></div>\n </div>\n \n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"chat.type === 'sendMsg'\">\n <div class=\"flex width-1-1 row-end padding-top-l padding-bottom-m\">\n <div class=\"user-seleted-question padding-xs\">\n {{chat?.question}}\n </div>\n <div class=\"user-icon\" *ngIf=\"userIcon\">\n <img alt=\"ai-icon\" src=\"{{userIcon}}\">\n </div>\n <div class=\"circle-s user-icon\" *ngIf=\"!userIcon\" [ngStyle]=\"{'background-color': circleColor }\">\n <div class=\"initials\" i18n-aria-label>\n {{ userInitials }} \n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div> \n</div>\n<div class=\"control-container\">\n <div class=\"border-gradient-rounded\">\n <div class=\"flex flex-row mx-5 justify-between\">\n\n <div class=\"query-box\">\n <input class=\"width-500\" type=\"text\" placeholder=\"Ask anything...\" [(ngModel)]=\"searchQueryAItutor\" (keydown.enter)=\"submitSearchQuery()\"/>\n \n </div>\n\n <div>\n <button type=\"button\" class=\"flex-auto-display send-btn\" (click)=\"submitSearchQuery()\" [disabled]=\"!searchQueryAItutor\">\n <mat-icon class=\"send-btn-icon\">send</mat-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n</div> -->\n\n<div class=\"overflow-y-hidden\" [ngClass]=\"(isMobile && !maximize ? 'ai-tutor-popup-minimize' : (isMobile ? 'ai-tutor-popup': ''))\">\n<div *ngIf=\"isMobile\">\n <div class=\"flex flex-row ai-tutor-mobile-header\">\n <div class=\"flex flex-row\">\n <div class=\"flex\">\n <span class=\"font-bold\">AI Tutor</span>\n </div> \n <div class=\"red-circle ml-5\">\n New\n </div>\n </div>\n <div class=\"flex flex-row justify-end\">\n <div *ngIf=\"maximize\" (click)=\"minimizeAITutor()\">\n <mat-icon>minimize</mat-icon>\n </div>\n <div *ngIf=\"!maximize\" (click)=\"maximizeAITutor()\">\n <mat-icon>maximize</mat-icon>\n </div>\n <div (click)=\"closeAITutorPopup()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n \n \n </div>\n</div>\n<div [hidden]=\"!maximize\">\n<div class=\"header\">\n <!-- <mat-form-field appearance=\"none\" style=\"width:100%\">\n <select matNativeControl required class=\"section-dd\" >\n <option value=\"\">You can also choose a learning style that suits you best from here.</option>\n <option value=\"\">None</option>\n <option value=\"\">Socratic</option>\n <option value=\"\">Story Telling</option>\n <option value=\"\">Summarisation</option>\n </select>\n </mat-form-field> -->\n <mat-form-field class=\"multiline-select\" appearance=\"fill\" style=\"width: 100%; height: 80px;\" floatLabel=\"never\">\n <mat-select class=\"multiline-select-box\" required [(value)]=\"selectedLearningStyle\" (selectionChange)=\"getLearningStyle()\">\n <mat-select-trigger class=\"multiline-select-box-trigger\">\n <div class=\"option-content\">\n <div class=\"title\">{{ selectedLearningStyle?.title }}</div>\n <div class=\"subtitle\">{{ selectedLearningStyle?.subtitle }}</div>\n </div>\n </mat-select-trigger>\n <mat-option class=\"multiline-select-option\" value=\"\" *ngFor=\"let item of learningStyle\" [value]=\"item\">\n <div class=\"option-content\">\n <div class=\"title\">{{item?.title}}</div>\n <div class=\"subtitle\">{{item?.subtitle}}</div>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n \n</div>\n\n<div class=\"container-none\" id=\"container-none\">\n <div [ngClass]=\"from === 'chatbot' ? 'ai-tutor-container-chatbot':'ai-tutor-container'\">\n <div class=\"message-container\" #scrollMe>\n <div class=\"start-chat\" *ngIf=\"aiTutorResultArr?.length === 0\">\n <h2 class=\"hey\">Hey<span *ngIf=\"userInfo?.firstName\">, {{userInfo?.firstName}}</span> </h2>\n <p>Welcome to AI Tutor,\u2028Get instant explanations, step-by-step learning guidance, and customised learning tailored just for you.</p>\n </div>\n <ng-container *ngFor=\"let chat of aiTutorResultArr; let i =index\">\n <ng-container *ngIf=\"chat.type === 'incoming'\">\n <ng-container *ngIf=\"chat?.answer || chat?.showFromInternet\">\n <div class=\"flex row-start incoming-msg margin-bottom-s\" *ngIf=\"chat?.answer\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/bot-chat-small.svg\"></div>\n \n <!-- <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount <= 30\" [innerHTML]=\"chat.answer\">\n </div> -->\n <div class=\"flex row-start incoming-msg margin-bottom-s\" *ngIf=\"chat?.showFromInternet\">\n <div class=\"system-msg padding-xs mx-10\">\n I couldn\u2019t find any relevant results for your query. Would you like me to search outside the iGOT platform for more information?\n </div>\n \n </div>\n <ng-container *ngIf=\"chat?.answer\">\n <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount <= 30\">\n <markdown [data]=\"chat?.answer\"></markdown>\n </div>\n \n <div class=\"system-msg padding-xs\" *ngIf=\"chat?.wordsCount > 30\" >\n <!-- <div [innerHTML]=\"chat?.showLess ? chat.shortAnswer : chat.answer\"></div> -->\n <markdown [data]=\"chat?.answer\"></markdown>\n <!-- <markdown [data]=\"chat?.showLess ? chat.shortAnswer : chat.answer\"></markdown> -->\n <!-- <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"!chat?.showLess\" (click)=\"toggleShow(i, 'less')\">Show Less</a>\n <a class=\"link\" href=\"javascript:void(0)\" *ngIf=\"chat?.showLess\" (click)=\"toggleShow(i, 'more')\">Show More</a> -->\n </div>\n </ng-container>\n \n \n </div>\n \n <div *ngIf=\"chat?.showFromInternet\">\n <div class=\"flex row my-2 justify-start mx-10 my-5\">\n <div (click)=\"callFromInternet(chat, i)\">\n <button type=\"button\" class=\"web-button px-4 cursor-pointer\">\n <mat-icon class=\"web-search-icon\">search </mat-icon><span class=\"blue-color\">Search the web</span>\n </button>\n </div>\n <div (click)=\"rejectFromInternet(i)\" class=\"mx-2\">\n <button type=\"button\" class=\"web-button py-2 px-4 cursor-pointer\">\n <mat-icon class=\"web-close-icon\">close</mat-icon><span class=\"blue-color\">No</span>\n </button>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let item of chat?.result; let ci=index\">\n <div class=\"system-msg-mimetype flex flex-col\" *ngIf=\"item?.contentType === 'Resource'\">\n <ng-container *ngIf=\"item?.mimeType === 'application/pdf'\">\n <!-- <div class=\"resource-icon\"><a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <img src=\"/assets/icons/ai-pdf-icon.jpg\"></a>\n </div> -->\n <div class=\"recommended-question-for-resource mx-10\" (click)=\"redirectToResource(item);raiseTelemetryForResource(item)\">\n <!-- <div class=\"resource-icon\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <img src=\"/assets/ai-tutor/pdf.svg\">\n </a>\n <p>{{item?.message}}</p>\n </div> -->\n <div class=\"btn-default mb-2\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">\n <img class=\"vertical-middle h-w-34\" src=\"/assets/ai-tutor/pdf.svg\">\n </a>\n {{item?.title}}\n <mat-icon class=\"vertical-middle\" *ngIf=\"!(item?.fromInternet)\">navigate_next</mat-icon>\n </div>\n </div>\n <!-- <div class=\"resource-link\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Click to view</a>\n </div> -->\n </ng-container>\n <!-- <ng-container *ngIf=\"item?.mimeType === 'video/mp4'\">\n \n <div class=\"resource-icon\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <div class=\"position-relative\">\n <div class=\"position-relative\">\n <img src=\"/assets/icons/ai-video-icon.jpg\">\n \n </div>\n <div class=\"content-duration flex\" *ngIf=\"item?.contentStart > -1 && item?.contentEnd > -1 && !(item?.fromInternet)\">\n <span><mat-icon>access_time</mat-icon>&nbsp;&nbsp;</span>\n <span *ngIf=\"item?.contentStart > -1\">\n <span *ngIf=\"item?.contentStart > 0\">{{item?.contentStart | pipeDurationTransform: 'hms'}}</span>\n <span *ngIf=\"item.contentStart === '0'\">0</span>\n </span>\n <span *ngIf=\"item?.contentEnd > -1\">&nbsp;-&nbsp;{{item?.contentEnd | pipeDurationTransform: 'hms'}}</span>\n </div>\n </div>\n \n \n </a>\n </div>\n </ng-container> -->\n <ng-container *ngIf=\"item?.mimeType === 'video/mp4'\">\n <div class=\"recommended-question-for-resource mx-10\" (click)=\"redirectToResource(item);raiseTelemetryForResource(item)\">\n \n <div class=\"btn-default mb-2\">\n <div class=\"flex flex-row\">\n <div>\n <a [href]=\"item?.resourceLink\" target=\"_blank\">\n <img class=\"vertical-middle h-w-34\" src=\"/assets/ai-tutor/video.svg\">\n </a>\n </div>\n <div class=\"ml-1\">\n <span>{{item?.title}} </span>\n </div>\n <div>\n <span class=\"content-duration flex ml-1\" *ngIf=\"item?.contentStart > -1 && item?.contentEnd > -1 && !(item?.fromInternet)\">\n <span><mat-icon>access_time</mat-icon>&nbsp;&nbsp;</span>\n <span *ngIf=\"item?.contentStart > -1\">\n <span *ngIf=\"item?.contentStart > 0\">{{item?.contentStart | pipeDurationTransform: 'hms'}}</span>\n <span *ngIf=\"item.contentStart === '0'\">0</span>\n </span>\n <span *ngIf=\"item?.contentEnd > -1\">&nbsp;-&nbsp;{{item?.contentEnd | pipeDurationTransform: 'hms'}}</span>\n </span> \n </div>\n <div>\n <mat-icon class=\"vertical-middle\" *ngIf=\"!(item?.fromInternet)\">navigate_next</mat-icon>\n </div>\n </div>\n </div>\n <!-- <a [href]=\"item?.resourceLink\" target=\"_blank\" (click)=\"raiseTelemetryForResource(item)\">\n <div class=\"position-relative\">\n <div class=\"position-relative\">\n <img class=\"h-w-34\" src=\"/assets/ai-tutor/video.svg\">\n <p>{{item?.message}}</p>\n </div>\n <div class=\"content-duration flex\" *ngIf=\"item?.contentStart > -1 && item?.contentEnd > -1 && !(item?.fromInternet)\">\n <span><mat-icon>access_time</mat-icon>&nbsp;&nbsp;</span>\n <span *ngIf=\"item?.contentStart > -1\">\n <span *ngIf=\"item?.contentStart > 0\">{{item?.contentStart | pipeDurationTransform: 'hms'}}</span>\n <span *ngIf=\"item.contentStart === '0'\">0</span>\n </span>\n <span *ngIf=\"item?.contentEnd > -1\">&nbsp;-&nbsp;{{item?.contentEnd | pipeDurationTransform: 'hms'}}</span>\n </div>\n </div>\n \n \n </a> -->\n </div>\n </ng-container>\n <div class=\"flex flex-row cursor-pointer\">\n <!-- <div class=\"resource-link\" *ngIf=\"!(item?.fromInternet)\">\n <a [href]=\"item?.resourceLink\" target=\"_blank\">Click to view</a>\n </div> -->\n <div class=\"cursor-pointer ml-10 mr-2 my-1\" (click)=\"copyPath(item, ci)\" *ngIf=\"item?.contentType === 'Resource' && !(item?.fromInternet)\">\n <mat-icon matTooltip=\"Copy\" aria-label=\"Copy\">content_copy</mat-icon>\n <span *ngIf=\"copiedIndex === ci\" class=\"copied-tooltip\">Link Copied!</span>\n </div>\n <!-- <div class=\"feefback-section flex flex-row my-1\" *ngIf=\"(item?.feedback)\">\n <div *ngIf=\"item?.feedback !== 'down'\"\n class=\"cursor-pointer feedback-icon mt-1\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" class=\"ml-2 cursor-pointer feedback-icon\">\n <img src=\"/assets/ai-tutor/fill-down.svg\">\n </div>\n </div>\n <div class=\"feefback-section flex flex-row my-1\" *ngIf=\"item?.feedback === ''\">\n <div *ngIf=\"item?.feedback !== 'down'\" (click)=\"sharePositiveContentRating(item,i, ci)\"\n class=\"cursor-pointer feedback-icon\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img src=\"/assets/ai-tutor/down.svg\">\n </div>\n </div> -->\n <div class=\"feefback-section flex flex-row my-1\">\n <div (click)=\"sharePositiveContentRating(item,i, ci)\" class=\"cursor-pointer feedback-icon mt-1\" \n >\n <img [ngClass]=\"'rotate-180'\" *ngIf=\"item?.feedback !== 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback === 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/up.svg\">\n <img *ngIf=\"item?.showLoaderForUp\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n <div (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img *ngIf=\"item?.feedback !== 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/down.svg\"> \n <img *ngIf=\"item?.feedback === 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/fill-down.svg\"> \n <img *ngIf=\"item?.showLoaderForDown\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n </div>\n <!-- <div class=\"flex flex-row font-12 mt-1\">\n <div class=\"ml-2 mr-2 cu\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are <span *ngIf=\"item?.fromInternet\">Web</span><span *ngIf=\"!(item?.fromInternet)\">AI</span> generated results</div>\n </div> -->\n <!-- <div class=\"feefback-section flex flex-row\">\n \n <div *ngIf=\"item?.feedback !== 'down'\" (click)=\"sharePositiveContentRating(item,i, ci)\"\n class=\"cursor-pointer feedback-icon\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon\"><img src=\"/assets/ai-tutor/down.svg\"></div>\n </div> -->\n </div>\n \n </div>\n <div class=\"recommended-question\" [ngClass]=\"{'ml-10': item?.message }\">\n <div class=\"my-5px mr-2 w-92\">\n <ng-container *ngIf=\"item?.contentType !== 'Resource' && !(item?.fromInternet)\">\n <div class=\"btn-default\" (click)=\"redirectToToc(item)\">{{item?.title}}\n <mat-icon class=\"vertical-middle\" *ngIf=\"!(item?.fromInternet)\">navigate_next</mat-icon>\n </div>\n <div class=\"recommended-question-desc\" *ngIf=\"!(item?.fromInternet)\">\n <!-- {{item?.description}} -->\n <markdown [data]=\"item?.description\"></markdown>\n </div>\n </ng-container>\n </div>\n <div class=\"flex flex-row font-12 mb-2\">\n <div class=\"cursor-pointer\" (click)=\"copyPath(item, ci)\" *ngIf=\"item?.contentType !== 'Resource' && !(item?.fromInternet)\">\n <mat-icon matTooltip=\"Copy\" aria-label=\"Copy\">content_copy</mat-icon>\n <span *ngIf=\"copiedIndex === ci\" class=\"copied-tooltip\">Link Copied!</span>\n </div>\n <!-- <div class=\"feefback-section flex flex-row\" *ngIf=\"item?.contentType !== 'Resource'\">\n \n <div *ngIf=\"item?.feedback !== 'down'\" (click)=\"sharePositiveContentRating(item, i,ci)\" \n class=\"cursor-pointer feedback-icon\" [ngClass]=\"item?.feedback !== 'up' ? 'rotate-180' : ''\">\n <img *ngIf=\"item?.feedback !== 'up'\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback == 'up'\" src=\"/assets/ai-tutor/up.svg\">\n </div>\n <div *ngIf=\"item?.feedback !== 'up'\" (click)=\"openAIFeedbackPopup(item, i,ci)\" class=\"ml-2 cursor-pointer feedback-icon\"><img src=\"/assets/ai-tutor/down.svg\"></div>\n </div> -->\n <div class=\"feefback-section flex flex-row\" *ngIf=\"item?.contentType !== 'Resource'\">\n <div (click)=\"sharePositiveContentRating(item,i, ci)\" class=\"cursor-pointer feedback-icon mt-1\" \n >\n <img [ngClass]=\"'rotate-180'\" *ngIf=\"item?.feedback !== 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"item?.feedback === 'up' && !item?.showLoaderForUp\" src=\"/assets/ai-tutor/up.svg\">\n <img *ngIf=\"item?.showLoaderForUp\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n <div (click)=\"openAIFeedbackPopup(item,i, ci)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img *ngIf=\"item?.feedback !== 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/down.svg\"> \n <img *ngIf=\"item?.feedback === 'down' && !item?.showLoaderForDown\" src=\"/assets/ai-tutor/fill-down.svg\"> \n <img *ngIf=\"item?.showLoaderForDown\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n </div> \n </div>\n <!-- <div class=\"flex flex-row font-12 mt-1\" *ngIf=\"item?.contentType !== 'Resource'\">\n <div class=\"ml-2 mr-2 cu\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are <span *ngIf=\"item?.fromInternet\">Web</span><span *ngIf=\"!(item?.fromInternet)\">AI</span> generated results</div>\n </div> -->\n </div>\n </ng-container>\n <div class=\" flex flex-row ml-10\" *ngIf=\"chat?.answer && !(chat?.result?.length)\">\n <div (click)=\"sharePositiveContentRatingForAnswer(chat,i)\" class=\"cursor-pointer feedback-icon mt-1\" \n >\n <img [ngClass]=\"'rotate-180'\" *ngIf=\"chat?.feedback !== 'up' && !chat?.showLoaderForUp\" src=\"/assets/ai-tutor/down.svg\">\n <img *ngIf=\"chat?.feedback === 'up' && !chat?.showLoaderForUp\" src=\"/assets/ai-tutor/up.svg\">\n <img *ngIf=\"chat?.showLoaderForUp\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n <div (click)=\"openAIFeedbackPopupForAnswer(chat,i)\" class=\"ml-2 cursor-pointer feedback-icon mt-1\">\n <img *ngIf=\"chat?.feedback !== 'down' && !chat?.showLoaderForDown\" src=\"/assets/ai-tutor/down.svg\"> \n <img *ngIf=\"chat?.feedback === 'down' && !chat?.showLoaderForDown\" src=\"/assets/ai-tutor/fill-down.svg\"> \n <img *ngIf=\"chat?.showLoaderForDown\" class=\"blue-loader-animation\" height=\"18\" width=\"18\" src=\"/assets/ai-tutor/blue-loader.png\">\n </div>\n </div> \n <div class=\"flex flex-row font-12 mt-1 mb-1 ai-generated-content-container\" *ngIf=\"chat?.result?.length\">\n <div class=\"ml-5 mr-2 cu\"><img alt=\"ai-icon\" src=\"/assets/ai-tutor/ai-icon.svg\"></div>\n <div class=\"ai-generated-content ml-2\">These are <span *ngIf=\"item?.fromInternet\">Web</span><span *ngIf=\"!(item?.fromInternet)\">AI</span> generated results</div>\n </div>\n \n </ng-container>\n <ng-container>\n <div class=\"flex row-start incoming-msg margin-bottom-s\" *ngIf=\"chat?.newMessage === '' && !resultFetch\">\n <div class=\"system-icon\"><img alt=\"ai-icon\" src=\"/assets/icons/bot-chat-small.svg\"></div>\n <div class=\"loading-bar-icon flex flex-row vertical-middle\">\n <div class=\"mt-2\"><span class=\"blue-color\">Retrieving Results</span></div>\n <div><img alt=\"ai-icon\" src=\"/assets/icons/loading_bar.gif\"></div>\n </div>\n </div>\n \n </ng-container>\n </ng-container>\n \n <ng-container *ngIf=\"chat.type === 'sendMsg'\">\n <div class=\"flex width-1-1 row-end padding-top-l padding-bottom-m\">\n <div class=\"user-seleted-question padding-xs\">\n {{chat?.question}}\n </div>\n <div class=\"user-icon\" *ngIf=\"userIcon\">\n <img alt=\"ai-icon\" src=\"{{userIcon}}\">\n </div>\n <div class=\"circle-s user-icon\" *ngIf=\"!userIcon\" [ngStyle]=\"{'background-color': circleColor }\">\n <div class=\"initials\" i18n-aria-label>\n {{ userInitials }} \n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div> \n </div>\n</div>\n\n<div class=\"footer\" [ngClass]=\"isMobile ? 'ai-popup-mobile-footer':''\">\n <div class=\"border-gradient-rounded\" [style.height.px]=\"containerHeight\">\n <div class=\"flex flex-row ml-5 mr-2 justify-between\">\n\n <div class=\"query-box\">\n <!-- <input class=\"width-500\" type=\"text\" placeholder=\"Ask anything...\" [(ngModel)]=\"searchQueryAItutor\" (keydown.enter)=\"submitSearchQuery()\"/> -->\n <textarea #autoResizeTextarea class=\"width-500\"\n placeholder=\"Ask Me Anything...\"\n (input)=\"resizeTextarea(autoResizeTextarea, 'fromInput')\"\n [(ngModel)]=\"searchQueryAItutor\" (keydown.enter)=\"submitSearchQuery(autoResizeTextarea, $event)\"\n rows=\"1\"\n >\n </textarea>\n \n </div>\n\n <div class=\"margin-top-2px\">\n <button type=\"button\" class=\"flex-auto-display send-btn\" (click)=\"submitSearchQuery(autoResizeTextarea, $event)\" [disabled]=\"!searchQueryAItutor\">\n <mat-icon class=\"send-btn-icon\">send</mat-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n</div>\n</div>", styles: [".hey{background:linear-gradient(90deg,#32b9dfde,#1b4ca1de);-webkit-background-clip:text;background-clip:text;color:transparent}.ai-generated-content{background:linear-gradient(90deg,#f3962f,#1b4ca1);-webkit-background-clip:text;background-clip:text;color:transparent}.ai-tutor-container .control-container{position:fixed;bottom:0;width:24%;z-index:2;background:#fff;height:40px}.ai-tutor-container-chatbot .control-container{position:fixed;bottom:100px;width:600px;margin:1%;z-index:2}.start-chat{text-align:center;padding-top:37.5%}.query-box{min-height:38px;transition:height .2s;width:100%}.query-box input{border:0;outline:0}.border-gradient-rounded{border:2px solid transparent;border-radius:20px;background:linear-gradient(to right,#fff,#fff),linear-gradient(to right,#efa34f,#4881e4);background-clip:padding-box,border-box;background-origin:padding-box,border-box;width:96%;min-height:36px;margin-left:1%;z-index:3}.send-btn{background-color:#fff!important;color:#1b4ca1!important;border:none!important;margin-left:14px}.ai-tutor-container-chatbot{background-image:url(/assets/ai-tutor/background.svg);height:90vh;width:525px}.message-container{z-index:2;position:relative;width:100%}.chatbot-icon-container{position:fixed;bottom:120px;right:0;cursor:pointer;height:90px;align-items:flex-start;display:flex;justify-content:center;width:auto;z-index:999999999}.chatbot-icon{position:absolute;right:30px;animation-delay:1s;transition:1s ease}.chatbot-icon-expanded{right:0}.expand-text{width:110px;display:flex;align-items:center;justify-content:center;background-color:#1b4ca1;color:#fff;font-size:18px;border-top:2px solid #fff;border-bottom:2px solid #fff;vertical-align:middle}.chatbot{width:610px;position:fixed;bottom:20px;right:50px;z-index:9999999999;border-radius:15px;background-color:#fff;box-shadow:0 6px 16px #0000003d;height:calc(100vh - 20%)}.cb-close{cursor:pointer}.cb-header{color:#fff!important;background-color:#1b4ca1;border-top-left-radius:15px;border-top-right-radius:15px;align-items:center;justify-content:space-between;position:absolute;width:100%;top:0}.cb-header .user-info-div{width:88%;justify-content:space-between}.cb-header .lang-select{height:32px;background-color:#fff;border-color:#00000029!important}.cb-header .user-name{padding-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:74%}.cb-content{background-color:#f0f3f4;overflow:auto}.cb-topics{padding:16px;background-color:#f5f5f5;overflow:auto}.cb-footer{border-bottom-left-radius:15px;border-bottom-right-radius:15px;background-color:#fff}.cb-footer .info{width:33%;padding:5px 0;align-items:center;display:flex;justify-content:center;flex-wrap:wrap;cursor:pointer}.cb-footer .info .info-text{font-size:10px;width:100%;text-align:center}.cb-footer .info .info-icon{height:24px}.br-br{border-bottom-right-radius:15px}.br-bl{border-bottom-left-radius:15px}.language{background-color:#0000000a}.active{background-color:#fbead1;border-top:3px solid rgb(239,149,30)}.active .mat-icon{color:#ef951e!important}.cat-list{margin:0;padding:0;width:100%;display:flex}.cat-item{padding:10px 16px;border-radius:21px;border:1px solid rgba(0,0,0,.16);background-color:#0000000a;opacity:1;color:#000000de;font-family:Lato-Regular,sans-serif;font-size:14px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:center;line-height:20px;width:fit-content;margin-right:12px;height:fit-content;cursor:pointer;white-space:nowrap}.lang-select{width:70px}.lang-select .mat-form-field-flex{background-color:#fff!important}.lang-select .mat-form-field-underline{background-color:transparent!important}.loader{position:absolute;left:50%;top:39%}.default-info .default-icon{width:60px;float:left;display:flex;flex-wrap:wrap}.default-info .default-msg{background-color:#0000000a;border:1px solid rgba(0,0,0,.16);border-radius:0 15px 15px;display:flex;flex-wrap:wrap}.chat-bot-icon{padding-top:8px}.row-start{justify-content:flex-start}.row-start .system-icon{padding-right:3px}.row-start .system-msg{background-color:#d1dbec;border:1px solid rgb(209,219,236);border-radius:0 15px 15px;display:flex;flex-wrap:wrap;min-width:auto;max-width:80%;height:100%;word-break:break-word}.row-start .system-msg ::ng-deep markdown *{margin:0}.recommended-question-desc ::ng-deep markdown *{margin:0;width:100%;word-wrap:break-word}.word-break{word-break:break-all;white-space:unset}.margin-left-5{margin-left:5%}.question-hint{font-weight:700}.recommended-question{display:flex;flex-wrap:wrap;height:fit-content}.recommended-question .rec-item{height:fit-content}.recommended-question .my-5px{margin-top:5px;margin-bottom:5px}.recommended-question .mr-5px{margin-right:5px}.recommended-question .btn-default{background:#d5c7c70a;border:1px solid #1B4CA1;color:#1b4ca1;padding:10px;font-size:14px;font-weight:700;cursor:pointer;border-radius:5px}.recommended-question .showmore-icon{align-items:flex-start}.recommended-question .btn-active{background:#000;border:1px solid rgba(0,0,0,.16);color:#fff}.btn-show-more,.btn-show-less{background:#1b4ca1;color:#fff;padding:10px 20px;font-size:14px;cursor:pointer;border-radius:40px}.row-end{justify-content:flex-end;height:100%}.row-end .user-seleted-question{background-color:#000;border-radius:15px 0 15px 15px;display:flex;flex-wrap:wrap;color:#fff;float:right;text-align:left;max-width:62%;word-break:break-word}.highlight-title{color:#1b4ca1}.incoming-msg{height:fit-content}.hint-text{color:#1b4ca1}@media only screen and (max-width: 600px){.chatbot{right:6px;bottom:67px}}@media only screen and (max-width: 390px){.chatbot{right:6px;bottom:67px}}.chatbot-wrapper{position:relative}.cb-content-wrapper{position:absolute;width:100%;top:64px;bottom:130px;max-height:100%;overflow:auto;box-sizing:border-box;background-color:#f0f3f4}.cb-footer-wrapper{position:absolute;width:100%;bottom:0}.my-5px{margin-top:5px;margin-bottom:5px}.mr-5px{margin-right:5px}*,:after,:before{box-sizing:border-box}::ng-deep .disable-scroll{overflow-x:hidden!important;overflow:hidden}@media only screen and (max-width: 600px){.chatbot{right:0;bottom:0;width:100%;height:100svh;z-index:999999999}.cb-footer-wrapper{bottom:0}.cb-content-wrapper{bottom:130px}.chatbot-icon-container{bottom:190px}.cb-header{border-top-left-radius:unset;border-top-right-radius:unset}.cb-footer{border-bottom-left-radius:unset;border-bottom-right-radius:unset}.br-br{border-bottom-right-radius:unset}.br-bl{border-bottom-left-radius:unset}}.feefback-section{margin-left:10px}.resource-icon{margin-left:10%}.resource-link{margin-left:40px}.resource-icon img{height:65px;width:115.25px}.font-12{font-size:12px}.vertical-middle{vertical-align:middle}.send-btn-icon{height:22px!important}.width-500{width:262px}.learning-type-container{width:98%}.section-dd{border:1px solid #ccc;padding:12px 16px;width:100%;height:65px;font-size:12px;font-weight:400;position:relative;z-index:2}.system-icon img{height:36px;width:36px}.circle-s{border-radius:50%;width:36px;height:36px;display:flex;justify-content:center;align-items:center;margin-left:4px}.circle-s img{border-radius:50%;width:100%;height:100%}.circle-s .initials{color:#fff;font-size:10px;line-height:12px;font-size:14px;letter-spacing:.2625px}.copied-tooltip{position:absolute;left:20%;transform:translate(-50%);background-color:#000;color:#fff;padding:4px 8px;border-radius:4px;font-size:12px;opacity:1;pointer-events:none;transition:opacity .3s ease;z-index:999}.loading-bar-icon img{height:50px;width:50px}.link{color:#1b4ca1;text-decoration:underline}.content-duration{position:relative;background:#f3962f;color:#fff;width:auto;border-radius:8px;text-align:center;bottom:11px;left:0;padding:0 5px;font-size:12px;display:flex;align-items:center;justify-content:center;margin-top:12px;white-space:nowrap}.content-duration .mat-icon{vertical-align:middle;color:#fff!important;height:14px!important;width:14px!important;font-size:14px}.position-relative{position:relative}.control-container{position:fixed;bottom:10px;z-index:2}.tutor-container{width:100%}.header{top:127px;width:100%;color:#fff;display:flex;align-items:flex-start;justify-content:flex-start}::ng-deep .header .mat-form-field{width:100%}.footer{bottom:0;width:100%;height:50px;color:#fff;display:flex;align-items:flex-end;justify-content:center;z-index:2}.container-none{margin-bottom:10px;padding:20px;height:calc(100vh - 261px);background:url(/assets/ai-tutor/background.svg);background-color:#f0f3f4;overflow-y:auto;overflow-x:hidden;position:relative;background-color:#ffffffe6;background-blend-mode:overlay}.option-content{display:flex;flex-direction:column;line-height:2}.option-content .title{font-weight:600}.option-content .subtitle{font-size:12px;color:gray}:host ::ng-deep .multiline-select .mat-mdc-select-value-text{white-space:pre-wrap!important}:host ::ng-deep .mat-pseudo-checkbox{display:none!important}:host ::ng-deep .mat-pseudo-checkbox-checked{display:none!important}:host ::ng-deep .multiline-select-option{background-color:#fff!important}:host ::ng-deep .player-content .mat-tab-label-active{opacity:1!important}.user-icon{margin-left:5px}.user-icon img{height:36px;width:36px;border-radius:50%}.w-92{width:92%}::ng-deep .copy-icon .material-icons{font-size:18px!important}::ng-deep .copy-icon .mat-icon{vertical-align:middle}.internet-result-query{background:#add8e6;border:1px solid #1B4CA1;color:#000;padding:10px;font-size:14px;font-weight:700;cursor:pointer;border-radius:5px}.blue-color{color:#1b4ca1;font-size:14px;font-weight:700}.web-button{background-color:#fff;color:#1b4ca1;border-radius:8px;padding:10px;border:1px solid #1B4CA1}.web-search-icon,.web-close-icon{color:#1b4ca1;vertical-align:middle}::ng-deep .mat-mdc-select-panel{background-color:#fff!important}.rotate-180{rotate:180deg}.feedback-icon{height:18px;width:18px}.recommended-question-for-resource{display:flex;flex-wrap:wrap;height:fit-content}.recommended-question-for-resource .rec-item{height:fit-content}.recommended-question-for-resource .my-5px{margin-top:5px;margin-bottom:5px}.recommended-question-for-resource .mr-5px{margin-right:5px}.recommended-question-for-resource .btn-default{background:#d5c7c70a;border:1px solid #F3962F;color:#1b4ca1;padding:10px;font-size:14px;font-weight:700;cursor:pointer;border-radius:5px}.recommended-question-for-resource .showmore-icon{align-items:flex-start}.recommended-question-for-resource .btn-active{background:#000;border:1px solid rgba(0,0,0,.16);color:#fff}.h-w-34{height:34px;width:34px}.border-gradient-rounded textarea{width:100%;border:none;resize:none;overflow:hidden;font-size:14px;font-family:Lato;box-sizing:border-box;min-height:32px;padding-top:5px}.border-gradient-rounded textarea:focus{outline:none;border:1px solid transparent}.overflow-y-hidden{overflow-y:hidden}.blue-loader-animation{width:18px;height:18px;animation:spin 2s linear infinite;transform-origin:center center}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.margin-top-2px{margin-top:2px}.recommended-question-desc ::ng-deep markdown pre{all:unset;display:revert;box-sizing:border-box;word-wrap:break-word;width:100%}.ai-tutor-popup{position:fixed;top:50px;z-index:999;background-color:#fff;width:100%}.ai-tutor-popup-minimize{position:fixed;bottom:65px;z-index:999;background-color:#fff;width:100%;border-top:3px solid #eff3f9}.ai-popup-mobile-footer{height:25px;bottom:70px;position:fixed}.ai-tutor-mobile-header{justify-content:space-between;padding:0 10px;border-bottom:1px solid #ccc;height:35px;margin-top:15px}.red-circle{background:red;opacity:1;color:#fff;padding:2px 10px;height:20px;width:50px;border-radius:2px;vertical-align:middle;display:flex;justify-content:center;align-items:center;margin-left:8px;margin-top:-10px}\n"] }]
1154
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.ConfigurationsService }, { type: i2.EventService }, { type: i0.Renderer2 }, { type: i3.RootService }, { type: i4.WebSocketService }, { type: i5.MatLegacyDialog }, { type: i6.MatSnackBar }, { type: i2.UtilityService }, { type: undefined, decorators: [{
1155
+ type: Inject,
1156
+ args: ["environment"]
1157
+ }] }, { type: i1.Router }]; }, propDecorators: { from: [{
1158
+ type: Input
1159
+ }], content: [{
1160
+ type: Input
1161
+ }], userJourney: [{
1162
+ type: Input
1163
+ }], textArea: [{
1164
+ type: ViewChild,
1165
+ args: ['autoResizeTextarea']
1166
+ }], closeAIPopup: [{
1167
+ type: Output
1168
+ }] } });
1169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktdHV0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vYWktdHV0b3IvYWktdHV0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vYWktdHV0b3IvYWktdHV0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQVksWUFBWSxFQUFDLEtBQUssRUFBcUIsTUFBTSxFQUFhLFNBQVMsRUFBRyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEssT0FBTyxFQUEwQixhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQXVELFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS3JHLHdGQUF3RjtBQUN4RixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx5RkFBeUYsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTzdJLE1BQU0sT0FBTyxnQkFBZ0I7SUFnRzNCLFlBQ1UsS0FBcUIsRUFDckIsU0FBZ0MsRUFDaEMsUUFBc0IsRUFDdEIsUUFBbUIsRUFDbkIsY0FBMkIsRUFDM0IsZ0JBQWtDLEVBQ2xDLE1BQWlCLEVBQ2pCLGNBQThCLEVBQzlCLFVBQTBCLEVBQ1YsV0FBZ0IsRUFDaEMsTUFBYztRQVZkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLGFBQVEsR0FBUixRQUFRLENBQWM7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBYTtRQUMzQixxQkFB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USxHQUFHLEtBQUssQ0FBQTtJQUN2QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ3RCLENBQUM7K0dBanZDVSxnQkFBZ0IsNlJBMEdoQixhQUFhO21HQTFHYixnQkFBZ0IsK1JDakI3Qiw4bzdCQWtnQk07OzRGRGpmTyxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0Usb0JBQW9COzswQkE4RzFCLE1BQU07MkJBQUMsYUFBYTtpRUF6R2YsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQXNGMkIsUUFBUTtzQkFBeEMsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBQ3JCLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsRWxlbWVudFJlZixFdmVudEVtaXR0ZXIsSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkICwgSW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBFdmVudFNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlLCBXc0V2ZW50cyB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJztcbmltcG9ydCB7IFJvb3RTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy9yb290LnNlcnZpY2UnO1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmljZSB9IGZyb20gJy4vc29ja2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZydcbi8vIGltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIGFzIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcidcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciBhcyBNYXRTbmFja2Jhck5ldyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcidcbmltcG9ydCB7IE5vblJlbGV2ZW50RmVlZGJhY2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cvbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtYWktdHV0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vYWktdHV0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9haS10dXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEFpVHV0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGZyb20gPSAnJ1xuICBASW5wdXQoKSBjb250ZW50OmFueVxuICBASW5wdXQoKSB1c2VySm91cm5leSA9IFtdXG4gIHNob3dJY29uID0gdHJ1ZVxuICBjYXRlZ29yaWVzOiBhbnlbXSA9IFtdXG4gIGxhbmd1YWdlOiBhbnlbXSA9IFtdXG4gIGN1cnJlbnRGaWx0ZXIgPSAnaW5mb3JtYXRpb24nXG4gIHNlbGVjdGVkTGFndWFnZSA9ICdlbidcblxuICByZXNwb25zZURhdGE6IGFueVxuICB1c2VySW5mbzogYW55XG4gIHJlY29tZW5kZWRRbnM6IGFueSA9IHt9XG4gIHF1ZXN0aW9uc0FuZEFuczogYW55ID0ge31cbiAgdXNlckljb24gPSAnJ1xuICBtb3JlID0gZmFsc2VcbiAgY2hhdEluZm9ybWF0aW9uOiBhbnkgPSBbXVxuICBjaGF0SXNzdWVzOiBhbnkgPSBbXVxuICBkaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgZXhwYW5kZWQgPSBmYWxzZVxuICBjYWxsVGV4dCA9ICcnXG4gIGVtYWlsVGV4dCA9ICcnXG4gIHNlYXJjaFF1ZXJ5QUl0dXRvcjogYW55ID0gJydcbiAgaW5pdGlhbHM6YW55XG4gIGNvcGllZEluZGV4ID0gLTFcbiAgcHVibGljIGNpcmNsZUNvbG9yITogc3RyaW5nXG4gIHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpXG4gIGlHT1RBSVR1dG9yUmVzdWx0QXJyOmFueSA9IFtdXG4gIG1heGltaXplID0gdHJ1ZVxuICAvLyB0c2xpbnQ6ZGlzYWJsZVxuICBsb2NhbGl6YXRpb246IGFueSA9IHtcbiAgICAnZW4nIDoge1xuICAgICAgJ0hpJyA6ICdOYW1hc3RlJyxcbiAgICAgICdpbmZvcm1hdGlvbic6ICdJbmZvcm1hdGlvbicsXG4gICAgICAnaXNzdWUnOiAnSXNzdWVzJyxcbiAgICAgICdjYXRlZ29yaWVzJzogJ1Nob3cgQWxsIENhdGVnb3JpZXMnLFxuICAgICAgJ3Nob3dtb3JlJzogJ1Nob3cgTW9yZSdcbiAgICB9LFxuICAgICdoaScgOiB7XG4gICAgICAnSGknIDogJ+CkqOCkruCkuOCljeCkpOClhycsXG4gICAgICAnaW5mb3JtYXRpb24nOiAn4KSc4KS+4KSo4KSV4KS+4KSw4KWAJyxcbiAgICAgICdpc3N1ZSc6ICfgpLjgpK7gpLjgpY3gpK/gpL4nLFxuICAgICAgJ2NhdGVnb3JpZXMnOiAn4KS44KSt4KWAIOCkleCliOCkn+Ckl+Cli+CksOClgCDgpKbgpL/gpJbgpL7gpK/gpYfgpIInLFxuICAgICAgJ3Nob3dtb3JlJzogJ+CklOCksCDgpKbgpL/gpJbgpL7gpJMnXG5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbG9ycyA9IFtcbiAgICAnI0VCNzE4MScsIC8vIHJlZFxuICAgICcjMzA2OTMzJywgLy8gZ3JlZW5cbiAgICAnIzAwMDAwMCcsIC8vIGJsYWNrXG4gICAgJyMzNjcwQjInLCAvLyBibHVlXG4gICAgJyM0RTlFODcnLFxuICAgICcjN0U0QzhEJyxcbiAgXVxuXG4gIHByaXZhdGUgcmFuZG9tY29sb3JzID0gW1xuICAgICcjRUI3MTgxJywgLy8gcmVkXG4gICAgJyMwMDY0MDAnLCAvLyBncmVlblxuICAgICcjMDAwMDAwJywgLy8gYmxhY2tcbiAgICAnIzM2NzBCMicsIC8vIGJsdWVcbiAgICAnIzRFOUU4NycsXG4gICAgJyM3RTRDOEQnLFxuICBdXG5cbiAgYWlUdXRvclJlc3VsdDphbnlcblxuICBwcml2YXRlIG1lc3NhZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHVibGljIG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgaW5wdXRNZXNzYWdlOiBzdHJpbmcgPSAnJztcblxuICBhaVR1dG9yUmVzdWx0QXJyOmFueSA9IFtdXG4gIGNsb25lU2VhcmNoUXVlcnkgPSAnJ1xuICBqd3RUb2tlbiA9ICcnXG4gIC8vIHRzbGludDogZGlzYWJsZVxuIC8vIEBWaWV3Q2hpbGQoJ3Njcm9sbE1lJykgcHJpdmF0ZSBteVNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZFxuICBpc0h1YkVuYWJsZSE6IGJvb2xlYW5cbiAgbGVhcm5pbmdTdHlsZSA9IFtcbiAgICB7IHRpdGxlOiAnTm9uZScsIHN1YnRpdGxlOiAnTGVhcm4gd2l0aCBOYXR1cmFsIHF1ZXJ5IHByb2Nlc3MnIH0sXG4gICAgeyB0aXRsZTogJ1NvY3JhdGljIFN0eWxlJywgc3VidGl0bGU6ICdFeHBsb3JlIGlkZWFzIHRocm91Z2ggdGhvdWdodGZ1bCBxdWVzdGlvbnMuJyB9LFxuICAgIHsgdGl0bGU6ICdTdG9yeXRlbGxpbmcnLCBzdWJ0aXRsZTogJ0xlYXJuIHRocm91Z2ggcmVsYXRhYmxlIG5hcnJhdGl2ZXMgYW5kIHJlYWwtbGlmZSBleGFtcGxlcy4nIH0sXG4gIF1cbiAgc2VsZWN0ZWRMZWFybmluZ1N0eWxlIDphbnlcbiAgcmVzdWx0RmV0Y2ggPSBmYWxzZVxuICBhdXRoVG9rZW5Ib3N0ID0gJydcbiAgTm9uZVNvY2tldEhvc3QgPSAnJ1xuICBTb2NyYXRpY2VTdHlsZUhvc3QgPSAnJ1xuICBTdG9yeXRlbGxpbmdIb3N0ID0gJydcbiAgQFZpZXdDaGlsZCgnYXV0b1Jlc2l6ZVRleHRhcmVhJykgdGV4dEFyZWEhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xuICBAT3V0cHV0KCkgY2xvc2VBSVBvcHVwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgY29udGFpbmVySGVpZ2h0ID0gMzg7XG4gIGlzTW9iaWxlID0gZmFsc2VcbiAgc2hvd0FJVHV0b3JQb3B1cCA9IGZhbHNlXG4gIGNoYXRJZCA9ICcnXG4gIGVudmlyb25tZW50OiBhbnlcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U3ZjOiBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgY2hhdGJvdFNlcnZpY2U6IFJvb3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgd2Vic29ja2V0U2VydmljZTogV2ViU29ja2V0U2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgbWF0U25hY2tCYXJOZXc6IE1hdFNuYWNrYmFyTmV3LFxuICAgIHByaXZhdGUgdXRpbGl0eVN2YzogVXRpbGl0eVNlcnZpY2UsXG4gICAgIEBJbmplY3QoXCJlbnZpcm9ubWVudFwiKSBlbnZpcm9ubWVudDogYW55LFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIpIHsgXG4gICAgICB0aGlzLnNlbGVjdGVkTGVhcm5pbmdTdHlsZSA9IHRoaXMubGVhcm5pbmdTdHlsZVswXVxuICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50XG4gICAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGVcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudD8uc2l0ZVBhdGg/LmluY2x1ZGVzKCdwb3J0YWwuaWdvdGthcm1heW9naS5nb3YuaW4nKSkge1xuICAgICAgdGhpcy5hdXRoVG9rZW5Ib3N0ID0gJ2xlYXJuaW5nLWFpLnByb2Qua2FybWF5b2dpYmhhcmF0Lm5ldCdcbiAgICAgIHRoaXMuTm9uZVNvY2tldEhvc3QgPSAnbGVhcm5pbmctYWkucHJvZC5rYXJtYXlvZ2liaGFyYXQubmV0J1xuICAgICAgdGhpcy5Tb2NyYXRpY2VTdHlsZUhvc3QgPSAnbGVhcm5pbmctYWkucHJvZC5rYXJtYXlvZ2liaGFyYXQubmV0J1xuICAgICAgdGhpcy5TdG9yeXRlbGxpbmdIb3N0ID0gJ2xlYXJuaW5nLWFpLnByb2Qua2FybWF5b2dpYmhhcmF0Lm5ldCdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hdXRoVG9rZW5Ib3N0ID0gJ2xlYXJuaW5nLWFpLnVhdC5rYXJtYXlvZ2liaGFyYXQubmV0J1xuICAgICAgdGhpcy5Ob25lU29ja2V0SG9zdCA9ICdsZWFybmluZy1haS51YXQua2FybWF5b2dpYmhhcmF0Lm5ldCdcbiAgICAgIHRoaXMuU29jcmF0aWNlU3R5bGVIb3N0ID0gJ2xlYXJuaW5nLWFpLnVhdC5rYXJtYXlvZ2liaGFyYXQubmV0J1xuICAgICAgdGhpcy5TdG9yeXRlbGxpbmdIb3N0ID0gJ2xlYXJuaW5nLWFpLnVhdC5rYXJtYXlvZ2liaGFyYXQubmV0J1xuICAgIH1cbiAgICB0aGlzLnVzZXJJbmZvID0gdGhpcy5jb25maWdTdmMgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGVcbiAgICB0aGlzLndlYnNvY2tldFNlcnZpY2UuZ2V0SldUVG9rZW4oKS5zdWJzY3JpYmUoKGRhdGE6YW55KT0+e1xuICAgICAgaWYoZGF0YSAmJiBkYXRhWyd4LWF1dGhlbnRpY2F0ZWQtdXNlci10b2tlbiddKSB7XG4gICAgICAgIHRoaXMuand0VG9rZW4gPSBkYXRhWyd4LWF1dGhlbnRpY2F0ZWQtdXNlci10b2tlbiddXG4gICAgICAgIC8vd3NzOi8vbGVhcm5pbmctYWkudWF0Lmthcm1heW9naWJoYXJhdC5uZXQvc29jcmF0aWMvdjEvXG4gICAgICAgIHRoaXMud2Vic29ja2V0U2VydmljZS5jb25uZWN0KGB3c3M6Ly8ke3RoaXMuYXV0aFRva2VuSG9zdH0vd3M/dG9rZW49JHt0aGlzLmp3dFRva2VufWApO1xuICAgICAgfVxuICAgICAgXG4gICAgfSlcblxuICAgIC8vbGV0IGp3dFRva2VuID0gJ2V5SmhiR2NpT2lKU1V6STFOaUlzSW5SNWNDSWdPaUFpU2xkVUlpd2lhMmxrSWlBNklDSmhNVGs1V1hoM1VreE5RV3BCYjNKVlJtSlVTa2w0WWpaRFdFMUpkVWs0V1ZwNFkwcExhR3hNZEhRd0luMC5leUpxZEdraU9pSTRaV1EyTXpFMVlpMDJPR1ExTFRSaFpEa3RZV1UzTUMxaFl6UmlOalptTmpJek9XSWlMQ0psZUhBaU9qRTNORFE0TlRNM05ETXNJbTVpWmlJNk1Dd2lhV0YwSWpveE56UTBPREV3TlRRekxDSnBjM01pT2lKb2RIUndjem92TDNCdmNuUmhiQzUxWVhRdWEyRnliV0Y1YjJkcFltaGhjbUYwTG01bGRDOWhkWFJvTDNKbFlXeHRjeTl6ZFc1aWFYSmtJaXdpYzNWaUlqb2laam81TVdWak9UVmtNaTFoTTJRMUxUUXhNMlV0WWpSbE5DMDFNMkl3WkdOak9UWTBPRFU2WTJWbFl6QXlZell0WXpFNU1TMDBPV1psTFRnME5UWXROall5TkRWaE9XRTNPRE0xSWl3aWRIbHdJam9pUW1WaGNtVnlJaXdpWVhwd0lqb2lZV1J0YVc0dFkyeHBJaXdpWVhWMGFGOTBhVzFsSWpvd0xDSnpaWE56YVc5dVgzTjBZWFJsSWpvaVlqVXlOVGxpWW1NdFpEVmpZeTAwWVdKa0xUaGpZMlV0WlRobFpUWmlZakE0TkdZeUlpd2lZV055SWpvaU1TSXNJbUZzYkc5M1pXUXRiM0pwWjJsdWN5STZXeUpvZEhSd09pOHZiRzlqWVd4b2IzTjBPalF5TURBaVhTd2ljbVZoYkcxZllXTmpaWE56SWpwN0luSnZiR1Z6SWpwYkltOW1abXhwYm1WZllXTmpaWE56SWl3aWRXMWhYMkYxZEdodmNtbDZZWFJwYjI0aVhYMHNJbk5qYjNCbElqb2lJaXdpYjNKbklqb2lNREV6TXpjNE16QTVOVGd5TXpneE1EVTJNQ0lzSW01aGJXVWlPaUpUY0hZZ1FXUnRhVzRpTENKMWMyVnlYM0p2YkdWeklqcGJJazFGVGxSUFVpSXNJbEJWUWt4SlF5SXNJbE5RVmw5QlJFMUpUaUpkTENKd2NtVm1aWEp5WldSZmRYTmxjbTVoYldVaU9pSnpjSFpoWkcxcGJsOXFaeko1SWl3aVoybDJaVzVmYm1GdFpTSTZJbE53ZGlCQlpHMXBiaUlzSW1aaGJXbHNlVjl1WVcxbElqb2lJaXdpWlcxaGFXd2lPaUp6Y0NvcUtpb3FLaW9xS2lvcVFIbHZjRzFoYVd3dVkyOXRJbjAubmFPX0ZVTmNpX0ltV0hRSXlsZm1NR0kyQi04NWtvSXliOVNmeTBtT2d1UHBMSUtlaUdaaUxadmNjUF9JXzFRVVNjQmV3T3JyUDNmWXhlcThvVTk4ZGo3c1FHbUJGT29VMWRTWkNsWmNlM1U0UUVqU2l1Z2NieGRpTkhjUVhscFpUeXViNWFBSkUtdWI5SGIxYmhTX1JRalRNVWVEZmg1d3JsWno2THFnN2tkRGg1ZXNYRkxpYmZuVWNGcW1GRnFaQnRONWlQMnNiUkNuQ0Z5UzFWdzVURUZLeFRpR2RSUFlULVhVek5FX2ladVFQbTJ6LXp5SzBGRWMxRTlvZGFpd3dwVzVoa24zVHpuRHd3WGU3VmRKUzJFLUh0anVqbUktbmFBcVpfX1I2OFN1THlSSHVxX1BHaGoyVFpfcmpvYVZJaGpsZ2lGcUhmT1ZMVXNSYXQ4SHBBJ1xuICAgIFxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgLy9jZXJ0aWZpY2F0ZSBsaW5rIGNoZWNrXG4gICAgICAgIHRoaXMuaXNIdWJFbmFibGUgPSAoZXZlbnQudXJsLmluY2x1ZGVzKCcvY2VydHMnKSB8fCBldmVudC51cmwuaW5jbHVkZXMoJy9wdWJsaWMvY2VydHMnKSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnVzZXJJbmZvID0gdGhpcy5jb25maWdTdmMgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGVcbiAgICAvLyB0aGlzLmFpR2xvYmFsU2VhcmNoKClcbiAgICB0aGlzLmNoZWNrRm9yQXBpQ2FsbHMoKVxuICAgIHRoaXMuZW5hYmxlU2Nyb2xsKClcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIHRoaXMudXNlckljb24gPSB0aGlzLnVzZXJJbmZvICYmIHRoaXMudXNlckluZm8ucHJvZmlsZUltYWdlVXJsID8gdGhpcy51c2VySW5mby5wcm9maWxlSW1hZ2VVcmwgOiAnJ1xuICAgIGlmKCF0aGlzLnVzZXJJbmZvLnByb2ZpbGVJbWFnZVVybCAmJiB0aGlzLnVzZXJJbmZvICYmIHRoaXMudXNlckluZm8uZmlyc3ROYW1lKSB7XG4gICAgICB0aGlzLmNyZWF0ZUluaXRpdGFscyh0aGlzLnVzZXJJbmZvLmZpcnN0TmFtZSlcbiAgICB9XG4gICAgY29uc3QgZW1haWwgPSB0aGlzLmVudmlyb25tZW50LnN1cHBvcnRFbWFpbCB8fCAnbWlzc2lvbi5rYXJtYXlvZ2lAZ292LmluJ1xuICAgIHRoaXMuY2FsbFRleHQgPSBgPGEgY2xhc3M9J2hpbnQtdGV4dCcgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vYml0Lmx5LzQ0TUpsbzQnPlRlYW1zIENhbGw8L2E+Jm5ic3A7YFxuICAgIHRoaXMuZW1haWxUZXh0ID0gYDxhIGNsYXNzPSdoaW50LXRleHQnIHRhcmdldD0nX2JsYW5rJyBocmVmPSdtYWlsdG86JHtlbWFpbH0nPiR7ZW1haWx9LjwvYT5gXG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50VHlwZTogV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5LFxuICAgICAgZXZlbnRMb2dMZXZlbDogV3NFdmVudHMuV3NFdmVudExvZ0xldmVsLkluZm8sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVkYXRhOiB7IHR5cGU6ICdjbGljaycsICBcImlkXCI6IFwiYWktdHV0b3ItY2FyZC1jb250ZW50XCIsIFwicGFnZWlkXCI6IGB2aWV3ZXIvJHt0aGlzLmNvbnRlbnR9YCwgXCJzdWJUeXBlXCIgOiAgIHRoaXMuc2VsZWN0ZWRMZWFybmluZ1N0eWxlLnRpdGxlICB9LFxuICAgICAgICBvYmplY3Q6IHsgaWQ6IHRoaXMuY29udGVudH0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7cGFnZUlkOiBgdmlld2VyLyR7dGhpcy5jb250ZW50fWAsIG1vZHVsZTogJ0xlYXJuJ30sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuY2hhdElkID0gYCR7dGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLnVzZXJJZH0tJHt0aW1lc3RhbXB9YFxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplVGV4dGFyZWEodGhpcy50ZXh0QXJlYT8ubmF0aXZlRWxlbWVudCwnJyk7XG4gIH1cblxuICBncmVldGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uW3RoaXMuc2VsZWN0ZWRMYWd1YWdlXVsnSGknXSB8fCAnSGknXG4gIH1cblxuICBnZXRJbmZvVGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uW3RoaXMuc2VsZWN0ZWRMYWd1YWdlXVtsYWJlbF0gfHwgbGFiZWxcbiAgfVxuXG4gIHNob3dNb3JlKCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsaXphdGlvblt0aGlzLnNlbGVjdGVkTGFndWFnZV1bJ3Nob3dtb3JlJ10gfHwgJ1Nob3cgTW9yZSdcbiAgfVxuXG4gIGdldERhdGEoKSB7XG4gICAgY29uc3QgbGFuZzogYW55ID0ge1xuICAgICAgaW5mb3JtYXRpb246ICdJTicsXG4gICAgICBpc3N1ZTogJ0lTJ1xuICAgIH1cbiAgICBjb25zdCB0YWJUeXBlOiBhbnkgPSB7XG4gICAgICBsYW5nOiB0aGlzLnNlbGVjdGVkTGFndWFnZSxcbiAgICAgIGNvbmZpZ190eXBlOiBsYW5nW3RoaXMuY3VycmVudEZpbHRlcl1cbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gdHJ1ZVxuICAgIHRoaXMuY2hhdGJvdFNlcnZpY2UuZ2V0Q2hhdERhdGEodGFiVHlwZSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcyAmJiByZXMucGF5bG9hZCAmJiByZXMucGF5bG9hZC5jb25maWcpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhVG9Mb2NhbFN0b3JhZ2UocmVzLnBheWxvYWQuY29uZmlnKVxuICAgICAgICB0aGlzLmNoZWNrRm9yQXBpQ2FsbHMoKVxuICAgICAgICAvLyB0aGlzLmluaXREYXRhKHJlcy5wYXlsb2FkLmNvbmZpZylcbiAgICAgICAgdGhpcy5kaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHNldERhdGFUb0xvY2FsU3RvcmFnZShkYXRhOiBhbnkpIHtcbiAgICBsZXQgbG9jYWxPYmplY3Q6IGFueSA9IHt9XG4gICAgbG9jYWxPYmplY3QgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmYXEnKXx8ICd7fScpXG4gICAgbG9jYWxPYmplY3RbdGhpcy5zZWxlY3RlZExhZ3VhZ2VdID0gey4uLmxvY2FsT2JqZWN0W3RoaXMuc2VsZWN0ZWRMYWd1YWdlXSwgW3RoaXMuY3VycmVudEZpbHRlcl0gOiBkYXRhfVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmYXEnLCBKU09OLnN0cmluZ2lmeShsb2NhbE9iamVjdCkpXG4gICAgdGhpcy50b2dnbGVGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyID09PSAnaW5mb3JtYXRpb24nID8gJ2luZm9ybWF0aW9uJzogdGhpcy5jdXJyZW50RmlsdGVyKVxuICB9XG5cbiAgaW5pdERhdGEoX2dldERhdGE6IGFueSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIC8vIGNvbnNvbGUubG9nKGdldERhdGEpXG4gICAgdGhpcy51c2VySm91cm5leSA9IFtdXG4gICAgbGV0IHVzZXJEZXRhaWxzOiBhbnkgPSB7XG4gICAgICB0eXBlOiAnaW5jb21pbmcnLFxuICAgICAgbWVzc2FnZTogJycsIC8vYCBIaSAke3RoaXMudXNlckluZm8gJiYgdGhpcy51c2VySW5mby5maXJzdE5hbWUgfHwgJyd9LCBJJ20gS2FybWFTYWhheW9naSAtIERpZ2l0YWwgQXNzaXN0YW50LCBJJ20gaGVyZSB0byBoZWxwIHlvdS5gLFxuICAgICAgcmVjb21tZW5kZWRRdWVzOiB0aGlzLmdldFByaW9yaXR5UXVlc3Rpb24oMSksXG4gICAgICBzZWxlY3RlZFZhbHVlOiAnJyxcbiAgICAgIHRpdGxlOiAnJywvLydIZXJlIGFyZSB0aGUgbW9zdCBmcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyB1c2VycyBoYXZlIGxvb2tlZCBmb3InLFxuICAgICAgdGFiOiAnaW5mb3JtYXRpb24nLFxuICAgIH1cblxuICAgIHRoaXMucHVzaERhdGEodXNlckRldGFpbHMpXG4gICAgLy8gdGhpcy5wdXNoRGF0YSh1c2VyRGV0YWlsc0Zvcklzc3VlcylcbiAgICB0aGlzLmdldFFucygpXG4gIH1cbiAgZ2V0UW5zKCkge1xuICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1ZXNNYXAubWFwKChxOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb25zQW5kQW5zW3EucXVlc0lkXSA9IHFcbiAgICB9KVxuICB9XG5cbiAgc2VsZWN0TGFndWFnZShldmVudDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZExhZ3VhZ2UgPSBldmVudC50YXJnZXQudmFsdWVcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2VsZWN0ZWRMYW5ndWFnZScsIGV2ZW50LnRhcmdldC52YWx1ZSlcbiAgICB0aGlzLmNoYXRJbmZvcm1hdGlvbj1bXVxuICAgIHRoaXMuY2hhdElzc3VlcyA9IFtdXG4gICAgdGhpcy5jaGVja0ZvckFwaUNhbGxzKClcbiAgfVxuXG4gIHJlYWRGcm9tTG9jYWxTdG9yYWdlKCkge1xuICAgIGxldCBsb2NhbFN0ZzogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Jlc3VsdCcpXG4gICAgaWYgKGxvY2FsU3RnKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyID09PSAnaW5mb3JtYXRpb24nKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0ZylbdGhpcy5zZWxlY3RlZExhZ3VhZ2VdLmluZm9ybWF0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdGcpW3RoaXMuc2VsZWN0ZWRMYWd1YWdlXS5pc3N1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdvVG9Cb3R0b20oKSB7XG4gICAgd2luZG93LnNjcm9sbFRvKDAsIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICB9XG5cbiAgaWNvbkNsaWNrKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuc2hvd0ljb24gPSAhdGhpcy5zaG93SWNvblxuICAgIHRoaXMuY3VycmVudEZpbHRlciA9ICdpbmZvcm1hdGlvbidcbiAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2VcbiAgICBpZiAodHlwZSA9PT0gJ3N0YXJ0Jykge1xuICAgICAgdGhpcy5kaXNhYmxlU2Nyb2xsKClcbiAgICAgIHRoaXMucmFpc2VDaGF0U3RhcnRUZWxlbWV0cnkoKVxuICAgICAgLy8gdGhpcy50b2dnbGVGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhaXNlQ2hhdEVuZFRlbGVtZXRyeSgpXG4gICAgICB0aGlzLnVzZXJKb3VybmV5ID0gW11cbiAgICAgIHRoaXMuY2hhdEluZm9ybWF0aW9uID0gW11cbiAgICAgIHRoaXMuY2hhdElzc3VlcyA9IFtdXG4gICAgICB0aGlzLnNlbGVjdGVkTGFndWFnZSA9ICdlbidcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlciA9ICdpbmZvcm1hdGlvbidcbiAgICAgIHRoaXMuY2hlY2tGb3JBcGlDYWxscygpXG4gICAgICB0aGlzLm1vcmUgPSBmYWxzZVxuICAgICAgdGhpcy5lbmFibGVTY3JvbGwoKVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUZpbHRlcih0YWI6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IHRhYlxuICAgIHRoaXMuY2hlY2tGb3JBcGlDYWxscygpXG4gICAgdGhpcy5tb3JlID0gZmFsc2VcbiAgfVxuXG4gIHNlbGVjdGVkUXVlc3Rpb24ocXVlc3Rpb246IGFueSwgZGF0YTogYW55KSB7XG4gICAgZGF0YS5zZWxlY3RlZFZhbHVlID0gcXVlc3Rpb24ucXVlc0lEXG4gICAgY29uc3Qgc2VuZE1zZyA9IHtcbiAgICAgIHR5cGU6ICdzZW5kTXNnJyxcbiAgICAgIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uc0FuZEFuc1txdWVzdGlvbi5xdWVzSURdLnF1ZXNWYWx1ZSxcbiAgICAgIHRhYjogdGhpcy5jdXJyZW50RmlsdGVyLFxuICAgIH1cblxuICAgIGNvbnN0IGluY29taW5nTXNnID0ge1xuICAgICAgdHlwZTogJ2luY29taW5nJyxcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIG1lc3NhZ2U6IHRoaXMucXVlc3Rpb25zQW5kQW5zW3F1ZXN0aW9uLnF1ZXNJRF0uYW5zVmFsLnJlcGxhY2UoJzx0ZWFtc19jYWxsX2xpbms+JywgdGhpcy5jYWxsVGV4dCkucmVwbGFjZSgnPGVtYWlsX2NvbmZpZ3VyYXRpb24+JywgdGhpcy5lbWFpbFRleHQpLFxuICAgICAgcmVjb21tZW5kZWRRdWVzOiBxdWVzdGlvbi5yZWNvbW1lbmRlZFF1ZXMgfHwgW10sXG4gICAgICB0aXRsZTogJycsIC8vICdRdWVzdGlvbnMgcmVsYXRlZCB0bycsXG4gICAgICByZWxhdGVkUWVzOiAnYWJvdmUgUXVlc3Rpb24nLFxuICAgICAgdGFiOiB0aGlzLmN1cnJlbnRGaWx0ZXIsXG4gICAgfVxuICAgIHRoaXMucHVzaERhdGEoc2VuZE1zZylcbiAgICB0aGlzLnB1c2hEYXRhKGluY29taW5nTXNnKVxuICAgIHRoaXMucmFpc2VUZW1lbGV0eUludGVyYXQocXVlc3Rpb24ucXVlc0lEKVxuICB9XG5cbiAgcHVzaERhdGEobXNnOiBhbnkpIHtcbiAgICB0aGlzLnVzZXJKb3VybmV5ID0gW11cbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyID09PSAnaW5mb3JtYXRpb24nKSB7XG4gICAgICB0aGlzLmNoYXRJbmZvcm1hdGlvbi5wdXNoKG1zZylcbiAgICAgIHRoaXMudXNlckpvdXJuZXkgPSB0aGlzLmNoYXRJbmZvcm1hdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXRJc3N1ZXMucHVzaChtc2cpXG4gICAgICB0aGlzLnVzZXJKb3VybmV5ID0gdGhpcy5jaGF0SXNzdWVzXG4gICAgfVxuICB9XG5cbiAgZ2V0dXNlcmpvdXJuZXkodGFiOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy51c2VySm91cm5leS5maWx0ZXIoKGo6IGFueSkgPT4gai50YWIgPT09IHRhYilcbiAgfVxuXG4gIGdldFByaW9yaXR5UXVlc3Rpb24ocHJpb3JpdHk6IGFueSkge1xuICAgIGNvbnN0IHJlY29tbWVuZGVkUXVlczogYW55W10gPSBbXVxuICAgIGNvbnN0IGlzTG9nZWRJbjogc3RyaW5nID0gdGhpcy51c2VySW5mbyA/ICdMb2dnZWQtSW4nIDogJ05vdCBMb2dnZWQtSW4nXG4gICAgdGhpcy5yZXNwb25zZURhdGEucmVjb21tZW5kYXRpb25NYXAubWFwKChxdWVzdGlvbjogYW55KSA9PiB7XG4gICAgICBxdWVzdGlvbi5yZWNvbW1lbmRlZFF1ZXMubWFwKChxdWVzOiBhbnkpPT4ge1xuICAgICAgICBpZiAocXVlcy5wcmlvcml0eSA9PT0gcHJpb3JpdHkgJiYgKHF1ZXN0aW9uLmNhdGVnb3J5VHlwZSA9PT0gaXNMb2dlZEluIHx8IHF1ZXN0aW9uLmNhdGVnb3J5VHlwZSA9PT0gJ0JvdGgnKSkge1xuICAgICAgICAgIHJlY29tbWVuZGVkUXVlcy5wdXNoKHF1ZXMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm4gcmVjb21tZW5kZWRRdWVzXG4gIH1cblxuICBzaG93TW9yZVF1ZXN0aW9uKCkge1xuICAgIGNvbnN0IHNob3dNb3JlUWVzOiBhbnkgPSB7XG4gICAgICB0eXBlOiAnaW5jb21pbmcnLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICByZWNvbW1lbmRlZFF1ZXM6IHRoaXMuZ2V0UHJpb3JpdHlRdWVzdGlvbigxKSxcbiAgICAgIHNlbGVjdGVkVmFsdWU6ICcnLFxuICAgICAgdGl0bGU6ICcnLCAvLydTaG93aW5nIG1vcmUgcXVlc3Rpb25zJyxcbiAgICB9XG4gICAgdGhpcy5wdXNoRGF0YShzaG93TW9yZVFlcylcbiAgfVxuXG4gIHNob3dDYXRlZ29yeShjYXRJdGVtOiBhbnkpIHtcbiAgICBsZXQgaW5jb21pbmdNc2cgPSB7XG4gICAgICB0eXBlOiAnY2F0ZWdvcnknLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICByZWNvbW1lbmRlZFF1ZXM6IFtdLFxuICAgICAgdGl0bGU6ICcnLCAvLycgV2hhdCBkbyB5b3Ugd2FudCB0byBrbm93IHVuZGVyJyxcbiAgICAgIHJlbGF0ZWRRZXM6IGAke2NhdEl0ZW0uY2F0TmFtZX0/YCxcbiAgICAgIHRhYjogdGhpcy5jdXJyZW50RmlsdGVyLFxuICAgIH1cbiAgICB0aGlzLm1vcmU9IGZhbHNlXG4gICAgaWYgKGNhdEl0ZW0uY2F0SWQgPT09ICdhbGwnKSB7XG4gICAgICBpbmNvbWluZ01zZy50aXRsZSA9ICcnLCAvLyAnSGVyZSBpcyB0aGUgbGlzdCBvZiBhbGwgdGhlIHRvcGljcydcbiAgICAgIGluY29taW5nTXNnLnJlbGF0ZWRRZXMgPSAnJ1xuICAgICAgaW5jb21pbmdNc2cucmVjb21tZW5kZWRRdWVzID0gdGhpcy5zb3J0Q2F0ZWdvcnkoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3BvbnNlRGF0YS5yZWNvbW1lbmRhdGlvbk1hcC5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNhdEl0ZW0uY2F0SWQgPT09IGVsZW1lbnQuY2F0SWQpIHtcbiAgICAgICAgICBpbmNvbWluZ01zZy50eXBlID0gJ2luY29taW5nJyxcbiAgICAgICAgICBpbmNvbWluZ01zZy5yZWNvbW1lbmRlZFF1ZXMgPSBlbGVtZW50LnJlY29tbWVuZGVkUXVlc1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdGhpcy5yYWlzZUNhdGVnb3R5VGVsZW1ldHJ5KGNhdEl0ZW0uY2F0SWQpXG4gICAgfVxuICAgIGNvbnN0IHNlbmRNc2cgPSB7XG4gICAgICB0eXBlOiAnc2VuZE1zZycsXG4gICAgICBxdWVzdGlvbjogY2F0SXRlbS5jYXROYW1lLFxuICAgIH1cbiAgICB0aGlzLnB1c2hEYXRhKHNlbmRNc2cpXG4gICAgdGhpcy5wdXNoRGF0YShpbmNvbWluZ01zZylcbiAgfVxuXG4gIHJhaXNlQ2F0ZWdvdHlUZWxlbWV0cnkoY2F0SXRlbTogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBpZDogY2F0SXRlbSB9LFxuICAgICAgICBvYmplY3Q6IHsgaWQ6IGNhdEl0ZW0sIHR5cGU6ICdDYXRlZ29yeScgfSxcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0LFxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgIH0sXG4gICAgICBwYWdlQ29udGV4dDoge3BhZ2VJZDogJy9jaGF0Ym90JywgbW9kdWxlOiAnQXNzaXN0YW50J30sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIHJhaXNlQ2hhdFN0YXJ0VGVsZW1ldHJ5KCkge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJycgfSxcbiAgICAgICAgb2JqZWN0OiB7IHR5cGU6ICd6c2UnLCBpZDogJ2FzZCd9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkLFxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXG4gICAgICAgIHR5cGU6ICdzZXNzaW9uJyxcbiAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgfSxcbiAgICAgIHBhZ2VDb250ZXh0OiB7IHBhZ2VJZDogJy9jaGF0Ym90JywgbW9kdWxlOiAnQXNzaXN0YW50JyB9LFxuICAgICAgZnJvbTogJycsXG4gICAgICB0bzogJ1RlbGVtZXRyeScsXG4gICAgfVxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXG4gIH1cblxuICByYWlzZUNoYXRFbmRUZWxlbWV0cnkoKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnJyB9LFxuICAgICAgICBvYmplY3Q6IHt9LFxuICAgICAgICBzdGF0ZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQsXG4gICAgICAgIGV2ZW50U3ViVHlwZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuQ2hhdGJvdCxcbiAgICAgICAgdHlwZTogJ3Nlc3Npb24nLFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgICAgcGFnZUNvbnRleHQ6IHsgcGFnZUlkOiAnL2NoYXRib3QnLCBtb2R1bGU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIHJhaXNlVGVtZWxldHlJbnRlcmF0KGlkbjogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCBpZDogaWRuIH0sXG4gICAgICAgIG9iamVjdDoge2lkOiBpZG4sIHR5cGU6IHRoaXMuY3VycmVudEZpbHRlci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuY3VycmVudEZpbHRlci5zbGljZSgxKX0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxuICAgICAgICBtb2RlOiAndmlldydcbiAgICAgIH0sXG4gICAgICBwYWdlQ29udGV4dDogeyBwYWdlSWQ6ICcvY2hhdGJvdCcsIG1vZHVsZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgIGZyb206ICcnLFxuICAgICAgdG86ICdUZWxlbWV0cnknLFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxuICB9XG5cbiAgY2hlY2tGb3JBSVF1ZXN0aW9uUmVzcG9uc2UoKSB7XG5cbiAgfVxuXG4gIGNoZWNrRm9yQXBpQ2FsbHMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZExhZ3VhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VsZWN0ZWRMYW5ndWFnZScpIHx8ICdlbidcbiAgICBsZXQgbG9jYWxTdGc6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZhcScpIHx8ICd7fScpXG4gICAgbGV0IGxhbmd1YWdlU3RnOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmYXEtbGFuZ3VhZ2VzJykgfHwgJ3t9JylcbiAgICBpZiAobGFuZ3VhZ2VTdGcubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlU3RnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0TGFuZ3VhZ2VzKClcbiAgICB9XG5cbiAgICBpZiAobG9jYWxTdGcgJiYgbGFuZ3VhZ2VTdGcpIHtcbiAgICAgIGlmIChsb2NhbFN0Z1t0aGlzLnNlbGVjdGVkTGFndWFnZV0gJiYgbG9jYWxTdGdbdGhpcy5zZWxlY3RlZExhZ3VhZ2VdW3RoaXMuY3VycmVudEZpbHRlcl0pIHtcbiAgICAgICAgY29uc3QgbG9jYWxTdG9yYWdlRGF0YSA9IGxvY2FsU3RnW3RoaXMuc2VsZWN0ZWRMYWd1YWdlXVt0aGlzLmN1cnJlbnRGaWx0ZXJdXG4gICAgICAgIHRoaXMudXNlckpvdXJuZXkgPSBbXVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyID09PSAnaW5mb3JtYXRpb24nKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY2hhdEluZm9ybWF0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSBsb2NhbFN0b3JhZ2VEYXRhXG4gICAgICAgICAgICB0aGlzLmluaXREYXRhKGxvY2FsU3RvcmFnZURhdGEpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gbG9jYWxTdG9yYWdlRGF0YVxuICAgICAgICAgICAgdGhpcy51c2VySm91cm5leSA9IHRoaXMuY2hhdEluZm9ybWF0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmNoYXRJc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IGxvY2FsU3RvcmFnZURhdGFcbiAgICAgICAgICAgIHRoaXMuaW5pdERhdGEobG9jYWxTdG9yYWdlRGF0YSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSBsb2NhbFN0b3JhZ2VEYXRhXG4gICAgICAgICAgICB0aGlzLnVzZXJKb3VybmV5ID0gdGhpcy5jaGF0SXNzdWVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2V0UW5zKClcbiAgICAgICAgdGhpcy5nZXRDYXRlZ29yaWVzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0TGFuZ3VhZ2VzKClcbiAgICAgICAgLy8gdGhpcy5nZXREYXRhKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0Q2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLmNhdGVnb3JpZXMgPSBbeyBjYXRJZDogJ2FsbCcsIGNhdE5hbWU6IHRoaXMubG9jYWxpemF0aW9uW3RoaXMuc2VsZWN0ZWRMYWd1YWdlXVsnY2F0ZWdvcmllcyddLCBwcmlvcml0eTogMCB9XVxuICAgIGNvbnN0IGNhdGVnb3JpZXM6IGFueSA9IFtdXG4gICAgY29uc3QgaXNMb2dlZEluOiBzdHJpbmcgPSB0aGlzLnVzZXJJbmZvID8gJ0xvZ2dlZC1JbicgOiAnTm90IExvZ2dlZC1JbidcbiAgICB0aGlzLnJlc3BvbnNlRGF0YS5yZWNvbW1lbmRhdGlvbk1hcC5tYXAoKGNhdGFuZHF1ZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNwb25zZURhdGEuY2F0ZWdvcnlNYXAubWFwKChjYXQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2F0YW5kcXVlcy5jYXRJZCA9PT0gY2F0LmNhdElkICYmIChjYXRhbmRxdWVzLmNhdGVnb3J5VHlwZSA9PT0gaXNMb2dlZEluIHx8IGNhdGFuZHF1ZXMuY2F0ZWdvcnlUeXBlID09PSAnQm90aCcpKSB7XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB7XG4gICAgICAgICAgICBjYXRJZDogY2F0LmNhdElkLFxuICAgICAgICAgICAgY2F0TmFtZTogY2F0LmNhdE5hbWUsXG4gICAgICAgICAgICBwcmlvcml0eTogY2F0YW5kcXVlcy5wcmlvcml0eSxcbiAgICAgICAgICAgIGNhdGVnb3J5VHlwZTogY2F0YW5kcXVlcy5jYXRlZ29yeVR5cGUsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChjYXRlZ29yeSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAgIGlmIChjYXRlZ29yaWVzLmxlbmd0aCA8IDYpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzID0gWy4uLnRoaXMuY2F0ZWdvcmllcywgLi4uY2F0ZWdvcmllc11cbiAgICB9XG4gIH1cbiAgc29ydENhdGVnb3J5KCk6IGFueSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBhWydwcmlvcml0eSddID4gYlsncHJpb3JpdHknXSA/IDEgOiBhWydwcmlvcml0eSddID09PSBiWydwcmlvcml0eSddID8gMCA6IC0xKVxuICB9XG5cbiAgZ2V0TGFuZ3VhZ2VzKCkge1xuICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IHRydWVcbiAgICB0aGlzLmNoYXRib3RTZXJ2aWNlLmdldExhbmd1Z2FnZXMoKS5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3AgJiYgcmVzcC5zdGF0dXMgJiYgcmVzcC5zdGF0dXMuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSByZXNwLnBheWxvYWQubGFuZ3VhZ2VzXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmYXEtbGFuZ3VhZ2VzJywgSlNPTi5zdHJpbmdpZnkocmVzcC5wYXlsb2FkLmxhbmd1YWdlcykpXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZExhbmd1YWdlJywgdGhpcy5zZWxlY3RlZExhZ3VhZ2UpXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpXG4gICAgICAgIHRoaXMuZGlzcGxheUxvYWRlciA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgLy8gIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICB9XG4gIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIGxldCBtZXNzYWdlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lci1ub25lJylcbiAgICBpZihtZXNzYWdlQ29udGFpbmVyKSB7XG4gICAgICBtZXNzYWdlQ29udGFpbmVyLnNjcm9sbFRvKHt0b3A6IG1lc3NhZ2VDb250YWluZXIuc2Nyb2xsSGVpZ2h0LCBiZWhhdmlvcjogJ3Ntb290aCd9KVxuICAgIH1cbiAgICBcbiAgICBcbiAgIFxuICB9XG4gIGNsaWNrT3V0c2lkZSgpIHtcbiAgICB0aGlzLmljb25DbGljaygnZW5kJylcbiAgfVxuICBwcml2YXRlIGRpc2FibGVTY3JvbGwoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCAnZGlzYWJsZS1zY3JvbGwnKVxuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVTY3JvbGwoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCAnZGlzYWJsZS1zY3JvbGwnKVxuICB9XG5cbiAgc3VibWl0U2VhcmNoUXVlcnkodGV4dEFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQsIGV2ZW50OmFueSkge1xuICAgIGlmICghdGhpcy5zZWFyY2hRdWVyeUFJdHV0b3IudHJpbSgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBQcmV2ZW50cyBFbnRlciBrZXkgZnJvbSBhZGRpbmcgYSBuZXcgbGluZVxuICAgIH1cbiAgICBpZighdGhpcy5zZWFyY2hRdWVyeUFJdHV0b3IudHJpbSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgdGhpcy5jbG9uZVNlYXJjaFF1ZXJ5ID0gJydcbiAgICB0aGlzLmNsb25lU2VhcmNoUXVlcnkgPSBjbG9uZURlZXAodGhpcy5zZWFyY2hRdWVyeUFJdHV0b3IpO1xuICAgIHRoaXMuc2VhcmNoUXVlcnlBSXR1dG9yID0gdGhpcy5zZWFyY2hRdWVyeUFJdHV0b3IudHJpbSgpXG4gICAgdGhpcy5zZWFyY2hRdWVyeUFJdHV0b3IgPSAnJ1xuICAgIHRoaXMucmVzZXRUZXh0QXJlYUhlaWdodCh0ZXh0QXJlYSlcbiAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubWFwKChpdGVtOmFueSwgaW5kZXg6YW55KT0+e1xuICAgICAgaWYoaXRlbSAmJiAoaXRlbS5uZXdNZXNzYWdlID09PSAnJykpIHtcbiAgICAgICAgLy8gZGVsZXRlIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF1cbiAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyLnNwbGljZShpbmRleCwxKVxuICAgICAgfVxuICAgICB9KVxuICAgICB0aGlzLnJlc3VsdEZldGNoID0gZmFsc2UgXG4gICAgXG4gIC8vIHRoaXMuc2VhcmNoUXVlcnkgPSAnU29pbCBFcm9zaW9uIGFuZCBDb25zZXJ2YXRpb24nXG4gICBsZXQgc2VuZE1zZ09iaiA9IHtcbiAgICAgdHlwZTogJ3NlbmRNc2cnLFxuICAgICB0YWI6ICdzYXJ0aGknLFxuICAgICBxdWVzdGlvbjogdGhpcy5jbG9uZVNlYXJjaFF1ZXJ5XG4gICB9XG4gICBcbiAgIHRoaXMuYWlUdXRvclJlc3VsdEFyci5wdXNoKHNlbmRNc2dPYmopXG4gICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIucHVzaCh7dHlwZTogJ2luY29taW5nJywgIHRhYjogJ3NhcnRoaScsIGFuc3dlcjogJycsbmV3TWVzc2FnZTogJyd9KVxuICAvLyAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnXG4gIC8vICB0aGlzLmFpR2xvYmFsU2VhcmNoKClcbiAgLy8gIHRoaXMuZ2V0QWlUdXRvck1lc3NhZ2UoKVxuIFxuICBzZXRUaW1lb3V0KCgpPT57XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gIH0sMClcbiAgXG4gICB0aGlzLnNlbmRBSVR1dG9yTWVzc2FnZSgpXG4gICBcbiAgfVxuXG5cbiAgc2VuZEFJVHV0b3JNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmNsb25lU2VhcmNoUXVlcnkpIHtcbiAgICAgIGxldCBtZXNzYWdlID0ge1xuICAgICAgICBtZXNzYWdlOiB0aGlzLmNsb25lU2VhcmNoUXVlcnksIFxuICAgICAgICBxdWVyeTogdGhpcy5jbG9uZVNlYXJjaFF1ZXJ5LFxuICAgICAgICBmb2xkZXJfbmFtZTogdGhpcy5jb250ZW50IC8vdGhpcy5jb250ZW50XG4gICAgICB9XG4gICAgICB0aGlzLndlYnNvY2tldFNlcnZpY2Uuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIHRoaXMuZ2V0QWlUdXRvck1lc3NhZ2UoKVxuICAgICAgfSwgMTAwMClcbiAgICAgIFxuICAgIH1cbiAgfVxuICBcblxuICBnZXRBaVR1dG9yTWVzc2FnZSgpIHtcbiAgICB0aGlzLm1lc3NhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLndlYnNvY2tldFNlcnZpY2VcbiAgICAgIC5nZXRNZXNzYWdlcygpXG4gICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIFxuICAgICAgIC8vIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHQgPSBtZXNzYWdlXG4gICAgICAgdGhpcy5yZXN1bHRGZXRjaCA9IHRydWVcbiAgICAgICBcbiAgICAgIHRoaXMuYWlUdXRvclJlc3VsdE1lc3NhZ2UoKVxuICAgICAgLy8gIHRoaXMuc2VhcmNoUXVlcnlBSXR1dG9yID0gJyc7XG4gICAgICAgXG4gICAgICB9KTtcbiAgfVxuXG4gIGFpVHV0b3JSZXN1bHRNZXNzYWdlKCkge1xuICAgIHRoaXMuaUdPVEFJVHV0b3JSZXN1bHRBcnIgPSBbXVxuICAvLyAgIGxldCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gIC8vICAgICBcInF1ZXJ5XCI6dGhpcy5jbG9uZVNlYXJjaFF1ZXJ5XG4gIC8vICB9XG4gICAgLy8gdGhpcy5jaGF0Ym90U2VydmljZS5haUdsb2JhbFNlYXJjaChyZXF1ZXN0Qm9keSkuc3Vic2NyaWJlKChkYXRhKT0+e1xuICAgIC8vICAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgLy8gfSlcbiAgICAvLyBjb25zb2xlLmxvZygncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAvLyBjb25zb2xlLmxvZygnYWlTZWFyY2hSZXN1bHQnLCB0aGlzLmFpVHV0b3JSZXN1bHQpXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMuYWlTZWFyY2hSZXN1bHRBcnInLCB0aGlzLmFpVHV0b3JSZXN1bHRBcnIpXG5cblxuICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBPYmplY3QuZW50cmllcyh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2VuY29kZVVSSShrZXkpfT0ke2VuY29kZVVSSSh2YWx1ZSl9YClcbiAgICAgICAgLmpvaW4oJyYnKTtcblxuICAgIC8vY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAvLyBsZXQgYXJyOmFueSA9IFtdXG4gICBjb25zb2xlLmxvZygndGhpcy5haVR1dG9yUmVzdWx0LS0nLHRoaXMuYWlUdXRvclJlc3VsdClcbiAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdCAmJiAhdGhpcy5haVR1dG9yUmVzdWx0LmFuc3dlciAmJiAhdGhpcy5haVR1dG9yUmVzdWx0LnJldHJpZXZlZENodW5rcykge1xuICAgIHRoaXMuYWlUdXRvclJlc3VsdC5yZXRyaWV2ZWRDaHVua3MgPSBbXVxuICAgfVxuICAgIHRoaXMuYWlUdXRvclJlc3VsdC5yZXRyaWV2ZWRDaHVua3MgJiYgdGhpcy5haVR1dG9yUmVzdWx0LnJldHJpZXZlZENodW5rcy5tYXAoKGl0ZW06YW55KT0+e1xuICAgICAgbGV0IHN0YXJ0VGltZSA9IC0xXG4gICAgICBsZXQgZW5kVGltZSA9IC0xXG4gICAgICBsZXQgcGFnZU51bWJlcjphbnkgPSAxXG4gICAgICBpZihpdGVtICYmIGl0ZW0/LkNvbnRlbnRTdGFydD8udHJpbSgpKSB7XG4gICAgICAgIHN0YXJ0VGltZSA9IGl0ZW0/LkNvbnRlbnRTdGFydFxuICAgICAgICBwYWdlTnVtYmVyID0gaXRlbT8uQ29udGVudFN0YXJ0XG4gICAgICB9XG4gICAgICBpZihpdGVtICYmIGl0ZW0/LkNvbnRlbnRFbmQ/LnRyaW0oKSkge1xuICAgICAgICBlbmRUaW1lID0gaXRlbT8uQ29udGVudEVuZFxuICAgICAgICBwYWdlTnVtYmVyID0gaXRlbT8uQ29udGVudEVuZFxuICAgICAgfVxuICAgICAgcGFnZU51bWJlciA9IHBhZ2VOdW1iZXIgIT09IFwiIFwiID8gcGFnZU51bWJlciA6IDFcbiAgICAgIGxldCByZXN1bHRPYmogPSB7ICAgICAgICBcbiAgICAgICAgbWVzc2FnZTogaXRlbS5OYW1lLFxuICAgICAgICByZWNvbW1lbmRlZFF1ZXM6ICcnLFxuICAgICAgICBzZWxlY3RlZFZhbHVlOiAnJywgICAgICAgXG4gICAgICAgIHRpdGxlOiBpdGVtLk5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IGl0ZW0sXG4gICAgICAgIG1pbWVUeXBlOiBpdGVtLk1pbWVUeXBlLFxuICAgICAgICBjb250ZW50VHlwZTogaXRlbS5Db250ZW50VHlwZSxcbiAgICAgICAgYXJ0aWZhY3RVcmw6IGl0ZW0uQXJ0aWZhY3RVUkwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpdGVtPy5EZXNjcmlwdGlvbj8ucmVwbGFjZSgvXlxcc3s0LH0vZ20sICcnKSxcbiAgICAgICAgaWRlbnRpZmllcjogaXRlbS5JZGVudGlmaWVyLCAgIFxuICAgICAgICBjb250ZW50U3RhcnQ6IHN0YXJ0VGltZSxcbiAgICAgICAgY29udGVudEVuZDogZW5kVGltZSxcbiAgICAgICAgcGFnZU51bWJlcjogIHBhZ2VOdW1iZXIgPyBwYWdlTnVtYmVyIDogMSwgIFxuICAgICAgICBxdWVyeTogdGhpcy5haVR1dG9yUmVzdWx0LnF1ZXJ5LCAgXG4gICAgICAgIHF1ZXJ5X2lkOiB0aGlzLmFpVHV0b3JSZXN1bHQucXVlcnlfaWQsXG4gICAgICAgIGZlZWRiYWNrOiAnJyxcbiAgICAgICAgcmVzb3VyY2VMaW5rIDogaXRlbS5NaW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZic/IGBodHRwczovL3BvcnRhbC5pZ290a2FybWF5b2dpLmdvdi5pbi92aWV3ZXIvcGRmLyR7aXRlbS5JZGVudGlmaWVyfT8ke3F1ZXJ5U3RyaW5nfSZmcm9tPWdsb2JhbFNlYXJjaCZwbGF5ZXJQcmV2aWV3PXRydWUmcG49JHtwYWdlTnVtYmVyfWA6IFxuICAgICAgICAoc3RhcnRUaW1lIDw9IDAgJiYgZW5kVGltZSA8PSAwKSA/IGBodHRwczovL3BvcnRhbC5pZ290a2FybWF5b2dpLmdvdi5pbi92aWV3ZXIvdmlkZW8vJHtpdGVtLklkZW50aWZpZXJ9PyR7cXVlcnlTdHJpbmd9JmZyb209Z2xvYmFsU2VhcmNoJnBsYXllclByZXZpZXc9dHJ1ZWA6ICBgaHR0cHM6Ly9wb3J0YWwuaWdvdGthcm1heW9naS5nb3YuaW4vdmlld2VyL3ZpZGVvLyR7aXRlbS5JZGVudGlmaWVyfT8ke3F1ZXJ5U3RyaW5nfSZmcm9tPWdsb2JhbFNlYXJjaCZwbGF5ZXJQcmV2aWV3PXRydWUmc3Q9JHtzdGFydFRpbWV9JmV0PSR7ZW5kVGltZX1gXG4gICAgICB9XG5cbiAgICAgIC8vIGFyci5wdXNoKHJlc3VsdE9iailcbiAgICAgIHRoaXMuaUdPVEFJVHV0b3JSZXN1bHRBcnIucHVzaChyZXN1bHRPYmopXG4gICAgICBcbiAgICB9KVxuICAgIGxldCBhbnN3ZXIgPSB0aGlzLmFpVHV0b3JSZXN1bHQuYW5zd2VyID8gdGhpcy5haVR1dG9yUmVzdWx0LmFuc3dlci50cmltKCkucmVwbGFjZSgvXFxuL2csICc8YnI+JykgOiBcIlwiXG4gXG4gICAgbGV0IHNob3J0QW5zd2VyID0gIHRoaXMuc3BsaXRQYXJhZ3JhcGhCeVdvcmRzKGFuc3dlcilcbiAgIC8vIGNvbnNvbGUubG9nKHRoaXMuYWlUdXRvclJlc3VsdC5yZXRyaWV2ZWRDaHVua3MsIHsgd29yZHNDb3VudDogYW5zd2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmxlbmd0aCwgc2hvd0xlc3M6IGFuc3dlci50cmltKCkuc3BsaXQoL1xccysvKS5sZW5ndGggPiAzMCA/IHRydWUgOiBmYWxzZSAsYW5zd2VyOiBhbnN3ZXIsIHNob3J0QW5zd2VyOiBzaG9ydEFuc3dlciAscmVzdWx0OiB0aGlzLmlHT1RBSVR1dG9yUmVzdWx0QXJyLCB0eXBlOiAnaW5jb21pbmcnLCAgdGFiOiAnc2FydGhpJyxyZXRlcml2ZWRDaHVua3M6IHRoaXMuaUdPVEFJVHV0b3JSZXN1bHRBcnIucmV0cmlldmVkQ2h1bmtzLCBzaG93RnJvbUludGVybmV0OiAgKCF0aGlzLmFpVHV0b3JSZXN1bHQucmV0cmlldmVkQ2h1bmtzID8gdHJ1ZSA6IGZhbHNlKX0pO1xuICAgIHRoaXMuYWlUdXRvclJlc3VsdEFyci5wdXNoKHsgcXVlcnk6IHRoaXMuYWlUdXRvclJlc3VsdC5xdWVyeSwgcXVlcnlfaWQ6IHRoaXMuYWlUdXRvclJlc3VsdC5xdWVyeV9pZCxjbGllbnRJZDogdGhpcy5haVR1dG9yUmVzdWx0LmNsaWVudElkLCB3b3Jkc0NvdW50OiBhbnN3ZXIudHJpbSgpLnNwbGl0KC9cXHMrLykubGVuZ3RoLCBzaG93TGVzczogYW5zd2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmxlbmd0aCA+IDMwID8gdHJ1ZSA6IGZhbHNlICxhbnN3ZXI6IGFuc3dlciwgc2hvcnRBbnN3ZXI6IHNob3J0QW5zd2VyICxyZXN1bHQ6IHRoaXMuaUdPVEFJVHV0b3JSZXN1bHRBcnIsIHR5cGU6ICdpbmNvbWluZycsICB0YWI6ICdzYXJ0aGknLHJldGVyaXZlZENodW5rczogdGhpcy5pR09UQUlUdXRvclJlc3VsdEFyci5yZXRyaWV2ZWRDaHVua3MsIHNob3dGcm9tSW50ZXJuZXQ6ICghKHRoaXMuYWlUdXRvclJlc3VsdC5hbnN3ZXIpICYmICEodGhpcy5haVR1dG9yUmVzdWx0LnJldHJpZXZlZENodW5rcykpID8gdHJ1ZSA6IGZhbHNlfSlcbiAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubWFwKChpdGVtOmFueSwgaW5kZXg6YW55KT0+e1xuICAgICAgaWYoaXRlbSAmJiAoaXRlbS5uZXdNZXNzYWdlID09PSAnJykpIHtcbiAgICAgICAgLy8gZGVsZXRlIHRoaXMuYWlTZWFyY2hSZXN1bHRBcnJbaW5kZXhdXG4gICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFyci5zcGxpY2UoaW5kZXgsMSlcbiAgICAgIH1cbiAgICAgfSkgICAgIFxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmFpVHV0b3JSZXN1bHRBcnItLS0nLCB0aGlzLmFpVHV0b3JSZXN1bHRBcnIpXG4gICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgLy8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgfSwwKVxuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCAgXCJpZFwiOiBcImFpLXR1dG9yLWNhcmQtY29udGVudFwiLCBcInBhZ2VpZFwiOiBgdmlld2VyLyR7dGhpcy5jb250ZW50fWAsIFwic3ViVHlwZVwiIDogICB0aGlzLnNlbGVjdGVkTGVhcm5pbmdTdHlsZS50aXRsZSAgfSxcbiAgICAgICAgb2JqZWN0OiB7IH0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgICAgcGFnZUNvbnRleHQ6IHtwYWdlSWQ6ICBgdmlld2VyLyR7dGhpcy5jb250ZW50fWAsIG1vZHVsZTogJ0xlYXJuJ30sXG4gICAgICBmcm9tOiAnJyxcbiAgICAgIHRvOiAnVGVsZW1ldHJ5JyxcbiAgICB9XG4gICAgdGhpcy5ldmVudFN2Yy5kaXNwYXRjaENoYXRib3RFdmVudDxXc0V2ZW50cy5JV3NFdmVudFRlbGVtZXRyeUludGVyYWN0PihldmVudClcbiAgfVxuXG4gIHJlZGlyZWN0VG9SZXNvdXJjZShpdGVtOmFueSkge1xuICAgIGxldCBxdWVyeVBhcmFtcyA9IHsgLi4udGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyB9O1xuICAgIGNvbnNvbGUubG9nKHF1ZXJ5UGFyYW1zKVxuICAgIC8vIFJlbW92ZSBzcGVjaWZpYyBwYXJhbWV0ZXJzXG4gICAgZGVsZXRlIHF1ZXJ5UGFyYW1zLnN0O1xuICAgIGRlbGV0ZSBxdWVyeVBhcmFtcy5ldDtcbiAgICBkZWxldGUgcXVlcnlQYXJhbXMucG47XG4gICAgZGVsZXRlIHF1ZXJ5UGFyYW1zLmZyb207XG4gICAgZGVsZXRlIHF1ZXJ5UGFyYW1zLnBsYXllclByZXZpZXc7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nID0gJydcbiAgICBxdWVyeVN0cmluZyA9IE9iamVjdC5lbnRyaWVzKHF1ZXJ5UGFyYW1zKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2VuY29kZVVSSShrZXkpfT0ke2VuY29kZVVSSSh2YWx1ZSl9YClcbiAgICAgICAgLmpvaW4oJyYnKTtcbiAgICBsZXQgcGF0aCA9ICcnXG4gICAgcGF0aCA9IChpdGVtLm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJyk/IGAvdmlld2VyL3BkZi8ke2l0ZW0uaWRlbnRpZmllcn0/JHtxdWVyeVN0cmluZ30mZnJvbT1nbG9iYWxTZWFyY2gmcGxheWVyUHJldmlldz10cnVlJnBuPSR7aXRlbT8ucGFnZU51bWJlcn1gOiBcbiAgICAoaXRlbT8uY29udGVudFN0YXJ0IDw9IDAgJiYgaXRlbT8uY29udGVudEVuZCA8PTApID8gYC92aWV3ZXIvdmlkZW8vJHtpdGVtLmlkZW50aWZpZXJ9PyR7cXVlcnlTdHJpbmd9JmZyb209Z2xvYmFsU2VhcmNoJnBsYXllclByZXZpZXc9dHJ1ZWAgOiBgL3ZpZXdlci92aWRlby8ke2l0ZW0uaWRlbnRpZmllcn0/JHtxdWVyeVN0cmluZ30mZnJvbT1nbG9iYWxTZWFyY2gmcGxheWVyUHJldmlldz10cnVlJnN0PSR7aXRlbT8uY29udGVudFN0YXJ0fSZldD0ke2l0ZW0/LmNvbnRlbnRFbmR9YFxuICAgIC8vIGNvbnNvbGUubG9nKCdwYXRoJywgcGF0aClcbiAgIC8vIHdpbmRvdy5vcGVuKHBhdGgsICdfYmxhbmsnKVxuICAgaWYodGhpcy5pc01vYmlsZSkge1xuICAgIHRoaXMubWF4aW1pemUgPSBmYWxzZVxuICAgfVxuICAgXG4gICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHBhdGgpXG4gIH1cblxuICBjb3B5UGF0aChpdGVtOmFueSwgY2luZGV4OmFueSkge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmVudHJpZXModGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtlbmNvZGVVUkkoa2V5KX09JHtlbmNvZGVVUkkodmFsdWUpfWApXG4gICAgICAgIC5qb2luKCcmJyk7XG5cbiAgICAvL2NvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zKS50b1N0cmluZygpOyAgICBcbiAgICBjb25zdCBzZWxCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpXG4gICAgc2VsQm94LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgIHNlbEJveC5zdHlsZS5sZWZ0ID0gJzAnXG4gICAgc2VsQm94LnN0eWxlLnRvcCA9ICcwJ1xuICAgIHNlbEJveC5zdHlsZS5vcGFjaXR5ID0gJzAnXG4gICAgIHNlbEJveC52YWx1ZSA9IGl0ZW0ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnPyBgaHR0cHM6Ly9wb3J0YWwuaWdvdGthcm1heW9naS5nb3YuaW4vdmlld2VyL3BkZi8ke2l0ZW0uaWRlbnRpZmllcn0/JHtxdWVyeVN0cmluZ30mZnJvbT1nbG9iYWxTZWFyY2gmcGxheWVyUHJldmlldz10cnVlJnBuPSR7aXRlbT8ucGFnZU51bWJlcn1gOiBcbiAgICAgKGl0ZW0/LmNvbnRlbnRTdGFydCA8PTAgJiYgaXRlbT8uY29udGVudEVuZCA8PTAgKSA/IGBodHRwczovL3BvcnRhbC5pZ290a2FybWF5b2dpLmdvdi5pbi92aWV3ZXIvdmlkZW8vJHtpdGVtLmlkZW50aWZpZXJ9PyR7cXVlcnlTdHJpbmd9JmZyb209Z2xvYmFsU2VhcmNoJnBsYXllclByZXZpZXc9dHJ1ZWAgOiAgYGh0dHBzOi8vcG9ydGFsLmlnb3RrYXJtYXlvZ2kuZ292LmluL3ZpZXdlci92aWRlby8ke2l0ZW0uaWRlbnRpZmllcn0/JHtxdWVyeVN0cmluZ30mZnJvbT1nbG9iYWxTZWFyY2gmcGxheWVyUHJldmlldz10cnVlJnN0PSR7aXRlbT8uY29udGVudFN0YXJ0fSZldD0ke2l0ZW0/LmNvbnRlbnRFbmR9YFxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2VsQm94KVxuICAgIHNlbEJveC5mb2N1cygpXG4gICAgc2VsQm94LnNlbGVjdCgpXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKVxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2VsQm94KVxuICAgIHRoaXMuY29waWVkSW5kZXggPSBjaW5kZXhcbiAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICB0aGlzLmNvcGllZEluZGV4ID0gLTFcbiAgICB9LDEwMDApXG4gICAgXG4gIH1cblxuICByZWRpcmVjdFRvVG9jKGNoYXQ6YW55KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudFR5cGU6IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSxcbiAgICAgIGV2ZW50TG9nTGV2ZWw6IFdzRXZlbnRzLldzRXZlbnRMb2dMZXZlbC5JbmZvLFxuICAgICAgZGF0YToge1xuICAgICAgICBlZGF0YTogeyB0eXBlOiAnY2xpY2snLCAgXCJpZFwiOiBcImFpLXR1dG9yLWNhcmQtY29udGVudFwiLCBcInBhZ2VpZFwiOiBgdmlld2VyLyR7dGhpcy5jb250ZW50fWAsIFwic3ViVHlwZVwiIDogICB0aGlzLnNlbGVjdGVkTGVhcm5pbmdTdHlsZS50aXRsZSAgfSxcbiAgICAgICAgb2JqZWN0OiB7IGlkOiBjaGF0Py5pZGVudGlmaWVyLCB0eXBlOiBjaGF0Py5jb250ZW50VHlwZX0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgICAgcGFnZUNvbnRleHQ6IHtwYWdlSWQ6IGB2aWV3ZXIvJHt0aGlzLmNvbnRlbnR9YCwgbW9kdWxlOiAnTGVhcm4nfSxcbiAgICAgIGZyb206ICcnLFxuICAgICAgdG86ICdUZWxlbWV0cnknLFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxuICAgIGxldCBwYXRoID0gYGh0dHBzOi8vcG9ydGFsLmlnb3RrYXJtYXlvZ2kuZ292LmluL2FwcC90b2MvJHtjaGF0Py5pZGVudGlmaWVyfS9vdmVydmlld2BcbiAgICB3aW5kb3cub3BlbihwYXRoLCAnX2JsYW5rJylcbiAgfVxuXG4gIHNwbGl0UGFyYWdyYXBoQnlXb3JkcyhwYXJhZ3JhcGg6YW55LCB3b3Jkc1BlckNodW5rID0gMzApIHtcbiAgICBjb25zdCB3b3JkcyA9IHBhcmFncmFwaC50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkc1BlckNodW5rOyBpKyspIHtcbiAgICAgIGNodW5rcy5wdXNoKHdvcmRzW2ldKVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY2h1bmtzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHRvZ2dsZVNob3coaW5kZXg6YW55LCBzaG93VHlwZTphbnkpIHtcbiAgICBpZihzaG93VHlwZSA9PT0gJ2xlc3MnKSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TGVzcyddID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TGVzcyddID0gZmFsc2VcbiAgICB9XG4gICAgXG4gIH1cblxuICBnZXQgdXNlckluaXRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxzXG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVJbml0aXRhbHMobmFtZTphbnkpOiB2b2lkIHtcbiAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IodGhpcy5jb2xvcnMubGVuZ3RoKSlcbiAgICB0aGlzLmNpcmNsZUNvbG9yID0gdGhpcy5jb2xvcnNbcmFuZG9tSW5kZXhdXG4gICAgaWYgKHRoaXMucmFuZG9tY29sb3JzKSB7XG4gICAgICBjb25zdCByYW5kb21JbmRleDEgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNYXRoLmZsb29yKHRoaXMucmFuZG9tY29sb3JzLmxlbmd0aCkpXG4gICAgICB0aGlzLmNpcmNsZUNvbG9yID0gdGhpcy5yYW5kb21jb2xvcnNbcmFuZG9tSW5kZXgxXVxuICAgIH1cbiAgICBsZXQgaW5pdGlhbHMgPSAnJ1xuICAgIGNvbnN0IGFycmF5ID0gYCR7bmFtZX0gYC50b1N0cmluZygpLnNwbGl0KCcgJylcbiAgICBpZiAoYXJyYXlbMF0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBhcnJheVsxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGluaXRpYWxzICs9IGFycmF5WzBdLmNoYXJBdCgwKVxuICAgICAgaW5pdGlhbHMgKz0gYXJyYXlbMV0uY2hhckF0KDApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAobmFtZS5jaGFyQXQoaSkgPT09ICcgJykge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZSAmJiAobmFtZS5jaGFyQXQoaSkgPT09IG5hbWUuY2hhckF0KGkpKSkge1xuICAgICAgICAgIGluaXRpYWxzICs9IG5hbWUuY2hhckF0KGkpXG5cbiAgICAgICAgICBpZiAoaW5pdGlhbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluaXRpYWxzID0gaW5pdGlhbHMudG9VcHBlckNhc2UoKVxuICB9XG5cbiAgZ2V0TGVhcm5pbmdTdHlsZSgpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuY2hhdElkID0gYCR7dGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLnVzZXJJZH0tJHt0aW1lc3RhbXB9YFxuICAgIGlmKHRoaXMuc2VsZWN0ZWRMZWFybmluZ1N0eWxlICYmIHRoaXMuc2VsZWN0ZWRMZWFybmluZ1N0eWxlLnRpdGxlID09PSAnU29jcmF0aWMgU3R5bGUnKSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIgPSBbXVxuICAgICAgdGhpcy53ZWJzb2NrZXRTZXJ2aWNlLmNsb3NlQ29ubmVjdGlvbigpXG4gICAgICB0aGlzLmNoYXRJZCA9IGAke3RoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci51c2VySWR9LSR7dGltZXN0YW1wfWBcbiAgICAgIFxuICAgICAgdGhpcy53ZWJzb2NrZXRTZXJ2aWNlLmNvbm5lY3QoYHdzczovLyR7dGhpcy5Tb2NyYXRpY2VTdHlsZUhvc3R9L3NvY3JhdGljL3YxL3dzP3Rva2VuPSR7dGhpcy5qd3RUb2tlbn1gKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRMZWFybmluZ1N0eWxlICYmIHRoaXMuc2VsZWN0ZWRMZWFybmluZ1N0eWxlLnRpdGxlID09PSAnTm9uZScpIHtcbiAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFyciA9IFtdXG4gICAgICB0aGlzLndlYnNvY2tldFNlcnZpY2UuY2xvc2VDb25uZWN0aW9uKClcbiAgICAgIHRoaXMuY2hhdElkID0gYCR7dGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLnVzZXJJZH0tJHt0aW1lc3RhbXB9YFxuICAgICAgXG4gICAgICB0aGlzLndlYnNvY2tldFNlcnZpY2UuY29ubmVjdChgd3NzOi8vJHt0aGlzLk5vbmVTb2NrZXRIb3N0fS93cz90b2tlbj0ke3RoaXMuand0VG9rZW59YCk7XG4gICAgfSAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZExlYXJuaW5nU3R5bGUgJiYgdGhpcy5zZWxlY3RlZExlYXJuaW5nU3R5bGUudGl0bGUgPT09ICdTdG9yeXRlbGxpbmcnKSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIgPSBbXVxuICAgICAgdGhpcy53ZWJzb2NrZXRTZXJ2aWNlLmNsb3NlQ29ubmVjdGlvbigpXG4gICAgICB0aGlzLmNoYXRJZCA9IGAke3RoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci51c2VySWR9LSR7dGltZXN0YW1wfWBcbiAgICAgIFxuICAgICAgdGhpcy53ZWJzb2NrZXRTZXJ2aWNlLmNvbm5lY3QoYHdzczovLyR7dGhpcy5TdG9yeXRlbGxpbmdIb3N0fS9zdG9yeXRlbGxpbmcvdjEvd3M/dG9rZW49JHt0aGlzLmp3dFRva2VufWApO1xuICAgIH1cbiAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZExlYXJuaW5nU3R5bGUtLScsIHRoaXMuc2VsZWN0ZWRMZWFybmluZ1N0eWxlKVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnlGb3JSZXNvdXJjZShpdGVtOmFueSkge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJ2NsaWNrJywgIFwiaWRcIjogXCJhaS10dXRvci1jYXJkLWNvbnRlbnRcIiwgXCJwYWdlaWRcIjogYHZpZXdlci8ke3RoaXMuY29udGVudH1gLCBcInN1YlR5cGVcIiA6ICAgdGhpcy5zZWxlY3RlZExlYXJuaW5nU3R5bGUudGl0bGUgICAgfSxcbiAgICAgICAgb2JqZWN0OiB7IGlkOiBpdGVtPy5pZGVudGlmaWVyLCB0eXBlOiBpdGVtPy5jb250ZW50VHlwZX0sXG4gICAgICAgIHN0YXRlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5JbnRlcmFjdCxcbiAgICAgICAgZXZlbnRTdWJUeXBlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5DaGF0Ym90LFxuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICB9LFxuICAgICAgcGFnZUNvbnRleHQ6IHtwYWdlSWQ6IGB2aWV3ZXIvJHt0aGlzLmNvbnRlbnR9YCwgbW9kdWxlOiAnTGVhcm4nfSxcbiAgICAgIGZyb206ICcnLFxuICAgICAgdG86ICdUZWxlbWV0cnknLFxuICAgIH1cbiAgICB0aGlzLmV2ZW50U3ZjLmRpc3BhdGNoQ2hhdGJvdEV2ZW50PFdzRXZlbnRzLklXc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3Q+KGV2ZW50KVxuICB9XG5cbiAgc2hhcmVQb3NpdGl2ZUNvbnRlbnRSYXRpbmcoaXRlbTphbnksIGluZGV4OmFueSwgY2luZGV4OmFueSkge1xuICAgIGxldCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICBcInF1ZXJ5X2lkXCI6IGl0ZW0/LnF1ZXJ5X2lkLFxuICAgICAgXCJyZXNwb25zZVwiOiAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnYW5zd2VyJ10sXG4gICAgICBcImNvbW1lbnRzXCI6IFwiXCIsXG4gICAgICBcImlzX2xpa2VkXCI6dHJ1ZSxcbiAgICAgIFwicmF0aW5nXCI6IFwiNVwiLFxuICAgICAgXCJpZGVudGlmaWVyXCI6dGhpcy5jb250ZW50LFxuICAgICAgXCJxdWVyeVwiOiBpdGVtLnF1ZXJ5LFxuICAgICAgY2hhdF9pZDogdGhpcy5jaGF0SWQsXG4gICAgICB1c2VyX2lkOiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIudXNlcklkLFxuXG4gICB9XG4gICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHQgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHRbY2luZGV4XSlcbiAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ3Nob3dMb2FkZXInXSA9IHRydWVcbiAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ3Nob3dMb2FkZXJGb3JVcCddID0gdHJ1ZVxuICAgfVxuICAgLy90aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBmZXRjaCBjb250ZW50IGRhdGEsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICB0aGlzLmNoYXRib3RTZXJ2aWNlLnNhdmVBSUNoYXRQb3NpdGl2ZUNvbnRlbnRSYXRpbmcocmVxdWVzdEJvZHksIHRoaXMuY2hhdElkLCB0aGlzLnVzZXJJbmZvPy51c2VySWQpLnN1YnNjcmliZSgoZGF0YTphbnkpPT57XG4gICAgaWYoZGF0YSAmJiBkYXRhLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgICAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0ICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF0pXG4gICAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHRbY2luZGV4XVsnZmVlZGJhY2snXSA9ICd1cCdcbiAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdWydzaG93TG9hZGVyJ10gPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ3Nob3dMb2FkZXJGb3JVcCddID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0U25hY2tCYXJOZXcub3BlbihcbiAgICAgICAgJ1RoYW5rIHlvdSBmb3IgeW91ciBmZWVkYmFjay4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IDUwMDAsIHBhbmVsQ2xhc3M6IFsnc3VjY2VzcyddIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFyciAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubGVuZ3RoICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pIHtcbiAgICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHQgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHRbY2luZGV4XSlcbiAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdWydzaG93TG9hZGVyJ10gPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ3Nob3dMb2FkZXJGb3JVcCddID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0U25hY2tCYXJOZXcub3BlbihcbiAgICAgICAgJ1NvbWV0aGluZyBpcyB3cm9uZy4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IDUwMDAsIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9XG4gICAgICApO1xuICAgIH1cblxuICB9KVxuICB9XG5cbiAgb3BlbkFJRmVlZGJhY2tQb3B1cChpdGVtOmFueSwgaW5kZXg6YW55LCBjaW5kZXg6YW55KSB7XG4gICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyICYmIHRoaXMuYWlUdXRvclJlc3VsdEFyci5sZW5ndGggJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ2ZlZWRiYWNrJ10gIT09ICdkb3duJykge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE5vblJlbGV2ZW50RmVlZGJhY2tEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgICAgd2lkdGg6ICc1MDJweCcsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydyZWxldmVudC1mZWVkYmFjay1kaWFsb2cnXSxcbiAgICAgICAgfSlcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVBSUZlZWRiYWNrKGl0ZW0sIHJlc3VsdCwgaW5kZXgsIGNpbmRleCk7XG4gICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXRTbmFja0Jhck5ldy5vcGVuKFxuICAgICAgICAgICdZb3UgaGF2ZSBhbHJlYWR5IHN1Ym1pdHRlZCBmZWVkYmFjaycsICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAwLCBwYW5lbENsYXNzOiBbJ2Vycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgc2hhcmVBSUZlZWRiYWNrKGl0ZW06YW55LCByZXN1bHQ6YW55LCBpbmRleDphbnksIGNpbmRleDphbnkpIHtcblxuICAgIGxldCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICBcInF1ZXJ5X2lkXCI6IGl0ZW0/LnF1ZXJ5X2lkLFxuICAgICAgXCJyZXNwb25zZVwiOiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydhbnN3ZXInXSxcbiAgICAgIFwiY29tbWVudHNcIjogcmVzdWx0LFxuICAgICAgXCJpc19saWtlZFwiOmZhbHNlLFxuICAgICAgXCJyYXRpbmdcIjogXCIwXCIsXG4gICAgICBcImlkZW50aWZpZXJcIjp0aGlzLmNvbnRlbnQsXG4gICAgICBcInF1ZXJ5XCI6IGl0ZW0ucXVlcnksXG4gICAgICBjaGF0X2lkOiB0aGlzLmNoYXRJZCxcbiAgICAgIHVzZXJfaWQ6IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci51c2VySWQsXG5cbiAgIH1cbiAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFyciAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubGVuZ3RoICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pIHtcbiAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdKSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdWydzaG93TG9hZGVyJ10gPSB0cnVlXG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdWydzaG93TG9hZGVyRm9yRG93biddID0gdHJ1ZVxuICAgIH1cblxuICB9XG4gICAgIHRoaXMuY2hhdGJvdFNlcnZpY2Uuc2hhcmVBSUZlZWRiYWNrKHJlcXVlc3RCb2R5LCB0aGlzLmNoYXRJZCwgdGhpcy51c2VySW5mbz8udXNlcklkKS5zdWJzY3JpYmUoKGRhdGE6YW55KT0+e1xuICAgICAgaWYoZGF0YSAgJiYgZGF0YS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHQgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XS5yZXN1bHRbY2luZGV4XSlcbiAgICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ2ZlZWRiYWNrJ10gPSAnZG93bidcbiAgICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ3Nob3dMb2FkZXInXSA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdWydzaG93TG9hZGVyRm9yRG93biddID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hdFNuYWNrQmFyTmV3Lm9wZW4oXG4gICAgICAgICAgJ1RoYW5rIHlvdSBmb3IgeW91ciBmZWVkYmFjay4nLCAnWCcsXG4gICAgICAgICAgeyBkdXJhdGlvbjogNTAwMCwgcGFuZWxDbGFzczogWydzdWNjZXNzJ10gfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyICYmIHRoaXMuYWlUdXRvclJlc3VsdEFyci5sZW5ndGggJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSkge1xuICAgICAgICAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0ICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF0pXG4gICAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdLnJlc3VsdFtjaW5kZXhdWydzaG93TG9hZGVyJ10gPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0ucmVzdWx0W2NpbmRleF1bJ3Nob3dMb2FkZXJGb3JEb3duJ10gPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0U25hY2tCYXJOZXcub3BlbihcbiAgICAgICAgICAnU29tZXRoaW5nIGlzIHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAwLCBwYW5lbENsYXNzOiBbJ2Vycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICB9KVxuICB9XG5cblxuICBzaGFyZVBvc2l0aXZlQ29udGVudFJhdGluZ0ZvckFuc3dlcihpdGVtOmFueSwgaW5kZXg6YW55KSB7XG4gICAgbGV0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgIFwicXVlcnlfaWRcIjogaXRlbS5xdWVyeV9pZCxcbiAgICAgIFwicmVzcG9uc2VcIjogaXRlbS5hbnN3ZXIsXG4gICAgICBcImNvbW1lbnRzXCI6IFwiXCIsXG4gICAgICBcImlzX2xpa2VkXCI6dHJ1ZSxcbiAgICAgIFwicmF0aW5nXCI6IFwiNVwiLFxuICAgICAgXCJpZGVudGlmaWVyXCI6dGhpcy5jb250ZW50LFxuICAgICAgXCJxdWVyeVwiOiBpdGVtLnF1ZXJ5XG5cbiAgIH1cbiAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFyciAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubGVuZ3RoICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pIHtcbiAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pXG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TG9hZGVyJ10gPSB0cnVlXG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TG9hZGVyRm9yVXAnXSA9IHRydWVcbiAgIH1cbiAgIC8vdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gZmV0Y2ggY29udGVudCBkYXRhLCBkdWUgdG8gc29tZSBlcnJvciEnKVxuICAgdGhpcy5jaGF0Ym90U2VydmljZS5zYXZlQUlDaGF0UG9zaXRpdmVDb250ZW50UmF0aW5nKHJlcXVlc3RCb2R5LCB0aGlzLmNoYXRJZCwgdGhpcy51c2VySW5mbz8udXNlcklkKS5zdWJzY3JpYmUoKGRhdGE6YW55KT0+e1xuICAgIGlmKGRhdGEgJiYgZGF0YS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyICYmIHRoaXMuYWlUdXRvclJlc3VsdEFyci5sZW5ndGggJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSkge1xuICAgICAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pXG4gICAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnZmVlZGJhY2snXSA9ICd1cCdcbiAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TG9hZGVyJ10gPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF1bJ3Nob3dMb2FkZXJGb3JVcCddID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0U25hY2tCYXJOZXcub3BlbihcbiAgICAgICAgJ1RoYW5rIHlvdSBmb3IgeW91ciBmZWVkYmFjay4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IDUwMDAsIHBhbmVsQ2xhc3M6IFsnc3VjY2VzcyddIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFyciAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubGVuZ3RoICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pIHtcbiAgICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKVxuICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF1bJ3Nob3dMb2FkZXInXSA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnc2hvd0xvYWRlckZvclVwJ10gPSBmYWxzZVxuICAgICAgfVxuICAgICAgdGhpcy5tYXRTbmFja0Jhck5ldy5vcGVuKFxuICAgICAgICAnU29tZXRoaW5nIGlzIHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsICdYJyxcbiAgICAgICAgeyBkdXJhdGlvbjogNTAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH1cbiAgICAgICk7XG4gICAgfVxuXG4gIH0pXG4gIH1cblxuICBvcGVuQUlGZWVkYmFja1BvcHVwRm9yQW5zd2VyKGl0ZW06YW55LCBpbmRleDphbnkpIHtcbiAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0pIHtcbiAgICAgIGlmKHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0gJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydmZWVkYmFjayddICE9PSAnZG93bicpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOb25SZWxldmVudEZlZWRiYWNrRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICAgIHdpZHRoOiAnNTAycHgnLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsncmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nJ10sXG4gICAgICAgIH0pXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLnNoYXJlQUlGb3JBbnN3ZXJGZWVkYmFjayhpdGVtLCByZXN1bHQsIGluZGV4KTtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hdFNuYWNrQmFyTmV3Lm9wZW4oXG4gICAgICAgICAgJ1lvdSBoYXZlIGFscmVhZHkgc3VibWl0dGVkIGZlZWRiYWNrJywgJ1gnLFxuICAgICAgICAgIHsgZHVyYXRpb246IDUwMDAsIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBzaGFyZUFJRm9yQW5zd2VyRmVlZGJhY2soaXRlbTphbnksIHJlc3VsdDphbnksIGluZGV4OmFueSkge1xuXG4gICAgbGV0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgIFwicXVlcnlfaWRcIjogaXRlbS5xdWVyeV9pZCxcbiAgICAgIFwicmVzcG9uc2VcIjogaXRlbT8uYW5zd2VyLFxuICAgICAgXCJjb21tZW50c1wiOiByZXN1bHQsXG4gICAgICBcImlzX2xpa2VkXCI6ZmFsc2UsXG4gICAgICBcInJhdGluZ1wiOiBcIjBcIixcbiAgICAgIFwiaWRlbnRpZmllclwiOnRoaXMuY29udGVudCxcbiAgICAgIFwicXVlcnlcIjogaXRlbS5xdWVyeVxuXG4gICB9XG4gICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TG9hZGVyJ10gPSB0cnVlXG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TG9hZGVyRm9yRG93biddID0gdHJ1ZVxuICAgIH1cblxuICB9XG4gICAgIHRoaXMuY2hhdGJvdFNlcnZpY2Uuc2hhcmVBSUZlZWRiYWNrKHJlcXVlc3RCb2R5LCB0aGlzLmNoYXRJZCwgdGhpcy51c2VySW5mbz8udXNlcklkKS5zdWJzY3JpYmUoKGRhdGE6YW55KT0+e1xuICAgICAgaWYoZGF0YSAgJiYgZGF0YS5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKVxuICAgICAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnZmVlZGJhY2snXSA9ICdkb3duJ1xuICAgICAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnc2hvd0xvYWRlciddID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF1bJ3Nob3dMb2FkZXJGb3JEb3duJ10gPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0U25hY2tCYXJOZXcub3BlbihcbiAgICAgICAgICAnVGhhbmsgeW91IGZvciB5b3VyIGZlZWRiYWNrLicsICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAwLCBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3MnXSB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZih0aGlzLmFpVHV0b3JSZXN1bHRBcnIgJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyLmxlbmd0aCAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKSB7XG4gICAgICAgICAgaWYodGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XSAmJiB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdKVxuICAgICAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnc2hvd0xvYWRlciddID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93TG9hZGVyRm9yRG93biddID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hdFNuYWNrQmFyTmV3Lm9wZW4oXG4gICAgICAgICAgJ1NvbWV0aGluZyBpcyB3cm9uZy4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLCAnWCcsXG4gICAgICAgICAgeyBkdXJhdGlvbjogNTAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgfSlcbiAgfVxuXG4gIGNhbGxGcm9tSW50ZXJuZXQoaXRlbTphbnksIGluZGV4OmFueSkge1xuICAgIHRoaXMuYWlUdXRvclJlc3VsdEFyci5wdXNoKHt0eXBlOiAnaW5jb21pbmcnLCAgdGFiOiAnc2FydGhpJywgYW5zd2VyOiAnJ30pXG4gICAgaWYoIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF0gJiYgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnc2hvd0Zyb21JbnRlcm5ldCddKSB7XG4gICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdWydzaG93RnJvbUludGVybmV0J10gPSBmYWxzZVxuICAgIH1cbiAgICBpZihpdGVtICYmICFpdGVtLmFuc3dlcikge1xuXG4gICAgICBsZXQgaW50ZXJuZXRHbG9iYWxTZWFyY2hSZXF1ZXN0ID0ge1xuICAgICAgICBcInF1ZXJ5XCI6IHRoaXMuY2xvbmVTZWFyY2hRdWVyeSxcbiAgICAgICAgXCJkZXNpZ25hdGlvblwiOiAgdGhpcy51c2VySW5mbz8ucHJvZmVzc2lvbmFsRGV0YWlscyAmJiB0aGlzLnVzZXJJbmZvPy5wcm9mZXNzaW9uYWxEZXRhaWxzLmxlbmd0aCA/IHRoaXMudXNlckluZm8/LnByb2Zlc3Npb25hbERldGFpbHNbMF0uZGVzaWduYXRpb24gOiAnJyxcbiAgICAgICAgXCJkZXBhcnRtZW50XCI6IHRoaXMudXNlckluZm8/LmRlcGFydG1lbnROYW1lID8gdGhpcy51c2VySW5mbz8uZGVwYXJ0bWVudE5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhdGJvdFNlcnZpY2UuYWlHbG9iYWxTZWFyY2hGcm9tSW50ZXJuZXQoaW50ZXJuZXRHbG9iYWxTZWFyY2hSZXF1ZXN0LCAnJywgdGhpcy51c2VySW5mbz8udXNlcklkKS5zdWJzY3JpYmUoKGlkYXRhOmFueSk9PntcbiAgICAgICAgdGhpcy5yZXN1bHRGZXRjaCA9IHRydWVcbiAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyLm1hcCgoaXRlbTphbnksIGluZGV4OmFueSk9PntcbiAgICAgICAgICBpZihpdGVtICYmIChpdGVtLm5ld01lc3NhZ2UgPT09ICcnKSkge1xuICAgICAgICAgICAgLy8gZGVsZXRlIHRoaXMuYWlTZWFyY2hSZXN1bHRBcnJbaW5kZXhdXG4gICAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIuc3BsaWNlKGluZGV4LDEpXG4gICAgICAgICAgfVxuICAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdE9iaiA9IHsgICAgICAgIFxuICAgICAgICAgIG1lc3NhZ2U6IGlkYXRhLmFuc3dlcixcbiAgICAgICAgICByZWNvbW1lbmRlZFF1ZXM6ICcnLFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWU6ICcnLCAgICAgICBcbiAgICAgICAgICB0aXRsZTogaWRhdGEuYW5zd2VyLFxuICAgICAgICAgIGNvbnRlbnQ6IGlkYXRhLFxuICAgICAgICAgIG1pbWVUeXBlOiBpZGF0YSxcbiAgICAgICAgICBjb250ZW50VHlwZTogaWRhdGEsXG4gICAgICAgICAgYXJ0aWZhY3RVcmw6IGlkYXRhLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBpZGF0YS5hbnN3ZXIsXG4gICAgICAgICAgaWRlbnRpZmllcjogaWRhdGEsICAgIFxuICAgICAgICAgIGNvbnRlbnRTdGFydDogaWRhdGEsXG4gICAgICAgICAgY29udGVudEVuZDogaWRhdGEsIFxuICAgICAgICAgIHBhZ2VOdW1iZXI6ICAgaWRhdGEsXG4gICAgICAgICAgcXVlcnk6IHRoaXMuY2xvbmVTZWFyY2hRdWVyeSxcbiAgICAgICAgICBxdWVyeV9pZDogaWRhdGEucXVlcnlfaWQsXG4gICAgICAgICAgcmVzb3VyY2VMaW5rIDogJycsIFxuICAgICAgICAgIGZlZWRiYWNrOiAnJyxcbiAgICAgICAgICBmcm9tSW50ZXJuZXQ6IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaUdPVEFJVHV0b3JSZXN1bHRBcnIucHVzaChyZXN1bHRPYmopXG4gICAgICAgIGxldCBhbnN3ZXIgPSBpZGF0YS5hbnN3ZXIgPyBpZGF0YS5hbnN3ZXIudHJpbSgpLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpIDogXCJcIlxuICAgICAgICBsZXQgc2hvcnRBbnN3ZXIgPSAgdGhpcy5zcGxpdFBhcmFncmFwaEJ5V29yZHMoYW5zd2VyKVxuICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIucHVzaCh7IGZlZWRiYWNrOicnLCB3b3Jkc0NvdW50OiBhbnN3ZXIudHJpbSgpLnNwbGl0KC9cXHMrLykubGVuZ3RoLCBzaG93TGVzczogYW5zd2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmxlbmd0aCA+IDMwID8gdHJ1ZSA6IGZhbHNlICxhbnN3ZXI6IGFuc3dlciwgc2hvcnRBbnN3ZXI6IHNob3J0QW5zd2VyICxyZXN1bHQ6IHRoaXMuaUdPVEFJVHV0b3JSZXN1bHRBcnIsIHR5cGU6ICdpbmNvbWluZycsICB0YWI6ICdzYXJ0aGknLCByZXRlcml2ZWRDaHVua3M6IHRoaXMuYWlUdXRvclJlc3VsdC5yZXRyaWV2ZWRDaHVua3MsIHNob3dGcm9tSW50ZXJuZXQ6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyLm1hcCgoaXRlbTphbnksIGluZGV4OmFueSk9PntcbiAgICAgICAgICBpZihpdGVtICYmIChpdGVtLm5ld01lc3NhZ2UgPT09ICcnKSkge1xuICAgICAgICAgICAgLy8gZGVsZXRlIHRoaXMuYWlTZWFyY2hSZXN1bHRBcnJbaW5kZXhdXG4gICAgICAgICAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIuc3BsaWNlKGluZGV4LDEpXG4gICAgICAgICAgfVxuICAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmVqZWN0RnJvbUludGVybmV0KGluZGV4OmFueSkge1xuICAgIGlmKCB0aGlzLmFpVHV0b3JSZXN1bHRBcnJbaW5kZXhdICYmIHRoaXMuYWlUdXRvclJlc3VsdEFycltpbmRleF1bJ3Nob3dGcm9tSW50ZXJuZXQnXSkge1xuICAgICAgdGhpcy5haVR1dG9yUmVzdWx0QXJyW2luZGV4XVsnc2hvd0Zyb21JbnRlcm5ldCddID0gZmFsc2VcbiAgICB9XG4gICAgdGhpcy5yZXN1bHRGZXRjaCA9IHRydWVcbiAgICB0aGlzLmFpVHV0b3JSZXN1bHRBcnIubWFwKChpdGVtOmFueSwgaW5kZXg6YW55KT0+e1xuICAgICAgaWYoaXRlbSAmJiAoaXRlbS5uZXdNZXNzYWdlID09PSAnJykpIHtcbiAgICAgICAgLy8gZGVsZXRlIHRoaXMuYWlTZWFyY2hSZXN1bHRBcnJbaW5kZXhdXG4gICAgICAgIHRoaXMuYWlUdXRvclJlc3VsdEFyci5zcGxpY2UoaW5kZXgsMSlcbiAgICAgIH1cbiAgICAgfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsZWFuIHVwIHRoZSBzdWJzY3JpcHRpb24gYW5kIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgaWYgKHRoaXMubWVzc2FnZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5tZXNzYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRUeXBlOiBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnksXG4gICAgICBldmVudExvZ0xldmVsOiBXc0V2ZW50cy5Xc0V2ZW50TG9nTGV2ZWwuSW5mbyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZWRhdGE6IHsgdHlwZTogJ2NsaWNrJywgIFwiaWRcIjogXCJhaS10dXRvci1jYXJkLWNvbnRlbnRcIiwgXCJwYWdlaWRcIjogYHZpZXdlci8ke3RoaXMuY29udGVudH1gLCBcInN1YlR5cGVcIiA6ICAgdGhpcy5zZWxlY3RlZExlYXJuaW5nU3R5bGUudGl0bGUgIH0sXG4gICAgICAgIG9iamVjdDogeyBpZDogdGhpcy5jb250ZW50fSxcbiAgICAgICAgc3RhdGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLlVubG9hZGVkLFxuICAgICAgICBldmVudFN1YlR5cGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QsXG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgIH0sXG4gICAgICBwYWdlQ29udGV4dDoge3BhZ2VJZDogYHZpZXdlci8ke3RoaXMuY29udGVudH1gLCBtb2R1bGU6ICdMZWFybid9LFxuICAgICAgZnJvbTogJycsXG4gICAgICB0bzogJ1RlbGVtZXRyeScsXG4gICAgfVxuICAgIHRoaXMuZXZlbnRTdmMuZGlzcGF0Y2hDaGF0Ym90RXZlbnQ8V3NFdmVudHMuSVdzRXZlbnRUZWxlbWV0cnlJbnRlcmFjdD4oZXZlbnQpXG4gICAgLy8gdGhpcy53ZWJzb2NrZXRTZXJ2aWNlLmNsb3NlQ29ubmVjdGlvbigpO1xuICB9XG5cbiAgcmVzaXplVGV4dGFyZWEodGV4dEFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQsX2Zyb21JbnB1dDphbnkpOiB2b2lkIHtcbiAgICBpZiAodGV4dEFyZWEpIHtcbiAgICAgIHRleHRBcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsgLy8gUmVzZXQgaGVpZ2h0IGZpcnN0XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5oZWlnaHQgPSB0ZXh0QXJlYS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuICBcbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPSBnZXRDb21wdXRlZFN0eWxlKHRleHRBcmVhKTtcbiAgICAgICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoY29tcHV0ZWQucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWQucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgICAgY29uc3QgbWFyZ2luRXh0cmEgPSAwO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRleHRBcmVhLnNjcm9sbEhlaWdodCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgbWFyZ2luRXh0cmE7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXNldFRleHRBcmVhSGVpZ2h0KF90ZXh0QXJlYTpIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgaWYodGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50ICYmIHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudC5zdHlsZSAmJiB0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIHRoaXMuc2VhcmNoUXVlcnlBSXR1dG9yID0gdGhpcy5zZWFyY2hRdWVyeUFJdHV0b3IudHJpbSgpICAgICAgICBcbiAgICAgICAgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICczMHB4JztcbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGNvbXB1dGVkLnBhZGRpbmdCb3R0b20pIHx8IDA7XG4gICAgICAgIGNvbnN0IG1hcmdpbkV4dHJhID0gMDtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSAzMCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgbWFyZ2luRXh0cmE7ICAgICAgICBcbiAgICAgIH0pICAgICBcbiAgICB9XG5cblxuICB9XG5cbiAgY2xvc2VBSVR1dG9yUG9wdXAoKSB7XG4gICAgdGhpcy5jbG9zZUFJUG9wdXAuZW1pdCh0cnVlKVxuICB9XG5cbiAgbWluaW1pemVBSVR1dG9yKCkge1xuICAgIHRoaXMubWF4aW1pemUgPSBmYWxzZVxuICB9XG5cbiAgbWF4aW1pemVBSVR1dG9yKCkge1xuICAgIHRoaXMubWF4aW1pemUgPSB0cnVlXG4gIH1cbn0iLCI8IS0tIDxkaXYgY2xhc3M9XCJ0dXRvci1jb250YWluZXJcIj5cbjxkaXYgY2xhc3M9XCJsZWFybmluZy10eXBlLWNvbnRhaW5lclwiPlxuICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm5vbmVcIj5cbiAgICA8c2VsZWN0ICBtYXROYXRpdmVDb250cm9sIHJlcXVpcmVkIGNsYXNzPVwic2VjdGlvbi1kZFwiID5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgbGVhcm5pbmcgdHlwZSBoZXJlIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPk5vbmU8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Tb2NyYXRpYzwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlN0b3J5IFRlbGxpbmc8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TdW1tYXJpc2F0aW9uPC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cbjxkaXYgW25nQ2xhc3NdPVwiZnJvbSA9PT0gJ2NoYXRib3QnID8gJ2FpLXR1dG9yLWNvbnRhaW5lci1jaGF0Ym90JzonYWktdHV0b3ItY29udGFpbmVyJ1wiICNzY3JvbGxNZT5cbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGFpbmVyXCIgI3Njcm9sbE1lPlxuICAgIDxkaXYgY2xhc3M9XCJzdGFydC1jaGF0XCIgKm5nSWY9XCJhaVR1dG9yUmVzdWx0QXJyPy5sZW5ndGggPT09IDBcIj5cbiAgICAgIDxoMiBjbGFzcz1cImhleVwiPkhleTxzcGFuICpuZ0lmPVwidXNlckluZm8/LmZpcnN0TmFtZVwiPiwge3t1c2VySW5mbz8uZmlyc3ROYW1lfX08L3NwYW4+IDwvaDI+XG4gICAgICA8cD5XZWxjb21lIHRvIEFpIFR1dG9yLOKAqEdldCBpbnN0YW50IGV4cGxhbmF0aW9ucywgc3RlcC1ieS1zdGVwIGxlYXJuaW5nIGd1aWRhbmNlLCBhbmQgY3VzdG9taXNlZCBsZWFybmluZyB0YWlsb3JlZCBqdXN0IGZvciB5b3UuPC9wPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoYXQgb2YgYWlUdXRvclJlc3VsdEFycjsgbGV0IGkgPWluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hhdC50eXBlID09PSAnaW5jb21pbmcnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaGF0Py5hbnN3ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCByb3ctc3RhcnQgaW5jb21pbmctbXNnIG1hcmdpbi1ib3R0b20tc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN5c3RlbS1pY29uXCI+PGltZyBhbHQ9XCJhaS1pY29uXCIgc3JjPVwiL2Fzc2V0cy9pY29ucy9jaGF0Ym90LWFpLW5ldy5zdmdcIj48L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeXN0ZW0tbXNnIHBhZGRpbmcteHNcIiAgKm5nSWY9XCJjaGF0Py53b3Jkc0NvdW50IDw9IDMwXCIgIFtpbm5lckhUTUxdPVwiY2hhdC5hbnN3ZXJcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3lzdGVtLW1zZyBwYWRkaW5nLXhzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAgICpuZ0lmPVwiY2hhdD8ud29yZHNDb3VudCA+IDMwXCIgW2lubmVySFRNTF09XCJjaGF0Py5zaG93TGVzcyA/IGNoYXQuc2hvcnRBbnN3ZXIgOiAgY2hhdC5hbnN3ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmtcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKm5nSWY9XCIhY2hhdD8uc2hvd0xlc3NcIiAoY2xpY2spPVwidG9nZ2xlU2hvdyhpLCAnbGVzcycpXCI+U2hvdyBMZXNzPC9hPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGlua1wiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAqbmdJZj1cImNoYXQ/LnNob3dMZXNzXCIgKGNsaWNrKT1cInRvZ2dsZVNob3coaSwgJ21vcmUnKVwiPlNob3cgTW9yZTwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY2hhdD8ucmVzdWx0OyBsZXQgY2k9aW5kZXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3lzdGVtLW1zZy1taW1ldHlwZSBmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJpdGVtPy5jb250ZW50VHlwZSA9PT0gJ1Jlc291cmNlJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzb3VyY2UtaWNvblwiPjxhIFtocmVmXT1cIml0ZW0/LnJlc291cmNlTGlua1wiIHRhcmdldD1cIl9ibGFua1wiPjxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9haS1wZGYtaWNvbi5qcGdcIj48L2E+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNvdXJjZS1saW5rXCI+XG4gICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiaXRlbT8ucmVzb3VyY2VMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+T3BlbiBSZXNvdXJjZSBMaW5rPC9hPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/Lm1pbWVUeXBlID09PSAndmlkZW8vbXA0J1wiPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvYWktdmlkZW8taWNvbi5qcGdcIj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWR1cmF0aW9uXCIgKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnQgfHwgaXRlbT8uY29udGVudEVuZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnRcIj57e2l0ZW0/LmNvbnRlbnRTdGFydH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb250ZW50RW5kXCI+Ont7aXRlbT8uY29udGVudEVuZH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc291cmNlLWxpbmtcIj5cbiAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJpdGVtPy5yZXNvdXJjZUxpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj5PcGVuIFJlc291cmNlIExpbms8L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29tbWVuZGVkLXF1ZXN0aW9uIG15LTVweFwiIFtuZ0NsYXNzXT1cInsnbWFyZ2luLWxlZnQtNSc6IGl0ZW0/Lm1lc3NhZ2UgfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTVweCBtci0yXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtPy5jb250ZW50VHlwZSAhPT0gJ1Jlc291cmNlJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZGVmYXVsdFwiIChjbGljayk9XCJyZWRpcmVjdFRvVG9jKGl0ZW0pXCI+e3tpdGVtPy50aXRsZX19XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2ZXJ0aWNhbC1taWRkbGVcIj5uYXZpZ2F0ZV9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAge3tpdGVtPy5kZXNjcmlwdGlvbiB8IHNsaWNlIDogMDo1MH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBmb250LTEyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJjb3B5UGF0aChpdGVtLCBjaSlcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0VG9vbHRpcD1cIkNvcHlcIiBhcmlhLWxhYmVsPVwiQ29weVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb3BpZWRJbmRleCA9PT0gY2lcIiBjbGFzcz1cImNvcGllZC10b29sdGlwXCI+TGluayBDb3BpZWQhPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgbXItMlwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvYWktaWNvbi5zdmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWdlbmVyYXRlZC1jb250ZW50IG1sLTJcIj5UaGVzZSBhcmUgQUkgZ2VuZXJhdGVkIHJlc3VsdHM8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2hhdD8uYW5zd2VyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcm93LXN0YXJ0IGluY29taW5nLW1zZyBtYXJnaW4tYm90dG9tLXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeXN0ZW0taWNvblwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvaWNvbnMvY2hhdGJvdC1haS1uZXcuc3ZnXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1iYXItaWNvblwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvaWNvbnMvbG9hZGluZ19iYXIuZ2lmXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hhdC50eXBlID09PSAnc2VuZE1zZydcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggd2lkdGgtMS0xIHJvdy1lbmQgcGFkZGluZy10b3AtbCBwYWRkaW5nLWJvdHRvbS1tXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItc2VsZXRlZC1xdWVzdGlvbiBwYWRkaW5nLXhzXCI+XG4gICAgICAgICAgICB7e2NoYXQ/LnF1ZXN0aW9ufX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1pY29uXCIgKm5nSWY9XCJ1c2VySWNvblwiPlxuICAgICAgICAgICAgPGltZyBhbHQ9XCJhaS1pY29uXCIgc3JjPVwie3t1c2VySWNvbn19XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZS1zIHVzZXItaWNvblwiICpuZ0lmPVwiIXVzZXJJY29uXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogIGNpcmNsZUNvbG9yIH1cIj5cbiAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwiaW5pdGlhbHNcIiBpMThuLWFyaWEtbGFiZWw+XG4gICAgICAgICAgICAgIHt7IHVzZXJJbml0aWFscyB9fSBcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj4gIFxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiY29udHJvbC1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImJvcmRlci1ncmFkaWVudC1yb3VuZGVkXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXgtNSBqdXN0aWZ5LWJldHdlZW5cIj5cblxuICAgICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWJveFwiPlxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJ3aWR0aC01MDBcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQXNrIGFueXRoaW5nLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeUFJdHV0b3JcIiAoa2V5ZG93bi5lbnRlcik9XCJzdWJtaXRTZWFyY2hRdWVyeSgpXCIvPlxuICAgICAgICBcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZsZXgtYXV0by1kaXNwbGF5IHNlbmQtYnRuXCIgKGNsaWNrKT1cInN1Ym1pdFNlYXJjaFF1ZXJ5KClcIiBbZGlzYWJsZWRdPVwiIXNlYXJjaFF1ZXJ5QUl0dXRvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNlbmQtYnRuLWljb25cIj5zZW5kPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjwvZGl2PiAtLT5cblxuPGRpdiBjbGFzcz1cIm92ZXJmbG93LXktaGlkZGVuXCIgW25nQ2xhc3NdPVwiKGlzTW9iaWxlICYmICFtYXhpbWl6ZSA/ICdhaS10dXRvci1wb3B1cC1taW5pbWl6ZScgOiAoaXNNb2JpbGUgPyAnYWktdHV0b3ItcG9wdXAnOiAnJykpXCI+XG48ZGl2ICpuZ0lmPVwiaXNNb2JpbGVcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYWktdHV0b3ItbW9iaWxlLWhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPkFJIFR1dG9yPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+ICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWQtY2lyY2xlIG1sLTVcIj5cbiAgICAgICAgICAgICAgTmV3XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmRcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1heGltaXplXCIgKGNsaWNrKT1cIm1pbmltaXplQUlUdXRvcigpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPm1pbmltaXplPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbWF4aW1pemVcIiAoY2xpY2spPVwibWF4aW1pemVBSVR1dG9yKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+bWF4aW1pemU8L21hdC1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAoY2xpY2spPVwiY2xvc2VBSVR1dG9yUG9wdXAoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgXG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IFtoaWRkZW5dPVwiIW1heGltaXplXCI+XG48ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gIDwhLS0gPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJub25lXCIgc3R5bGU9XCJ3aWR0aDoxMDAlXCI+XG4gICAgPHNlbGVjdCAgbWF0TmF0aXZlQ29udHJvbCByZXF1aXJlZCBjbGFzcz1cInNlY3Rpb24tZGRcIiA+XG4gICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+WW91IGNhbiBhbHNvIGNob29zZSBhIGxlYXJuaW5nIHN0eWxlIHRoYXQgc3VpdHMgeW91IGJlc3QgZnJvbSBoZXJlLjwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPk5vbmU8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Tb2NyYXRpYzwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlN0b3J5IFRlbGxpbmc8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TdW1tYXJpc2F0aW9uPC9vcHRpb24+XG4gICAgPC9zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0XCIgYXBwZWFyYW5jZT1cImZpbGxcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDgwcHg7XCIgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgPG1hdC1zZWxlY3QgY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LWJveFwiIHJlcXVpcmVkIFsodmFsdWUpXT1cInNlbGVjdGVkTGVhcm5pbmdTdHlsZVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiZ2V0TGVhcm5pbmdTdHlsZSgpXCI+XG4gICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyIGNsYXNzPVwibXVsdGlsaW5lLXNlbGVjdC1ib3gtdHJpZ2dlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57eyBzZWxlY3RlZExlYXJuaW5nU3R5bGU/LnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+e3sgc2VsZWN0ZWRMZWFybmluZ1N0eWxlPy5zdWJ0aXRsZSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgPG1hdC1vcHRpb24gY2xhc3M9XCJtdWx0aWxpbmUtc2VsZWN0LW9wdGlvblwiIHZhbHVlPVwiXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGVhcm5pbmdTdHlsZVwiIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbT8udGl0bGV9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPnt7aXRlbT8uc3VidGl0bGV9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIFxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJjb250YWluZXItbm9uZVwiIGlkPVwiY29udGFpbmVyLW5vbmVcIj5cbiAgPGRpdiBbbmdDbGFzc109XCJmcm9tID09PSAnY2hhdGJvdCcgPyAnYWktdHV0b3ItY29udGFpbmVyLWNoYXRib3QnOidhaS10dXRvci1jb250YWluZXInXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGFpbmVyXCIgI3Njcm9sbE1lPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXJ0LWNoYXRcIiAqbmdJZj1cImFpVHV0b3JSZXN1bHRBcnI/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJoZXlcIj5IZXk8c3BhbiAqbmdJZj1cInVzZXJJbmZvPy5maXJzdE5hbWVcIj4sIHt7dXNlckluZm8/LmZpcnN0TmFtZX19PC9zcGFuPiA8L2gyPlxuICAgICAgICA8cD5XZWxjb21lIHRvIEFJIFR1dG9yLOKAqEdldCBpbnN0YW50IGV4cGxhbmF0aW9ucywgc3RlcC1ieS1zdGVwIGxlYXJuaW5nIGd1aWRhbmNlLCBhbmQgY3VzdG9taXNlZCBsZWFybmluZyB0YWlsb3JlZCBqdXN0IGZvciB5b3UuPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaGF0IG9mIGFpVHV0b3JSZXN1bHRBcnI7IGxldCBpID1pbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hhdC50eXBlID09PSAnaW5jb21pbmcnXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoYXQ/LmFuc3dlciB8fCBjaGF0Py5zaG93RnJvbUludGVybmV0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCByb3ctc3RhcnQgaW5jb21pbmctbXNnIG1hcmdpbi1ib3R0b20tc1wiICpuZ0lmPVwiY2hhdD8uYW5zd2VyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeXN0ZW0taWNvblwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvaWNvbnMvYm90LWNoYXQtc21hbGwuc3ZnXCI+PC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic3lzdGVtLW1zZyBwYWRkaW5nLXhzXCIgICpuZ0lmPVwiY2hhdD8ud29yZHNDb3VudCA8PSAzMFwiICBbaW5uZXJIVE1MXT1cImNoYXQuYW5zd2VyXCI+XG4gICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcm93LXN0YXJ0IGluY29taW5nLW1zZyBtYXJnaW4tYm90dG9tLXNcIiAqbmdJZj1cImNoYXQ/LnNob3dGcm9tSW50ZXJuZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3lzdGVtLW1zZyBwYWRkaW5nLXhzIG14LTEwXCI+XG4gICAgICAgICAgICAgICAgICBJIGNvdWxkbuKAmXQgZmluZCBhbnkgcmVsZXZhbnQgcmVzdWx0cyBmb3IgeW91ciBxdWVyeS4gV291bGQgeW91IGxpa2UgbWUgdG8gc2VhcmNoIG91dHNpZGUgdGhlIGlHT1QgcGxhdGZvcm0gZm9yIG1vcmUgaW5mb3JtYXRpb24/XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hhdD8uYW5zd2VyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeXN0ZW0tbXNnIHBhZGRpbmcteHNcIiAgKm5nSWY9XCJjaGF0Py53b3Jkc0NvdW50IDw9IDMwXCI+XG4gICAgICAgICAgICAgICAgPG1hcmtkb3duIFtkYXRhXT1cImNoYXQ/LmFuc3dlclwiPjwvbWFya2Rvd24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3lzdGVtLW1zZyBwYWRkaW5nLXhzXCIgKm5nSWY9XCJjaGF0Py53b3Jkc0NvdW50ID4gMzBcIiA+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgICBbaW5uZXJIVE1MXT1cImNoYXQ/LnNob3dMZXNzID8gY2hhdC5zaG9ydEFuc3dlciA6ICBjaGF0LmFuc3dlclwiPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgIDxtYXJrZG93biBbZGF0YV09XCJjaGF0Py5hbnN3ZXJcIj48L21hcmtkb3duPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8bWFya2Rvd24gW2RhdGFdPVwiY2hhdD8uc2hvd0xlc3MgPyBjaGF0LnNob3J0QW5zd2VyIDogIGNoYXQuYW5zd2VyXCI+PC9tYXJrZG93bj4gLS0+XG4gICAgICAgICAgICAgICAgICA8IS0tIDxhIGNsYXNzPVwibGlua1wiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAqbmdJZj1cIiFjaGF0Py5zaG93TGVzc1wiIChjbGljayk9XCJ0b2dnbGVTaG93KGksICdsZXNzJylcIj5TaG93IExlc3M8L2E+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpbmtcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKm5nSWY9XCJjaGF0Py5zaG93TGVzc1wiIChjbGljayk9XCJ0b2dnbGVTaG93KGksICdtb3JlJylcIj5TaG93IE1vcmU8L2E+IC0tPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgXG4gIFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGF0Py5zaG93RnJvbUludGVybmV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHJvdyBteS0yIGp1c3RpZnktc3RhcnQgbXgtMTAgbXktNVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNhbGxGcm9tSW50ZXJuZXQoY2hhdCwgaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwid2ViLWJ1dHRvbiBweC00IGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndlYi1zZWFyY2gtaWNvblwiPnNlYXJjaCAgPC9tYXQtaWNvbj48c3BhbiBjbGFzcz1cImJsdWUtY29sb3JcIj5TZWFyY2ggdGhlIHdlYjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInJlamVjdEZyb21JbnRlcm5ldChpKVwiIGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ3ZWItYnV0dG9uIHB5LTIgcHgtNCBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3ZWItY2xvc2UtaWNvblwiPmNsb3NlPC9tYXQtaWNvbj48c3BhbiBjbGFzcz1cImJsdWUtY29sb3JcIj5Obzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY2hhdD8ucmVzdWx0OyBsZXQgY2k9aW5kZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzeXN0ZW0tbXNnLW1pbWV0eXBlIGZsZXggZmxleC1jb2xcIiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRUeXBlID09PSAnUmVzb3VyY2UnXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtPy5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJyZXNvdXJjZS1pY29uXCI+PGEgW2hyZWZdPVwiaXRlbT8ucmVzb3VyY2VMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUmVzb3VyY2UoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9haS1wZGYtaWNvbi5qcGdcIj48L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvbW1lbmRlZC1xdWVzdGlvbi1mb3ItcmVzb3VyY2UgbXgtMTBcIiAoY2xpY2spPVwicmVkaXJlY3RUb1Jlc291cmNlKGl0ZW0pO3JhaXNlVGVsZW1ldHJ5Rm9yUmVzb3VyY2UoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInJlc291cmNlLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiaXRlbT8ucmVzb3VyY2VMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUmVzb3VyY2UoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL3BkZi5zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8cD57e2l0ZW0/Lm1lc3NhZ2V9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZGVmYXVsdCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIml0ZW0/LnJlc291cmNlTGlua1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJ2ZXJ0aWNhbC1taWRkbGUgaC13LTM0XCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9wZGYuc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAge3tpdGVtPy50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInZlcnRpY2FsLW1pZGRsZVwiICpuZ0lmPVwiIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+bmF2aWdhdGVfbmV4dDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJyZXNvdXJjZS1saW5rXCI+XG4gICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJpdGVtPy5yZXNvdXJjZUxpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj5DbGljayB0byB2aWV3PC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/Lm1pbWVUeXBlID09PSAndmlkZW8vbXA0J1wiPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNvdXJjZS1pY29uXCI+XG4gICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiaXRlbT8ucmVzb3VyY2VMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUmVzb3VyY2UoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvYWktdmlkZW8taWNvbi5qcGdcIj5cbiAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1kdXJhdGlvbiBmbGV4XCIgKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnQgPiAtMSAmJiBpdGVtPy5jb250ZW50RW5kID4gLTEgJiYgIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PG1hdC1pY29uPmFjY2Vzc190aW1lPC9tYXQtaWNvbj4mbmJzcDsmbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnQgPiAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnQgPiAwXCI+e3tpdGVtPy5jb250ZW50U3RhcnQgfCBwaXBlRHVyYXRpb25UcmFuc2Zvcm06ICdobXMnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uY29udGVudFN0YXJ0ID09PSAnMCdcIj4wPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRFbmQgPiAtMVwiPiZuYnNwOy0mbmJzcDt7e2l0ZW0/LmNvbnRlbnRFbmQgfCBwaXBlRHVyYXRpb25UcmFuc2Zvcm06ICdobXMnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbT8ubWltZVR5cGUgPT09ICd2aWRlby9tcDQnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvbW1lbmRlZC1xdWVzdGlvbi1mb3ItcmVzb3VyY2UgbXgtMTBcIiAoY2xpY2spPVwicmVkaXJlY3RUb1Jlc291cmNlKGl0ZW0pO3JhaXNlVGVsZW1ldHJ5Rm9yUmVzb3VyY2UoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWRlZmF1bHQgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJpdGVtPy5yZXNvdXJjZUxpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInZlcnRpY2FsLW1pZGRsZSBoLXctMzRcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL3ZpZGVvLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0xXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57e2l0ZW0/LnRpdGxlfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRlbnQtZHVyYXRpb24gZmxleCBtbC0xXCIgKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnQgPiAtMSAmJiBpdGVtPy5jb250ZW50RW5kID4gLTEgJiYgIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxtYXQtaWNvbj5hY2Nlc3NfdGltZTwvbWF0LWljb24+Jm5ic3A7Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRTdGFydCA+IC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb250ZW50U3RhcnQgPiAwXCI+e3tpdGVtPy5jb250ZW50U3RhcnQgfCBwaXBlRHVyYXRpb25UcmFuc2Zvcm06ICdobXMnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLmNvbnRlbnRTdGFydCA9PT0gJzAnXCI+MDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRFbmQgPiAtMVwiPiZuYnNwOy0mbmJzcDt7e2l0ZW0/LmNvbnRlbnRFbmQgfCBwaXBlRHVyYXRpb25UcmFuc2Zvcm06ICdobXMnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+ICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInZlcnRpY2FsLW1pZGRsZVwiICpuZ0lmPVwiIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+bmF2aWdhdGVfbmV4dDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gPGEgW2hyZWZdPVwiaXRlbT8ucmVzb3VyY2VMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUmVzb3VyY2UoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaC13LTM0XCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci92aWRlby5zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cD57e2l0ZW0/Lm1lc3NhZ2V9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWR1cmF0aW9uIGZsZXhcIiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRTdGFydCA+IC0xICYmIGl0ZW0/LmNvbnRlbnRFbmQgPiAtMSAmJiAhKGl0ZW0/LmZyb21JbnRlcm5ldClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48bWF0LWljb24+YWNjZXNzX3RpbWU8L21hdC1pY29uPiZuYnNwOyZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRTdGFydCA+IC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRTdGFydCA+IDBcIj57e2l0ZW0/LmNvbnRlbnRTdGFydCB8IHBpcGVEdXJhdGlvblRyYW5zZm9ybTogJ2htcyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5jb250ZW50U3RhcnQgPT09ICcwJ1wiPjA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uY29udGVudEVuZCA+IC0xXCI+Jm5ic3A7LSZuYnNwO3t7aXRlbT8uY29udGVudEVuZCB8IHBpcGVEdXJhdGlvblRyYW5zZm9ybTogJ2htcyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9hPiAtLT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicmVzb3VyY2UtbGlua1wiICAqbmdJZj1cIiEoaXRlbT8uZnJvbUludGVybmV0KVwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJpdGVtPy5yZXNvdXJjZUxpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj5DbGljayB0byB2aWV3PC9hPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG1sLTEwIG1yLTIgbXktMVwiIChjbGljayk9XCJjb3B5UGF0aChpdGVtLCBjaSlcIiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRUeXBlID09PSAnUmVzb3VyY2UnICYmICEoaXRlbT8uZnJvbUludGVybmV0KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0VG9vbHRpcD1cIkNvcHlcIiBhcmlhLWxhYmVsPVwiQ29weVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29waWVkSW5kZXggPT09IGNpXCIgY2xhc3M9XCJjb3BpZWQtdG9vbHRpcFwiPkxpbmsgQ29waWVkITwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmVlZmJhY2stc2VjdGlvbiBmbGV4IGZsZXgtcm93IG15LTFcIiAqbmdJZj1cIihpdGVtPy5mZWVkYmFjaylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrICE9PSAnZG93bidcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBmZWVkYmFjay1pY29uIG10LTFcIiBbbmdDbGFzc109XCJpdGVtPy5mZWVkYmFjayAhPT0gJ3VwJyA/ICdyb3RhdGUtMTgwJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgIT09ICd1cCdcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL2Rvd24uc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgPT0gJ3VwJ1wiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvdXAuc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgIT09ICd1cCdcIiAgY2xhc3M9XCJtbC0yIGN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZmlsbC1kb3duLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZWZiYWNrLXNlY3Rpb24gZmxleCBmbGV4LXJvdyBteS0xXCIgKm5nSWY9XCJpdGVtPy5mZWVkYmFjayA9PT0gJydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrICE9PSAnZG93bidcIiAoY2xpY2spPVwic2hhcmVQb3NpdGl2ZUNvbnRlbnRSYXRpbmcoaXRlbSxpLCBjaSlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBmZWVkYmFjay1pY29uXCIgW25nQ2xhc3NdPVwiaXRlbT8uZmVlZGJhY2sgIT09ICd1cCcgPyAncm90YXRlLTE4MCcgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrICE9PSAndXAnXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9kb3duLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrID09ICd1cCdcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL3VwLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrICE9PSAndXAnXCIgKGNsaWNrKT1cIm9wZW5BSUZlZWRiYWNrUG9wdXAoaXRlbSxpLCBjaSlcIiBjbGFzcz1cIm1sLTIgY3Vyc29yLXBvaW50ZXIgZmVlZGJhY2staWNvbiBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL2Rvd24uc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZWZiYWNrLXNlY3Rpb24gZmxleCBmbGV4LXJvdyBteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgIChjbGljayk9XCJzaGFyZVBvc2l0aXZlQ29udGVudFJhdGluZyhpdGVtLGksIGNpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZmVlZGJhY2staWNvbiBtdC0xXCIgXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgW25nQ2xhc3NdPVwiJ3JvdGF0ZS0xODAnXCIgKm5nSWY9XCJpdGVtPy5mZWVkYmFjayAhPT0gJ3VwJyAmJiAhaXRlbT8uc2hvd0xvYWRlckZvclVwXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9kb3duLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgPT09ICd1cCcgICYmICFpdGVtPy5zaG93TG9hZGVyRm9yVXBcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL3VwLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uc2hvd0xvYWRlckZvclVwXCIgY2xhc3M9XCJibHVlLWxvYWRlci1hbmltYXRpb25cIiBoZWlnaHQ9XCIxOFwiIHdpZHRoPVwiMThcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL2JsdWUtbG9hZGVyLnBuZ1wiPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvcGVuQUlGZWVkYmFja1BvcHVwKGl0ZW0saSwgY2kpXCIgY2xhc3M9XCJtbC0yIGN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb24gbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgIT09ICdkb3duJyAmJiAhaXRlbT8uc2hvd0xvYWRlckZvckRvd25cIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL2Rvd24uc3ZnXCI+IFxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgPT09ICdkb3duJyAgJiYgIWl0ZW0/LnNob3dMb2FkZXJGb3JEb3duXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9maWxsLWRvd24uc3ZnXCI+IFxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXRlbT8uc2hvd0xvYWRlckZvckRvd25cIiBjbGFzcz1cImJsdWUtbG9hZGVyLWFuaW1hdGlvblwiIGhlaWdodD1cIjE4XCIgd2lkdGg9XCIxOFwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvYmx1ZS1sb2FkZXIucG5nXCI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBmb250LTEyIG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgbXItMiBjdVwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvYWktaWNvbi5zdmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWdlbmVyYXRlZC1jb250ZW50IG1sLTJcIj5UaGVzZSBhcmUgPHNwYW4gKm5nSWY9XCJpdGVtPy5mcm9tSW50ZXJuZXRcIj5XZWI8L3NwYW4+PHNwYW4gKm5nSWY9XCIhKGl0ZW0/LmZyb21JbnRlcm5ldClcIj5BSTwvc3Bhbj4gZ2VuZXJhdGVkIHJlc3VsdHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZlZWZiYWNrLXNlY3Rpb24gZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrICE9PSAnZG93bidcIiAoY2xpY2spPVwic2hhcmVQb3NpdGl2ZUNvbnRlbnRSYXRpbmcoaXRlbSxpLCBjaSlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb25cIiBbbmdDbGFzc109XCJpdGVtPy5mZWVkYmFjayAhPT0gJ3VwJyA/ICdyb3RhdGUtMTgwJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpdGVtPy5mZWVkYmFjayAhPT0gJ3VwJ1wiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZG93bi5zdmdcIj5cbiAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrID09ICd1cCdcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL3VwLnN2Z1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5mZWVkYmFjayAhPT0gJ3VwJ1wiIChjbGljayk9XCJvcGVuQUlGZWVkYmFja1BvcHVwKGl0ZW0saSwgY2kpXCIgY2xhc3M9XCJtbC0yIGN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb25cIj48aW1nIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZG93bi5zdmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvbW1lbmRlZC1xdWVzdGlvblwiIFtuZ0NsYXNzXT1cInsnbWwtMTAnOiBpdGVtPy5tZXNzYWdlIH1cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTVweCBtci0yIHctOTJcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbT8uY29udGVudFR5cGUgIT09ICdSZXNvdXJjZScgJiYgIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwicmVkaXJlY3RUb1RvYyhpdGVtKVwiPnt7aXRlbT8udGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2ZXJ0aWNhbC1taWRkbGVcIiAqbmdJZj1cIiEoaXRlbT8uZnJvbUludGVybmV0KVwiPm5hdmlnYXRlX25leHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb21tZW5kZWQtcXVlc3Rpb24tZGVzY1wiICpuZ0lmPVwiIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0ge3tpdGVtPy5kZXNjcmlwdGlvbn19IC0tPlxuICAgICAgICAgICAgICAgICAgICAgPG1hcmtkb3duIFtkYXRhXT1cIml0ZW0/LmRlc2NyaXB0aW9uXCI+PC9tYXJrZG93bj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZm9udC0xMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNvcHlQYXRoKGl0ZW0sIGNpKVwiICpuZ0lmPVwiaXRlbT8uY29udGVudFR5cGUgIT09ICdSZXNvdXJjZScgJiYgIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0VG9vbHRpcD1cIkNvcHlcIiBhcmlhLWxhYmVsPVwiQ29weVwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvcGllZEluZGV4ID09PSBjaVwiIGNsYXNzPVwiY29waWVkLXRvb2x0aXBcIj5MaW5rIENvcGllZCE8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmVlZmJhY2stc2VjdGlvbiBmbGV4IGZsZXgtcm93XCIgKm5nSWY9XCJpdGVtPy5jb250ZW50VHlwZSAhPT0gJ1Jlc291cmNlJ1wiPlxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgIT09ICdkb3duJ1wiIChjbGljayk9XCJzaGFyZVBvc2l0aXZlQ29udGVudFJhdGluZyhpdGVtLCBpLGNpKVwiIFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZmVlZGJhY2staWNvblwiIFtuZ0NsYXNzXT1cIml0ZW0/LmZlZWRiYWNrICE9PSAndXAnID8gJ3JvdGF0ZS0xODAnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpdGVtPy5mZWVkYmFjayAhPT0gJ3VwJ1wiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZG93bi5zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpdGVtPy5mZWVkYmFjayA9PSAndXAnXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci91cC5zdmdcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgIT09ICd1cCdcIiAgKGNsaWNrKT1cIm9wZW5BSUZlZWRiYWNrUG9wdXAoaXRlbSwgaSxjaSlcIiBjbGFzcz1cIm1sLTIgY3Vyc29yLXBvaW50ZXIgZmVlZGJhY2staWNvblwiPjxpbWcgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9kb3duLnN2Z1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVmYmFjay1zZWN0aW9uIGZsZXggZmxleC1yb3dcIiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRUeXBlICE9PSAnUmVzb3VyY2UnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICAoY2xpY2spPVwic2hhcmVQb3NpdGl2ZUNvbnRlbnRSYXRpbmcoaXRlbSxpLCBjaSlcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb24gbXQtMVwiIFxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIFtuZ0NsYXNzXT1cIidyb3RhdGUtMTgwJ1wiICpuZ0lmPVwiaXRlbT8uZmVlZGJhY2sgIT09ICd1cCcgJiYgIWl0ZW0/LnNob3dMb2FkZXJGb3JVcFwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZG93bi5zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrID09PSAndXAnICAmJiAhaXRlbT8uc2hvd0xvYWRlckZvclVwXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci91cC5zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LnNob3dMb2FkZXJGb3JVcFwiIGNsYXNzPVwiYmx1ZS1sb2FkZXItYW5pbWF0aW9uXCIgaGVpZ2h0PVwiMThcIiB3aWR0aD1cIjE4XCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9ibHVlLWxvYWRlci5wbmdcIj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib3BlbkFJRmVlZGJhY2tQb3B1cChpdGVtLGksIGNpKVwiIGNsYXNzPVwibWwtMiBjdXJzb3ItcG9pbnRlciBmZWVkYmFjay1pY29uIG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrICE9PSAnZG93bicgJiYgIWl0ZW0/LnNob3dMb2FkZXJGb3JEb3duXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9kb3duLnN2Z1wiPiBcbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LmZlZWRiYWNrID09PSAnZG93bicgICYmICFpdGVtPy5zaG93TG9hZGVyRm9yRG93blwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZmlsbC1kb3duLnN2Z1wiPiBcbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0/LnNob3dMb2FkZXJGb3JEb3duXCIgY2xhc3M9XCJibHVlLWxvYWRlci1hbmltYXRpb25cIiBoZWlnaHQ9XCIxOFwiIHdpZHRoPVwiMThcIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL2JsdWUtbG9hZGVyLnBuZ1wiPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBmb250LTEyIG10LTFcIiAqbmdJZj1cIml0ZW0/LmNvbnRlbnRUeXBlICE9PSAnUmVzb3VyY2UnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgbXItMiBjdVwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvYWktaWNvbi5zdmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktZ2VuZXJhdGVkLWNvbnRlbnQgbWwtMlwiPlRoZXNlIGFyZSA8c3BhbiAqbmdJZj1cIml0ZW0/LmZyb21JbnRlcm5ldFwiPldlYjwvc3Bhbj48c3BhbiAqbmdJZj1cIiEoaXRlbT8uZnJvbUludGVybmV0KVwiPkFJPC9zcGFuPiBnZW5lcmF0ZWQgcmVzdWx0czwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGZsZXggZmxleC1yb3cgbWwtMTBcIiAqbmdJZj1cImNoYXQ/LmFuc3dlciAmJiAhKGNoYXQ/LnJlc3VsdD8ubGVuZ3RoKVwiPlxuICAgICAgICAgICAgPGRpdiAgKGNsaWNrKT1cInNoYXJlUG9zaXRpdmVDb250ZW50UmF0aW5nRm9yQW5zd2VyKGNoYXQsaSlcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb24gbXQtMVwiIFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW1nIFtuZ0NsYXNzXT1cIidyb3RhdGUtMTgwJ1wiICpuZ0lmPVwiY2hhdD8uZmVlZGJhY2sgIT09ICd1cCcgJiYgIWNoYXQ/LnNob3dMb2FkZXJGb3JVcFwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvZG93bi5zdmdcIj5cbiAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNoYXQ/LmZlZWRiYWNrID09PSAndXAnICAmJiAhY2hhdD8uc2hvd0xvYWRlckZvclVwXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci91cC5zdmdcIj5cbiAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNoYXQ/LnNob3dMb2FkZXJGb3JVcFwiIGNsYXNzPVwiYmx1ZS1sb2FkZXItYW5pbWF0aW9uXCIgaGVpZ2h0PVwiMThcIiB3aWR0aD1cIjE4XCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9ibHVlLWxvYWRlci5wbmdcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib3BlbkFJRmVlZGJhY2tQb3B1cEZvckFuc3dlcihjaGF0LGkpXCIgY2xhc3M9XCJtbC0yIGN1cnNvci1wb2ludGVyIGZlZWRiYWNrLWljb24gbXQtMVwiPlxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiY2hhdD8uZmVlZGJhY2sgIT09ICdkb3duJyAmJiAhY2hhdD8uc2hvd0xvYWRlckZvckRvd25cIiBzcmM9XCIvYXNzZXRzL2FpLXR1dG9yL2Rvd24uc3ZnXCI+IFxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiY2hhdD8uZmVlZGJhY2sgPT09ICdkb3duJyAgJiYgIWNoYXQ/LnNob3dMb2FkZXJGb3JEb3duXCIgc3JjPVwiL2Fzc2V0cy9haS10dXRvci9maWxsLWRvd24uc3ZnXCI+IFxuICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiY2hhdD8uc2hvd0xvYWRlckZvckRvd25cIiBjbGFzcz1cImJsdWUtbG9hZGVyLWFuaW1hdGlvblwiIGhlaWdodD1cIjE4XCIgd2lkdGg9XCIxOFwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvYmx1ZS1sb2FkZXIucG5nXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZm9udC0xMiBtdC0xIG1iLTEgYWktZ2VuZXJhdGVkLWNvbnRlbnQtY29udGFpbmVyXCIgKm5nSWY9XCJjaGF0Py5yZXN1bHQ/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTUgbXItMiBjdVwiPjxpbWcgYWx0PVwiYWktaWNvblwiIHNyYz1cIi9hc3NldHMvYWktdHV0b3IvYWktaWNvbi5zdmdcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1nZW5lcmF0ZWQtY29udGVudCBtbC0yXCI+VGhlc2UgYXJlIDxzcGFuICpuZ0lmPVwiaXRlbT8uZnJvbUludGVybmV0XCI+V2ViPC9zcGFuPjxzcGFuICpuZ0lmPVwiIShpdGVtPy5mcm9tSW50ZXJuZXQpXCI+QUk8L3NwYW4+IGdlbmVyYXRlZCByZXN1bHRzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcm93LXN0YXJ0IGluY29taW5nLW1zZyBtYXJnaW4tYm90dG9tLXNcIiAqbmdJZj1cImNoYXQ/Lm5ld01lc3NhZ2UgPT09ICcnICYmICFyZXN1bHRGZXRjaFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3lzdGVtLWljb25cIj48aW1nIGFsdD1cImFpLWljb25cIiBzcmM9XCIvYXNzZXRzL2ljb25zL2JvdC1jaGF0LXNtYWxsLnN2Z1wiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1iYXItaWNvbiBmbGV4IGZsZXgtcm93IHZlcnRpY2FsLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+PHNwYW4gY2xhc3M9XCJibHVlLWNvbG9yXCI+UmV0cmlldmluZyBSZXN1bHRzPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+PGltZyBhbHQ9XCJhaS1pY29uXCIgc3JjPVwiL2Fzc2V0cy9pY29ucy9sb2FkaW5nX2Jhci5naWZcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICBcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hhdC50eXBlID09PSAnc2VuZE1zZydcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3aWR0aC0xLTEgcm93LWVuZCBwYWRkaW5nLXRvcC1sIHBhZGRpbmctYm90dG9tLW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXNlbGV0ZWQtcXVlc3Rpb24gcGFkZGluZy14c1wiPlxuICAgICAgICAgICAgICB7e2NoYXQ/LnF1ZXN0aW9ufX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItaWNvblwiICpuZ0lmPVwidXNlckljb25cIj5cbiAgICAgICAgICAgICAgPGltZyBhbHQ9XCJhaS1pY29uXCIgc3JjPVwie3t1c2VySWNvbn19XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGUtcyB1c2VyLWljb25cIiAqbmdJZj1cIiF1c2VySWNvblwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6ICBjaXJjbGVDb2xvciB9XCI+XG4gICAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwiaW5pdGlhbHNcIiBpMThuLWFyaWEtbGFiZWw+XG4gICAgICAgICAgICAgICAge3sgdXNlckluaXRpYWxzIH19IFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PiAgXG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmb290ZXJcIiBbbmdDbGFzc109XCJpc01vYmlsZSA/ICdhaS1wb3B1cC1tb2JpbGUtZm9vdGVyJzonJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWdyYWRpZW50LXJvdW5kZWRcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbnRhaW5lckhlaWdodFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1sLTUgbXItMiBqdXN0aWZ5LWJldHdlZW5cIj5cblxuICAgICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWJveFwiPlxuICAgICAgICA8IS0tIDxpbnB1dCBjbGFzcz1cIndpZHRoLTUwMFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJBc2sgYW55dGhpbmcuLi5cIiBbKG5nTW9kZWwpXT1cInNlYXJjaFF1ZXJ5QUl0dXRvclwiIChrZXlkb3duLmVudGVyKT1cInN1Ym1pdFNlYXJjaFF1ZXJ5KClcIi8+ICAtLT5cbiAgICAgICAgPHRleHRhcmVhICNhdXRvUmVzaXplVGV4dGFyZWEgY2xhc3M9XCJ3aWR0aC01MDBcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkFzayBNZSBBbnl0aGluZy4uLlwiXG4gICAgICAgIChpbnB1dCk9XCJyZXNpemVUZXh0YXJlYShhdXRvUmVzaXplVGV4dGFyZWEsICdmcm9tSW5wdXQnKVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoUXVlcnlBSXR1dG9yXCIgKGtleWRvd24uZW50ZXIpPVwic3VibWl0U2VhcmNoUXVlcnkoYXV0b1Jlc2l6ZVRleHRhcmVhLCAkZXZlbnQpXCJcbiAgICAgICAgcm93cz1cIjFcIlxuICAgICAgICA+XG4gICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgIFxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXJnaW4tdG9wLTJweFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZsZXgtYXV0by1kaXNwbGF5IHNlbmQtYnRuXCIgKGNsaWNrKT1cInN1Ym1pdFNlYXJjaFF1ZXJ5KGF1dG9SZXNpemVUZXh0YXJlYSwgJGV2ZW50KVwiIFtkaXNhYmxlZF09XCIhc2VhcmNoUXVlcnlBSXR1dG9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2VuZC1idG4taWNvblwiPnNlbmQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPC9kaXY+XG48L2Rpdj4iXX0=