@sunbird-cb/consumption 0.0.11 → 0.0.12

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 (57) hide show
  1. package/bundles/sunbird-cb-consumption.umd.js +1180 -272
  2. package/bundles/sunbird-cb-consumption.umd.js.map +1 -1
  3. package/bundles/sunbird-cb-consumption.umd.min.js +2 -2
  4. package/bundles/sunbird-cb-consumption.umd.min.js.map +1 -1
  5. package/esm2015/lib/_common/calender/calender.component.js +34 -0
  6. package/esm2015/lib/_common/calender/calender.module.js +21 -0
  7. package/esm2015/lib/_common/cards/card-user/card-user.component.js +5 -5
  8. package/esm2015/lib/_common/common-strip/common-strip.component.js +643 -0
  9. package/esm2015/lib/_common/common-strip/common-strip.model.js +216 -0
  10. package/esm2015/lib/_common/common-strip/common-strip.module.js +62 -0
  11. package/esm2015/lib/_common/competency-passbook/competency-passbook.component.js +3 -3
  12. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +7 -5
  13. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +1 -1
  14. package/esm2015/lib/_common/data-points/data-points.component.js +2 -2
  15. package/esm2015/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +63 -12
  16. package/esm2015/lib/_common/pills/pills.component.js +2 -2
  17. package/esm2015/lib/_common/sliders/sliders.component.js +3 -3
  18. package/esm2015/lib/_models/card-users.model.js +7 -5
  19. package/esm2015/lib/_services/common-methods.service.js +1 -1
  20. package/esm2015/lib/consumption.module.js +6 -2
  21. package/esm2015/public-api.js +3 -1
  22. package/esm2015/sunbird-cb-consumption.js +21 -19
  23. package/esm5/lib/_common/calender/calender.component.js +39 -0
  24. package/esm5/lib/_common/calender/calender.module.js +25 -0
  25. package/esm5/lib/_common/cards/card-user/card-user.component.js +5 -5
  26. package/esm5/lib/_common/common-strip/common-strip.component.js +757 -0
  27. package/esm5/lib/_common/common-strip/common-strip.model.js +216 -0
  28. package/esm5/lib/_common/common-strip/common-strip.module.js +66 -0
  29. package/esm5/lib/_common/competency-passbook/competency-passbook.component.js +3 -3
  30. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +7 -5
  31. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +1 -1
  32. package/esm5/lib/_common/data-points/data-points.component.js +2 -2
  33. package/esm5/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +60 -12
  34. package/esm5/lib/_common/pills/pills.component.js +2 -2
  35. package/esm5/lib/_common/sliders/sliders.component.js +3 -3
  36. package/esm5/lib/_models/card-users.model.js +7 -5
  37. package/esm5/lib/_services/common-methods.service.js +1 -1
  38. package/esm5/lib/consumption.module.js +6 -2
  39. package/esm5/public-api.js +3 -1
  40. package/esm5/sunbird-cb-consumption.js +21 -19
  41. package/fesm2015/sunbird-cb-consumption.js +974 -190
  42. package/fesm2015/sunbird-cb-consumption.js.map +1 -1
  43. package/fesm5/sunbird-cb-consumption.js +1157 -253
  44. package/fesm5/sunbird-cb-consumption.js.map +1 -1
  45. package/lib/_common/calender/calender.component.d.ts +6 -0
  46. package/lib/_common/calender/calender.module.d.ts +2 -0
  47. package/lib/_common/common-strip/common-strip.component.d.ts +104 -0
  48. package/lib/_common/common-strip/common-strip.model.d.ts +141 -0
  49. package/lib/_common/common-strip/common-strip.module.d.ts +2 -0
  50. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.d.ts +8 -0
  51. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +8 -6
  52. package/lib/_models/card-users.model.d.ts +5 -4
  53. package/lib/_services/common-methods.service.d.ts +3 -2
  54. package/package.json +1 -1
  55. package/public-api.d.ts +2 -0
  56. package/sunbird-cb-consumption.d.ts +19 -17
  57. package/sunbird-cb-consumption.metadata.json +1 -1
