@sunbird-cb/consumption 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +24 -0
  2. package/bundles/sunbird-cb-consumption.umd.js +8116 -0
  3. package/bundles/sunbird-cb-consumption.umd.js.map +1 -0
  4. package/bundles/sunbird-cb-consumption.umd.min.js +17 -0
  5. package/bundles/sunbird-cb-consumption.umd.min.js.map +1 -0
  6. package/esm2015/lib/_common/cards/card-landscape/card-landscape.component.js +209 -0
  7. package/esm2015/lib/_common/cards/card-portrait/card-portrait.component.js +173 -0
  8. package/esm2015/lib/_common/cards/card-resource/card-resource.component.js +34 -0
  9. package/esm2015/lib/_common/cards/card-user/card-user.component.js +141 -0
  10. package/esm2015/lib/_common/cards/cards.component.js +107 -0
  11. package/esm2015/lib/_common/cards/cards.module.js +47 -0
  12. package/esm2015/lib/_common/competency-passbook/competency-passbook.component.js +324 -0
  13. package/esm2015/lib/_common/competency-passbook/competency-passbook.module.js +27 -0
  14. package/esm2015/lib/_common/competency-passbook/competency-passbook.service.js +52 -0
  15. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +1594 -0
  16. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +212 -0
  17. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.module.js +69 -0
  18. package/esm2015/lib/_common/data-points/data-points.component.js +53 -0
  19. package/esm2015/lib/_common/data-points/data-points.module.js +19 -0
  20. package/esm2015/lib/_common/display-content-type-lib/display-content-type-lib.component.js +56 -0
  21. package/esm2015/lib/_common/display-content-type-lib/display-content-type-lib.module.js +18 -0
  22. package/esm2015/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +268 -0
  23. package/esm2015/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.module.js +23 -0
  24. package/esm2015/lib/_common/pills/pills.component.js +49 -0
  25. package/esm2015/lib/_common/pills/pills.module.js +24 -0
  26. package/esm2015/lib/_common/skeleton-loader-lib/skeleton-loader-lib.component.js +40 -0
  27. package/esm2015/lib/_common/skeleton-loader-lib/skeleton-loader-lib.module.js +28 -0
  28. package/esm2015/lib/_common/sliders/sliders.component.js +184 -0
  29. package/esm2015/lib/_common/sliders/sliders.model.js +61 -0
  30. package/esm2015/lib/_common/sliders/sliders.module.js +50 -0
  31. package/esm2015/lib/_constants/misc.constants.js +5 -0
  32. package/esm2015/lib/_directives/default-thumbnail/default-thumbnail.directive.js +52 -0
  33. package/esm2015/lib/_directives/default-thumbnail/default-thumbnail.module.js +19 -0
  34. package/esm2015/lib/_directives/image-responsive/image-responsive.directive.js +127 -0
  35. package/esm2015/lib/_directives/image-responsive/image-responsive.module.js +19 -0
  36. package/esm2015/lib/_directives/navigation/navigation.directive.js +54 -0
  37. package/esm2015/lib/_directives/navigation/navigation.module.js +19 -0
  38. package/esm2015/lib/_models/card-content-v2.model.js +78 -0
  39. package/esm2015/lib/_models/card-content.model.js +69 -0
  40. package/esm2015/lib/_models/card-users.model.js +101 -0
  41. package/esm2015/lib/_models/content-strip-multiple.model.js +195 -0
  42. package/esm2015/lib/_models/event.js +45 -0
  43. package/esm2015/lib/_models/profile-v3.models.js +196 -0
  44. package/esm2015/lib/_models/widget-content.model.js +876 -0
  45. package/esm2015/lib/_models/widget-search.model.js +472 -0
  46. package/esm2015/lib/_models/widget-user.model.js +17 -0
  47. package/esm2015/lib/_pipes/pipe-duration-transform/pipe-duration-transform.module.js +19 -0
  48. package/esm2015/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +120 -0
  49. package/esm2015/lib/_pipes/pipe-public-URL/pipe-public-URL.module.js +19 -0
  50. package/esm2015/lib/_pipes/pipe-public-URL/pipe-public-URL.pipe.js +38 -0
  51. package/esm2015/lib/_services/common-methods.service.js +60 -0
  52. package/esm2015/lib/_services/configurations.service.js +243 -0
  53. package/esm2015/lib/_services/multilingual-translations.service.js +228 -0
  54. package/esm2015/lib/_services/viewer-route-util.js +125 -0
  55. package/esm2015/lib/_services/widget-content.service.js +818 -0
  56. package/esm2015/lib/_services/widget-user.service.js +439 -0
  57. package/esm2015/lib/consumption.component.js +26 -0
  58. package/esm2015/lib/consumption.config.js +12 -0
  59. package/esm2015/lib/consumption.module.js +26 -0
  60. package/esm2015/lib/consumption.service.js +18 -0
  61. package/esm2015/lib/registration-lib.config.js +21 -0
  62. package/esm2015/public-api.js +19 -0
  63. package/esm2015/sunbird-cb-consumption.js +41 -0
  64. package/esm5/lib/_common/cards/card-landscape/card-landscape.component.js +222 -0
  65. package/esm5/lib/_common/cards/card-portrait/card-portrait.component.js +182 -0
  66. package/esm5/lib/_common/cards/card-resource/card-resource.component.js +41 -0
  67. package/esm5/lib/_common/cards/card-user/card-user.component.js +147 -0
  68. package/esm5/lib/_common/cards/cards.component.js +127 -0
  69. package/esm5/lib/_common/cards/cards.module.js +51 -0
  70. package/esm5/lib/_common/competency-passbook/competency-passbook.component.js +391 -0
  71. package/esm5/lib/_common/competency-passbook/competency-passbook.module.js +31 -0
  72. package/esm5/lib/_common/competency-passbook/competency-passbook.service.js +59 -0
  73. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +1861 -0
  74. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +212 -0
  75. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.module.js +73 -0
  76. package/esm5/lib/_common/data-points/data-points.component.js +62 -0
  77. package/esm5/lib/_common/data-points/data-points.module.js +23 -0
  78. package/esm5/lib/_common/display-content-type-lib/display-content-type-lib.component.js +63 -0
  79. package/esm5/lib/_common/display-content-type-lib/display-content-type-lib.module.js +22 -0
  80. package/esm5/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +300 -0
  81. package/esm5/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.module.js +27 -0
  82. package/esm5/lib/_common/pills/pills.component.js +58 -0
  83. package/esm5/lib/_common/pills/pills.module.js +28 -0
  84. package/esm5/lib/_common/skeleton-loader-lib/skeleton-loader-lib.component.js +45 -0
  85. package/esm5/lib/_common/skeleton-loader-lib/skeleton-loader-lib.module.js +32 -0
  86. package/esm5/lib/_common/sliders/sliders.component.js +211 -0
  87. package/esm5/lib/_common/sliders/sliders.model.js +61 -0
  88. package/esm5/lib/_common/sliders/sliders.module.js +67 -0
  89. package/esm5/lib/_constants/misc.constants.js +5 -0
  90. package/esm5/lib/_directives/default-thumbnail/default-thumbnail.directive.js +60 -0
  91. package/esm5/lib/_directives/default-thumbnail/default-thumbnail.module.js +23 -0
  92. package/esm5/lib/_directives/image-responsive/image-responsive.directive.js +137 -0
  93. package/esm5/lib/_directives/image-responsive/image-responsive.module.js +23 -0
  94. package/esm5/lib/_directives/navigation/navigation.directive.js +63 -0
  95. package/esm5/lib/_directives/navigation/navigation.module.js +23 -0
  96. package/esm5/lib/_models/card-content-v2.model.js +78 -0
  97. package/esm5/lib/_models/card-content.model.js +69 -0
  98. package/esm5/lib/_models/card-users.model.js +101 -0
  99. package/esm5/lib/_models/content-strip-multiple.model.js +195 -0
  100. package/esm5/lib/_models/event.js +45 -0
  101. package/esm5/lib/_models/profile-v3.models.js +196 -0
  102. package/esm5/lib/_models/widget-content.model.js +876 -0
  103. package/esm5/lib/_models/widget-search.model.js +472 -0
  104. package/esm5/lib/_models/widget-user.model.js +17 -0
  105. package/esm5/lib/_pipes/pipe-duration-transform/pipe-duration-transform.module.js +23 -0
  106. package/esm5/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +143 -0
  107. package/esm5/lib/_pipes/pipe-public-URL/pipe-public-URL.module.js +23 -0
  108. package/esm5/lib/_pipes/pipe-public-URL/pipe-public-URL.pipe.js +41 -0
  109. package/esm5/lib/_services/common-methods.service.js +73 -0
  110. package/esm5/lib/_services/configurations.service.js +257 -0
  111. package/esm5/lib/_services/multilingual-translations.service.js +256 -0
  112. package/esm5/lib/_services/viewer-route-util.js +127 -0
  113. package/esm5/lib/_services/widget-content.service.js +1062 -0
  114. package/esm5/lib/_services/widget-user.service.js +501 -0
  115. package/esm5/lib/consumption.component.js +28 -0
  116. package/esm5/lib/consumption.config.js +12 -0
  117. package/esm5/lib/consumption.module.js +30 -0
  118. package/esm5/lib/consumption.service.js +21 -0
  119. package/esm5/lib/registration-lib.config.js +21 -0
  120. package/esm5/public-api.js +19 -0
  121. package/esm5/sunbird-cb-consumption.js +41 -0
  122. package/fesm2015/sunbird-cb-consumption.js +6940 -0
  123. package/fesm2015/sunbird-cb-consumption.js.map +1 -0
  124. package/fesm5/sunbird-cb-consumption.js +7871 -0
  125. package/fesm5/sunbird-cb-consumption.js.map +1 -0
  126. package/lib/_common/cards/card-landscape/card-landscape.component.d.ts +35 -0
  127. package/lib/_common/cards/card-portrait/card-portrait.component.d.ts +31 -0
  128. package/lib/_common/cards/card-resource/card-resource.component.d.ts +8 -0
  129. package/lib/_common/cards/card-user/card-user.component.d.ts +24 -0
  130. package/lib/_common/cards/cards.component.d.ts +20 -0
  131. package/lib/_common/cards/cards.module.d.ts +2 -0
  132. package/lib/_common/competency-passbook/competency-passbook.component.d.ts +36 -0
  133. package/lib/_common/competency-passbook/competency-passbook.module.d.ts +2 -0
  134. package/lib/_common/competency-passbook/competency-passbook.service.d.ts +8 -0
  135. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.d.ts +174 -0
  136. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.d.ts +131 -0
  137. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.module.d.ts +5 -0
  138. package/lib/_common/data-points/data-points.component.d.ts +9 -0
  139. package/lib/_common/data-points/data-points.module.d.ts +2 -0
  140. package/lib/_common/display-content-type-lib/display-content-type-lib.component.d.ts +11 -0
  141. package/lib/_common/display-content-type-lib/display-content-type-lib.module.d.ts +2 -0
  142. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +31 -0
  143. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.module.d.ts +2 -0
  144. package/lib/_common/pills/pills.component.d.ts +10 -0
  145. package/lib/_common/pills/pills.module.d.ts +2 -0
  146. package/lib/_common/skeleton-loader-lib/skeleton-loader-lib.component.d.ts +8 -0
  147. package/lib/_common/skeleton-loader-lib/skeleton-loader-lib.module.d.ts +2 -0
  148. package/lib/_common/sliders/sliders.component.d.ts +26 -0
  149. package/lib/_common/sliders/sliders.model.d.ts +34 -0
  150. package/lib/_common/sliders/sliders.module.d.ts +6 -0
  151. package/lib/_constants/misc.constants.d.ts +2 -0
  152. package/lib/_directives/default-thumbnail/default-thumbnail.directive.d.ts +9 -0
  153. package/lib/_directives/default-thumbnail/default-thumbnail.module.d.ts +2 -0
  154. package/lib/_directives/image-responsive/image-responsive.directive.d.ts +17 -0
  155. package/lib/_directives/image-responsive/image-responsive.module.d.ts +2 -0
  156. package/lib/_directives/navigation/navigation.directive.d.ts +9 -0
  157. package/lib/_directives/navigation/navigation.module.d.ts +2 -0
  158. package/lib/_models/card-content-v2.model.d.ts +44 -0
  159. package/lib/_models/card-content.model.d.ts +41 -0
  160. package/lib/_models/card-users.model.d.ts +49 -0
  161. package/lib/_models/content-strip-multiple.model.d.ts +128 -0
  162. package/lib/_models/event.d.ts +18 -0
  163. package/lib/_models/profile-v3.models.d.ts +91 -0
  164. package/lib/_models/widget-content.model.d.ts +497 -0
  165. package/lib/_models/widget-search.model.d.ts +252 -0
  166. package/lib/_models/widget-user.model.d.ts +5 -0
  167. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.module.d.ts +2 -0
  168. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +6 -0
  169. package/lib/_pipes/pipe-public-URL/pipe-public-URL.module.d.ts +2 -0
  170. package/lib/_pipes/pipe-public-URL/pipe-public-URL.pipe.d.ts +6 -0
  171. package/lib/_services/common-methods.service.d.ts +37 -0
  172. package/lib/_services/configurations.service.d.ts +71 -0
  173. package/lib/_services/multilingual-translations.service.d.ts +20 -0
  174. package/lib/_services/viewer-route-util.d.ts +8 -0
  175. package/lib/_services/widget-content.service.d.ts +82 -0
  176. package/lib/_services/widget-user.service.d.ts +31 -0
  177. package/lib/consumption.component.d.ts +5 -0
  178. package/lib/consumption.config.d.ts +6 -0
  179. package/lib/consumption.module.d.ts +2 -0
  180. package/lib/consumption.service.d.ts +3 -0
  181. package/lib/registration-lib.config.d.ts +4 -0
  182. package/package.json +23 -0
  183. package/public-api.d.ts +11 -0
  184. package/sunbird-cb-consumption.d.ts +36 -0
  185. package/sunbird-cb-consumption.metadata.json +1 -0
@@ -0,0 +1,1594 @@
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';
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, WsEvents, } from '@sunbird-cb/utils';
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 { NsCardContent } from '../../_models/card-content-v2.model';
18
+ import { TranslateService } from '@ngx-translate/core';
19
+ /**
20
+ * @record
21
+ */
22
+ function IStripUnitContentData() { }
23
+ if (false) {
24
+ /** @type {?} */
25
+ IStripUnitContentData.prototype.key;
26
+ /** @type {?} */
27
+ IStripUnitContentData.prototype.canHideStrip;
28
+ /** @type {?|undefined} */
29
+ IStripUnitContentData.prototype.mode;
30
+ /** @type {?} */
31
+ IStripUnitContentData.prototype.showStrip;
32
+ /** @type {?} */
33
+ IStripUnitContentData.prototype.disableTranslate;
34
+ /** @type {?|undefined} */
35
+ IStripUnitContentData.prototype.widgets;
36
+ /** @type {?} */
37
+ IStripUnitContentData.prototype.stripTitle;
38
+ /** @type {?|undefined} */
39
+ IStripUnitContentData.prototype.stripTitleLink;
40
+ /** @type {?|undefined} */
41
+ IStripUnitContentData.prototype.sliderConfig;
42
+ /** @type {?} */
43
+ IStripUnitContentData.prototype.stripConfig;
44
+ /** @type {?|undefined} */
45
+ IStripUnitContentData.prototype.tabs;
46
+ /** @type {?|undefined} */
47
+ IStripUnitContentData.prototype.stripName;
48
+ /** @type {?|undefined} */
49
+ IStripUnitContentData.prototype.stripLogo;
50
+ /** @type {?|undefined} */
51
+ IStripUnitContentData.prototype.description;
52
+ /** @type {?|undefined} */
53
+ IStripUnitContentData.prototype.stripInfo;
54
+ /** @type {?|undefined} */
55
+ IStripUnitContentData.prototype.noDataWidget;
56
+ /** @type {?|undefined} */
57
+ IStripUnitContentData.prototype.errorWidget;
58
+ /** @type {?} */
59
+ IStripUnitContentData.prototype.showOnNoData;
60
+ /** @type {?} */
61
+ IStripUnitContentData.prototype.showOnLoader;
62
+ /** @type {?} */
63
+ IStripUnitContentData.prototype.showOnError;
64
+ /** @type {?|undefined} */
65
+ IStripUnitContentData.prototype.loaderWidgets;
66
+ /** @type {?|undefined} */
67
+ IStripUnitContentData.prototype.stripBackground;
68
+ /** @type {?|undefined} */
69
+ IStripUnitContentData.prototype.secondaryHeading;
70
+ /** @type {?} */
71
+ IStripUnitContentData.prototype.viewMoreUrl;
72
+ }
73
+ export class ContentStripWithTabsLibComponent 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
+ */
85
+ constructor(
86
+ // private contentStripSvc: ContentStripNewMultipleService,
87
+ environment, contentSvc, loggerSvc, eventSvc, configSvc, utilitySvc, userSvc, translate, langtranslations) {
88
+ super();
89
+ this.contentSvc = contentSvc;
90
+ this.loggerSvc = loggerSvc;
91
+ this.eventSvc = eventSvc;
92
+ this.configSvc = configSvc;
93
+ this.utilitySvc = utilitySvc;
94
+ this.userSvc = userSvc;
95
+ this.translate = translate;
96
+ this.langtranslations = langtranslations;
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
+ if (localStorage.getItem('websiteLanguage')) {
114
+ this.translate.setDefaultLang('en');
115
+ /** @type {?} */
116
+ let lang = JSON.stringify(localStorage.getItem('websiteLanguage'));
117
+ lang = lang.replace(/\"/g, '');
118
+ this.translate.use(lang);
119
+ }
120
+ this.environment = environment;
121
+ console.log('plugin');
122
+ }
123
+ /**
124
+ * @return {?}
125
+ */
126
+ ngOnInit() {
127
+ // const url = window.location.href
128
+ this.initData();
129
+ }
130
+ /**
131
+ * @return {?}
132
+ */
133
+ ngOnDestroy() {
134
+ if (this.changeEventSubscription) {
135
+ this.changeEventSubscription.unsubscribe();
136
+ }
137
+ }
138
+ /**
139
+ * @param {?} key
140
+ * @return {?}
141
+ */
142
+ showAccordion(key) {
143
+ if (this.utilitySvc.isMobile && this.stripsResultDataMap[key].mode === 'accordion') {
144
+ return this.showAccordionData;
145
+ }
146
+ return true;
147
+ }
148
+ /**
149
+ * @param {?} key
150
+ * @return {?}
151
+ */
152
+ setHiddenForStrip(key) {
153
+ this.stripsResultDataMap[key].showStrip = false;
154
+ sessionStorage.setItem(`cstrip_${key}`, '1');
155
+ }
156
+ /**
157
+ * @private
158
+ * @param {?} key
159
+ * @return {?}
160
+ */
161
+ getIfStripHidden(key) {
162
+ /** @type {?} */
163
+ const storageItem = sessionStorage.getItem(`cstrip_${key}`);
164
+ return Boolean(storageItem !== '1');
165
+ }
166
+ /**
167
+ * @private
168
+ * @return {?}
169
+ */
170
+ initData() {
171
+ this.stripsKeyOrder = this.widgetData && this.widgetData.strips && this.widgetData.strips.map((/**
172
+ * @param {?} strip
173
+ * @return {?}
174
+ */
175
+ strip => strip.key)) || [];
176
+ if (this.widgetData.loader && this.widgetData.strips.length) {
177
+ this.showParentLoader = true;
178
+ }
179
+ // Fetch the data
180
+ for (const strip of this.widgetData.strips) {
181
+ if (this.checkForEmptyWidget(strip)) {
182
+ this.fetchStripFromRequestData(strip, false);
183
+ }
184
+ else {
185
+ this.processStrip(strip, [], 'done', true, null);
186
+ }
187
+ }
188
+ // Subscription for changes
189
+ /** @type {?} */
190
+ const keyAndEvent = this.widgetData.strips
191
+ .map((/**
192
+ * @param {?} strip
193
+ * @return {?}
194
+ */
195
+ strip => ({
196
+ key: strip.key,
197
+ type: (strip.refreshEvent && strip.refreshEvent.eventType) || '',
198
+ from: (strip.refreshEvent && strip.refreshEvent.from.toString()) || '',
199
+ })))
200
+ .filter((/**
201
+ * @param {?} __0
202
+ * @return {?}
203
+ */
204
+ ({ key, type, from }) => key && type && from));
205
+ /** @type {?} */
206
+ const eventTypeSet = new Set(keyAndEvent.map((/**
207
+ * @param {?} e
208
+ * @return {?}
209
+ */
210
+ e => e.type)));
211
+ this.changeEventSubscription = this.eventSvc.events$
212
+ .pipe(filter((/**
213
+ * @param {?} event
214
+ * @return {?}
215
+ */
216
+ event => eventTypeSet.has(event.eventType))))
217
+ .subscribe((/**
218
+ * @param {?} event
219
+ * @return {?}
220
+ */
221
+ event => {
222
+ keyAndEvent
223
+ .filter((/**
224
+ * @param {?} e
225
+ * @return {?}
226
+ */
227
+ e => e.type === event.eventType && e.from === event.from))
228
+ .map((/**
229
+ * @param {?} e
230
+ * @return {?}
231
+ */
232
+ e => e.key))
233
+ .forEach((/**
234
+ * @param {?} k
235
+ * @return {?}
236
+ */
237
+ k => this.fetchStripFromKey(k, false)));
238
+ }));
239
+ }
240
+ /**
241
+ * @private
242
+ * @param {?} key
243
+ * @param {?=} calculateParentStatus
244
+ * @return {?}
245
+ */
246
+ fetchStripFromKey(key, calculateParentStatus = true) {
247
+ /** @type {?} */
248
+ const stripData = this.widgetData.strips.find((/**
249
+ * @param {?} strip
250
+ * @return {?}
251
+ */
252
+ strip => strip.key === key));
253
+ if (stripData) {
254
+ this.fetchStripFromRequestData(stripData, calculateParentStatus);
255
+ }
256
+ }
257
+ /**
258
+ * @param {?} data
259
+ * @return {?}
260
+ */
261
+ isStripShowing(data) {
262
+ /** @type {?} */
263
+ let count = 0;
264
+ if (data && data.key === this.environment.programStripKey && (!data.tabs || !data.tabs.length) &&
265
+ data.stripTitle === this.environment.programStripName && data.widgets.length > 0) {
266
+ data.widgets.forEach((/**
267
+ * @param {?} key
268
+ * @return {?}
269
+ */
270
+ (key) => {
271
+ if (key && key.widgetData.content.primaryCategory === this.environment.programStripPrimaryCategory) {
272
+ count = count + 1;
273
+ }
274
+ }));
275
+ if (count > 0) {
276
+ data.showStrip = true;
277
+ }
278
+ else {
279
+ data.showStrip = false;
280
+ }
281
+ }
282
+ // console.log('data.key', data, data.key, data.widgets);
283
+ return data.showStrip;
284
+ }
285
+ /**
286
+ * @return {?}
287
+ */
288
+ get isMobile() {
289
+ return this.utilitySvc.isMobile || false;
290
+ }
291
+ /**
292
+ * @param {?} data
293
+ * @return {?}
294
+ */
295
+ getdata(data) {
296
+ if (data.stripInfo) {
297
+ return data.stripInfo.widget;
298
+ }
299
+ return {};
300
+ }
301
+ /**
302
+ * @param {?} wData
303
+ * @param {?} data
304
+ * @return {?}
305
+ */
306
+ checkCondition(wData, data) {
307
+ if (wData.strips[0].stripConfig && wData.strips[0].stripConfig.hideShowAll) {
308
+ return !wData.strips[0].stripConfig.hideShowAll;
309
+ }
310
+ return wData.strips[0].viewMoreUrl && data.widgets && data.widgets.length >= 4;
311
+ }
312
+ /**
313
+ * @param {?} data
314
+ * @return {?}
315
+ */
316
+ checkVisible(data) {
317
+ return data.stripInfo && data.stripInfo.visibilityMode === 'visible';
318
+ }
319
+ /**
320
+ * @param {?} data
321
+ * @return {?}
322
+ */
323
+ getContineuLearningLenth(data) {
324
+ return data.widgets ? data.widgets.length : 0;
325
+ }
326
+ /**
327
+ * @param {?} data
328
+ * @return {?}
329
+ */
330
+ getLength(data) {
331
+ if (!data.tabs || !data.tabs.length) {
332
+ return data.widgets ? data.widgets.length : 0;
333
+ }
334
+ {
335
+ // if tabs are there check if each tab has widgets and get the tab with max widgets
336
+ /** @type {?} */
337
+ const tabWithMaxWidgets = data.tabs.reduce((/**
338
+ * @param {?} prev
339
+ * @param {?} current
340
+ * @return {?}
341
+ */
342
+ (prev, current) => {
343
+ if (!prev.widgets && !current.widgets) {
344
+ return current;
345
+ }
346
+ if (prev.widgets && current.widgets) {
347
+ return (prev.widgets.length > current.widgets.length) ? prev : current;
348
+ }
349
+ if (current.widgets && !prev.widgets) {
350
+ return current;
351
+ }
352
+ if (!current.widgets && prev.widgets) {
353
+ return prev;
354
+ }
355
+ return current;
356
+ // return (prev.widgets && current.widgets && (prev.widgets.length > current.widgets.length) ) ? prev : current
357
+ // tslint:disable-next-line: align
358
+ }), data.tabs[0]);
359
+ // if tabs has atleast 1 widgets then strip will show or else not
360
+ return tabWithMaxWidgets.widgets ? tabWithMaxWidgets.widgets.length : 0;
361
+ }
362
+ }
363
+ /**
364
+ * @private
365
+ * @param {?} v6filters
366
+ * @return {?}
367
+ */
368
+ getFiltersFromArray(v6filters) {
369
+ /** @type {?} */
370
+ const filters = {};
371
+ if (v6filters.constructor === Array) {
372
+ v6filters.forEach(((/**
373
+ * @param {?} f
374
+ * @return {?}
375
+ */
376
+ (f) => {
377
+ Object.keys(f).forEach((/**
378
+ * @param {?} key
379
+ * @return {?}
380
+ */
381
+ key => {
382
+ filters[key] = f[key];
383
+ }));
384
+ })));
385
+ return filters;
386
+ }
387
+ return v6filters;
388
+ }
389
+ /**
390
+ * @private
391
+ * @param {?} v6filters
392
+ * @return {?}
393
+ */
394
+ transformSearchV6FiltersV2(v6filters) {
395
+ /** @type {?} */
396
+ const filters = {};
397
+ if (v6filters.constructor === Array) {
398
+ v6filters.forEach(((/**
399
+ * @param {?} f
400
+ * @return {?}
401
+ */
402
+ (f) => {
403
+ Object.keys(f).forEach((/**
404
+ * @param {?} key
405
+ * @return {?}
406
+ */
407
+ key => {
408
+ filters[key] = f[key];
409
+ }));
410
+ })));
411
+ return filters;
412
+ }
413
+ return v6filters;
414
+ }
415
+ /**
416
+ * @param {?} filters
417
+ * @return {?}
418
+ */
419
+ checkForDateFilters(filters) {
420
+ /** @type {?} */
421
+ let userData;
422
+ if (this.configSvc.userProfile) {
423
+ userData = this.configSvc.userProfile;
424
+ }
425
+ if (filters && filters.hasOwnProperty('batches.endDate')) {
426
+ // tslint:disable-next-line
427
+ filters['batches.endDate']['>='] = eval(filters['batches.endDate']['>=']);
428
+ }
429
+ else if (filters && filters.hasOwnProperty('batches.enrollmentEndDate')) {
430
+ // tslint:disable-next-line
431
+ filters['batches.enrollmentEndDate']['>='] = eval(filters['batches.enrollmentEndDate']['>=']);
432
+ }
433
+ else if (filters.organisation &&
434
+ filters.organisation.indexOf('<orgID>') >= 0) {
435
+ filters.organisation = userData && userData.rootOrgId;
436
+ if (filters && filters.hasOwnProperty('designation')) {
437
+ filters.designation = userData.professionalDetails.length > 0 ?
438
+ userData.professionalDetails[0].designation : '';
439
+ }
440
+ }
441
+ return filters;
442
+ }
443
+ /**
444
+ * @private
445
+ * @param {?} strip
446
+ * @param {?=} calculateParentStatus
447
+ * @return {?}
448
+ */
449
+ fetchStripFromRequestData(strip, calculateParentStatus = true) {
450
+ // setting initial values
451
+ strip.loaderWidgets = this.transformSkeletonToWidgets(strip);
452
+ this.processStrip(strip, [], 'fetching', false, null);
453
+ this.fetchFromEnrollmentList(strip, calculateParentStatus);
454
+ this.fetchFromSearchV6(strip, calculateParentStatus);
455
+ this.fetchFromTrendingContent(strip, calculateParentStatus);
456
+ this.fetchAllCbpPlans(strip, calculateParentStatus);
457
+ // this.enrollInterval = setInterval(() => {
458
+ // this.fetchAllCbpPlans(strip, calculateParentStatus)
459
+ // }, 1000)
460
+ }
461
+ /**
462
+ * @param {?} strip
463
+ * @param {?=} calculateParentStatus
464
+ * @return {?}
465
+ */
466
+ fetchFromEnrollmentList(strip, calculateParentStatus = true) {
467
+ if (strip.request && strip.request.enrollmentList && Object.keys(strip.request.enrollmentList).length) {
468
+ /** @type {?} */
469
+ let userId = '';
470
+ /** @type {?} */
471
+ let content;
472
+ /** @type {?} */
473
+ let contentNew;
474
+ /** @type {?} */
475
+ let tabResults = [];
476
+ /** @type {?} */
477
+ const queryParams = _.get(strip.request.enrollmentList, 'queryParams');
478
+ if (this.configSvc.userProfile) {
479
+ userId = this.configSvc.userProfile.userId;
480
+ }
481
+ // tslint:disable-next-line: deprecation
482
+ this.userSvc.fetchUserBatchList(userId, queryParams).subscribe((/**
483
+ * @param {?} result
484
+ * @return {?}
485
+ */
486
+ (result) => {
487
+ /** @type {?} */
488
+ const courses = result && result.courses;
489
+ /** @type {?} */
490
+ const showViewMore = Boolean(courses.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
491
+ /** @type {?} */
492
+ const viewMoreUrl = showViewMore
493
+ ? {
494
+ path: (strip.viewMoreUrl && strip.viewMoreUrl.path) || '',
495
+ queryParams: {
496
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
497
+ f: strip.request && strip.request.searchV6 && strip.request.searchV6.filters
498
+ ? JSON.stringify(
499
+ // this.searchServSvc.transformSearchV6Filters(
500
+ strip.request.searchV6.filters
501
+ // ),
502
+ )
503
+ : {},
504
+ },
505
+ }
506
+ : null;
507
+ if (courses && courses.length) {
508
+ content = courses.map((/**
509
+ * @param {?} c
510
+ * @return {?}
511
+ */
512
+ (c) => {
513
+ /** @type {?} */
514
+ const contentTemp = c.content;
515
+ contentTemp.completionPercentage = c.completionPercentage || c.progress || 0;
516
+ contentTemp.completionStatus = c.completionStatus || c.status || 0;
517
+ contentTemp.enrolledDate = c.enrolledDate || '';
518
+ contentTemp.lastContentAccessTime = c.lastContentAccessTime || '';
519
+ contentTemp.lastReadContentStatus = c.lastReadContentStatus || '';
520
+ contentTemp.lastReadContentId = c.lastReadContentId || '';
521
+ contentTemp.lrcProgressDetails = c.lrcProgressDetails || '';
522
+ contentTemp.issuedCertificates = c.issuedCertificates || [];
523
+ contentTemp.batchId = c.batchId || '';
524
+ return contentTemp;
525
+ }));
526
+ }
527
+ // To filter content with completionPercentage > 0,
528
+ // so that only those content will show in home page
529
+ // continue learing strip
530
+ // if (content && content.length) {
531
+ // contentNew = content.filter((c: any) => {
532
+ // /** commented as both are 0 after enrolll */
533
+ // if (c.completionPercentage && c.completionPercentage > 0) {
534
+ // return c
535
+ // }
536
+ // })
537
+ // }
538
+ // To sort in descending order of the enrolled date
539
+ contentNew = (content || []).sort((/**
540
+ * @param {?} a
541
+ * @param {?} b
542
+ * @return {?}
543
+ */
544
+ (a, b) => {
545
+ /** @type {?} */
546
+ const dateA = new Date(a.lastContentAccessTime || 0);
547
+ /** @type {?} */
548
+ const dateB = new Date(b.lastContentAccessTime || 0);
549
+ return dateB - dateA;
550
+ }));
551
+ if (strip.tabs && strip.tabs.length) {
552
+ tabResults = this.splitEnrollmentTabsData(contentNew, strip);
553
+ this.processStrip(strip, this.transformContentsToWidgets(contentNew, strip), 'done', calculateParentStatus, viewMoreUrl, tabResults);
554
+ }
555
+ else {
556
+ this.processStrip(strip, this.transformContentsToWidgets(contentNew, strip), 'done', calculateParentStatus, viewMoreUrl);
557
+ }
558
+ }), (/**
559
+ * @return {?}
560
+ */
561
+ () => {
562
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
563
+ }));
564
+ }
565
+ }
566
+ /**
567
+ * @param {?} contentNew
568
+ * @param {?} strip
569
+ * @return {?}
570
+ */
571
+ splitEnrollmentTabsData(contentNew, strip) {
572
+ /** @type {?} */
573
+ const tabResults = [];
574
+ /** @type {?} */
575
+ const splitData = this.getInprogressAndCompleted(contentNew, (/**
576
+ * @param {?} e
577
+ * @return {?}
578
+ */
579
+ (e) => e.completionStatus === 1 || e.completionPercentage < 100), strip);
580
+ if (strip.tabs && strip.tabs.length) {
581
+ for (let i = 0; i < strip.tabs.length; i += 1) {
582
+ if (strip.tabs[i]) {
583
+ tabResults.push(Object.assign({}, strip.tabs[i], { fetchTabStatus: 'done' }, (splitData.find((/**
584
+ * @param {?} itmInner
585
+ * @return {?}
586
+ */
587
+ itmInner => {
588
+ if (strip.tabs && strip.tabs[i] && itmInner.value === strip.tabs[i].value) {
589
+ return itmInner;
590
+ }
591
+ return undefined;
592
+ })))));
593
+ }
594
+ }
595
+ }
596
+ return tabResults;
597
+ }
598
+ /**
599
+ * @param {?} array
600
+ * @param {?} customFilter
601
+ * @param {?} strip
602
+ * @return {?}
603
+ */
604
+ getInprogressAndCompleted(array, customFilter, strip) {
605
+ /** @type {?} */
606
+ const inprogress = [];
607
+ /** @type {?} */
608
+ const completed = [];
609
+ array.forEach((/**
610
+ * @param {?} e
611
+ * @param {?} idx
612
+ * @param {?} arr
613
+ * @return {?}
614
+ */
615
+ (e, idx, arr) => (customFilter(e, idx, arr) ? inprogress : completed).push(e)));
616
+ return [
617
+ { value: 'inprogress', widgets: this.transformContentsToWidgets(inprogress, strip) },
618
+ { value: 'completed', widgets: this.transformContentsToWidgets(completed, strip) }
619
+ ];
620
+ }
621
+ /**
622
+ * @param {?} strip
623
+ * @param {?=} calculateParentStatus
624
+ * @return {?}
625
+ */
626
+ fetchFromSearchV6(strip, calculateParentStatus = true) {
627
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
628
+ if (strip.request && strip.request.searchV6 && Object.keys(strip.request.searchV6).length) {
629
+ // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
630
+ // if (this.configSvc.activeLocale) {
631
+ // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
632
+ // } else {
633
+ // strip.request.searchV6.locale = ['en']
634
+ // }
635
+ // }
636
+ /** @type {?} */
637
+ let originalFilters = [];
638
+ // tslint:disable:no-console
639
+ console.log(originalFilters);
640
+ if (strip.request &&
641
+ strip.request.searchV6 &&
642
+ strip.request.searchV6.request &&
643
+ strip.request.searchV6.request.filters) {
644
+ originalFilters = strip.request.searchV6.request.filters;
645
+ strip.request.searchV6.request.filters = this.checkForDateFilters(strip.request.searchV6.request.filters);
646
+ strip.request.searchV6.request.filters = this.getFiltersFromArray(strip.request.searchV6.request.filters);
647
+ }
648
+ if (strip.tabs && strip.tabs.length) {
649
+ // TODO: Have to extract requestRequired to outer level of tabs config
650
+ /** @type {?} */
651
+ const firstTab = strip.tabs[0];
652
+ if (firstTab.requestRequired) {
653
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
654
+ /** @type {?} */
655
+ const allTabs = this.stripsResultDataMap[strip.key].tabs;
656
+ /** @type {?} */
657
+ const currentTabFromMap = (/** @type {?} */ ((allTabs && allTabs.length && allTabs[0])));
658
+ this.getTabDataByNewReqSearchV6(strip, 0, currentTabFromMap, calculateParentStatus);
659
+ }
660
+ }
661
+ }
662
+ else {
663
+ try {
664
+ /** @type {?} */
665
+ const response = yield this.searchV6Request(strip, strip.request, calculateParentStatus);
666
+ // console.log('calling after - response, ', response)
667
+ if (response && response.results) {
668
+ // console.log('calling after-- ')
669
+ if (response.results.result.content) {
670
+ this.processStrip(strip, this.transformContentsToWidgets(response.results.result.content, strip), 'done', calculateParentStatus, response.viewMoreUrl);
671
+ }
672
+ else if (response.results.result.Event) {
673
+ this.processStrip(strip, this.transformEventsToWidgets(response.results.result.Event, strip), 'done', calculateParentStatus, response.viewMoreUrl);
674
+ }
675
+ else {
676
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
677
+ }
678
+ }
679
+ else {
680
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
681
+ }
682
+ }
683
+ catch (error) {
684
+ // Handle errors
685
+ // console.error('Error:', error);
686
+ }
687
+ }
688
+ }
689
+ });
690
+ }
691
+ /**
692
+ * @param {?} strip
693
+ * @param {?} request
694
+ * @param {?} calculateParentStatus
695
+ * @return {?}
696
+ */
697
+ searchV6Request(strip, request, calculateParentStatus) {
698
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
699
+ /** @type {?} */
700
+ const originalFilters = [];
701
+ return new Promise((/**
702
+ * @param {?} resolve
703
+ * @param {?} reject
704
+ * @return {?}
705
+ */
706
+ (resolve, reject) => {
707
+ if (request && request.searchV6) {
708
+ this.contentSvc.searchV6(request.searchV6).subscribe((/**
709
+ * @param {?} results
710
+ * @return {?}
711
+ */
712
+ results => {
713
+ /** @type {?} */
714
+ const showViewMore = Boolean(results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
715
+ /** @type {?} */
716
+ const viewMoreUrl = showViewMore
717
+ ? {
718
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
719
+ queryParams: {
720
+ tab: 'Learn',
721
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
722
+ f: request &&
723
+ request.searchV6 &&
724
+ request.searchV6.request &&
725
+ request.searchV6.request.filters
726
+ ? JSON.stringify(this.transformSearchV6FiltersV2(originalFilters))
727
+ : {},
728
+ },
729
+ }
730
+ : null;
731
+ // if (viewMoreUrl && viewMoreUrl.queryParams) {
732
+ // viewMoreUrl.queryParams = viewMoreUrl.queryParams
733
+ // }
734
+ resolve({ results, viewMoreUrl });
735
+ }), (/**
736
+ * @param {?} error
737
+ * @return {?}
738
+ */
739
+ (error) => {
740
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
741
+ reject(error);
742
+ }));
743
+ }
744
+ }));
745
+ });
746
+ }
747
+ /**
748
+ * @param {?} strip
749
+ * @param {?=} calculateParentStatus
750
+ * @return {?}
751
+ */
752
+ fetchFromTrendingContent(strip, calculateParentStatus = true) {
753
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
754
+ if (strip.request && strip.request.trendingSearch && Object.keys(strip.request.trendingSearch).length) {
755
+ // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
756
+ // if (this.configSvc.activeLocale) {
757
+ // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
758
+ // } else {
759
+ // strip.request.searchV6.locale = ['en']
760
+ // }
761
+ // }
762
+ /** @type {?} */
763
+ let originalFilters = [];
764
+ // tslint:disable:no-console
765
+ console.log(originalFilters);
766
+ if (strip.request &&
767
+ strip.request.trendingSearch &&
768
+ strip.request.trendingSearch.request &&
769
+ strip.request.trendingSearch.request.filters) {
770
+ originalFilters = strip.request.trendingSearch.request.filters;
771
+ strip.request.trendingSearch.request.filters = this.checkForDateFilters(strip.request.trendingSearch.request.filters);
772
+ strip.request.trendingSearch.request.filters = this.getFiltersFromArray(strip.request.trendingSearch.request.filters);
773
+ }
774
+ if (strip.tabs && strip.tabs.length) {
775
+ // TODO: Have to extract requestRequired to outer level of tabs config
776
+ /** @type {?} */
777
+ const firstTab = strip.tabs[0];
778
+ if (firstTab.requestRequired) {
779
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
780
+ /** @type {?} */
781
+ const allTabs = this.stripsResultDataMap[strip.key].tabs;
782
+ /** @type {?} */
783
+ const currentTabFromMap = (/** @type {?} */ ((allTabs && allTabs.length && allTabs[0])));
784
+ this.getTabDataByNewReqTrending(strip, 0, currentTabFromMap, calculateParentStatus);
785
+ }
786
+ }
787
+ }
788
+ else {
789
+ try {
790
+ /** @type {?} */
791
+ const response = yield this.trendingSearchRequest(strip, strip.request, calculateParentStatus);
792
+ if (response && response.results && response.results.response) {
793
+ /** @type {?} */
794
+ const content = response.results.response[strip.request.trendingSearch.responseKey] || [];
795
+ this.processStrip(strip, this.transformContentsToWidgets(content, strip), 'done', calculateParentStatus, response.viewMoreUrl || '');
796
+ }
797
+ else {
798
+ this.processStrip(strip, [], 'done', calculateParentStatus, null);
799
+ }
800
+ }
801
+ catch (error) {
802
+ // Handle errors
803
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
804
+ }
805
+ }
806
+ }
807
+ });
808
+ }
809
+ /**
810
+ * @param {?} strip
811
+ * @param {?} request
812
+ * @param {?} calculateParentStatus
813
+ * @return {?}
814
+ */
815
+ trendingSearchRequest(strip, request, calculateParentStatus) {
816
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
817
+ /** @type {?} */
818
+ const originalFilters = [];
819
+ return new Promise((/**
820
+ * @param {?} resolve
821
+ * @param {?} reject
822
+ * @return {?}
823
+ */
824
+ (resolve, reject) => {
825
+ if (request && request.trendingSearch) {
826
+ // check for the request if it has dynamic values]
827
+ if (request.trendingSearch.request.filters.organisation &&
828
+ request.trendingSearch.request.filters.organisation.indexOf('<orgID>') >= 0) {
829
+ /** @type {?} */
830
+ let userRootOrgId;
831
+ if (this.configSvc.userProfile) {
832
+ userRootOrgId = this.configSvc.userProfile.rootOrgId;
833
+ }
834
+ request.trendingSearch.request.filters.organisation = userRootOrgId;
835
+ }
836
+ this.contentSvc.trendingContentSearch(request.trendingSearch).subscribe((/**
837
+ * @param {?} results
838
+ * @return {?}
839
+ */
840
+ results => {
841
+ /** @type {?} */
842
+ const showViewMore = Boolean(results.result &&
843
+ strip.request &&
844
+ results.result[strip.request.trendingSearch.responseKey] &&
845
+ results.result[strip.request.trendingSearch.responseKey].length > 5 &&
846
+ strip.stripConfig && strip.stripConfig.postCardForSearch);
847
+ /** @type {?} */
848
+ const viewMoreUrl = showViewMore
849
+ ? {
850
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
851
+ queryParams: {
852
+ tab: 'Learn',
853
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
854
+ f: request &&
855
+ request.trendingSearch &&
856
+ request.trendingSearch.request &&
857
+ request.trendingSearch.request.filters
858
+ ? JSON.stringify(this.transformSearchV6FiltersV2(originalFilters))
859
+ : {},
860
+ },
861
+ }
862
+ : null;
863
+ resolve({ results, viewMoreUrl });
864
+ }), (/**
865
+ * @param {?} error
866
+ * @return {?}
867
+ */
868
+ (error) => {
869
+ if (error.error && error.error.status === 400) {
870
+ this.processStrip(strip, [], 'done', calculateParentStatus, null);
871
+ }
872
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null)
873
+ reject(error);
874
+ }));
875
+ }
876
+ }));
877
+ });
878
+ }
879
+ /**
880
+ * @param {?} data
881
+ * @return {?}
882
+ */
883
+ toggleInfo(data) {
884
+ /** @type {?} */
885
+ const stripInfo = this.stripsResultDataMap[data.key].stripInfo;
886
+ if (stripInfo) {
887
+ if (stripInfo.mode !== 'below') {
888
+ this.loggerSvc.warn(`strip info mode: ${stripInfo.mode} not implemented yet`);
889
+ stripInfo.mode = 'below';
890
+ }
891
+ if (stripInfo.mode === 'below') {
892
+ this.stripsResultDataMap[data.key].stripInfo = Object.assign({}, stripInfo, { visibilityMode: stripInfo.visibilityMode === 'hidden' ? 'visible' : 'hidden' });
893
+ }
894
+ }
895
+ }
896
+ /**
897
+ * @private
898
+ * @param {?} contents
899
+ * @param {?} strip
900
+ * @return {?}
901
+ */
902
+ transformContentsToWidgets(contents, strip) {
903
+ return (contents || []).map((/**
904
+ * @param {?} content
905
+ * @param {?} idx
906
+ * @return {?}
907
+ */
908
+ (content, idx) => (content ? {
909
+ widgetType: 'cardLib',
910
+ widgetSubType: 'cardContentLib',
911
+ widgetHostClass: 'mb-2',
912
+ widgetData: Object.assign({ content }, (content.batch && { batch: content.batch }), { cardSubType: strip.stripConfig && strip.stripConfig.cardSubType, cardCustomeClass: strip.customeClass ? strip.customeClass : '', context: { pageSection: strip.key, position: idx }, intranetMode: strip.stripConfig && strip.stripConfig.intranetMode, deletedMode: strip.stripConfig && strip.stripConfig.deletedMode, contentTags: strip.stripConfig && strip.stripConfig.contentTags }),
913
+ } : {
914
+ widgetType: 'card',
915
+ widgetSubType: 'cardContent',
916
+ widgetHostClass: 'mb-2',
917
+ widgetData: {},
918
+ })));
919
+ }
920
+ /**
921
+ * @private
922
+ * @param {?} contents
923
+ * @param {?} strip
924
+ * @return {?}
925
+ */
926
+ transformEventsToWidgets(contents, strip) {
927
+ this.eventSvc.setEventListData(contents);
928
+ return (this.eventSvc.todaysEvents || []).map((/**
929
+ * @param {?} content
930
+ * @param {?} idx
931
+ * @return {?}
932
+ */
933
+ (content, idx) => (content ? {
934
+ widgetType: 'card',
935
+ widgetSubType: 'eventHubCard',
936
+ widgetHostClass: 'mb-2',
937
+ widgetData: {
938
+ content,
939
+ cardSubType: strip.stripConfig && strip.stripConfig.cardSubType,
940
+ cardCustomeClass: strip.customeClass ? strip.customeClass : '',
941
+ context: { pageSection: strip.key, position: idx },
942
+ intranetMode: strip.stripConfig && strip.stripConfig.intranetMode,
943
+ deletedMode: strip.stripConfig && strip.stripConfig.deletedMode,
944
+ contentTags: strip.stripConfig && strip.stripConfig.contentTags,
945
+ },
946
+ } : {
947
+ widgetType: 'card',
948
+ widgetSubType: 'eventHubCard',
949
+ widgetHostClass: 'mb-2',
950
+ widgetData: {},
951
+ })));
952
+ }
953
+ /**
954
+ * @private
955
+ * @param {?} strip
956
+ * @return {?}
957
+ */
958
+ transformSkeletonToWidgets(strip) {
959
+ return [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10].map((/**
960
+ * @param {?} _content
961
+ * @return {?}
962
+ */
963
+ _content => ({
964
+ widgetType: 'cardLib',
965
+ widgetSubType: 'cardContentLib',
966
+ widgetHostClass: 'mb-2',
967
+ widgetData: {
968
+ cardSubType: strip.loaderConfig && strip.loaderConfig.cardSubType || 'card-standard-skeleton',
969
+ cardCustomeClass: strip.customeClass ? strip.customeClass : '',
970
+ },
971
+ })));
972
+ }
973
+ /**
974
+ * @private
975
+ * @param {?} strip
976
+ * @param {?=} results
977
+ * @param {?=} fetchStatus
978
+ * @param {?=} calculateParentStatus
979
+ * @param {?=} _viewMoreUrl
980
+ * @param {?=} tabsResults
981
+ * @return {?}
982
+ */
983
+ processStrip(strip, results = [], fetchStatus, calculateParentStatus = true, _viewMoreUrl, tabsResults) {
984
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
985
+ /** @type {?} */
986
+ const stripData = {
987
+ viewMoreUrl: strip.viewMoreUrl,
988
+ key: strip.key,
989
+ canHideStrip: Boolean(strip.canHideStrip),
990
+ showStrip: this.getIfStripHidden(strip.key),
991
+ noDataWidget: strip.noDataWidget,
992
+ errorWidget: strip.errorWidget,
993
+ stripInfo: strip.info,
994
+ stripTitle: strip.title,
995
+ stripTitleLink: strip.stripTitleLink,
996
+ disableTranslate: strip.disableTranslate,
997
+ sliderConfig: strip.sliderConfig,
998
+ tabs: tabsResults ? tabsResults : strip.tabs,
999
+ stripName: strip.name,
1000
+ mode: strip.mode,
1001
+ stripConfig: strip.stripConfig,
1002
+ stripBackground: strip.stripBackground,
1003
+ secondaryHeading: strip.secondaryHeading,
1004
+ loaderWidgets: strip.loaderWidgets || [],
1005
+ widgets: fetchStatus === 'done'
1006
+ ? [
1007
+ ...(strip.preWidgets || []).map((/**
1008
+ * @param {?} w
1009
+ * @return {?}
1010
+ */
1011
+ w => (Object.assign({}, w, { widgetHostClass: `mb-2 ${w.widgetHostClass}` })))),
1012
+ ...results,
1013
+ ...(strip.postWidgets || []).map((/**
1014
+ * @param {?} w
1015
+ * @return {?}
1016
+ */
1017
+ w => (Object.assign({}, w, { widgetHostClass: `mb-2 ${w.widgetHostClass}` })))),
1018
+ ]
1019
+ : [],
1020
+ showOnNoData: Boolean(strip.noDataWidget &&
1021
+ !((strip.preWidgets || []).length + results.length + (strip.postWidgets || []).length) &&
1022
+ fetchStatus === 'done'),
1023
+ showOnLoader: Boolean(strip.loader && fetchStatus === 'fetching'),
1024
+ showOnError: Boolean(strip.errorWidget && fetchStatus === 'error'),
1025
+ };
1026
+ // const stripData = this.stripsResultDataMap[strip.key]
1027
+ this.stripsResultDataMap = Object.assign({}, this.stripsResultDataMap, { [strip.key]: stripData });
1028
+ if (!tabsResults) {
1029
+ if (calculateParentStatus &&
1030
+ (fetchStatus === 'done' || fetchStatus === 'error') &&
1031
+ stripData.widgets) {
1032
+ this.checkParentStatus(fetchStatus, stripData.widgets.length);
1033
+ }
1034
+ if (calculateParentStatus && !(results && results.length > 0)) {
1035
+ this.contentAvailable = false;
1036
+ }
1037
+ else if (results && results.length > 0) {
1038
+ this.contentAvailable = true;
1039
+ }
1040
+ }
1041
+ else {
1042
+ this.contentAvailable = true;
1043
+ }
1044
+ });
1045
+ }
1046
+ /**
1047
+ * @private
1048
+ * @param {?} fetchStatus
1049
+ * @param {?} stripWidgetsCount
1050
+ * @return {?}
1051
+ */
1052
+ checkParentStatus(fetchStatus, stripWidgetsCount) {
1053
+ if (fetchStatus === 'done' && !stripWidgetsCount) {
1054
+ this.noDataCount += 1;
1055
+ }
1056
+ else if (fetchStatus === 'done' && stripWidgetsCount) {
1057
+ this.successDataCount += 1;
1058
+ }
1059
+ else if (fetchStatus === 'error') {
1060
+ this.errorDataCount += 1;
1061
+ }
1062
+ /** @type {?} */
1063
+ const settledCount = this.noDataCount + this.successDataCount + this.errorDataCount;
1064
+ /** @type {?} */
1065
+ const totalCount = this.widgetData.strips.length;
1066
+ if (this.successDataCount > 0 && settledCount < totalCount) {
1067
+ return;
1068
+ }
1069
+ this.showParentLoader = settledCount !== totalCount;
1070
+ this.showParentNoData =
1071
+ this.noDataCount > 0 && this.noDataCount + this.errorDataCount === totalCount;
1072
+ this.showParentError = this.errorDataCount === totalCount;
1073
+ }
1074
+ /**
1075
+ * @param {?} strip
1076
+ * @return {?}
1077
+ */
1078
+ checkForEmptyWidget(strip) {
1079
+ if (strip.request &&
1080
+ ((strip.request.api && Object.keys(strip.request.api).length) ||
1081
+ (strip.request.search && Object.keys(strip.request.search).length) ||
1082
+ (strip.request.searchRegionRecommendation &&
1083
+ Object.keys(strip.request.searchRegionRecommendation).length) ||
1084
+ (strip.request.searchV6 && Object.keys(strip.request.searchV6).length) ||
1085
+ (strip.request.enrollmentList && Object.keys(strip.request.enrollmentList).length) ||
1086
+ (strip.request.cbpList && Object.keys(strip.request.cbpList).length) ||
1087
+ (strip.request.trendingSearch && Object.keys(strip.request.trendingSearch).length))) {
1088
+ return true;
1089
+ }
1090
+ return false;
1091
+ }
1092
+ /**
1093
+ * @param {?} tabEvent
1094
+ * @param {?} stripMap
1095
+ * @param {?} stripKey
1096
+ * @return {?}
1097
+ */
1098
+ tabClicked(tabEvent, stripMap, stripKey) {
1099
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1100
+ stripMap.tabs[tabEvent.index].fetchTabStatus = 'inprogress';
1101
+ stripMap.tabs[tabEvent.index].tabLoading = true;
1102
+ stripMap.showOnLoader = true;
1103
+ }
1104
+ /** @type {?} */
1105
+ const data = {
1106
+ label: `${tabEvent.tab.textLabel}`,
1107
+ index: tabEvent.index,
1108
+ };
1109
+ this.eventSvc.raiseInteractTelemetry({
1110
+ type: WsEvents.EnumInteractTypes.CLICK,
1111
+ subType: WsEvents.EnumInteractSubTypes.HOME_PAGE_STRIP_TABS,
1112
+ id: `${_.camelCase(data.label)}-tab`,
1113
+ }, {}, {
1114
+ module: WsEvents.EnumTelemetrymodules.HOME,
1115
+ });
1116
+ /** @type {?} */
1117
+ const currentTabFromMap = stripMap.tabs && stripMap.tabs[tabEvent.index];
1118
+ /** @type {?} */
1119
+ const currentStrip = this.widgetData.strips.find((/**
1120
+ * @param {?} s
1121
+ * @return {?}
1122
+ */
1123
+ s => s.key === stripKey));
1124
+ if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
1125
+ this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = Object.assign({}, this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams, { tabSelected: currentTabFromMap.label });
1126
+ }
1127
+ if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick) {
1128
+ if (currentTabFromMap.requestRequired && currentTabFromMap.request) {
1129
+ // call API to get tab data and process
1130
+ // this.processStrip(currentStrip, [], 'fetching', true, null)
1131
+ if (currentTabFromMap.request.searchV6) {
1132
+ this.getTabDataByNewReqSearchV6(currentStrip, tabEvent.index, currentTabFromMap, true);
1133
+ }
1134
+ else if (currentTabFromMap.request.trendingSearch) {
1135
+ this.getTabDataByNewReqTrending(currentStrip, tabEvent.index, currentTabFromMap, true);
1136
+ }
1137
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1138
+ stripMap.tabs[tabEvent.index].tabLoading = false;
1139
+ }
1140
+ }
1141
+ else {
1142
+ this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
1143
+ setTimeout((/**
1144
+ * @return {?}
1145
+ */
1146
+ () => {
1147
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1148
+ stripMap.tabs[tabEvent.index].tabLoading = false;
1149
+ stripMap.tabs[tabEvent.index].fetchTabStatus = 'done';
1150
+ stripMap.showOnLoader = false;
1151
+ }
1152
+ }), 200);
1153
+ }
1154
+ }
1155
+ }
1156
+ /**
1157
+ * @param {?} strip
1158
+ * @param {?} tabIndex
1159
+ * @param {?} currentTab
1160
+ * @param {?} calculateParentStatus
1161
+ * @return {?}
1162
+ */
1163
+ getTabDataByNewReqSearchV6(strip, tabIndex, currentTab, calculateParentStatus) {
1164
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
1165
+ try {
1166
+ /** @type {?} */
1167
+ const response = yield this.searchV6Request(strip, currentTab.request, calculateParentStatus);
1168
+ if (response && response.results) {
1169
+ /** @type {?} */
1170
+ const widgets = this.transformContentsToWidgets(response.results.result.content, strip);
1171
+ /** @type {?} */
1172
+ let tabResults = [];
1173
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1174
+ /** @type {?} */
1175
+ const allTabs = this.stripsResultDataMap[strip.key].tabs;
1176
+ if (allTabs && allTabs.length && allTabs[tabIndex]) {
1177
+ allTabs[tabIndex] = Object.assign({}, allTabs[tabIndex], { widgets, fetchTabStatus: 'done' });
1178
+ tabResults = allTabs;
1179
+ }
1180
+ }
1181
+ this.processStrip(strip, widgets, 'done', calculateParentStatus, response.viewMoreUrl, tabResults // tabResults as widgets
1182
+ );
1183
+ }
1184
+ else {
1185
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
1186
+ }
1187
+ }
1188
+ catch (error) {
1189
+ // Handle errors
1190
+ // console.error('Error:', error);
1191
+ }
1192
+ });
1193
+ }
1194
+ /**
1195
+ * @param {?} strip
1196
+ * @param {?} tabIndex
1197
+ * @param {?} currentTab
1198
+ * @param {?} calculateParentStatus
1199
+ * @return {?}
1200
+ */
1201
+ getTabDataByNewReqTrending(strip, tabIndex, currentTab, calculateParentStatus) {
1202
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
1203
+ try {
1204
+ /** @type {?} */
1205
+ const response = yield this.trendingSearchRequest(strip, currentTab.request, calculateParentStatus);
1206
+ if (response && response.results && response.results.response) {
1207
+ /** @type {?} */
1208
+ const content = response.results.response[currentTab.value] || [];
1209
+ /** @type {?} */
1210
+ const widgets = this.transformContentsToWidgets(content, strip);
1211
+ // console.log('currentTab --- widgets', widgets)
1212
+ /** @type {?} */
1213
+ let tabResults = [];
1214
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1215
+ /** @type {?} */
1216
+ const allTabs = this.stripsResultDataMap[strip.key].tabs;
1217
+ if (allTabs && allTabs.length && allTabs[tabIndex]) {
1218
+ allTabs[tabIndex] = Object.assign({}, allTabs[tabIndex], { widgets, fetchTabStatus: 'done' });
1219
+ tabResults = allTabs;
1220
+ }
1221
+ }
1222
+ // console.log('tabResults -++++***--', tabResults)
1223
+ // console.log('calling after-- ')
1224
+ this.processStrip(strip, widgets, 'done', calculateParentStatus, response.viewMoreUrl, tabResults // tabResults as widgets
1225
+ );
1226
+ }
1227
+ else {
1228
+ this.processStrip(strip, [], 'done', calculateParentStatus, null);
1229
+ }
1230
+ }
1231
+ catch (error) {
1232
+ // Handle errors
1233
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
1234
+ }
1235
+ });
1236
+ }
1237
+ /**
1238
+ * @param {?} strip
1239
+ * @param {?} currentTab
1240
+ * @param {?} calculateParentStatus
1241
+ * @return {?}
1242
+ */
1243
+ getTabDataByfilter(strip, currentTab, calculateParentStatus) {
1244
+ // tslint:disable:no-console
1245
+ console.log('strip -- ', strip);
1246
+ // tslint:disable:no-console
1247
+ console.log('currentTab -- ', currentTab);
1248
+ // tslint:disable:no-console
1249
+ console.log('calculateParentStatus-- ', calculateParentStatus);
1250
+ // TODO: Write logic for individual filter if passed in config
1251
+ // add switch case based on config key passed
1252
+ }
1253
+ /**
1254
+ * @param {?} strip
1255
+ * @param {?=} calculateParentStatus
1256
+ * @return {?}
1257
+ */
1258
+ fetchAllCbpPlans(strip, calculateParentStatus = true) {
1259
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
1260
+ if (strip.request && strip.request.cbpList && Object.keys(strip.request.cbpList).length) {
1261
+ /** @type {?} */
1262
+ let courses;
1263
+ /** @type {?} */
1264
+ let tabResults = [];
1265
+ /** @type {?} */
1266
+ const response = yield this.userSvc.fetchCbpPlanList().toPromise();
1267
+ if (response) {
1268
+ courses = response;
1269
+ if (strip.tabs && strip.tabs.length) {
1270
+ tabResults = this.splitCbpTabsData(courses, strip);
1271
+ yield this.processStrip(strip, this.transformContentsToWidgets(courses, strip), 'done', calculateParentStatus, '', tabResults);
1272
+ }
1273
+ else {
1274
+ this.processStrip(strip, this.transformContentsToWidgets(courses, strip), 'done', calculateParentStatus, 'viewMoreUrl');
1275
+ }
1276
+ }
1277
+ // this.userSvc.fetchCbpPlanList().subscribe( async (res: any) => {
1278
+ // if (res) {
1279
+ // console.log(res,'===============================>')
1280
+ // courses = res
1281
+ // if (strip.tabs && strip.tabs.length) {
1282
+ // tabResults = this.splitCbpTabsData(courses, strip)
1283
+ // await this.processStrip(
1284
+ // strip,
1285
+ // this.transformContentsToWidgets(courses, strip),
1286
+ // 'done',
1287
+ // calculateParentStatus,
1288
+ // '',
1289
+ // tabResults
1290
+ // )
1291
+ // } else {
1292
+ // this.processStrip(
1293
+ // strip,
1294
+ // this.transformContentsToWidgets(courses, strip),
1295
+ // 'done',
1296
+ // calculateParentStatus,
1297
+ // 'viewMoreUrl',
1298
+ // )
1299
+ // }
1300
+ // }
1301
+ // }, (_err: any) => {
1302
+ // })
1303
+ clearInterval(this.enrollInterval);
1304
+ }
1305
+ });
1306
+ }
1307
+ /**
1308
+ * @param {?} contentNew
1309
+ * @param {?} strip
1310
+ * @return {?}
1311
+ */
1312
+ splitCbpTabsData(contentNew, strip) {
1313
+ /** @type {?} */
1314
+ const tabResults = [];
1315
+ /** @type {?} */
1316
+ const splitData = this.getTabsList(contentNew, strip);
1317
+ if (strip.tabs && strip.tabs.length) {
1318
+ for (let i = 0; i < strip.tabs.length; i += 1) {
1319
+ if (strip.tabs[i]) {
1320
+ tabResults.push(Object.assign({}, strip.tabs[i], { fetchTabStatus: 'done' }, (splitData.find((/**
1321
+ * @param {?} itmInner
1322
+ * @return {?}
1323
+ */
1324
+ itmInner => {
1325
+ if (strip.tabs && strip.tabs[i] && itmInner.value === strip.tabs[i].value) {
1326
+ return itmInner;
1327
+ }
1328
+ return undefined;
1329
+ })))));
1330
+ }
1331
+ }
1332
+ }
1333
+ return tabResults;
1334
+ }
1335
+ /**
1336
+ * @param {?} array
1337
+ * @param {?} strip
1338
+ * @return {?}
1339
+ */
1340
+ getTabsList(array, strip) {
1341
+ /** @type {?} */
1342
+ let all = [];
1343
+ /** @type {?} */
1344
+ let upcoming = [];
1345
+ /** @type {?} */
1346
+ let overdue = [];
1347
+ array.forEach((/**
1348
+ * @param {?} e
1349
+ * @return {?}
1350
+ */
1351
+ (e) => {
1352
+ all.push(e);
1353
+ if (e.planDuration === NsCardContent.ACBPConst.OVERDUE) {
1354
+ overdue.push(e);
1355
+ }
1356
+ else if (e.planDuration === NsCardContent.ACBPConst.UPCOMING) {
1357
+ upcoming.push(e);
1358
+ }
1359
+ }));
1360
+ /** @type {?} */
1361
+ const allCompleted = all.filter((/**
1362
+ * @param {?} allData
1363
+ * @return {?}
1364
+ */
1365
+ (allData) => allData.contentStatus === 2));
1366
+ /** @type {?} */
1367
+ let allInCompleted = all.filter((/**
1368
+ * @param {?} allData
1369
+ * @return {?}
1370
+ */
1371
+ (allData) => allData.contentStatus < 2));
1372
+ /** @type {?} */
1373
+ let allCompletedOverDue = allCompleted.filter((/**
1374
+ * @param {?} allData
1375
+ * @return {?}
1376
+ */
1377
+ (allData) => allData.planDuration === NsCardContent.ACBPConst.OVERDUE));
1378
+ /** @type {?} */
1379
+ const allCompletedAll = allCompleted.filter((/**
1380
+ * @param {?} allData
1381
+ * @return {?}
1382
+ */
1383
+ (allData) => allData.planDuration !== NsCardContent.ACBPConst.OVERDUE));
1384
+ allCompletedOverDue = allCompletedOverDue.sort((/**
1385
+ * @param {?} a
1386
+ * @param {?} b
1387
+ * @return {?}
1388
+ */
1389
+ (a, b) => {
1390
+ if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
1391
+ /** @type {?} */
1392
+ const firstDate = new Date(a.endDate);
1393
+ /** @type {?} */
1394
+ const secondDate = new Date(b.endDate);
1395
+ return firstDate > secondDate ? -1 : 1;
1396
+ }
1397
+ }));
1398
+ allInCompleted = allInCompleted.sort((/**
1399
+ * @param {?} a
1400
+ * @param {?} b
1401
+ * @return {?}
1402
+ */
1403
+ (a, b) => {
1404
+ if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
1405
+ /** @type {?} */
1406
+ const firstDate = new Date(a.endDate);
1407
+ /** @type {?} */
1408
+ const secondDate = new Date(b.endDate);
1409
+ return firstDate > secondDate ? -1 : 1;
1410
+ }
1411
+ }));
1412
+ all = [...allInCompleted, ...allCompletedAll, ...allCompletedOverDue];
1413
+ overdue = overdue.filter((/**
1414
+ * @param {?} data
1415
+ * @return {?}
1416
+ */
1417
+ (data) => {
1418
+ return data.contentStatus < 2;
1419
+ }));
1420
+ overdue = overdue.sort((/**
1421
+ * @param {?} a
1422
+ * @param {?} b
1423
+ * @return {?}
1424
+ */
1425
+ (a, b) => {
1426
+ /** @type {?} */
1427
+ const firstDate = new Date(a.endDate);
1428
+ /** @type {?} */
1429
+ const secondDate = new Date(b.endDate);
1430
+ return firstDate > secondDate ? -1 : 1;
1431
+ }));
1432
+ upcoming = upcoming.filter((/**
1433
+ * @param {?} data
1434
+ * @return {?}
1435
+ */
1436
+ (data) => {
1437
+ return data.contentStatus < 2;
1438
+ }));
1439
+ // this.getSelectedIndex(1)
1440
+ return [
1441
+ { value: 'all', widgets: this.transformContentsToWidgets(all, strip) },
1442
+ { value: 'upcoming', widgets: this.transformContentsToWidgets(upcoming, strip) },
1443
+ { value: 'overdue', widgets: this.transformContentsToWidgets(overdue, strip) }
1444
+ ];
1445
+ }
1446
+ /**
1447
+ * @param {?} stripsResultDataMap
1448
+ * @param {?} key
1449
+ * @return {?}
1450
+ */
1451
+ getSelectedIndex(stripsResultDataMap, key) {
1452
+ /** @type {?} */
1453
+ let returnValue = 0;
1454
+ if (key === 'cbpPlan') {
1455
+ if (stripsResultDataMap.tabs.length) {
1456
+ /** @type {?} */
1457
+ const data = stripsResultDataMap.tabs.filter((/**
1458
+ * @param {?} ele
1459
+ * @return {?}
1460
+ */
1461
+ (ele) => ele.value === 'upcoming'));
1462
+ returnValue = data[0].widgets && data[0].widgets.length > 0 ? 1 : 0;
1463
+ }
1464
+ }
1465
+ return returnValue;
1466
+ }
1467
+ /**
1468
+ * @param {?} label
1469
+ * @param {?} type
1470
+ * @return {?}
1471
+ */
1472
+ translateLabels(label, type) {
1473
+ return this.langtranslations.translateLabel(label, type, '');
1474
+ }
1475
+ /**
1476
+ * @param {?} index
1477
+ * @param {?} item
1478
+ * @return {?}
1479
+ */
1480
+ identify(index, item) {
1481
+ if (index >= 0) { }
1482
+ return item;
1483
+ }
1484
+ /**
1485
+ * @param {?} index
1486
+ * @param {?} item
1487
+ * @return {?}
1488
+ */
1489
+ tracker(index, item) {
1490
+ if (index >= 0) { }
1491
+ return _.get(item, 'widgetData.content.identifier');
1492
+ }
1493
+ }
1494
+ ContentStripWithTabsLibComponent.decorators = [
1495
+ { type: Component, args: [{
1496
+ selector: 'sb-uic-content-strip-with-tabs',
1497
+ 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\" [wsResolverWidget]=\"widgetData.errorWidget\"></ng-container>\n <ng-container *ngIf=\"showParentNoData\" [wsResolverWidget]=\"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 <button *ngIf=\"stripsResultDataMap[key]?.stripInfo?.icon\" type=\"button\" mat-icon-button\n (click)=\"toggleInfo(stripsResultDataMap[key])\" i18n-matTooltip matTooltip=\"info\"\n class=\"margin-left-xs\">\n <mat-icon>{{ stripsResultDataMap[key]?.stripInfo?.icon.icon }}</mat-icon>\n </button>\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 [wsResolverWidget]=\"getdata(stripsResultDataMap[key])\">\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnNoData\"\n [wsResolverWidget]=\"stripsResultDataMap[key]?.noDataWidget\"></ng-container>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnError\"\n [wsResolverWidget]=\"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 [wsResolverWidget]=\"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 [wsResolverWidget]=\"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\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [wsResolverWidget]=\"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\"\n *ngIf=\"getContineuLearningLenth(stripsResultDataMap[key]) && showAccordion(key)\" [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 [wsResolverWidget]=\"widget\"></ng-container> -->\n <ng-container [wsResolverWidget]=\"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>",
1498
+ 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}"]
1499
+ }] }
1500
+ ];
1501
+ /** @nocollapse */
1502
+ ContentStripWithTabsLibComponent.ctorParameters = () => [
1503
+ { type: undefined, decorators: [{ type: Inject, args: ['environment',] }] },
1504
+ { type: WidgetContentService },
1505
+ { type: LoggerService },
1506
+ { type: EventService },
1507
+ { type: ConfigurationsService },
1508
+ { type: UtilityService },
1509
+ { type: WidgetUserService },
1510
+ { type: TranslateService },
1511
+ { type: MultilingualTranslationsService }
1512
+ ];
1513
+ ContentStripWithTabsLibComponent.propDecorators = {
1514
+ widgetData: [{ type: Input }],
1515
+ id: [{ type: HostBinding, args: ['id',] }]
1516
+ };
1517
+ if (false) {
1518
+ /** @type {?} */
1519
+ ContentStripWithTabsLibComponent.prototype.widgetData;
1520
+ /** @type {?} */
1521
+ ContentStripWithTabsLibComponent.prototype.id;
1522
+ /** @type {?} */
1523
+ ContentStripWithTabsLibComponent.prototype.stripsResultDataMap;
1524
+ /** @type {?} */
1525
+ ContentStripWithTabsLibComponent.prototype.stripsKeyOrder;
1526
+ /** @type {?} */
1527
+ ContentStripWithTabsLibComponent.prototype.showAccordionData;
1528
+ /** @type {?} */
1529
+ ContentStripWithTabsLibComponent.prototype.showParentLoader;
1530
+ /** @type {?} */
1531
+ ContentStripWithTabsLibComponent.prototype.showParentError;
1532
+ /** @type {?} */
1533
+ ContentStripWithTabsLibComponent.prototype.showParentNoData;
1534
+ /** @type {?} */
1535
+ ContentStripWithTabsLibComponent.prototype.errorDataCount;
1536
+ /** @type {?} */
1537
+ ContentStripWithTabsLibComponent.prototype.noDataCount;
1538
+ /** @type {?} */
1539
+ ContentStripWithTabsLibComponent.prototype.successDataCount;
1540
+ /** @type {?} */
1541
+ ContentStripWithTabsLibComponent.prototype.contentAvailable;
1542
+ /** @type {?} */
1543
+ ContentStripWithTabsLibComponent.prototype.baseUrl;
1544
+ /** @type {?} */
1545
+ ContentStripWithTabsLibComponent.prototype.veifiedKarmayogi;
1546
+ /** @type {?} */
1547
+ ContentStripWithTabsLibComponent.prototype.environment;
1548
+ /** @type {?} */
1549
+ ContentStripWithTabsLibComponent.prototype.changeEventSubscription;
1550
+ /** @type {?} */
1551
+ ContentStripWithTabsLibComponent.prototype.defaultMaxWidgets;
1552
+ /** @type {?} */
1553
+ ContentStripWithTabsLibComponent.prototype.enrollInterval;
1554
+ /** @type {?} */
1555
+ ContentStripWithTabsLibComponent.prototype.todaysEvents;
1556
+ /**
1557
+ * @type {?}
1558
+ * @private
1559
+ */
1560
+ ContentStripWithTabsLibComponent.prototype.contentSvc;
1561
+ /**
1562
+ * @type {?}
1563
+ * @private
1564
+ */
1565
+ ContentStripWithTabsLibComponent.prototype.loggerSvc;
1566
+ /**
1567
+ * @type {?}
1568
+ * @private
1569
+ */
1570
+ ContentStripWithTabsLibComponent.prototype.eventSvc;
1571
+ /**
1572
+ * @type {?}
1573
+ * @private
1574
+ */
1575
+ ContentStripWithTabsLibComponent.prototype.configSvc;
1576
+ /** @type {?} */
1577
+ ContentStripWithTabsLibComponent.prototype.utilitySvc;
1578
+ /**
1579
+ * @type {?}
1580
+ * @private
1581
+ */
1582
+ ContentStripWithTabsLibComponent.prototype.userSvc;
1583
+ /**
1584
+ * @type {?}
1585
+ * @private
1586
+ */
1587
+ ContentStripWithTabsLibComponent.prototype.translate;
1588
+ /**
1589
+ * @type {?}
1590
+ * @private
1591
+ */
1592
+ ContentStripWithTabsLibComponent.prototype.langtranslations;
1593
+ }
1594
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1zdHJpcC13aXRoLXRhYnMtbGliLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uLyIsInNvdXJjZXMiOlsibGliL19jb21tb24vY29udGVudC1zdHJpcC13aXRoLXRhYnMtbGliL2NvbnRlbnQtc3RyaXAtd2l0aC10YWJzLWxpYi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBb0IsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFOUUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDcEcsT0FBTyxFQUVMLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxRQUFRLEdBQ1QsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7OztBQUd4RSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUUzQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFFdkQsb0NBb0NDOzs7SUFuQ0Msb0NBQVk7O0lBQ1osNkNBQXNCOztJQUN0QixxQ0FBYzs7SUFDZCwwQ0FBbUI7O0lBQ25CLGlEQUEwQjs7SUFDMUIsd0NBQXNEOztJQUN0RCwyQ0FBbUI7O0lBQ25CLCtDQU1FOztJQUNGLDZDQUtFOztJQUNGLDRDQUFpQjs7SUFDakIscUNBQTZE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QUFRLEVBQUUsZ0NBQWdDO2dCQUMxQyw0dFhBQTJEOzthQUU1RDs7Ozs0Q0E2QkksTUFBTSxTQUFDLGFBQWE7WUE3RmhCLG9CQUFvQjtZQUszQixhQUFhO1lBQ2IsWUFBWTtZQUNaLHFCQUFxQjtZQUNyQixjQUFjO1lBS1AsaUJBQWlCO1lBT2pCLGdCQUFnQjtZQWxCaEIsK0JBQStCOzs7eUJBb0VyQyxLQUFLO2lCQUNMLFdBQVcsU0FBQyxJQUFJOzs7O0lBRGpCLHNEQUFtRTs7SUFDbkUsOENBQ2lEOztJQUNqRCwrREFBbUU7O0lBQ25FLDBEQUE4Qjs7SUFDOUIsNkRBQXlCOztJQUN6Qiw0REFBeUI7O0lBQ3pCLDJEQUF3Qjs7SUFDeEIsNERBQXlCOztJQUN6QiwwREFBbUI7O0lBQ25CLHVEQUFnQjs7SUFDaEIsNERBQXFCOztJQUNyQiw0REFBd0I7O0lBQ3hCLG1EQUF3Qzs7SUFDeEMsNERBQXlCOztJQUN6Qix1REFBa0I7O0lBQ2xCLG1FQUFvRDs7SUFDcEQsNkRBQXVCOztJQUN2QiwwREFBb0I7O0lBQ3BCLHdEQUF1Qjs7Ozs7SUFLckIsc0RBQXdDOzs7OztJQUN4QyxxREFBZ0M7Ozs7O0lBQ2hDLG9EQUE4Qjs7Ozs7SUFDOUIscURBQXdDOztJQUN4QyxzREFBaUM7Ozs7O0lBR2pDLG1EQUFrQzs7Ozs7SUFDbEMscURBQW1DOzs7OztJQUNuQyw0REFBeUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgSG9zdEJpbmRpbmcsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciwgV2lkZ2V0QmFzZUNvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyJztcbmltcG9ydCB7IE5zQ29udGVudFN0cmlwV2l0aFRhYnMgfSBmcm9tICcuL2NvbnRlbnQtc3RyaXAtd2l0aC10YWJzLWxpYi5tb2RlbCc7XG4vLyBpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19tb2RlbHMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnO1xuaW1wb3J0IHsgTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy9tdWx0aWxpbmd1YWwtdHJhbnNsYXRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVEZldGNoU3RhdHVzLFxuICBMb2dnZXJTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgVXRpbGl0eVNlcnZpY2UsXG4gIFdzRXZlbnRzLFxufSBmcm9tICdAc3VuYmlyZC1jYi91dGlscyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFdpZGdldFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC11c2VyLnNlcnZpY2UnO1xuLy8gaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICdzcmMvZW52aXJvbm1lbnRzL2Vudmlyb25tZW50J1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgTnNDYXJkQ29udGVudCB9IGZyb20gJy4uLy4uL19tb2RlbHMvY2FyZC1jb250ZW50LXYyLm1vZGVsJztcbmltcG9ydCB7IElUb2RheUV2ZW50cyB9IGZyb20gJy4uLy4uL19tb2RlbHMvZXZlbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbnRlcmZhY2UgSVN0cmlwVW5pdENvbnRlbnREYXRhIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNhbkhpZGVTdHJpcDogYm9vbGVhbjtcbiAgbW9kZT86IHN0cmluZztcbiAgc2hvd1N0cmlwOiBib29sZWFuO1xuICBkaXNhYmxlVHJhbnNsYXRlOiBib29sZWFuO1xuICB3aWRnZXRzPzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXTtcbiAgc3RyaXBUaXRsZTogc3RyaW5nO1xuICBzdHJpcFRpdGxlTGluaz86IHtcbiAgICBsaW5rOiAge1xuICAgICAgcXVlcnlQYXJhbXM6IHN0cmluZ1xuICAgIH0sXG4gICAgaWNvbjogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zOiBzdHJpbmdcbiAgfTtcbiAgc2xpZGVyQ29uZmlnPzoge1xuICAgIHNob3dOYXZzOiBib29sZWFuLFxuICAgIHNob3dEb3RzOiBib29sZWFuLFxuICAgIG1heFdpZGdldHM/OiBudW1iZXJcbiAgICBjZXJpZmljYXRlQ2FyZE1hcmdpbj86IGJvb2xlYW5cbiAgfTtcbiAgc3RyaXBDb25maWc6IGFueTtcbiAgdGFicz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYltdIHwgdW5kZWZpbmVkO1xuICBzdHJpcE5hbWU/OiBzdHJpbmc7XG4gIHN0cmlwTG9nbz86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHN0cmlwSW5mbz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSVN0cmlwSW5mbztcbiAgbm9EYXRhV2lkZ2V0PzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGE7XG4gIGVycm9yV2lkZ2V0PzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGE7XG4gIHNob3dPbk5vRGF0YTogYm9vbGVhbjtcbiAgc2hvd09uTG9hZGVyOiBib29sZWFuO1xuICBzaG93T25FcnJvcjogYm9vbGVhbjtcbiAgbG9hZGVyV2lkZ2V0cz86IGFueTtcbiAgc3RyaXBCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzZWNvbmRhcnlIZWFkaW5nPzogYW55O1xuICB2aWV3TW9yZVVybDogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzYi11aWMtY29udGVudC1zdHJpcC13aXRoLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGVudC1zdHJpcC13aXRoLXRhYnMtbGliLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGVudC1zdHJpcC13aXRoLXRhYnMtbGliLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvbnRlbnRTdHJpcFdpdGhUYWJzTGliQ29tcG9uZW50IGV4dGVuZHMgV2lkZ2V0QmFzZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBOc1dpZGdldFJlc29sdmVyLklXaWRnZXREYXRhPE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcE11bHRpcGxlPiB7XG4gIEBJbnB1dCgpIHdpZGdldERhdGEhOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBNdWx0aXBsZTtcbiAgQEhvc3RCaW5kaW5nKCdpZCcpXG4gIHB1YmxpYyBpZCA9IGB3cy1zdHJpcC1taWx0aXBsZV8ke01hdGgucmFuZG9tKCl9YDtcbiAgc3RyaXBzUmVzdWx0RGF0YU1hcDogeyBba2V5OiBzdHJpbmddOiBJU3RyaXBVbml0Q29udGVudERhdGEgfSA9IHt9O1xuICBzdHJpcHNLZXlPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgc2hvd0FjY29yZGlvbkRhdGEgPSB0cnVlO1xuICBzaG93UGFyZW50TG9hZGVyID0gZmFsc2U7XG4gIHNob3dQYXJlbnRFcnJvciA9IGZhbHNlO1xuICBzaG93UGFyZW50Tm9EYXRhID0gZmFsc2U7XG4gIGVycm9yRGF0YUNvdW50ID0gMDtcbiAgbm9EYXRhQ291bnQgPSAwO1xuICBzdWNjZXNzRGF0YUNvdW50ID0gMDtcbiAgY29udGVudEF2YWlsYWJsZSA9IHRydWU7XG4gIGJhc2VVcmwgPSB0aGlzLmNvbmZpZ1N2Yy5zaXRlUGF0aCB8fCAnJztcbiAgdmVpZmllZEthcm1heW9naSA9IGZhbHNlO1xuICBlbnZpcm9ubWVudCE6IGFueTtcbiAgY2hhbmdlRXZlbnRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBkZWZhdWx0TWF4V2lkZ2V0cyA9IDEyO1xuICBlbnJvbGxJbnRlcnZhbDogYW55O1xuICB0b2RheXNFdmVudHM6IGFueSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIHByaXZhdGUgY29udGVudFN0cmlwU3ZjOiBDb250ZW50U3RyaXBOZXdNdWx0aXBsZVNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55LFxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICAvLyBwcml2YXRlIHNlYXJjaFNlcnZTdmM6IFNlYXJjaFNlcnZTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclN2YzogV2lkZ2V0VXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndHJhbnNsYXRpb25zOiBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSkge1xuICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJyk7XG4gICAgICBsZXQgbGFuZyA9IEpTT04uc3RyaW5naWZ5KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSk7XG4gICAgICBsYW5nID0gbGFuZy5yZXBsYWNlKC9cXFwiL2csICcnKTtcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKTtcbiAgICB9XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50XG4gICAgY29uc29sZS5sb2coJ3BsdWdpbicpXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgIHRoaXMuaW5pdERhdGEoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmNoYW5nZUV2ZW50U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNoYW5nZUV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgc2hvd0FjY29yZGlvbihrZXk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGUgJiYgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW2tleV0ubW9kZSA9PT0gJ2FjY29yZGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dBY2NvcmRpb25EYXRhO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNldEhpZGRlbkZvclN0cmlwKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW2tleV0uc2hvd1N0cmlwID0gZmFsc2U7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgY3N0cmlwXyR7a2V5fWAsICcxJyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJZlN0cmlwSGlkZGVuKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGBjc3RyaXBfJHtrZXl9YCk7XG4gICAgcmV0dXJuIEJvb2xlYW4oc3RvcmFnZUl0ZW0gIT09ICcxJyk7XG4gIH1cblxuICBwcml2YXRlIGluaXREYXRhKCkge1xuICAgIHRoaXMuc3RyaXBzS2V5T3JkZXIgPSB0aGlzLndpZGdldERhdGEgJiYgdGhpcy53aWRnZXREYXRhLnN0cmlwcyAmJiB0aGlzLndpZGdldERhdGEuc3RyaXBzLm1hcChzdHJpcCA9PiBzdHJpcC5rZXkpIHx8IFtdO1xuICAgIGlmICh0aGlzLndpZGdldERhdGEubG9hZGVyICYmIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNob3dQYXJlbnRMb2FkZXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBGZXRjaCB0aGUgZGF0YVxuICAgIGZvciAoY29uc3Qgc3RyaXAgb2YgdGhpcy53aWRnZXREYXRhLnN0cmlwcykge1xuICAgICAgaWYgKHRoaXMuY2hlY2tGb3JFbXB0eVdpZGdldChzdHJpcCkpIHtcbiAgICAgICAgdGhpcy5mZXRjaFN0cmlwRnJvbVJlcXVlc3REYXRhKHN0cmlwLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgdHJ1ZSwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFN1YnNjcmlwdGlvbiBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IGtleUFuZEV2ZW50OiB7IGtleTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGZyb206IHN0cmluZyB9W10gPSB0aGlzLndpZGdldERhdGEuc3RyaXBzXG4gICAgICAubWFwKHN0cmlwID0+ICh7XG4gICAgICAgIGtleTogc3RyaXAua2V5LFxuICAgICAgICB0eXBlOiAoc3RyaXAucmVmcmVzaEV2ZW50ICYmIHN0cmlwLnJlZnJlc2hFdmVudC5ldmVudFR5cGUpIHx8ICcnLFxuICAgICAgICBmcm9tOiAoc3RyaXAucmVmcmVzaEV2ZW50ICYmIHN0cmlwLnJlZnJlc2hFdmVudC5mcm9tLnRvU3RyaW5nKCkpIHx8ICcnLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKCh7IGtleSwgdHlwZSwgZnJvbSB9KSA9PiBrZXkgJiYgdHlwZSAmJiBmcm9tKTtcbiAgICBjb25zdCBldmVudFR5cGVTZXQgPSBuZXcgU2V0KGtleUFuZEV2ZW50Lm1hcChlID0+IGUudHlwZSkpO1xuICAgIHRoaXMuY2hhbmdlRXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50U3ZjLmV2ZW50cyRcbiAgICAgIC5waXBlKGZpbHRlcihldmVudCA9PiBldmVudFR5cGVTZXQuaGFzKGV2ZW50LmV2ZW50VHlwZSkpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIGtleUFuZEV2ZW50XG4gICAgICAgICAgLmZpbHRlcihlID0+IGUudHlwZSA9PT0gZXZlbnQuZXZlbnRUeXBlICYmIGUuZnJvbSA9PT0gZXZlbnQuZnJvbSlcbiAgICAgICAgICAubWFwKGUgPT4gZS5rZXkpXG4gICAgICAgICAgLmZvckVhY2goayA9PiB0aGlzLmZldGNoU3RyaXBGcm9tS2V5KGssIGZhbHNlKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hTdHJpcEZyb21LZXkoa2V5OiBzdHJpbmcsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUpIHtcbiAgICBjb25zdCBzdHJpcERhdGEgPSB0aGlzLndpZGdldERhdGEuc3RyaXBzLmZpbmQoc3RyaXAgPT4gc3RyaXAua2V5ID09PSBrZXkpO1xuICAgIGlmIChzdHJpcERhdGEpIHtcbiAgICAgIHRoaXMuZmV0Y2hTdHJpcEZyb21SZXF1ZXN0RGF0YShzdHJpcERhdGEsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpcFNob3dpbmcoZGF0YTogYW55KSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmtleSA9PT0gdGhpcy5lbnZpcm9ubWVudC5wcm9ncmFtU3RyaXBLZXkgJiYgKCFkYXRhLnRhYnMgfHwgIWRhdGEudGFicy5sZW5ndGgpICYmXG4gICAgICBkYXRhLnN0cmlwVGl0bGUgPT09IHRoaXMuZW52aXJvbm1lbnQucHJvZ3JhbVN0cmlwTmFtZSAmJiBkYXRhLndpZGdldHMubGVuZ3RoID4gMCkge1xuICAgICAgZGF0YS53aWRnZXRzLmZvckVhY2goKGtleTogYW55KSA9PiB7XG4gICAgICAgIGlmIChrZXkgJiYga2V5LndpZGdldERhdGEuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMuZW52aXJvbm1lbnQucHJvZ3JhbVN0cmlwUHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICAgICAgY291bnQgPSBjb3VudCArIDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBkYXRhLnNob3dTdHJpcCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLnNob3dTdHJpcCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygnZGF0YS5rZXknLCBkYXRhLCBkYXRhLmtleSwgZGF0YS53aWRnZXRzKTtcbiAgICByZXR1cm4gZGF0YS5zaG93U3RyaXA7XG4gIH1cblxuICBnZXQgaXNNb2JpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbGl0eVN2Yy5pc01vYmlsZSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldGRhdGEoZGF0YTogSVN0cmlwVW5pdENvbnRlbnREYXRhKSB7XG4gICAgaWYgKGRhdGEuc3RyaXBJbmZvKSB7XG4gICAgICByZXR1cm4gZGF0YS5zdHJpcEluZm8ud2lkZ2V0O1xuICAgIH1cbiAgICByZXR1cm4ge307XG5cbiAgfVxuICBjaGVja0NvbmRpdGlvbih3RGF0YTogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwTXVsdGlwbGUsIGRhdGE6IElTdHJpcFVuaXRDb250ZW50RGF0YSkge1xuICAgIGlmICh3RGF0YS5zdHJpcHNbMF0uc3RyaXBDb25maWcgJiYgd0RhdGEuc3RyaXBzWzBdLnN0cmlwQ29uZmlnLmhpZGVTaG93QWxsKSB7XG4gICAgICByZXR1cm4gIXdEYXRhLnN0cmlwc1swXS5zdHJpcENvbmZpZy5oaWRlU2hvd0FsbDtcbiAgICB9XG4gICAgcmV0dXJuIHdEYXRhLnN0cmlwc1swXS52aWV3TW9yZVVybCAmJiBkYXRhLndpZGdldHMgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCA+PSA0O1xuICB9XG4gIGNoZWNrVmlzaWJsZShkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5zdHJpcEluZm8gJiYgZGF0YS5zdHJpcEluZm8udmlzaWJpbGl0eU1vZGUgPT09ICd2aXNpYmxlJztcbiAgfVxuXG4gIGdldENvbnRpbmV1TGVhcm5pbmdMZW50aChkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICByZXR1cm4gZGF0YS53aWRnZXRzID8gZGF0YS53aWRnZXRzLmxlbmd0aCA6IDA7XG4gIH1cbiAgZ2V0TGVuZ3RoKGRhdGE6IElTdHJpcFVuaXRDb250ZW50RGF0YSkge1xuICAgIGlmICghZGF0YS50YWJzIHx8ICFkYXRhLnRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YS53aWRnZXRzID8gZGF0YS53aWRnZXRzLmxlbmd0aCA6IDA7XG4gICAgfSB7XG4gICAgICAvLyBpZiB0YWJzIGFyZSB0aGVyZSBjaGVjayBpZiBlYWNoIHRhYiBoYXMgd2lkZ2V0cyBhbmQgZ2V0IHRoZSB0YWIgd2l0aCBtYXggd2lkZ2V0c1xuICAgICAgY29uc3QgdGFiV2l0aE1heFdpZGdldHMgPSBkYXRhLnRhYnMucmVkdWNlKFxuICAgICAgICAocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgIGlmICghcHJldi53aWRnZXRzICYmICFjdXJyZW50LndpZGdldHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldi53aWRnZXRzICYmIGN1cnJlbnQud2lkZ2V0cykge1xuICAgICAgICAgICAgcmV0dXJuIChwcmV2LndpZGdldHMubGVuZ3RoID4gY3VycmVudC53aWRnZXRzLmxlbmd0aCkgPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnQud2lkZ2V0cyAmJiAhcHJldi53aWRnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjdXJyZW50LndpZGdldHMgJiYgcHJldi53aWRnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgLy8gcmV0dXJuIChwcmV2LndpZGdldHMgJiYgY3VycmVudC53aWRnZXRzICYmIChwcmV2LndpZGdldHMubGVuZ3RoID4gY3VycmVudC53aWRnZXRzLmxlbmd0aCkgKSA/IHByZXYgOiBjdXJyZW50XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBhbGlnblxuICAgICAgICB9LCBkYXRhLnRhYnNbMF0pO1xuICAgICAgLy8gaWYgdGFicyBoYXMgYXRsZWFzdCAxIHdpZGdldHMgdGhlbiBzdHJpcCB3aWxsIHNob3cgb3IgZWxzZSBub3RcbiAgICAgIHJldHVybiB0YWJXaXRoTWF4V2lkZ2V0cy53aWRnZXRzID8gdGFiV2l0aE1heFdpZGdldHMud2lkZ2V0cy5sZW5ndGggOiAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyc0Zyb21BcnJheSh2NmZpbHRlcnM6IGFueSkge1xuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHt9O1xuICAgIGlmICh2NmZpbHRlcnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICB2NmZpbHRlcnMuZm9yRWFjaCgoKGY6IGFueSkgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgZmlsdGVyc1trZXldID0gZltrZXldO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH1cbiAgICByZXR1cm4gdjZmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1TZWFyY2hWNkZpbHRlcnNWMih2NmZpbHRlcnM6IGFueSkge1xuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHt9O1xuICAgIGlmICh2NmZpbHRlcnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICB2NmZpbHRlcnMuZm9yRWFjaCgoKGY6IGFueSkgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgZmlsdGVyc1trZXldID0gZltrZXldO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH1cbiAgICByZXR1cm4gdjZmaWx0ZXJzO1xuICB9XG5cbiAgY2hlY2tGb3JEYXRlRmlsdGVycyhmaWx0ZXJzOiBhbnkpIHtcbiAgICBsZXQgdXNlckRhdGE6IGFueTtcbiAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgIHVzZXJEYXRhID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU7XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5oYXNPd25Qcm9wZXJ0eSgnYmF0Y2hlcy5lbmREYXRlJykpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgZmlsdGVyc1snYmF0Y2hlcy5lbmREYXRlJ11bJz49J10gPSBldmFsKGZpbHRlcnNbJ2JhdGNoZXMuZW5kRGF0ZSddWyc+PSddKVxuICAgIH0gZWxzZSBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmhhc093blByb3BlcnR5KCdiYXRjaGVzLmVucm9sbG1lbnRFbmREYXRlJykpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgZmlsdGVyc1snYmF0Y2hlcy5lbnJvbGxtZW50RW5kRGF0ZSddWyc+PSddID0gZXZhbChmaWx0ZXJzWydiYXRjaGVzLmVucm9sbG1lbnRFbmREYXRlJ11bJz49J10pXG4gICAgfSBlbHNlIGlmIChmaWx0ZXJzLm9yZ2FuaXNhdGlvbiAmJlxuICAgICAgZmlsdGVycy5vcmdhbmlzYXRpb24uaW5kZXhPZignPG9yZ0lEPicpID49IDBcbiAgICApIHtcbiAgICAgIGZpbHRlcnMub3JnYW5pc2F0aW9uID0gdXNlckRhdGEgJiYgdXNlckRhdGEucm9vdE9yZ0lkO1xuXG4gICAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmhhc093blByb3BlcnR5KCdkZXNpZ25hdGlvbicpKSB7XG4gICAgICAgIGZpbHRlcnMuZGVzaWduYXRpb24gPSB1c2VyRGF0YS5wcm9mZXNzaW9uYWxEZXRhaWxzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgIHVzZXJEYXRhLnByb2Zlc3Npb25hbERldGFpbHNbMF0uZGVzaWduYXRpb24gOiAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcnM7XG4gIH1cblxuICBwcml2YXRlIGZldGNoU3RyaXBGcm9tUmVxdWVzdERhdGEoXG4gICAgc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSxcbiAgKSB7XG4gICAgLy8gc2V0dGluZyBpbml0aWFsIHZhbHVlc1xuICAgIHN0cmlwLmxvYWRlcldpZGdldHMgPSB0aGlzLnRyYW5zZm9ybVNrZWxldG9uVG9XaWRnZXRzKHN0cmlwKTtcbiAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdmZXRjaGluZycsIGZhbHNlLCBudWxsKTtcbiAgICB0aGlzLmZldGNoRnJvbUVucm9sbG1lbnRMaXN0KHN0cmlwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIHRoaXMuZmV0Y2hGcm9tU2VhcmNoVjYoc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgdGhpcy5mZXRjaEZyb21UcmVuZGluZ0NvbnRlbnQoc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgdGhpcy5mZXRjaEFsbENicFBsYW5zKHN0cmlwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIC8vIHRoaXMuZW5yb2xsSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gICB0aGlzLmZldGNoQWxsQ2JwUGxhbnMoc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cylcbiAgICAvLyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMClcbiAgfVxuXG4gIGZldGNoRnJvbUVucm9sbG1lbnRMaXN0KHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5lbnJvbGxtZW50TGlzdCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmVucm9sbG1lbnRMaXN0KS5sZW5ndGgpIHtcbiAgICAgIGxldCB1c2VySWQgPSAnJztcbiAgICAgIGxldCBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnRbXTtcbiAgICAgIGxldCBjb250ZW50TmV3OiBOc0NvbnRlbnQuSUNvbnRlbnRbXTtcbiAgICAgIGxldCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBfLmdldChzdHJpcC5yZXF1ZXN0LmVucm9sbG1lbnRMaXN0LCAncXVlcnlQYXJhbXMnKTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQ7XG4gICAgICB9XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXG4gICAgICB0aGlzLnVzZXJTdmMuZmV0Y2hVc2VyQmF0Y2hMaXN0KHVzZXJJZCwgcXVlcnlQYXJhbXMpLnN1YnNjcmliZShcbiAgICAgICAgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgY291cnNlcyA9IHJlc3VsdCAmJiByZXN1bHQuY291cnNlcztcbiAgICAgICAgICBjb25zdCBzaG93Vmlld01vcmUgPSBCb29sZWFuKFxuICAgICAgICAgICAgY291cnNlcy5sZW5ndGggPiA1ICYmIHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLnBvc3RDYXJkRm9yU2VhcmNoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgdmlld01vcmVVcmwgPSBzaG93Vmlld01vcmVcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwYXRoOiAoc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucGF0aCkgfHwgJycsXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgcTogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgZjpcbiAgICAgICAgICAgICAgICAgIHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5zZWFyY2hWNiAmJiBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNlYXJjaFNlcnZTdmMudHJhbnNmb3JtU2VhcmNoVjZGaWx0ZXJzKFxuICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYuZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgIC8vICksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB7fSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICBpZiAoY291cnNlcyAmJiBjb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGVudCA9IGNvdXJzZXMubWFwKChjOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudFRlbXA6IE5zQ29udGVudC5JQ29udGVudCA9IGMuY29udGVudDtcbiAgICAgICAgICAgICAgY29udGVudFRlbXAuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBjLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGMucHJvZ3Jlc3MgfHwgMDtcbiAgICAgICAgICAgICAgY29udGVudFRlbXAuY29tcGxldGlvblN0YXR1cyA9IGMuY29tcGxldGlvblN0YXR1cyB8fCBjLnN0YXR1cyB8fCAwO1xuICAgICAgICAgICAgICBjb250ZW50VGVtcC5lbnJvbGxlZERhdGUgPSBjLmVucm9sbGVkRGF0ZSB8fCAnJztcbiAgICAgICAgICAgICAgY29udGVudFRlbXAubGFzdENvbnRlbnRBY2Nlc3NUaW1lID0gYy5sYXN0Q29udGVudEFjY2Vzc1RpbWUgfHwgJyc7XG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wLmxhc3RSZWFkQ29udGVudFN0YXR1cyA9IGMubGFzdFJlYWRDb250ZW50U3RhdHVzIHx8ICcnO1xuICAgICAgICAgICAgICBjb250ZW50VGVtcC5sYXN0UmVhZENvbnRlbnRJZCA9IGMubGFzdFJlYWRDb250ZW50SWQgfHwgJyc7XG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wLmxyY1Byb2dyZXNzRGV0YWlscyA9IGMubHJjUHJvZ3Jlc3NEZXRhaWxzIHx8ICcnO1xuICAgICAgICAgICAgICBjb250ZW50VGVtcC5pc3N1ZWRDZXJ0aWZpY2F0ZXMgPSBjLmlzc3VlZENlcnRpZmljYXRlcyB8fCBbXTtcbiAgICAgICAgICAgICAgY29udGVudFRlbXAuYmF0Y2hJZCA9IGMuYmF0Y2hJZCB8fCAnJztcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRUZW1wO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRvIGZpbHRlciBjb250ZW50IHdpdGggY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwLFxuICAgICAgICAgIC8vIHNvIHRoYXQgb25seSB0aG9zZSBjb250ZW50IHdpbGwgc2hvdyBpbiBob21lIHBhZ2VcbiAgICAgICAgICAvLyBjb250aW51ZSBsZWFyaW5nIHN0cmlwXG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQgJiYgY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAvLyAgIGNvbnRlbnROZXcgPSBjb250ZW50LmZpbHRlcigoYzogYW55KSA9PiB7XG4gICAgICAgICAgLy8gICAgIC8qKiBjb21tZW50ZWQgYXMgYm90aCBhcmUgMCBhZnRlciBlbnJvbGxsICovXG4gICAgICAgICAgLy8gICAgIGlmIChjLmNvbXBsZXRpb25QZXJjZW50YWdlICYmIGMuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwKSB7XG4gICAgICAgICAgLy8gICAgICAgcmV0dXJuIGNcbiAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgIC8vICAgfSlcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAvLyBUbyBzb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlIGVucm9sbGVkIGRhdGVcbiAgICAgICAgICBjb250ZW50TmV3ID0gKGNvbnRlbnQgfHwgW10pLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlQTogYW55ID0gbmV3IERhdGUoYS5sYXN0Q29udGVudEFjY2Vzc1RpbWUgfHwgMCk7XG4gICAgICAgICAgICBjb25zdCBkYXRlQjogYW55ID0gbmV3IERhdGUoYi5sYXN0Q29udGVudEFjY2Vzc1RpbWUgfHwgMCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZUIgLSBkYXRlQTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdEVucm9sbG1lbnRUYWJzRGF0YShjb250ZW50TmV3LCBzdHJpcCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudE5ldywgc3RyaXApLFxuICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgdmlld01vcmVVcmwsXG4gICAgICAgICAgICAgIHRhYlJlc3VsdHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb250ZW50TmV3LCBzdHJpcCksXG4gICAgICAgICAgICAgICdkb25lJyxcbiAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICB2aWV3TW9yZVVybCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNwbGl0RW5yb2xsbWVudFRhYnNEYXRhKGNvbnRlbnROZXc6IE5zQ29udGVudC5JQ29udGVudFtdLCBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAgIGNvbnN0IHRhYlJlc3VsdHM6IGFueVtdID0gW107XG4gICAgY29uc3Qgc3BsaXREYXRhID0gdGhpcy5nZXRJbnByb2dyZXNzQW5kQ29tcGxldGVkKFxuICAgICAgY29udGVudE5ldyxcbiAgICAgIChlOiBhbnkpID0+IGUuY29tcGxldGlvblN0YXR1cyA9PT0gMSB8fCBlLmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwLFxuICAgICAgc3RyaXAsXG4gICAgKTtcblxuICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmlwLnRhYnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKHN0cmlwLnRhYnNbaV0pIHtcbiAgICAgICAgICB0YWJSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnN0cmlwLnRhYnNbaV0sXG4gICAgICAgICAgICAgIGZldGNoVGFiU3RhdHVzOiAnZG9uZScsXG4gICAgICAgICAgICAgIC4uLihzcGxpdERhdGEuZmluZChpdG1Jbm5lciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmlwLnRhYnMgJiYgc3RyaXAudGFic1tpXSAmJiBpdG1Jbm5lci52YWx1ZSA9PT0gc3RyaXAudGFic1tpXS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0bUlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFiUmVzdWx0cztcbiAgfVxuXG4gIGdldElucHJvZ3Jlc3NBbmRDb21wbGV0ZWQoYXJyYXk6IE5zQ29udGVudC5JQ29udGVudFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpbHRlcjogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0KSB7XG4gICAgY29uc3QgaW5wcm9ncmVzczogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb21wbGV0ZWQ6IGFueVtdID0gW107XG4gICAgYXJyYXkuZm9yRWFjaCgoZTogYW55LCBpZHg6IG51bWJlciwgYXJyOiBhbnlbXSkgPT4gKGN1c3RvbUZpbHRlcihlLCBpZHgsIGFycikgPyBpbnByb2dyZXNzIDogY29tcGxldGVkKS5wdXNoKGUpKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyB2YWx1ZTogJ2lucHJvZ3Jlc3MnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGlucHJvZ3Jlc3MsIHN0cmlwKSB9LFxuICAgICAgeyB2YWx1ZTogJ2NvbXBsZXRlZCcsIHdpZGdldHM6IHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29tcGxldGVkLCBzdHJpcCkgfV07XG4gIH1cblxuICBhc3luYyBmZXRjaEZyb21TZWFyY2hWNihzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5zZWFyY2hWNikubGVuZ3RoKSB7XG4gICAgICAvLyBpZiAoIShzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZSAmJiBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZS5sZW5ndGggPiAwKSkge1xuICAgICAgLy8gICBpZiAodGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlKSB7XG4gICAgICAvLyAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgPSBbdGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlLmxvY2Fsc1swXV1cbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZSA9IFsnZW4nXVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICBsZXQgb3JpZ2luYWxGaWx0ZXJzOiBhbnkgPSBbXTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKG9yaWdpbmFsRmlsdGVycyk7XG4gICAgICBpZiAoc3RyaXAucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2ICYmXG4gICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycykge1xuICAgICAgICBvcmlnaW5hbEZpbHRlcnMgPSBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycztcbiAgICAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMgPSB0aGlzLmNoZWNrRm9yRGF0ZUZpbHRlcnMoc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMpO1xuICAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVyc0Zyb21BcnJheShcbiAgICAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRPRE86IEhhdmUgdG8gZXh0cmFjdCByZXF1ZXN0UmVxdWlyZWQgdG8gb3V0ZXIgbGV2ZWwgb2YgdGFicyBjb25maWdcbiAgICAgICAgY29uc3QgZmlyc3RUYWIgPSBzdHJpcC50YWJzWzBdO1xuICAgICAgICBpZiAoZmlyc3RUYWIucmVxdWVzdFJlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZyb21NYXAgPSAoYWxsVGFicyAmJiBhbGxUYWJzLmxlbmd0aCAmJiBhbGxUYWJzWzBdKSBhcyBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWI7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxU2VhcmNoVjYoc3RyaXAsIDAsIGN1cnJlbnRUYWJGcm9tTWFwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZWFyY2hWNlJlcXVlc3Qoc3RyaXAsIHN0cmlwLnJlcXVlc3QsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyIC0gcmVzcG9uc2UsICcsIHJlc3BvbnNlKVxuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnY2FsbGluZyAgYWZ0ZXItLSAnKVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50LCBzdHJpcCksXG4gICAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgICByZXNwb25zZS52aWV3TW9yZVVybCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuRXZlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1FdmVudHNUb1dpZGdldHMocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuRXZlbnQsIHN0cmlwKSxcbiAgICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlYXJjaFY2UmVxdWVzdChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXRbJ3JlcXVlc3QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1czogYm9vbGVhblxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC5zZWFyY2hWNikge1xuICAgICAgICB0aGlzLmNvbnRlbnRTdmMuc2VhcmNoVjYocmVxdWVzdC5zZWFyY2hWNikuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3dWaWV3TW9yZSA9IEJvb2xlYW4oXG4gICAgICAgICAgICByZXN1bHRzLnJlc3VsdC5jb250ZW50ICYmIHJlc3VsdHMucmVzdWx0LmNvbnRlbnQubGVuZ3RoID4gNSAmJiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGF0aDogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucGF0aCB8fCAnJyxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0YWI6ICdMZWFybicsXG4gICAgICAgICAgICAgICAgcTogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgZjpcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZWFyY2hWNiAmJlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybVNlYXJjaFY2RmlsdGVyc1YyKFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIC8vIGlmICh2aWV3TW9yZVVybCAmJiB2aWV3TW9yZVVybC5xdWVyeVBhcmFtcykge1xuICAgICAgICAgIC8vICAgdmlld01vcmVVcmwucXVlcnlQYXJhbXMgPSB2aWV3TW9yZVVybC5xdWVyeVBhcmFtc1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICByZXNvbHZlKHsgcmVzdWx0cywgdmlld01vcmVVcmwgfSk7XG4gICAgICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRnJvbVRyZW5kaW5nQ29udGVudChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2ggJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaCkubGVuZ3RoKSB7XG4gICAgICAvLyBpZiAoIShzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZSAmJiBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZS5sZW5ndGggPiAwKSkge1xuICAgICAgLy8gICBpZiAodGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlKSB7XG4gICAgICAvLyAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgPSBbdGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlLmxvY2Fsc1swXV1cbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZSA9IFsnZW4nXVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICBsZXQgb3JpZ2luYWxGaWx0ZXJzOiBhbnkgPSBbXTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKG9yaWdpbmFsRmlsdGVycyk7XG4gICAgICBpZiAoc3RyaXAucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoICYmXG4gICAgICAgIHN0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycykge1xuICAgICAgICBvcmlnaW5hbEZpbHRlcnMgPSBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycztcbiAgICAgICAgc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMgPSB0aGlzLmNoZWNrRm9yRGF0ZUZpbHRlcnMoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMpO1xuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVyc0Zyb21BcnJheShcbiAgICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRPRE86IEhhdmUgdG8gZXh0cmFjdCByZXF1ZXN0UmVxdWlyZWQgdG8gb3V0ZXIgbGV2ZWwgb2YgdGFicyBjb25maWdcbiAgICAgICAgY29uc3QgZmlyc3RUYWIgPSBzdHJpcC50YWJzWzBdO1xuICAgICAgICBpZiAoZmlyc3RUYWIucmVxdWVzdFJlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZyb21NYXAgPSAoYWxsVGFicyAmJiBhbGxUYWJzLmxlbmd0aCAmJiBhbGxUYWJzWzBdKSBhcyBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWI7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxVHJlbmRpbmcoc3RyaXAsIDAsIGN1cnJlbnRUYWJGcm9tTWFwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50cmVuZGluZ1NlYXJjaFJlcXVlc3Qoc3RyaXAsIHN0cmlwLnJlcXVlc3QsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdHMgJiYgcmVzcG9uc2UucmVzdWx0cy5yZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3BvbnNlLnJlc3VsdHMucmVzcG9uc2Vbc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXNwb25zZUtleV0gfHwgW107XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudCwgc3RyaXApLFxuICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgcmVzcG9uc2Uudmlld01vcmVVcmwgfHwgJycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHRyZW5kaW5nU2VhcmNoUmVxdWVzdChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXRbJ3JlcXVlc3QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1czogYm9vbGVhblxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC50cmVuZGluZ1NlYXJjaCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHJlcXVlc3QgaWYgaXQgaGFzIGR5bmFtaWMgdmFsdWVzXVxuICAgICAgICBpZiAocmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMub3JnYW5pc2F0aW9uICYmXG4gICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMub3JnYW5pc2F0aW9uLmluZGV4T2YoJzxvcmdJRD4nKSA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGxldCB1c2VyUm9vdE9yZ0lkO1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgICAgICAgdXNlclJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMub3JnYW5pc2F0aW9uID0gdXNlclJvb3RPcmdJZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRlbnRTdmMudHJlbmRpbmdDb250ZW50U2VhcmNoKHJlcXVlc3QudHJlbmRpbmdTZWFyY2gpLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgICAgICBjb25zdCBzaG93Vmlld01vcmUgPSBCb29sZWFuKFxuICAgICAgICAgICAgcmVzdWx0cy5yZXN1bHQgJiZcbiAgICAgICAgICAgIHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICAgICAgIHJlc3VsdHMucmVzdWx0W3N0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gucmVzcG9uc2VLZXldICYmXG4gICAgICAgICAgICByZXN1bHRzLnJlc3VsdFtzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlc3BvbnNlS2V5XS5sZW5ndGggPiA1ICYmXG4gICAgICAgICAgICBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGF0aDogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucGF0aCB8fCAnJyxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0YWI6ICdMZWFybicsXG4gICAgICAgICAgICAgICAgcTogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgZjpcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaCAmJlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybVNlYXJjaFY2RmlsdGVyc1YyKFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIHJlc29sdmUoeyByZXN1bHRzLCB2aWV3TW9yZVVybCB9KTtcbiAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3Iuc3RhdHVzID09PSA0MDApIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2RvbmUnLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVJbmZvKGRhdGE6IElTdHJpcFVuaXRDb250ZW50RGF0YSkge1xuICAgIGNvbnN0IHN0cmlwSW5mbyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtkYXRhLmtleV0uc3RyaXBJbmZvO1xuICAgIGlmIChzdHJpcEluZm8pIHtcbiAgICAgIGlmIChzdHJpcEluZm8ubW9kZSAhPT0gJ2JlbG93Jykge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy53YXJuKGBzdHJpcCBpbmZvIG1vZGU6ICR7c3RyaXBJbmZvLm1vZGV9IG5vdCBpbXBsZW1lbnRlZCB5ZXRgKTtcbiAgICAgICAgc3RyaXBJbmZvLm1vZGUgPSAnYmVsb3cnO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmlwSW5mby5tb2RlID09PSAnYmVsb3cnKSB7XG4gICAgICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtkYXRhLmtleV0uc3RyaXBJbmZvID0ge1xuICAgICAgICAgIC4uLnN0cmlwSW5mbyxcbiAgICAgICAgICB2aXNpYmlsaXR5TW9kZTogc3RyaXBJbmZvLnZpc2liaWxpdHlNb2RlID09PSAnaGlkZGVuJyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoXG4gICAgY29udGVudHM6IE5zQ29udGVudC5JQ29udGVudFtdLFxuICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LFxuICApIHtcbiAgICByZXR1cm4gKGNvbnRlbnRzIHx8IFtdKS5tYXAoKGNvbnRlbnQsIGlkeCkgPT4gKFxuICAgICAgY29udGVudCA/IHtcbiAgICAgICAgd2lkZ2V0VHlwZTogJ2NhcmRMaWInLFxuICAgICAgICB3aWRnZXRTdWJUeXBlOiAnY2FyZENvbnRlbnRMaWInLFxuICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6ICdtYi0yJyxcbiAgICAgICAgd2lkZ2V0RGF0YToge1xuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgLi4uKGNvbnRlbnQuYmF0Y2ggJiYgeyBiYXRjaDogY29udGVudC5iYXRjaCB9KSxcbiAgICAgICAgICBjYXJkU3ViVHlwZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuY2FyZFN1YlR5cGUsXG4gICAgICAgICAgY2FyZEN1c3RvbWVDbGFzczogc3RyaXAuY3VzdG9tZUNsYXNzID8gc3RyaXAuY3VzdG9tZUNsYXNzIDogJycsXG4gICAgICAgICAgY29udGV4dDogeyBwYWdlU2VjdGlvbjogc3RyaXAua2V5LCBwb3NpdGlvbjogaWR4IH0sXG4gICAgICAgICAgaW50cmFuZXRNb2RlOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5pbnRyYW5ldE1vZGUsXG4gICAgICAgICAgZGVsZXRlZE1vZGU6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmRlbGV0ZWRNb2RlLFxuICAgICAgICAgIGNvbnRlbnRUYWdzOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5jb250ZW50VGFncyxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB7XG4gICAgICAgIHdpZGdldFR5cGU6ICdjYXJkJyxcbiAgICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NhcmRDb250ZW50JyxcbiAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbWItMicsXG4gICAgICAgIHdpZGdldERhdGE6IHt9LFxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1FdmVudHNUb1dpZGdldHMoXG4gICAgY29udGVudHM6IElUb2RheUV2ZW50c1tdLFxuICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LFxuICApIHtcbiAgICB0aGlzLmV2ZW50U3ZjLnNldEV2ZW50TGlzdERhdGEoY29udGVudHMpO1xuICAgIHJldHVybiAodGhpcy5ldmVudFN2Yy50b2RheXNFdmVudHMgfHwgW10pLm1hcCgoY29udGVudDogYW55LCBpZHg6IGFueSkgPT4gKGNvbnRlbnQgPyB7XG4gICAgICB3aWRnZXRUeXBlOiAnY2FyZCcsXG4gICAgICB3aWRnZXRTdWJUeXBlOiAnZXZlbnRIdWJDYXJkJyxcbiAgICAgIHdpZGdldEhvc3RDbGFzczogJ21iLTInLFxuICAgICAgd2lkZ2V0RGF0YToge1xuICAgICAgICBjb250ZW50LFxuICAgICAgICBjYXJkU3ViVHlwZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuY2FyZFN1YlR5cGUsXG4gICAgICAgIGNhcmRDdXN0b21lQ2xhc3M6IHN0cmlwLmN1c3RvbWVDbGFzcyA/IHN0cmlwLmN1c3RvbWVDbGFzcyA6ICcnLFxuICAgICAgICBjb250ZXh0OiB7IHBhZ2VTZWN0aW9uOiBzdHJpcC5rZXksIHBvc2l0aW9uOiBpZHggfSxcbiAgICAgICAgaW50cmFuZXRNb2RlOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5pbnRyYW5ldE1vZGUsXG4gICAgICAgIGRlbGV0ZWRNb2RlOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5kZWxldGVkTW9kZSxcbiAgICAgICAgY29udGVudFRhZ3M6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmNvbnRlbnRUYWdzLFxuICAgICAgfSxcbiAgICB9IDoge1xuICAgICAgd2lkZ2V0VHlwZTogJ2NhcmQnLFxuICAgICAgd2lkZ2V0U3ViVHlwZTogJ2V2ZW50SHViQ2FyZCcsXG4gICAgICB3aWRnZXRIb3N0Q2xhc3M6ICdtYi0yJyxcbiAgICAgIHdpZGdldERhdGE6IHt9LFxuICAgIH1cbiAgICApKTtcbiAgfVxuICBwcml2YXRlIHRyYW5zZm9ybVNrZWxldG9uVG9XaWRnZXRzKFxuICAgIHN0cmlwOiBhbnlcbiAgKSB7XG4gICAgcmV0dXJuIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA3LCA4LCA5LCAxMF0ubWFwKF9jb250ZW50ID0+ICh7XG4gICAgICB3aWRnZXRUeXBlOiAnY2FyZExpYicsXG4gICAgICB3aWRnZXRTdWJUeXBlOiAnY2FyZENvbnRlbnRMaWInLFxuICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbWItMicsXG4gICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgIGNhcmRTdWJUeXBlOiBzdHJpcC5sb2FkZXJDb25maWcgJiYgc3RyaXAubG9hZGVyQ29uZmlnLmNhcmRTdWJUeXBlIHx8ICdjYXJkLXN0YW5kYXJkLXNrZWxldG9uJyxcbiAgICAgICAgY2FyZEN1c3RvbWVDbGFzczogc3RyaXAuY3VzdG9tZUNsYXNzID8gc3RyaXAuY3VzdG9tZUNsYXNzIDogJycsXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1N0cmlwKFxuICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LFxuICAgIHJlc3VsdHM6IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhW10gPSBbXSxcbiAgICBmZXRjaFN0YXR1czogVEZldGNoU3RhdHVzLFxuICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUsXG4gICAgX3ZpZXdNb3JlVXJsOiBhbnksXG4gICAgdGFic1Jlc3VsdHM/OiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWJbXSB8IHVuZGVmaW5lZCxcbiAgICAvLyBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgaXMgdXNlZCBzbyB0aGF0IHBhcmVudHMnIHN0YXR1cyBpcyBub3QgcmUtY2FsY3VsYXRlZCBpZiB0aGUgQVBJIGlzIGNhbGxlZCBhZ2FpbiBjb3ogb2YgZmlsdGVycywgZXRjLlxuICApIHtcbiAgICBjb25zdCBzdHJpcERhdGEgPSB7XG4gICAgICB2aWV3TW9yZVVybDogc3RyaXAudmlld01vcmVVcmwsXG4gICAgICBrZXk6IHN0cmlwLmtleSxcbiAgICAgIGNhbkhpZGVTdHJpcDogQm9vbGVhbihzdHJpcC5jYW5IaWRlU3RyaXApLFxuICAgICAgc2hvd1N0cmlwOiB0aGlzLmdldElmU3RyaXBIaWRkZW4oc3RyaXAua2V5KSxcbiAgICAgIG5vRGF0YVdpZGdldDogc3RyaXAubm9EYXRhV2lkZ2V0LFxuICAgICAgZXJyb3JXaWRnZXQ6IHN0cmlwLmVycm9yV2lkZ2V0LFxuICAgICAgc3RyaXBJbmZvOiBzdHJpcC5pbmZvLFxuICAgICAgc3RyaXBUaXRsZTogc3RyaXAudGl0bGUsXG4gICAgICBzdHJpcFRpdGxlTGluazogc3RyaXAuc3RyaXBUaXRsZUxpbmssXG4gICAgICBkaXNhYmxlVHJhbnNsYXRlOiBzdHJpcC5kaXNhYmxlVHJhbnNsYXRlLFxuICAgICAgc2xpZGVyQ29uZmlnOiBzdHJpcC5zbGlkZXJDb25maWcsXG4gICAgICB0YWJzOiB0YWJzUmVzdWx0cyA/IHRhYnNSZXN1bHRzIDogc3RyaXAudGFicyxcbiAgICAgIHN0cmlwTmFtZTogc3RyaXAubmFtZSxcbiAgICAgIG1vZGU6IHN0cmlwLm1vZGUsXG4gICAgICBzdHJpcENvbmZpZzogc3RyaXAuc3RyaXBDb25maWcsXG4gICAgICBzdHJpcEJhY2tncm91bmQ6IHN0cmlwLnN0cmlwQmFja2dyb3VuZCxcbiAgICAgIHNlY29uZGFyeUhlYWRpbmc6IHN0cmlwLnNlY29uZGFyeUhlYWRpbmcsXG4gICAgICBsb2FkZXJXaWRnZXRzOiBzdHJpcC5sb2FkZXJXaWRnZXRzIHx8IFtdLFxuICAgICAgd2lkZ2V0czpcbiAgICAgICAgZmV0Y2hTdGF0dXMgPT09ICdkb25lJ1xuICAgICAgICAgID8gW1xuICAgICAgICAgICAgLi4uKHN0cmlwLnByZVdpZGdldHMgfHwgW10pLm1hcCh3ID0+ICh7XG4gICAgICAgICAgICAgIC4uLncsXG4gICAgICAgICAgICAgIHdpZGdldEhvc3RDbGFzczogYG1iLTIgJHt3LndpZGdldEhvc3RDbGFzc31gLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgLi4ucmVzdWx0cyxcbiAgICAgICAgICAgIC4uLihzdHJpcC5wb3N0V2lkZ2V0cyB8fCBbXSkubWFwKHcgPT4gKHtcbiAgICAgICAgICAgICAgLi4udyxcbiAgICAgICAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiBgbWItMiAke3cud2lkZ2V0SG9zdENsYXNzfWAsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXVxuICAgICAgICAgIDogW10sXG4gICAgICBzaG93T25Ob0RhdGE6IEJvb2xlYW4oXG4gICAgICAgIHN0cmlwLm5vRGF0YVdpZGdldCAmJlxuICAgICAgICAhKChzdHJpcC5wcmVXaWRnZXRzIHx8IFtdKS5sZW5ndGggKyByZXN1bHRzLmxlbmd0aCArIChzdHJpcC5wb3N0V2lkZ2V0cyB8fCBbXSkubGVuZ3RoKSAmJlxuICAgICAgICBmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnLFxuICAgICAgKSxcbiAgICAgIHNob3dPbkxvYWRlcjogQm9vbGVhbihzdHJpcC5sb2FkZXIgJiYgZmV0Y2hTdGF0dXMgPT09ICdmZXRjaGluZycpLFxuICAgICAgc2hvd09uRXJyb3I6IEJvb2xlYW4oc3RyaXAuZXJyb3JXaWRnZXQgJiYgZmV0Y2hTdGF0dXMgPT09ICdlcnJvcicpLFxuICAgIH07XG4gICAgLy8gY29uc3Qgc3RyaXBEYXRhID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV1cbiAgICB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXAgPSB7XG4gICAgICAuLi50aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXAsXG4gICAgICBbc3RyaXAua2V5XTogc3RyaXBEYXRhLFxuICAgIH07XG4gICAgaWYgKCF0YWJzUmVzdWx0cykge1xuICAgICAgaWYgKFxuICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgJiZcbiAgICAgICAgKGZldGNoU3RhdHVzID09PSAnZG9uZScgfHwgZmV0Y2hTdGF0dXMgPT09ICdlcnJvcicpICYmXG4gICAgICAgIHN0cmlwRGF0YS53aWRnZXRzXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaGVja1BhcmVudFN0YXR1cyhmZXRjaFN0YXR1cywgc3RyaXBEYXRhLndpZGdldHMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYWxjdWxhdGVQYXJlbnRTdGF0dXMgJiYgIShyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2hlY2tQYXJlbnRTdGF0dXMoZmV0Y2hTdGF0dXM6IFRGZXRjaFN0YXR1cywgc3RyaXBXaWRnZXRzQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnICYmICFzdHJpcFdpZGdldHNDb3VudCkge1xuICAgICAgdGhpcy5ub0RhdGFDb3VudCArPSAxO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hTdGF0dXMgPT09ICdkb25lJyAmJiBzdHJpcFdpZGdldHNDb3VudCkge1xuICAgICAgdGhpcy5zdWNjZXNzRGF0YUNvdW50ICs9IDE7XG4gICAgfSBlbHNlIGlmIChmZXRjaFN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgdGhpcy5lcnJvckRhdGFDb3VudCArPSAxO1xuICAgIH1cbiAgICBjb25zdCBzZXR0bGVkQ291bnQgPSB0aGlzLm5vRGF0YUNvdW50ICsgdGhpcy5zdWNjZXNzRGF0YUNvdW50ICsgdGhpcy5lcnJvckRhdGFDb3VudDtcbiAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy53aWRnZXREYXRhLnN0cmlwcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuc3VjY2Vzc0RhdGFDb3VudCA+IDAgJiYgc2V0dGxlZENvdW50IDwgdG90YWxDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNob3dQYXJlbnRMb2FkZXIgPSBzZXR0bGVkQ291bnQgIT09IHRvdGFsQ291bnQ7XG4gICAgdGhpcy5zaG93UGFyZW50Tm9EYXRhID1cbiAgICAgIHRoaXMubm9EYXRhQ291bnQgPiAwICYmIHRoaXMubm9EYXRhQ291bnQgKyB0aGlzLmVycm9yRGF0YUNvdW50ID09PSB0b3RhbENvdW50O1xuICAgIHRoaXMuc2hvd1BhcmVudEVycm9yID0gdGhpcy5lcnJvckRhdGFDb3VudCA9PT0gdG90YWxDb3VudDtcbiAgfVxuICBjaGVja0ZvckVtcHR5V2lkZ2V0KHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3RyaXAucmVxdWVzdCAmJlxuICAgICAgKChzdHJpcC5yZXF1ZXN0LmFwaSAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmFwaSkubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5zZWFyY2ggJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5zZWFyY2gpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3Quc2VhcmNoUmVnaW9uUmVjb21tZW5kYXRpb24gJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnNlYXJjaFJlZ2lvblJlY29tbWVuZGF0aW9uKS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QuZW5yb2xsbWVudExpc3QgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5lbnJvbGxtZW50TGlzdCkubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5jYnBMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCkubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoKS5sZW5ndGgpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHRhYkNsaWNrZWQodGFiRXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50LCBzdHJpcE1hcDogSVN0cmlwVW5pdENvbnRlbnREYXRhLCBzdHJpcEtleTogc3RyaW5nKSB7XG4gICAgaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0pIHtcbiAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLmZldGNoVGFiU3RhdHVzID0gJ2lucHJvZ3Jlc3MnO1xuICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0udGFiTG9hZGluZyA9IHRydWU7XG4gICAgICBzdHJpcE1hcC5zaG93T25Mb2FkZXIgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkYXRhOiBXc0V2ZW50cy5JVGVsZW1ldHJ5VGFiRGF0YSA9IHtcbiAgICAgIGxhYmVsOiBgJHt0YWJFdmVudC50YWIudGV4dExhYmVsfWAsXG4gICAgICBpbmRleDogdGFiRXZlbnQuaW5kZXgsXG4gICAgfTtcbiAgICB0aGlzLmV2ZW50U3ZjLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5IT01FX1BBR0VfU1RSSVBfVEFCUyxcbiAgICAgICAgaWQ6IGAke18uY2FtZWxDYXNlKGRhdGEubGFiZWwpfS10YWJgLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkhPTUUsXG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50VGFiRnJvbU1hcDogYW55ID0gc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XTtcbiAgICBjb25zdCBjdXJyZW50U3RyaXAgPSB0aGlzLndpZGdldERhdGEuc3RyaXBzLmZpbmQocyA9PiBzLmtleSA9PT0gc3RyaXBLZXkpO1xuICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXBLZXldICYmIGN1cnJlbnRUYWJGcm9tTWFwKSB7XG4gICAgICB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXBLZXldLnZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zID0ge1xuICAgICAgICAuLi50aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXBLZXldLnZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB0YWJTZWxlY3RlZDogY3VycmVudFRhYkZyb21NYXAubGFiZWwsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY3VycmVudFN0cmlwICYmIGN1cnJlbnRUYWJGcm9tTWFwICYmICFjdXJyZW50VGFiRnJvbU1hcC5jb21wdXRlRGF0YU9uQ2xpY2spIHtcbiAgICAgIGlmIChjdXJyZW50VGFiRnJvbU1hcC5yZXF1ZXN0UmVxdWlyZWQgJiYgY3VycmVudFRhYkZyb21NYXAucmVxdWVzdCkge1xuICAgICAgICAvLyBjYWxsIEFQSSB0byBnZXQgdGFiIGRhdGEgYW5kIHByb2Nlc3NcbiAgICAgICAgLy8gdGhpcy5wcm9jZXNzU3RyaXAoY3VycmVudFN0cmlwLCBbXSwgJ2ZldGNoaW5nJywgdHJ1ZSwgbnVsbClcbiAgICAgICAgaWYgKGN1cnJlbnRUYWJGcm9tTWFwLnJlcXVlc3Quc2VhcmNoVjYpIHtcbiAgICAgICAgICB0aGlzLmdldFRhYkRhdGFCeU5ld1JlcVNlYXJjaFY2KGN1cnJlbnRTdHJpcCwgdGFiRXZlbnQuaW5kZXgsIGN1cnJlbnRUYWJGcm9tTWFwLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VGFiRnJvbU1hcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoKSB7XG4gICAgICAgICAgdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFUcmVuZGluZyhjdXJyZW50U3RyaXAsIHRhYkV2ZW50LmluZGV4LCBjdXJyZW50VGFiRnJvbU1hcCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0pIHtcbiAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5ZmlsdGVyKGN1cnJlbnRTdHJpcCwgY3VycmVudFRhYkZyb21NYXAsIHRydWUpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XSkge1xuICAgICAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLmZldGNoVGFiU3RhdHVzID0gJ2RvbmUnO1xuICAgICAgICAgICAgICBzdHJpcE1hcC5zaG93T25Mb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sICAgICAgICAgMjAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICB0YWJJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRUYWI6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYixcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZWFyY2hWNlJlcXVlc3Qoc3RyaXAsIGN1cnJlbnRUYWIucmVxdWVzdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IHdpZGdldHMgPSB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmNvbnRlbnQsIHN0cmlwKTtcbiAgICAgICAgbGV0IHRhYlJlc3VsdHM6IGFueVtdID0gW107XG4gICAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzKSB7XG4gICAgICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnM7XG4gICAgICAgICAgaWYgKGFsbFRhYnMgJiYgYWxsVGFicy5sZW5ndGggJiYgYWxsVGFic1t0YWJJbmRleF0pIHtcbiAgICAgICAgICAgIGFsbFRhYnNbdGFiSW5kZXhdID0ge1xuICAgICAgICAgICAgICAuLi5hbGxUYWJzW3RhYkluZGV4XSxcbiAgICAgICAgICAgICAgd2lkZ2V0cyxcbiAgICAgICAgICAgICAgZmV0Y2hUYWJTdGF0dXM6ICdkb25lJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0YWJSZXN1bHRzID0gYWxsVGFicztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgd2lkZ2V0cyxcbiAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAgICAgICAgIHRhYlJlc3VsdHMgLy8gdGFiUmVzdWx0cyBhcyB3aWRnZXRzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRUYWJEYXRhQnlOZXdSZXFUcmVuZGluZyhcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICB0YWJJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRUYWI6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYixcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50cmVuZGluZ1NlYXJjaFJlcXVlc3Qoc3RyaXAsIGN1cnJlbnRUYWIucmVxdWVzdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzICYmIHJlc3BvbnNlLnJlc3VsdHMucmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3BvbnNlLnJlc3VsdHMucmVzcG9uc2VbY3VycmVudFRhYi52YWx1ZV0gfHwgW107XG4gICAgICAgIGNvbnN0IHdpZGdldHMgPSB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvbnRlbnQsIHN0cmlwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2N1cnJlbnRUYWIgLS0tIHdpZGdldHMnLCB3aWRnZXRzKVxuICAgICAgICBsZXQgdGFiUmVzdWx0czogYW55W10gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnMpIHtcbiAgICAgICAgICBjb25zdCBhbGxUYWJzID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicztcbiAgICAgICAgICBpZiAoYWxsVGFicyAmJiBhbGxUYWJzLmxlbmd0aCAmJiBhbGxUYWJzW3RhYkluZGV4XSkge1xuICAgICAgICAgICAgYWxsVGFic1t0YWJJbmRleF0gPSB7XG4gICAgICAgICAgICAgIC4uLmFsbFRhYnNbdGFiSW5kZXhdLFxuICAgICAgICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhYlJlc3VsdHMgPSBhbGxUYWJzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZygndGFiUmVzdWx0cyAtKysrKyoqKi0tJywgdGFiUmVzdWx0cylcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyLS0gJylcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgd2lkZ2V0cyxcbiAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAgICAgICAgIHRhYlJlc3VsdHMgLy8gdGFiUmVzdWx0cyBhcyB3aWRnZXRzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRhYkRhdGFCeWZpbHRlcihcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICBjdXJyZW50VGFiOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWIsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBib29sZWFuXG4gICkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnc3RyaXAgLS0gJywgc3RyaXApO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnY3VycmVudFRhYiAtLSAnLCBjdXJyZW50VGFiKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ2NhbGN1bGF0ZVBhcmVudFN0YXR1cy0tICcsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgLy8gVE9ETzogV3JpdGUgbG9naWMgZm9yIGluZGl2aWR1YWwgZmlsdGVyIGlmIHBhc3NlZCBpbiBjb25maWdcbiAgICAvLyBhZGQgc3dpdGNoIGNhc2UgYmFzZWQgb24gY29uZmlnIGtleSBwYXNzZWRcbiAgfVxuXG4gIGFzeW5jIGZldGNoQWxsQ2JwUGxhbnMoc3RyaXA6IGFueSwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuXG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5jYnBMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCkubGVuZ3RoKSB7XG5cbiAgICAgIGxldCBjb3Vyc2VzOiBOc0NvbnRlbnQuSUNvbnRlbnRbXTtcbiAgICAgIGxldCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVzZXJTdmMuZmV0Y2hDYnBQbGFuTGlzdCgpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb3Vyc2VzID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoc3RyaXAudGFicyAmJiBzdHJpcC50YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdENicFRhYnNEYXRhKGNvdXJzZXMsIHN0cmlwKTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb3Vyc2VzLCBzdHJpcCksXG4gICAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICB0YWJSZXN1bHRzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvdXJzZXMsIHN0cmlwKSxcbiAgICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICAgICd2aWV3TW9yZVVybCcsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB0aGlzLnVzZXJTdmMuZmV0Y2hDYnBQbGFuTGlzdCgpLnN1YnNjcmliZSggYXN5bmMgIChyZXM6IGFueSkgPT4ge1xuICAgICAgLy8gICBpZiAocmVzKSB7XG4gICAgICAvLyAgICAgY29uc29sZS5sb2cocmVzLCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PicpXG4gICAgICAvLyAgICAgY291cnNlcyA9IHJlc1xuICAgICAgLy8gICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAvLyAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdENicFRhYnNEYXRhKGNvdXJzZXMsIHN0cmlwKVxuICAgICAgLy8gICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAvLyAgICAgICAgIHN0cmlwLFxuICAgICAgLy8gICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvdXJzZXMsIHN0cmlwKSxcbiAgICAgIC8vICAgICAgICAgJ2RvbmUnLFxuICAgICAgLy8gICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAvLyAgICAgICAgICcnLFxuICAgICAgLy8gICAgICAgICB0YWJSZXN1bHRzXG4gICAgICAvLyAgICAgICApXG4gICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgLy8gICAgICAgICBzdHJpcCxcbiAgICAgIC8vICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb3Vyc2VzLCBzdHJpcCksXG4gICAgICAvLyAgICAgICAgICdkb25lJyxcbiAgICAgIC8vICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgLy8gICAgICAgICAndmlld01vcmVVcmwnLFxuICAgICAgLy8gICAgICAgKVxuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lcnI6IGFueSkgPT4ge1xuXG4gICAgICAvLyB9KVxuXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZW5yb2xsSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuICBzcGxpdENicFRhYnNEYXRhKGNvbnRlbnROZXc6IE5zQ29udGVudC5JQ29udGVudFtdLCBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAgIGNvbnN0IHRhYlJlc3VsdHM6IGFueVtdID0gW107XG4gICAgY29uc3Qgc3BsaXREYXRhID0gdGhpcy5nZXRUYWJzTGlzdChcbiAgICAgIGNvbnRlbnROZXcsXG4gICAgICBzdHJpcCxcbiAgICApO1xuICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmlwLnRhYnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKHN0cmlwLnRhYnNbaV0pIHtcbiAgICAgICAgICB0YWJSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnN0cmlwLnRhYnNbaV0sXG4gICAgICAgICAgICAgIGZldGNoVGFiU3RhdHVzOiAnZG9uZScsXG4gICAgICAgICAgICAgIC4uLihzcGxpdERhdGEuZmluZChpdG1Jbm5lciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmlwLnRhYnMgJiYgc3RyaXAudGFic1tpXSAmJiBpdG1Jbm5lci52YWx1ZSA9PT0gc3RyaXAudGFic1tpXS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0bUlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFiUmVzdWx0cztcbiAgfVxuXG4gIGdldFRhYnNMaXN0KGFycmF5OiBOc0NvbnRlbnQuSUNvbnRlbnRbXSxcbiAgICAgICAgICAgICAgc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQpIHtcbiAgICBsZXQgYWxsOiBhbnlbXSA9IFtdO1xuICAgIGxldCB1cGNvbWluZzogYW55W10gPSBbXTtcbiAgICBsZXQgb3ZlcmR1ZTogYW55W10gPSBbXTtcbiAgICBhcnJheS5mb3JFYWNoKChlOiBhbnkpID0+IHtcbiAgICAgIGFsbC5wdXNoKGUpO1xuICAgICAgaWYgKGUucGxhbkR1cmF0aW9uID09PSBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5PVkVSRFVFKSB7XG4gICAgICAgIG92ZXJkdWUucHVzaChlKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0LlVQQ09NSU5HKSB7XG4gICAgICAgIHVwY29taW5nLnB1c2goZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgYWxsQ29tcGxldGVkID0gYWxsLmZpbHRlcigoYWxsRGF0YTogYW55KSA9PiBhbGxEYXRhLmNvbnRlbnRTdGF0dXMgPT09IDIpO1xuICAgIGxldCBhbGxJbkNvbXBsZXRlZCA9IGFsbC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gYWxsRGF0YS5jb250ZW50U3RhdHVzIDwgMik7XG5cbiAgICBsZXQgYWxsQ29tcGxldGVkT3ZlckR1ZSA9IGFsbENvbXBsZXRlZC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gYWxsRGF0YS5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUpO1xuICAgIGNvbnN0IGFsbENvbXBsZXRlZEFsbCA9IGFsbENvbXBsZXRlZC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gIGFsbERhdGEucGxhbkR1cmF0aW9uICE9PSBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5PVkVSRFVFKTtcblxuICAgIGFsbENvbXBsZXRlZE92ZXJEdWUgPSBhbGxDb21wbGV0ZWRPdmVyRHVlLnNvcnQoKGE6IGFueSwgYjogYW55KTogYW55ID0+IHtcbiAgICAgIGlmIChhLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSAmJiBiLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSkge1xuICAgICAgICBjb25zdCBmaXJzdERhdGU6IGFueSA9IG5ldyBEYXRlKGEuZW5kRGF0ZSk7XG4gICAgICAgIGNvbnN0IHNlY29uZERhdGU6IGFueSA9IG5ldyBEYXRlKGIuZW5kRGF0ZSk7XG4gICAgICAgIHJldHVybiAgZmlyc3REYXRlID4gc2Vjb25kRGF0ZSAgPyAtMSA6IDE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhbGxJbkNvbXBsZXRlZCA9IGFsbEluQ29tcGxldGVkLnNvcnQoKGE6IGFueSwgYjogYW55KTogYW55ID0+IHtcbiAgICAgIGlmIChhLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSAmJiBiLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSkge1xuICAgICAgICBjb25zdCBmaXJzdERhdGU6IGFueSA9IG5ldyBEYXRlKGEuZW5kRGF0ZSk7XG4gICAgICAgIGNvbnN0IHNlY29uZERhdGU6IGFueSA9IG5ldyBEYXRlKGIuZW5kRGF0ZSk7XG4gICAgICAgIHJldHVybiAgZmlyc3REYXRlID4gc2Vjb25kRGF0ZSAgPyAtMSA6IDE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhbGwgPSBbLi4uYWxsSW5Db21wbGV0ZWQsIC4uLmFsbENvbXBsZXRlZEFsbCwgLi4uYWxsQ29tcGxldGVkT3ZlckR1ZV07XG5cbiAgICBvdmVyZHVlID0gb3ZlcmR1ZS5maWx0ZXIoKGRhdGE6IGFueSk6IGFueSA9PiB7XG4gICAgICByZXR1cm4gZGF0YS5jb250ZW50U3RhdHVzIDwgMjtcbiAgICB9KTtcblxuICAgIG92ZXJkdWUgPSBvdmVyZHVlLnNvcnQoKGE6IGFueSwgYjogYW55KTogYW55ID0+IHtcbiAgICAgICAgY29uc3QgZmlyc3REYXRlOiBhbnkgPSBuZXcgRGF0ZShhLmVuZERhdGUpO1xuICAgICAgICBjb25zdCBzZWNvbmREYXRlOiBhbnkgPSBuZXcgRGF0ZShiLmVuZERhdGUpO1xuICAgICAgICByZXR1cm4gIGZpcnN0RGF0ZSA+IHNlY29uZERhdGUgID8gLTEgOiAxO1xuICAgIH0pO1xuXG4gICAgdXBjb21pbmcgPSB1cGNvbWluZy5maWx0ZXIoKGRhdGE6IGFueSk6IGFueSA9PiB7XG4gICAgICByZXR1cm4gZGF0YS5jb250ZW50U3RhdHVzIDwgMjtcbiAgICB9KTtcbiAgICAvLyB0aGlzLmdldFNlbGVjdGVkSW5kZXgoMSlcbiAgICByZXR1cm4gW1xuICAgIHsgdmFsdWU6ICdhbGwnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGFsbCwgc3RyaXApIH0sXG4gICAgeyB2YWx1ZTogJ3VwY29taW5nJywgd2lkZ2V0czogdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyh1cGNvbWluZywgc3RyaXApIH0sXG4gICAgeyB2YWx1ZTogJ292ZXJkdWUnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKG92ZXJkdWUsIHN0cmlwKSB9XTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkSW5kZXgoc3RyaXBzUmVzdWx0RGF0YU1hcDogYW55LCBrZXk6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gMDtcbiAgICBpZiAoa2V5ID09PSAnY2JwUGxhbicpIHtcbiAgICAgIGlmIChzdHJpcHNSZXN1bHREYXRhTWFwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzdHJpcHNSZXN1bHREYXRhTWFwLnRhYnMuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnZhbHVlID09PSAndXBjb21pbmcnKTtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBkYXRhWzBdLndpZGdldHMgJiYgZGF0YVswXS53aWRnZXRzLmxlbmd0aCA+IDAgPyAxIDogMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKTtcbiAgfVxuXG4gIGlkZW50aWZ5KGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIGlmIChpbmRleCA+PSAwKSB7IH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICB0cmFja2VyKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIGlmIChpbmRleCA+PSAwKSB7IH1cbiAgICByZXR1cm4gXy5nZXQoaXRlbSwgJ3dpZGdldERhdGEuY29udGVudC5pZGVudGlmaWVyJylcbiAgfVxufVxuIl19