@@ -0,0 +1,643 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Component, Input, HostBinding, Inject } from '@angular/core';
7
+ import { WidgetBaseComponent } from '@sunbird-cb/resolver-v2';
8
+ // import { HttpClient } from '@angular/common/http'
9
+ import { WidgetContentService } from '../../_services/widget-content.service';
10
+ import { MultilingualTranslationsService } from '../../_services/multilingual-translations.service';
11
+ import { LoggerService, EventService, ConfigurationsService, UtilityService, } from '@sunbird-cb/utils-v2';
12
+ import { filter } from 'rxjs/operators';
13
+ import { WidgetUserService } from '../../_services/widget-user.service';
14
+ // import { environment } from 'src/environments/environment'
15
+ // tslint:disable-next-line
16
+ import * as _ from 'lodash';
17
+ import { TranslateService } from '@ngx-translate/core';
18
+ import { CommonMethodsService } from '../../_services/common-methods.service';
19
+ /**
20
+ * @record
21
+ */
22
+ function IStripUnitCommonData() { }
23
+ if (false) {
24
+ /** @type {?} */
25
+ IStripUnitCommonData.prototype.key;
26
+ /** @type {?} */
27
+ IStripUnitCommonData.prototype.canHideStrip;
28
+ /** @type {?|undefined} */
29
+ IStripUnitCommonData.prototype.mode;
30
+ /** @type {?} */
31
+ IStripUnitCommonData.prototype.showStrip;
32
+ /** @type {?} */
33
+ IStripUnitCommonData.prototype.disableTranslate;
34
+ /** @type {?|undefined} */
35
+ IStripUnitCommonData.prototype.widgets;
36
+ /** @type {?} */
37
+ IStripUnitCommonData.prototype.stripTitle;
38
+ /** @type {?|undefined} */
39
+ IStripUnitCommonData.prototype.stripTitleLink;
40
+ /** @type {?|undefined} */
41
+ IStripUnitCommonData.prototype.sliderConfig;
42
+ /** @type {?} */
43
+ IStripUnitCommonData.prototype.stripConfig;
44
+ /** @type {?|undefined} */
45
+ IStripUnitCommonData.prototype.tabs;
46
+ /** @type {?|undefined} */
47
+ IStripUnitCommonData.prototype.stripName;
48
+ /** @type {?|undefined} */
49
+ IStripUnitCommonData.prototype.stripLogo;
50
+ /** @type {?|undefined} */
51
+ IStripUnitCommonData.prototype.description;
52
+ /** @type {?|undefined} */
53
+ IStripUnitCommonData.prototype.stripInfo;
54
+ /** @type {?|undefined} */
55
+ IStripUnitCommonData.prototype.noDataWidget;
56
+ /** @type {?|undefined} */
57
+ IStripUnitCommonData.prototype.errorWidget;
58
+ /** @type {?} */
59
+ IStripUnitCommonData.prototype.showOnNoData;
60
+ /** @type {?} */
61
+ IStripUnitCommonData.prototype.showOnLoader;
62
+ /** @type {?} */
63
+ IStripUnitCommonData.prototype.showOnError;
64
+ /** @type {?|undefined} */
65
+ IStripUnitCommonData.prototype.loaderWidgets;
66
+ /** @type {?|undefined} */
67
+ IStripUnitCommonData.prototype.stripBackground;
68
+ /** @type {?|undefined} */
69
+ IStripUnitCommonData.prototype.secondaryHeading;
70
+ /** @type {?} */
71
+ IStripUnitCommonData.prototype.viewMoreUrl;
72
+ }
73
+ export class CommonStripComponent extends WidgetBaseComponent {
74
+ /**
75
+ * @param {?} environment
76
+ * @param {?} contentSvc
77
+ * @param {?} loggerSvc
78
+ * @param {?} eventSvc
79
+ * @param {?} configSvc
80
+ * @param {?} utilitySvc
81
+ * @param {?} userSvc
82
+ * @param {?} translate
83
+ * @param {?} langtranslations
84
+ * @param {?} commonMethodsSvc
85
+ */
86
+ constructor(environment, contentSvc, loggerSvc, eventSvc, configSvc, utilitySvc, userSvc, translate, langtranslations, commonMethodsSvc) {
87
+ super();
88
+ this.contentSvc = contentSvc;
89
+ this.loggerSvc = loggerSvc;
90
+ this.eventSvc = eventSvc;
91
+ this.configSvc = configSvc;
92
+ this.utilitySvc = utilitySvc;
93
+ this.userSvc = userSvc;
94
+ this.translate = translate;
95
+ this.langtranslations = langtranslations;
96
+ this.commonMethodsSvc = commonMethodsSvc;
97
+ this.id = `ws-strip-miltiple_${Math.random()}`;
98
+ this.stripsResultDataMap = {};
99
+ this.stripsKeyOrder = [];
100
+ this.showAccordionData = true;
101
+ this.showParentLoader = false;
102
+ this.showParentError = false;
103
+ this.showParentNoData = false;
104
+ this.errorDataCount = 0;
105
+ this.noDataCount = 0;
106
+ this.successDataCount = 0;
107
+ this.contentAvailable = true;
108
+ this.baseUrl = this.configSvc.sitePath || '';
109
+ this.veifiedKarmayogi = false;
110
+ this.changeEventSubscription = null;
111
+ this.defaultMaxWidgets = 12;
112
+ this.todaysEvents = [];
113
+ this.environment = environment;
114
+ }
115
+ /**
116
+ * @return {?}
117
+ */
118
+ ngOnInit() {
119
+ // const url = window.location.href
120
+ this.initData();
121
+ }
122
+ /**
123
+ * @return {?}
124
+ */
125
+ ngOnDestroy() {
126
+ if (this.changeEventSubscription) {
127
+ this.changeEventSubscription.unsubscribe();
128
+ }
129
+ }
130
+ /**
131
+ * @param {?} key
132
+ * @return {?}
133
+ */
134
+ showAccordion(key) {
135
+ if (this.utilitySvc.isMobile && this.stripsResultDataMap[key].mode === 'accordion') {
136
+ return this.showAccordionData;
137
+ }
138
+ return true;
139
+ }
140
+ /**
141
+ * @param {?} key
142
+ * @return {?}
143
+ */
144
+ setHiddenForStrip(key) {
145
+ this.stripsResultDataMap[key].showStrip = false;
146
+ sessionStorage.setItem(`cstrip_${key}`, '1');
147
+ }
148
+ /**
149
+ * @private
150
+ * @param {?} key
151
+ * @return {?}
152
+ */
153
+ getIfStripHidden(key) {
154
+ /** @type {?} */
155
+ const storageItem = sessionStorage.getItem(`cstrip_${key}`);
156
+ return Boolean(storageItem !== '1');
157
+ }
158
+ /**
159
+ * @private
160
+ * @return {?}
161
+ */
162
+ initData() {
163
+ this.stripsKeyOrder = this.widgetData && this.widgetData.strips && this.widgetData.strips.map((/**
164
+ * @param {?} strip
165
+ * @return {?}
166
+ */
167
+ strip => strip.key)) || [];
168
+ if (this.widgetData.loader && this.widgetData.strips.length) {
169
+ this.showParentLoader = true;
170
+ }
171
+ // Fetch the data
172
+ for (const strip of this.widgetData.strips) {
173
+ this.processStrip(strip, [], 'fetching', false, null);
174
+ if (strip.dataType === 'in-hand' && this.widgetData[strip.dataKey]) {
175
+ this.processStrip(strip, this.commonMethodsSvc.transformContentsToWidgets(this.widgetData[strip.dataKey], strip), 'done', true, strip.viewMoreUrl || '');
176
+ }
177
+ else {
178
+ if (this.checkForEmptyWidget(strip)) {
179
+ // this.fetchStripFromRequestData(strip, false);
180
+ }
181
+ else {
182
+ this.processStrip(strip, [], 'done', true, null);
183
+ }
184
+ }
185
+ }
186
+ // Subscription for changes
187
+ /** @type {?} */
188
+ const keyAndEvent = this.widgetData.strips
189
+ .map((/**
190
+ * @param {?} strip
191
+ * @return {?}
192
+ */
193
+ strip => ({
194
+ key: strip.key,
195
+ type: (strip.refreshEvent && strip.refreshEvent.eventType) || '',
196
+ from: (strip.refreshEvent && strip.refreshEvent.from.toString()) || '',
197
+ })))
198
+ .filter((/**
199
+ * @param {?} __0
200
+ * @return {?}
201
+ */
202
+ ({ key, type, from }) => key && type && from));
203
+ /** @type {?} */
204
+ const eventTypeSet = new Set(keyAndEvent.map((/**
205
+ * @param {?} e
206
+ * @return {?}
207
+ */
208
+ e => e.type)));
209
+ this.changeEventSubscription = this.eventSvc.events$
210
+ .pipe(filter((/**
211
+ * @param {?} event
212
+ * @return {?}
213
+ */
214
+ event => eventTypeSet.has(event.eventType))))
215
+ .subscribe((/**
216
+ * @param {?} event
217
+ * @return {?}
218
+ */
219
+ event => {
220
+ keyAndEvent
221
+ .filter((/**
222
+ * @param {?} e
223
+ * @return {?}
224
+ */
225
+ e => e.type === event.eventType && e.from === event.from))
226
+ .map((/**
227
+ * @param {?} e
228
+ * @return {?}
229
+ */
230
+ e => e.key))
231
+ .forEach((/**
232
+ * @param {?} k
233
+ * @return {?}
234
+ */
235
+ k => this.fetchStripFromKey(k, false)));
236
+ }));
237
+ }
238
+ /**
239
+ * @private
240
+ * @param {?} key
241
+ * @param {?=} calculateParentStatus
242
+ * @return {?}
243
+ */
244
+ fetchStripFromKey(key, calculateParentStatus = true) {
245
+ /** @type {?} */
246
+ const stripData = this.widgetData.strips.find((/**
247
+ * @param {?} strip
248
+ * @return {?}
249
+ */
250
+ strip => strip.key === key));
251
+ if (stripData) {
252
+ // this.fetchStripFromRequestData(stripData, calculateParentStatus);
253
+ }
254
+ }
255
+ /**
256
+ * @param {?} data
257
+ * @return {?}
258
+ */
259
+ isStripShowing(data) {
260
+ /** @type {?} */
261
+ let count = 0;
262
+ if (data && data.key === this.environment.programStripKey && (!data.tabs || !data.tabs.length) &&
263
+ data.stripTitle === this.environment.programStripName && data.widgets.length > 0) {
264
+ data.widgets.forEach((/**
265
+ * @param {?} key
266
+ * @return {?}
267
+ */
268
+ (key) => {
269
+ if (key && key.widgetData.content.primaryCategory === this.environment.programStripPrimaryCategory) {
270
+ count = count + 1;
271
+ }
272
+ }));
273
+ if (count > 0) {
274
+ data.showStrip = true;
275
+ }
276
+ else {
277
+ data.showStrip = false;
278
+ }
279
+ }
280
+ return data.showStrip;
281
+ }
282
+ /**
283
+ * @return {?}
284
+ */
285
+ get isMobile() {
286
+ return this.utilitySvc.isMobile || false;
287
+ }
288
+ /**
289
+ * @param {?} data
290
+ * @return {?}
291
+ */
292
+ getdata(data) {
293
+ if (data.stripInfo) {
294
+ return data.stripInfo.widget;
295
+ }
296
+ return {};
297
+ }
298
+ /**
299
+ * @param {?} wData
300
+ * @param {?} data
301
+ * @return {?}
302
+ */
303
+ checkCondition(wData, data) {
304
+ if (wData.strips[0].stripConfig && wData.strips[0].stripConfig.hideShowAll) {
305
+ return !wData.strips[0].stripConfig.hideShowAll;
306
+ }
307
+ return wData.strips[0].viewMoreUrl && data.widgets && data.widgets.length >= 4;
308
+ }
309
+ /**
310
+ * @param {?} data
311
+ * @return {?}
312
+ */
313
+ checkVisible(data) {
314
+ return data.stripInfo && data.stripInfo.visibilityMode === 'visible';
315
+ }
316
+ /**
317
+ * @param {?} data
318
+ * @return {?}
319
+ */
320
+ getContineuLearningLenth(data) {
321
+ return data.widgets ? data.widgets.length : 0;
322
+ }
323
+ /**
324
+ * @param {?} data
325
+ * @return {?}
326
+ */
327
+ getLength(data) {
328
+ if (!data.tabs || !data.tabs.length) {
329
+ return data.widgets ? data.widgets.length : 0;
330
+ }
331
+ {
332
+ // if tabs are there check if each tab has widgets and get the tab with max widgets
333
+ /** @type {?} */
334
+ const tabWithMaxWidgets = data.tabs.reduce((/**
335
+ * @param {?} prev
336
+ * @param {?} current
337
+ * @return {?}
338
+ */
339
+ (prev, current) => {
340
+ if (!prev.widgets && !current.widgets) {
341
+ return current;
342
+ }
343
+ if (prev.widgets && current.widgets) {
344
+ return (prev.widgets.length > current.widgets.length) ? prev : current;
345
+ }
346
+ if (current.widgets && !prev.widgets) {
347
+ return current;
348
+ }
349
+ if (!current.widgets && prev.widgets) {
350
+ return prev;
351
+ }
352
+ return current;
353
+ // return (prev.widgets && current.widgets && (prev.widgets.length > current.widgets.length) ) ? prev : current
354
+ // tslint:disable-next-line: align
355
+ }), data.tabs[0]);
356
+ // if tabs has atleast 1 widgets then strip will show or else not
357
+ return tabWithMaxWidgets.widgets ? tabWithMaxWidgets.widgets.length : 0;
358
+ }
359
+ }
360
+ /**
361
+ * @private
362
+ * @param {?} strip
363
+ * @param {?=} results
364
+ * @param {?=} fetchStatus
365
+ * @param {?=} calculateParentStatus
366
+ * @param {?=} _viewMoreUrl
367
+ * @param {?=} tabsResults
368
+ * @return {?}
369
+ */
370
+ processStrip(strip, results = [], fetchStatus, calculateParentStatus = true, _viewMoreUrl, tabsResults) {
371
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
372
+ /** @type {?} */
373
+ const stripData = {
374
+ viewMoreUrl: strip.viewMoreUrl,
375
+ key: strip.key,
376
+ canHideStrip: Boolean(strip.canHideStrip),
377
+ showStrip: this.getIfStripHidden(strip.key),
378
+ noDataWidget: strip.noDataWidget,
379
+ errorWidget: strip.errorWidget,
380
+ stripInfo: strip.info,
381
+ stripTitle: strip.title,
382
+ stripTitleLink: strip.stripTitleLink,
383
+ dataType: strip.dataType,
384
+ dataKey: strip.dataKey,
385
+ disableTranslate: strip.disableTranslate,
386
+ sliderConfig: strip.sliderConfig,
387
+ tabs: tabsResults ? tabsResults : strip.tabs,
388
+ stripName: strip.name,
389
+ mode: strip.mode,
390
+ stripConfig: strip.stripConfig,
391
+ stripBackground: strip.stripBackground,
392
+ secondaryHeading: strip.secondaryHeading,
393
+ loaderWidgets: strip.loaderWidgets || [],
394
+ widgets: fetchStatus === 'done'
395
+ ? [
396
+ ...(strip.preWidgets || []).map((/**
397
+ * @param {?} w
398
+ * @return {?}
399
+ */
400
+ w => (Object.assign({}, w, { widgetHostClass: `mb-2 ${w.widgetHostClass}` })))),
401
+ ...results,
402
+ ...(strip.postWidgets || []).map((/**
403
+ * @param {?} w
404
+ * @return {?}
405
+ */
406
+ w => (Object.assign({}, w, { widgetHostClass: `mb-2 ${w.widgetHostClass}` })))),
407
+ ]
408
+ : [],
409
+ showOnNoData: Boolean(strip.noDataWidget &&
410
+ !((strip.preWidgets || []).length + results.length + (strip.postWidgets || []).length) &&
411
+ fetchStatus === 'done'),
412
+ showOnLoader: Boolean(strip.loader && fetchStatus === 'fetching'),
413
+ showOnError: Boolean(strip.errorWidget && fetchStatus === 'error'),
414
+ };
415
+ // const stripData = this.stripsResultDataMap[strip.key]
416
+ this.stripsResultDataMap = Object.assign({}, this.stripsResultDataMap, { [strip.key]: stripData });
417
+ if (!tabsResults) {
418
+ if (calculateParentStatus &&
419
+ (fetchStatus === 'done' || fetchStatus === 'error') &&
420
+ stripData.widgets) {
421
+ this.checkParentStatus(fetchStatus, stripData.widgets.length);
422
+ }
423
+ if (calculateParentStatus && !(results && results.length > 0)) {
424
+ this.contentAvailable = false;
425
+ }
426
+ else if (results && results.length > 0) {
427
+ this.contentAvailable = true;
428
+ }
429
+ }
430
+ else {
431
+ this.contentAvailable = true;
432
+ }
433
+ });
434
+ }
435
+ /**
436
+ * @param {?} stripsResultDataMap
437
+ * @param {?} key
438
+ * @return {?}
439
+ */
440
+ getSelectedIndex(stripsResultDataMap, key) {
441
+ /** @type {?} */
442
+ let returnValue = 0;
443
+ if (key === 'cbpPlan') {
444
+ if (stripsResultDataMap.tabs.length) {
445
+ /** @type {?} */
446
+ const data = stripsResultDataMap.tabs.filter((/**
447
+ * @param {?} ele
448
+ * @return {?}
449
+ */
450
+ (ele) => ele.value === 'upcoming'));
451
+ returnValue = data[0].widgets && data[0].widgets.length > 0 ? 1 : 0;
452
+ }
453
+ }
454
+ return returnValue;
455
+ }
456
+ /**
457
+ * @private
458
+ * @param {?} fetchStatus
459
+ * @param {?} stripWidgetsCount
460
+ * @return {?}
461
+ */
462
+ checkParentStatus(fetchStatus, stripWidgetsCount) {
463
+ if (fetchStatus === 'done' && !stripWidgetsCount) {
464
+ this.noDataCount += 1;
465
+ }
466
+ else if (fetchStatus === 'done' && stripWidgetsCount) {
467
+ this.successDataCount += 1;
468
+ }
469
+ else if (fetchStatus === 'error') {
470
+ this.errorDataCount += 1;
471
+ }
472
+ /** @type {?} */
473
+ const settledCount = this.noDataCount + this.successDataCount + this.errorDataCount;
474
+ /** @type {?} */
475
+ const totalCount = this.widgetData.strips.length;
476
+ if (this.successDataCount > 0 && settledCount < totalCount) {
477
+ return;
478
+ }
479
+ this.showParentLoader = settledCount !== totalCount;
480
+ this.showParentNoData =
481
+ this.noDataCount > 0 && this.noDataCount + this.errorDataCount === totalCount;
482
+ this.showParentError = this.errorDataCount === totalCount;
483
+ }
484
+ /**
485
+ * @param {?} strip
486
+ * @return {?}
487
+ */
488
+ checkForEmptyWidget(strip) {
489
+ if (strip.request &&
490
+ ((strip.request.api && Object.keys(strip.request.api).length) ||
491
+ (strip.request.search && Object.keys(strip.request.search).length) ||
492
+ (strip.request.searchRegionRecommendation &&
493
+ Object.keys(strip.request.searchRegionRecommendation).length) ||
494
+ (strip.request.searchV6 && Object.keys(strip.request.searchV6).length) ||
495
+ (strip.request.enrollmentList && Object.keys(strip.request.enrollmentList).length) ||
496
+ (strip.request.cbpList && Object.keys(strip.request.cbpList).length) ||
497
+ (strip.request.trendingSearch && Object.keys(strip.request.trendingSearch).length))) {
498
+ return true;
499
+ }
500
+ return false;
501
+ }
502
+ /**
503
+ * @param {?} tabEvent
504
+ * @param {?} stripMap
505
+ * @param {?} stripKey
506
+ * @return {?}
507
+ */
508
+ tabClicked(tabEvent, stripMap, stripKey) {
509
+ }
510
+ /**
511
+ * @param {?} label
512
+ * @param {?} type
513
+ * @return {?}
514
+ */
515
+ translateLabels(label, type) {
516
+ return this.langtranslations.translateLabel(label, type, '');
517
+ }
518
+ /**
519
+ * @param {?} index
520
+ * @param {?} item
521
+ * @return {?}
522
+ */
523
+ identify(index, item) {
524
+ if (index >= 0) { }
525
+ return item;
526
+ }
527
+ /**
528
+ * @param {?} index
529
+ * @param {?} item
530
+ * @return {?}
531
+ */
532
+ tracker(index, item) {
533
+ if (index >= 0) { }
534
+ return _.get(item, 'widgetData.content.identifier');
535
+ }
536
+ }
537
+ CommonStripComponent.decorators = [
538
+ { type: Component, args: [{
539
+ selector: 'sb-uic-common-strip',
540
+ template: "<ng-container *ngIf=\"!contentAvailable; else otherTemplate\"></ng-container>\n<ng-template #otherTemplate>\n <!-- <div *ngIf=\"showParentLoader\" class=\"text-center my-2\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div> -->\n <ng-container *ngIf=\"showParentError\" [sbUiResolverWidget]=\"widgetData.errorWidget\"></ng-container>\n <ng-container *ngIf=\"showParentNoData\" [sbUiResolverWidget]=\"widgetData.noDataWidget\"></ng-container>\n <ng-container *ngFor=\"let key of stripsKeyOrder; let i = index; trackBy: identify\">\n <ng-container *ngIf=\"isStripShowing(stripsResultDataMap[key])\">\n <a name=\"{{stripsResultDataMap[key]?.stripTitle}}\" [class]=\"key\">\n <div *ngIf=\"stripsResultDataMap && (getLength(stripsResultDataMap[key]) ||\n stripsResultDataMap[key]?.showOnNoData ||\n stripsResultDataMap[key]?.showOnLoader ||\n stripsResultDataMap[key]?.showOnError)\n \" [ngClass]=\"\n !widgetData?.isChannelStrip ? 'xs:px-8 sx:px-10ss' : i > 0 ? 'mt-12' : ''\n \" [id]=\"key\" [ngClass]=\"!widgetData?.isChannelStrip ? margin-bottom-custom : margin-bottom-xs\">\n <div [ngClass]=\"{ pad: stripsResultDataMap[key]?.stripBackground }\"\n [ngStyle]=\"{ 'background-color': stripsResultDataMap[key]?.stripBackground }\">\n <div class=\"flex flex-col pl-4 pr-4 md:pr-0 md:pl-0 \" [ngClass]=\"\n !widgetData?.isChannelStrip\n ? ''\n : stripsResultDataMap[key]?.stripTitle\n ? 'mb-8'\n : ''\n \">\n <div class=\"flex flex-1 items-center\">\n <p class=\"mat-subheading-1 margin-remove inline-block \" *ngIf=\"stripsResultDataMap[key]?.stripTitle\">\n <span class=\"capitalize\" *ngIf=\"stripsResultDataMap[key]?.disableTranslate\">\n {{stripsResultDataMap[key]?.stripTitle}}\n </span>\n <span *ngIf=\"!stripsResultDataMap[key]?.disableTranslate\">\n {{ translateLabels(stripsResultDataMap[key]?.stripTitle, 'home') }}\n </span>\n </p>\n\n <a *ngIf=\"stripsResultDataMap[key]?.stripTitleLink?.link\"\n [routerLink]=\"stripsResultDataMap[key]?.stripTitleLink?.link\"\n [queryParams]=\"stripsResultDataMap[key]?.stripTitleLink?.link?.queryParams\">\n <mat-icon class=\"ws-mat-primary-primary-text ws-mat-default-text\" [color]=\"'accent'\">{{\n stripsResultDataMap[key]?.stripTitleLink?.icon }}</mat-icon>\n </a>\n <span class=\"spacer\"></span>\n <!-- viewAll start-->\n <div *ngIf=\"checkCondition(widgetData , stripsResultDataMap[key])\"\n class=\"ml-4 view-more ws-mat-default-text\">\n <a class=\"flex ws-mat-default-text items-center justify-center mat-body-1\" [routerLink]=\"stripsResultDataMap[key]?.viewMoreUrl?.path\"\n [queryParams]=\"stripsResultDataMap[key]?.viewMoreUrl?.queryParams\">\n <span i18n class=\"ws-mat-default-text\">{{translateLabels(widgetData.strips[0].viewMoreUrl.viewMoreText,'home') || 'See all'}}</span>\n <mat-icon class=\"ws-mat-default-text mat-icon notranslate material-icons mat-icon-no-color\" color=\"accent\">navigate_next</mat-icon>\n </a>\n </div>\n <!-- viewAll end-->\n </div>\n <button mat-icon-button (click)=\"setHiddenForStrip(key)\" *ngIf=\"stripsResultDataMap[key]?.canHideStrip\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-icon class=\"cursor-pointer\" *ngIf=\"stripsResultDataMap[key]?.mode === 'accordion' && isMobile\"\n (click)=\"showAccordionData = !showAccordionData\">{{ showAccordionData ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"checkVisible(stripsResultDataMap[key])\">\n <ng-container [sbUiResolverWidget]=\"getdata(stripsResultDataMap[key])\">\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnNoData\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.noDataWidget\"></ng-container>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnError\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.errorWidget\"></ng-container>\n <!-- IF no errors then proceed to show tabs or non tabs strip -->\n <ng-container *ngIf=\"!stripsResultDataMap[key]?.showOnNoData && !stripsResultDataMap[key]?.showOnError\">\n <ng-container *ngIf=\"stripsResultDataMap[key].tabs && stripsResultDataMap[key].tabs.length\">\n <mat-tab-group animationDuration=\"0ms\" [selectedIndex]=\"getSelectedIndex(stripsResultDataMap[key], key)\"\n class=\"mat-tab-labels w-full strips-tabgroup\" dynamicHeight\n (selectedTabChange)=\"tabClicked($event, stripsResultDataMap[key], key)\">\n <mat-tab label=\"{{tab?.label}}\" *ngFor=\"let tab of stripsResultDataMap[key].tabs; let last = last;\">\n <ng-template mat-tab-label>\n <span>{{ translateLabels(tab?.label, 'home') }} &nbsp;</span>\n <span *ngIf=\"tab?.showTabDataCount && tab?.widgets?.length\">({{tab?.widgets?.length}})</span>\n </ng-template>\n <div>\n <!-- <ng-container [ngTemplateOutlet]=\"loader\" *ngIf=\"stripsResultDataMap[key]?.showOnLoader\">\n </ng-container> -->\n <div *ngIf=\"stripsResultDataMap && stripsResultDataMap[key]?.showOnLoader ||\n !tab.fetchTabStatus\"\n class=\"text-center my-2\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n <div *ngIf=\"((tab?.fetchTabStatus && tab?.fetchTabStatus === 'done') &&\n (!tab?.widgets || !tab?.widgets?.length))\">\n <ng-container *ngIf=\"tab?.value === 'inprogress'; else msgTemp\">\n <div class=\"w-full flex flex-col items-center justify-center\">\n <img alt=\"\" class=\"mt-4 mb-4\" src=\"assets/icons/home/nodataDefault.svg\">\n <div class=\"mat-subheading-1 text-center info-content\">{{ 'contentstripmultiple.getReadyForLearningAdventure' | translate }} -\n <a class=\"click-here\" [routerLink]=\"'/page/learn'\">{{ 'contentstripmultiple.clickHere' | translate }}</a> {{ 'contentstripmultiple.toEnrollNextCourse' | translate }}</div>\n </div>\n </ng-container>\n <ng-template #msgTemp>\n <div class=\"w-full flex flex-col items-center justify-center\">\n <img alt=\"\" class=\"mt-4 mb-4\" src=\"assets/icons/home/nodataDefault.png\">\n <div class=\"mat-subheading-1 text-center\">{{ translateLabels(tab.nodataMsg, 'home') }}</div>\n </div>\n </ng-template>\n </div>\n <ng-container *ngIf=\"(tab?.fetchTabStatus === 'done' || tab?.widgets?.length)\">\n <ng-container *ngIf=\"!tab?.tabLoading\">\n\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [widgetsLength]=\"tab?.widgets?.length\"\n *ngIf=\"getContineuLearningLenth(stripsResultDataMap[key]) && showAccordion(key)\"\n [loadStatus]=\"'done'\" [defaultMaxWidgets]=\"tab?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of tab?.widgets| slice:0:(tab?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets); trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </ng-container>\n </ng-container>\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n <ng-container *ngIf=\"!stripsResultDataMap[key].tabs || !stripsResultDataMap[key].tabs.length\">\n <div *ngIf=\"stripsResultDataMap && stripsResultDataMap[key]?.showOnLoader\" class=\"text-center my-2\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [id]=\"key+'-scroller'\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n <div class=\"\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [id]=\"key+'-scroller'\"\n [widgetsLength]=\"stripsResultDataMap[key]?.widgets?.length\" [loadStatus]=\"'done'\" [defaultMaxWidgets]=\"stripsResultDataMap[key].sliderConfig?.maxWidgets || defaultMaxWidgets\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.widgets| slice:0:(stripsResultDataMap[key].sliderConfig?.maxWidgets || defaultMaxWidgets); trackBy: tracker\">\n <!-- <ng-container *ngIf=\"widget.widgetData.context.pageSection === 'continueLearning' \"> -->\n <!-- <ng-container *ngIf=\"widget.widgetData.content.completionPercentage !== 100\"\n [sbUiResolverWidget]=\"widget\"></ng-container> -->\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n <!-- </ng-container> -->\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </a>\n\n </ng-container>\n </ng-container>\n</ng-template>",
541
+ styles: [".view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.view-more .icon{font-size:24px;width:24px;height:24px;border:1px solid;border-radius:50%;padding:8px;margin-bottom:8px}.margin-bottom-custom{margin-bottom:60px}.view-more:hover{background-color:#dcdfe5}::ng-deep.strips-tabgroup .mat-tab-header{border-bottom:2px solid rgba(0,0,0,.12)}::ng-deep.strips-tabgroup .mat-tab-body{padding:20px 0!important;box-sizing:border-box;overflow-y:initial!important}::ng-deep.strips-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep.strips-tabgroup .mat-tab-label{border-bottom:0 solid rgba(0,0,0,.1);margin-right:0;opacity:1}::ng-deep.strips-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:inherit;font:400 14px/20px Lato}::ng-deep.strips-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.click-here{color:#1b4ca1}.info-content{opacity:1;color:rgba(0,0,0,.87);font:700 14px/20px Lato-Bold;text-align:center}"]
542
+ }] }
543
+ ];
544
+ /** @nocollapse */
545
+ CommonStripComponent.ctorParameters = () => [
546
+ { type: undefined, decorators: [{ type: Inject, args: ['environment',] }] },
547
+ { type: WidgetContentService },
548
+ { type: LoggerService },
549
+ { type: EventService },
550
+ { type: ConfigurationsService },
551
+ { type: UtilityService },
552
+ { type: WidgetUserService },
553
+ { type: TranslateService },
554
+ { type: MultilingualTranslationsService },
555
+ { type: CommonMethodsService }
556
+ ];
557
+ CommonStripComponent.propDecorators = {
558
+ widgetData: [{ type: Input }],
559
+ id: [{ type: HostBinding, args: ['id',] }]
560
+ };
561
+ if (false) {
562
+ /** @type {?} */
563
+ CommonStripComponent.prototype.widgetData;
564
+ /** @type {?} */
565
+ CommonStripComponent.prototype.id;
566
+ /** @type {?} */
567
+ CommonStripComponent.prototype.stripsResultDataMap;
568
+ /** @type {?} */
569
+ CommonStripComponent.prototype.stripsKeyOrder;
570
+ /** @type {?} */
571
+ CommonStripComponent.prototype.showAccordionData;
572
+ /** @type {?} */
573
+ CommonStripComponent.prototype.showParentLoader;
574
+ /** @type {?} */
575
+ CommonStripComponent.prototype.showParentError;
576
+ /** @type {?} */
577
+ CommonStripComponent.prototype.showParentNoData;
578
+ /** @type {?} */
579
+ CommonStripComponent.prototype.errorDataCount;
580
+ /** @type {?} */
581
+ CommonStripComponent.prototype.noDataCount;
582
+ /** @type {?} */
583
+ CommonStripComponent.prototype.successDataCount;
584
+ /** @type {?} */
585
+ CommonStripComponent.prototype.contentAvailable;
586
+ /** @type {?} */
587
+ CommonStripComponent.prototype.baseUrl;
588
+ /** @type {?} */
589
+ CommonStripComponent.prototype.veifiedKarmayogi;
590
+ /** @type {?} */
591
+ CommonStripComponent.prototype.environment;
592
+ /** @type {?} */
593
+ CommonStripComponent.prototype.changeEventSubscription;
594
+ /** @type {?} */
595
+ CommonStripComponent.prototype.defaultMaxWidgets;
596
+ /** @type {?} */
597
+ CommonStripComponent.prototype.enrollInterval;
598
+ /** @type {?} */
599
+ CommonStripComponent.prototype.todaysEvents;
600
+ /**
601
+ * @type {?}
602
+ * @private
603
+ */
604
+ CommonStripComponent.prototype.contentSvc;
605
+ /**
606
+ * @type {?}
607
+ * @private
608
+ */
609
+ CommonStripComponent.prototype.loggerSvc;
610
+ /**
611
+ * @type {?}
612
+ * @private
613
+ */
614
+ CommonStripComponent.prototype.eventSvc;
615
+ /**
616
+ * @type {?}
617
+ * @private
618
+ */
619
+ CommonStripComponent.prototype.configSvc;
620
+ /** @type {?} */
621
+ CommonStripComponent.prototype.utilitySvc;
622
+ /**
623
+ * @type {?}
624
+ * @private
625
+ */
626
+ CommonStripComponent.prototype.userSvc;
627
+ /**
628
+ * @type {?}
629
+ * @private
630
+ */
631
+ CommonStripComponent.prototype.translate;
632
+ /**
633
+ * @type {?}
634
+ * @private
635
+ */
636
+ CommonStripComponent.prototype.langtranslations;
637
+ /**
638
+ * @type {?}
639
+ * @private
640
+ */
641
+ CommonStripComponent.prototype.commonMethodsSvc;
642
+ }
643
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXN0cmlwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uLyIsInNvdXJjZXMiOlsibGliL19jb21tb24vY29tbW9uLXN0cmlwL2NvbW1vbi1zdHJpcC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBb0IsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFHaEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFOUUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDcEcsT0FBTyxFQUVMLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBR3hFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBRTNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7O0FBRzlFLG1DQW9DQzs7O0lBbkNDLG1DQUFZOztJQUNaLDRDQUFzQjs7SUFDdEIsb0NBQWM7O0lBQ2QseUNBQW1COztJQUNuQixnREFBMEI7O0lBQzFCLHVDQUFzRDs7SUFDdEQsMENBQW1COztJQUNuQiw4Q0FNRTs7SUFDRiw0Q0FLRTs7SUFDRiwyQ0FBaUI7O0lBQ2pCLG9DQUFtRDs7SUFDbkQseUNBQW1COztJQUNuQix5Q0FBbUI7O0lBQ25CLDJDQUFxQjs7SUFDckIseUNB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bkRlc3Ryb3ksIEhvc3RCaW5kaW5nLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIsIFdpZGdldEJhc2VDb21wb25lbnQgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12Mic7XG5pbXBvcnQgeyBOc0NvbW1vblN0cmlwIH0gZnJvbSAnLi9jb21tb24tc3RyaXAubW9kZWwnO1xuLy8gaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi9fbW9kZWxzL3dpZGdldC1jb250ZW50Lm1vZGVsJztcbmltcG9ydCB7IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvbXVsdGlsaW5ndWFsLXRyYW5zbGF0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFRGZXRjaFN0YXR1cyxcbiAgTG9nZ2VyU2VydmljZSxcbiAgRXZlbnRTZXJ2aWNlLFxuICBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gIFV0aWxpdHlTZXJ2aWNlLFxufSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Mic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFdpZGdldFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC11c2VyLnNlcnZpY2UnO1xuLy8gaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICdzcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50J1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTWV0aG9kc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvY29tbW9uLW1ldGhvZHMuc2VydmljZSc7XG5cblxuaW50ZXJmYWNlIElTdHJpcFVuaXRDb21tb25EYXRhIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNhbkhpZGVTdHJpcDogYm9vbGVhbjtcbiAgbW9kZT86IHN0cmluZztcbiAgc2hvd1N0cmlwOiBib29sZWFuO1xuICBkaXNhYmxlVHJhbnNsYXRlOiBib29sZWFuO1xuICB3aWRnZXRzPzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXTtcbiAgc3RyaXBUaXRsZTogc3RyaW5nO1xuICBzdHJpcFRpdGxlTGluaz86IHtcbiAgICBsaW5rOiAge1xuICAgICAgcXVlcnlQYXJhbXM6IHN0cmluZ1xuICAgIH0sXG4gICAgaWNvbjogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zOiBzdHJpbmdcbiAgfTtcbiAgc2xpZGVyQ29uZmlnPzoge1xuICAgIHNob3dOYXZzOiBib29sZWFuLFxuICAgIHNob3dEb3RzOiBib29sZWFuLFxuICAgIG1heFdpZGdldHM/OiBudW1iZXJcbiAgICBjZXJpZmljYXRlQ2FyZE1hcmdpbj86IGJvb2xlYW5cbiAgfTtcbiAgc3RyaXBDb25maWc6IGFueTtcbiAgdGFicz86IE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwVGFiW10gfCB1bmRlZmluZWQ7XG4gIHN0cmlwTmFtZT86IHN0cmluZztcbiAgc3RyaXBMb2dvPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgc3RyaXBJbmZvPzogTnNDb21tb25TdHJpcC5JU3RyaXBJbmZvO1xuICBub0RhdGFXaWRnZXQ/OiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YTtcbiAgZXJyb3JXaWRnZXQ/OiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YTtcbiAgc2hvd09uTm9EYXRhOiBib29sZWFuO1xuICBzaG93T25Mb2FkZXI6IGJvb2xlYW47XG4gIHNob3dPbkVycm9yOiBib29sZWFuO1xuICBsb2FkZXJXaWRnZXRzPzogYW55O1xuICBzdHJpcEJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIHNlY29uZGFyeUhlYWRpbmc/OiBhbnk7XG4gIHZpZXdNb3JlVXJsOiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NiLXVpYy1jb21tb24tc3RyaXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbW9uLXN0cmlwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tbW9uLXN0cmlwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tbW9uU3RyaXBDb21wb25lbnQgZXh0ZW5kcyBXaWRnZXRCYXNlQ29tcG9uZW50XG5pbXBsZW1lbnRzXG5PbkluaXQsXG5PbkRlc3Ryb3ksXG5Oc1dpZGdldFJlc29sdmVyLklXaWRnZXREYXRhPE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwPiB7XG4gIEBJbnB1dCgpIHdpZGdldERhdGEhOiBOc0NvbW1vblN0cmlwLklDb21tb25TdHJpcDtcbiAgQEhvc3RCaW5kaW5nKCdpZCcpXG4gIHB1YmxpYyBpZCA9IGB3cy1zdHJpcC1taWx0aXBsZV8ke01hdGgucmFuZG9tKCl9YDtcbiAgc3RyaXBzUmVzdWx0RGF0YU1hcDogeyBba2V5OiBzdHJpbmddOiBJU3RyaXBVbml0Q29tbW9uRGF0YSB9ID0ge307XG4gIHN0cmlwc0tleU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBzaG93QWNjb3JkaW9uRGF0YSA9IHRydWU7XG4gIHNob3dQYXJlbnRMb2FkZXIgPSBmYWxzZTtcbiAgc2hvd1BhcmVudEVycm9yID0gZmFsc2U7XG4gIHNob3dQYXJlbnROb0RhdGEgPSBmYWxzZTtcbiAgZXJyb3JEYXRhQ291bnQgPSAwO1xuICBub0RhdGFDb3VudCA9IDA7XG4gIHN1Y2Nlc3NEYXRhQ291bnQgPSAwO1xuICBjb250ZW50QXZhaWxhYmxlID0gdHJ1ZTtcbiAgYmFzZVVybCA9IHRoaXMuY29uZmlnU3ZjLnNpdGVQYXRoIHx8ICcnO1xuICB2ZWlmaWVkS2FybWF5b2dpID0gZmFsc2U7XG4gIGVudmlyb25tZW50ITogYW55O1xuICBjaGFuZ2VFdmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGRlZmF1bHRNYXhXaWRnZXRzID0gMTI7XG4gIGVucm9sbEludGVydmFsOiBhbnk7XG4gIHRvZGF5c0V2ZW50czogYW55ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55LFxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICAvLyBwcml2YXRlIHNlYXJjaFNlcnZTdmM6IFNlYXJjaFNlcnZTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclN2YzogV2lkZ2V0VXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndHJhbnNsYXRpb25zOiBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29tbW9uTWV0aG9kc1N2YzogQ29tbW9uTWV0aG9kc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnRcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgdGhpcy5pbml0RGF0YSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY2hhbmdlRXZlbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2hhbmdlRXZlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzaG93QWNjb3JkaW9uKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMudXRpbGl0eVN2Yy5pc01vYmlsZSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XS5tb2RlID09PSAnYWNjb3JkaW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd0FjY29yZGlvbkRhdGE7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2V0SGlkZGVuRm9yU3RyaXAoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XS5zaG93U3RyaXAgPSBmYWxzZTtcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBjc3RyaXBfJHtrZXl9YCwgJzEnKTtcbiAgfVxuICBwcml2YXRlIGdldElmU3RyaXBIaWRkZW4oa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdG9yYWdlSXRlbSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oYGNzdHJpcF8ke2tleX1gKTtcbiAgICByZXR1cm4gQm9vbGVhbihzdG9yYWdlSXRlbSAhPT0gJzEnKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XG4gICAgdGhpcy5zdHJpcHNLZXlPcmRlciA9IHRoaXMud2lkZ2V0RGF0YSAmJiB0aGlzLndpZGdldERhdGEuc3RyaXBzICYmIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMubWFwKHN0cmlwID0+IHN0cmlwLmtleSkgfHwgW107XG4gICAgaWYgKHRoaXMud2lkZ2V0RGF0YS5sb2FkZXIgJiYgdGhpcy53aWRnZXREYXRhLnN0cmlwcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvd1BhcmVudExvYWRlciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEZldGNoIHRoZSBkYXRhXG4gICAgZm9yIChjb25zdCBzdHJpcCBvZiB0aGlzLndpZGdldERhdGEuc3RyaXBzKSB7XG4gICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdmZXRjaGluZycsIGZhbHNlLCBudWxsKTtcbiAgICAgIGlmKHN0cmlwLmRhdGFUeXBlID09PSAnaW4taGFuZCcgJiYgdGhpcy53aWRnZXREYXRhW3N0cmlwLmRhdGFLZXldKXtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgdGhpcy5jb21tb25NZXRob2RzU3ZjLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKHRoaXMud2lkZ2V0RGF0YVtzdHJpcC5kYXRhS2V5XSwgc3RyaXApLFxuICAgICAgICAgICdkb25lJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHN0cmlwLnZpZXdNb3JlVXJsIHx8ICcnLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tGb3JFbXB0eVdpZGdldChzdHJpcCkpIHtcbiAgICAgICAgICAvLyB0aGlzLmZldGNoU3RyaXBGcm9tUmVxdWVzdERhdGEoc3RyaXAsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgdHJ1ZSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU3Vic2NyaXB0aW9uIGZvciBjaGFuZ2VzXG4gICAgY29uc3Qga2V5QW5kRXZlbnQ6IHsga2V5OiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZnJvbTogc3RyaW5nIH1bXSA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHNcbiAgICAgIC5tYXAoc3RyaXAgPT4gKHtcbiAgICAgICAga2V5OiBzdHJpcC5rZXksXG4gICAgICAgIHR5cGU6IChzdHJpcC5yZWZyZXNoRXZlbnQgJiYgc3RyaXAucmVmcmVzaEV2ZW50LmV2ZW50VHlwZSkgfHwgJycsXG4gICAgICAgIGZyb206IChzdHJpcC5yZWZyZXNoRXZlbnQgJiYgc3RyaXAucmVmcmVzaEV2ZW50LmZyb20udG9TdHJpbmcoKSkgfHwgJycsXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKHsga2V5LCB0eXBlLCBmcm9tIH0pID0+IGtleSAmJiB0eXBlICYmIGZyb20pO1xuICAgIGNvbnN0IGV2ZW50VHlwZVNldCA9IG5ldyBTZXQoa2V5QW5kRXZlbnQubWFwKGUgPT4gZS50eXBlKSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRTdmMuZXZlbnRzJFxuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50VHlwZVNldC5oYXMoZXZlbnQuZXZlbnRUeXBlKSkpXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAga2V5QW5kRXZlbnRcbiAgICAgICAgICAuZmlsdGVyKGUgPT4gZS50eXBlID09PSBldmVudC5ldmVudFR5cGUgJiYgZS5mcm9tID09PSBldmVudC5mcm9tKVxuICAgICAgICAgIC5tYXAoZSA9PiBlLmtleSlcbiAgICAgICAgICAuZm9yRWFjaChrID0+IHRoaXMuZmV0Y2hTdHJpcEZyb21LZXkoaywgZmFsc2UpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFN0cmlwRnJvbUtleShrZXk6IHN0cmluZywgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHN0cmlwRGF0YSA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMuZmluZChzdHJpcCA9PiBzdHJpcC5rZXkgPT09IGtleSk7XG4gICAgaWYgKHN0cmlwRGF0YSkge1xuICAgICAgLy8gdGhpcy5mZXRjaFN0cmlwRnJvbVJlcXVlc3REYXRhKHN0cmlwRGF0YSwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICBpc1N0cmlwU2hvd2luZyhkYXRhOiBhbnkpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGlmIChkYXRhICYmIGRhdGEua2V5ID09PSB0aGlzLmVudmlyb25tZW50LnByb2dyYW1TdHJpcEtleSAmJiAoIWRhdGEudGFicyB8fCAhZGF0YS50YWJzLmxlbmd0aCkgJiZcbiAgICAgIGRhdGEuc3RyaXBUaXRsZSA9PT0gdGhpcy5lbnZpcm9ubWVudC5wcm9ncmFtU3RyaXBOYW1lICYmIGRhdGEud2lkZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICBkYXRhLndpZGdldHMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGtleSAmJiBrZXkud2lkZ2V0RGF0YS5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5lbnZpcm9ubWVudC5wcm9ncmFtU3RyaXBQcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGRhdGEuc2hvd1N0cmlwID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEuc2hvd1N0cmlwID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhLnNob3dTdHJpcDtcbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0ZGF0YShkYXRhOiBJU3RyaXBVbml0Q29tbW9uRGF0YSkge1xuICAgIGlmIChkYXRhLnN0cmlwSW5mbykge1xuICAgICAgcmV0dXJuIGRhdGEuc3RyaXBJbmZvLndpZGdldDtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuXG4gIH1cbiAgY2hlY2tDb25kaXRpb24od0RhdGE6IE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwLCBkYXRhOiBJU3RyaXBVbml0Q29tbW9uRGF0YSkge1xuICAgIGlmICh3RGF0YS5zdHJpcHNbMF0uc3RyaXBDb25maWcgJiYgd0RhdGEuc3RyaXBzWzBdLnN0cmlwQ29uZmlnLmhpZGVTaG93QWxsKSB7XG4gICAgICByZXR1cm4gIXdEYXRhLnN0cmlwc1swXS5zdHJpcENvbmZpZy5oaWRlU2hvd0FsbDtcbiAgICB9XG4gICAgcmV0dXJuIHdEYXRhLnN0cmlwc1swXS52aWV3TW9yZVVybCAmJiBkYXRhLndpZGdldHMgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCA+PSA0O1xuICB9XG4gIGNoZWNrVmlzaWJsZShkYXRhOiBJU3RyaXBVbml0Q29tbW9uRGF0YSkge1xuICAgIHJldHVybiBkYXRhLnN0cmlwSW5mbyAmJiBkYXRhLnN0cmlwSW5mby52aXNpYmlsaXR5TW9kZSA9PT0gJ3Zpc2libGUnO1xuICB9XG5cbiAgZ2V0Q29udGluZXVMZWFybmluZ0xlbnRoKGRhdGE6IElTdHJpcFVuaXRDb21tb25EYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEud2lkZ2V0cyA/IGRhdGEud2lkZ2V0cy5sZW5ndGggOiAwO1xuICB9XG4gIGdldExlbmd0aChkYXRhOiBJU3RyaXBVbml0Q29tbW9uRGF0YSkge1xuICAgIGlmICghZGF0YS50YWJzIHx8ICFkYXRhLnRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YS53aWRnZXRzID8gZGF0YS53aWRnZXRzLmxlbmd0aCA6IDA7XG4gICAgfSB7XG4gICAgICAvLyBpZiB0YWJzIGFyZSB0aGVyZSBjaGVjayBpZiBlYWNoIHRhYiBoYXMgd2lkZ2V0cyBhbmQgZ2V0IHRoZSB0YWIgd2l0aCBtYXggd2lkZ2V0c1xuICAgICAgY29uc3QgdGFiV2l0aE1heFdpZGdldHMgPSBkYXRhLnRhYnMucmVkdWNlKFxuICAgICAgICAocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgIGlmICghcHJldi53aWRnZXRzICYmICFjdXJyZW50LndpZGdldHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldi53aWRnZXRzICYmIGN1cnJlbnQud2lkZ2V0cykge1xuICAgICAgICAgICAgcmV0dXJuIChwcmV2LndpZGdldHMubGVuZ3RoID4gY3VycmVudC53aWRnZXRzLmxlbmd0aCkgPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnQud2lkZ2V0cyAmJiAhcHJldi53aWRnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjdXJyZW50LndpZGdldHMgJiYgcHJldi53aWRnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgLy8gcmV0dXJuIChwcmV2LndpZGdldHMgJiYgY3VycmVudC53aWRnZXRzICYmIChwcmV2LndpZGdldHMubGVuZ3RoID4gY3VycmVudC53aWRnZXRzLmxlbmd0aCkgKSA/IHByZXYgOiBjdXJyZW50XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBhbGlnblxuICAgICAgICB9LCBkYXRhLnRhYnNbMF0pO1xuICAgICAgLy8gaWYgdGFicyBoYXMgYXRsZWFzdCAxIHdpZGdldHMgdGhlbiBzdHJpcCB3aWxsIHNob3cgb3IgZWxzZSBub3RcbiAgICAgIHJldHVybiB0YWJXaXRoTWF4V2lkZ2V0cy53aWRnZXRzID8gdGFiV2l0aE1heFdpZGdldHMud2lkZ2V0cy5sZW5ndGggOiAwO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzU3RyaXAoXG4gICAgc3RyaXA6IE5zQ29tbW9uU3RyaXAuSUNvbW1vblN0cmlwVW5pdCxcbiAgICByZXN1bHRzOiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YVtdID0gW10sXG4gICAgZmV0Y2hTdGF0dXM6IFRGZXRjaFN0YXR1cyxcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlLFxuICAgIF92aWV3TW9yZVVybDogYW55LFxuICAgIHRhYnNSZXN1bHRzPzogTnNDb21tb25TdHJpcC5JQ29tbW9uU3RyaXBUYWJbXSB8IHVuZGVmaW5lZCxcbiAgICAvLyBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgaXMgdXNlZCBzbyB0aGF0IHBhcmVudHMnIHN0YXR1cyBpcyBub3QgcmUtY2FsY3VsYXRlZCBpZiB0aGUgQVBJIGlzIGNhbGxlZCBhZ2FpbiBjb3ogb2YgZmlsdGVycywgZXRjLlxuICApIHtcbiAgICBjb25zdCBzdHJpcERhdGEgPSB7XG4gICAgICB2aWV3TW9yZVVybDogc3RyaXAudmlld01vcmVVcmwsXG4gICAgICBrZXk6IHN0cmlwLmtleSxcbiAgICAgIGNhbkhpZGVTdHJpcDogQm9vbGVhbihzdHJpcC5jYW5IaWRlU3RyaXApLFxuICAgICAgc2hvd1N0cmlwOiB0aGlzLmdldElmU3RyaXBIaWRkZW4oc3RyaXAua2V5KSxcbiAgICAgIG5vRGF0YVdpZGdldDogc3RyaXAubm9EYXRhV2lkZ2V0LFxuICAgICAgZXJyb3JXaWRnZXQ6IHN0cmlwLmVycm9yV2lkZ2V0LFxuICAgICAgc3RyaXBJbmZvOiBzdHJpcC5pbmZvLFxuICAgICAgc3RyaXBUaXRsZTogc3RyaXAudGl0bGUsXG4gICAgICBzdHJpcFRpdGxlTGluazogc3RyaXAuc3RyaXBUaXRsZUxpbmssXG4gICAgICBkYXRhVHlwZTogc3RyaXAuZGF0YVR5cGUsXG4gICAgICBkYXRhS2V5OiBzdHJpcC5kYXRhS2V5LFxuICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogc3RyaXAuZGlzYWJsZVRyYW5zbGF0ZSxcbiAgICAgIHNsaWRlckNvbmZpZzogc3RyaXAuc2xpZGVyQ29uZmlnLFxuICAgICAgdGFiczogdGFic1Jlc3VsdHMgPyB0YWJzUmVzdWx0cyA6IHN0cmlwLnRhYnMsXG4gICAgICBzdHJpcE5hbWU6IHN0cmlwLm5hbWUsXG4gICAgICBtb2RlOiBzdHJpcC5tb2RlLFxuICAgICAgc3RyaXBDb25maWc6IHN0cmlwLnN0cmlwQ29uZmlnLFxuICAgICAgc3RyaXBCYWNrZ3JvdW5kOiBzdHJpcC5zdHJpcEJhY2tncm91bmQsXG4gICAgICBzZWNvbmRhcnlIZWFkaW5nOiBzdHJpcC5zZWNvbmRhcnlIZWFkaW5nLFxuICAgICAgbG9hZGVyV2lkZ2V0czogc3RyaXAubG9hZGVyV2lkZ2V0cyB8fCBbXSxcbiAgICAgIHdpZGdldHM6XG4gICAgICAgIGZldGNoU3RhdHVzID09PSAnZG9uZSdcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgIC4uLihzdHJpcC5wcmVXaWRnZXRzIHx8IFtdKS5tYXAodyA9PiAoe1xuICAgICAgICAgICAgICAuLi53LFxuICAgICAgICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6IGBtYi0yICR7dy53aWRnZXRIb3N0Q2xhc3N9YCxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIC4uLnJlc3VsdHMsXG4gICAgICAgICAgICAuLi4oc3RyaXAucG9zdFdpZGdldHMgfHwgW10pLm1hcCh3ID0+ICh7XG4gICAgICAgICAgICAgIC4uLncsXG4gICAgICAgICAgICAgIHdpZGdldEhvc3RDbGFzczogYG1iLTIgJHt3LndpZGdldEhvc3RDbGFzc31gLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdLFxuICAgICAgc2hvd09uTm9EYXRhOiBCb29sZWFuKFxuICAgICAgICBzdHJpcC5ub0RhdGFXaWRnZXQgJiZcbiAgICAgICAgISgoc3RyaXAucHJlV2lkZ2V0cyB8fCBbXSkubGVuZ3RoICsgcmVzdWx0cy5sZW5ndGggKyAoc3RyaXAucG9zdFdpZGdldHMgfHwgW10pLmxlbmd0aCkgJiZcbiAgICAgICAgZmV0Y2hTdGF0dXMgPT09ICdkb25lJyxcbiAgICAgICksXG4gICAgICBzaG93T25Mb2FkZXI6IEJvb2xlYW4oc3RyaXAubG9hZGVyICYmIGZldGNoU3RhdHVzID09PSAnZmV0Y2hpbmcnKSxcbiAgICAgIHNob3dPbkVycm9yOiBCb29sZWFuKHN0cmlwLmVycm9yV2lkZ2V0ICYmIGZldGNoU3RhdHVzID09PSAnZXJyb3InKSxcbiAgICB9O1xuICAgIC8vIGNvbnN0IHN0cmlwRGF0YSA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldXG4gICAgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwID0ge1xuICAgICAgLi4udGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwLFxuICAgICAgW3N0cmlwLmtleV06IHN0cmlwRGF0YSxcbiAgICB9O1xuICAgIGlmICghdGFic1Jlc3VsdHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzICYmXG4gICAgICAgIChmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnIHx8IGZldGNoU3RhdHVzID09PSAnZXJyb3InKSAmJlxuICAgICAgICBzdHJpcERhdGEud2lkZ2V0c1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQYXJlbnRTdGF0dXMoZmV0Y2hTdGF0dXMsIHN0cmlwRGF0YS53aWRnZXRzLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsY3VsYXRlUGFyZW50U3RhdHVzICYmICEocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdGVkSW5kZXgoc3RyaXBzUmVzdWx0RGF0YU1hcDogYW55LCBrZXk6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gMDtcbiAgICBpZiAoa2V5ID09PSAnY2JwUGxhbicpIHtcbiAgICAgIGlmIChzdHJpcHNSZXN1bHREYXRhTWFwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzdHJpcHNSZXN1bHREYXRhTWFwLnRhYnMuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnZhbHVlID09PSAndXBjb21pbmcnKTtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBkYXRhWzBdLndpZGdldHMgJiYgZGF0YVswXS53aWRnZXRzLmxlbmd0aCA+IDAgPyAxIDogMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG4gIFxuICBwcml2YXRlIGNoZWNrUGFyZW50U3RhdHVzKGZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMsIHN0cmlwV2lkZ2V0c0NvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZmV0Y2hTdGF0dXMgPT09ICdkb25lJyAmJiAhc3RyaXBXaWRnZXRzQ291bnQpIHtcbiAgICAgIHRoaXMubm9EYXRhQ291bnQgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGZldGNoU3RhdHVzID09PSAnZG9uZScgJiYgc3RyaXBXaWRnZXRzQ291bnQpIHtcbiAgICAgIHRoaXMuc3VjY2Vzc0RhdGFDb3VudCArPSAxO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hTdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgIHRoaXMuZXJyb3JEYXRhQ291bnQgKz0gMTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlZENvdW50ID0gdGhpcy5ub0RhdGFDb3VudCArIHRoaXMuc3VjY2Vzc0RhdGFDb3VudCArIHRoaXMuZXJyb3JEYXRhQ291bnQ7XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMubGVuZ3RoO1xuICAgIGlmICh0aGlzLnN1Y2Nlc3NEYXRhQ291bnQgPiAwICYmIHNldHRsZWRDb3VudCA8IHRvdGFsQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93UGFyZW50TG9hZGVyID0gc2V0dGxlZENvdW50ICE9PSB0b3RhbENvdW50O1xuICAgIHRoaXMuc2hvd1BhcmVudE5vRGF0YSA9XG4gICAgICB0aGlzLm5vRGF0YUNvdW50ID4gMCAmJiB0aGlzLm5vRGF0YUNvdW50ICsgdGhpcy5lcnJvckRhdGFDb3VudCA9PT0gdG90YWxDb3VudDtcbiAgICB0aGlzLnNob3dQYXJlbnRFcnJvciA9IHRoaXMuZXJyb3JEYXRhQ291bnQgPT09IHRvdGFsQ291bnQ7XG4gIH1cbiAgY2hlY2tGb3JFbXB0eVdpZGdldChzdHJpcDogTnNDb21tb25TdHJpcC5JQ29tbW9uU3RyaXBVbml0KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3RyaXAucmVxdWVzdCAmJlxuICAgICAgKChzdHJpcC5yZXF1ZXN0LmFwaSAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmFwaSkubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5zZWFyY2ggJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5zZWFyY2gpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3Quc2VhcmNoUmVnaW9uUmVjb21tZW5kYXRpb24gJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnNlYXJjaFJlZ2lvblJlY29tbWVuZGF0aW9uKS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QuZW5yb2xsbWVudExpc3QgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5lbnJvbGxtZW50TGlzdCkubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5jYnBMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCkubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoKS5sZW5ndGgpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHRhYkNsaWNrZWQodGFiRXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50LCBzdHJpcE1hcDogSVN0cmlwVW5pdENvbW1vbkRhdGEsIHN0cmlwS2V5OiBzdHJpbmcpIHtcblxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKTtcbiAgfVxuXG4gIGlkZW50aWZ5KGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIGlmIChpbmRleCA+PSAwKSB7IH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICB0cmFja2VyKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIGlmIChpbmRleCA+PSAwKSB7IH1cbiAgICByZXR1cm4gXy5nZXQoaXRlbSwgJ3dpZGdldERhdGEuY29udGVudC5pZGVudGlmaWVyJylcbiAgfVxuXG59XG4iXX0=