@sunbird-cb/consumption 0.0.0-watch

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 (394) hide show
  1. package/README.md +24 -0
  2. package/esm2015/lib/_common/announcements/announcements.component.js +98 -0
  3. package/esm2015/lib/_common/announcements/announcements.module.js +30 -0
  4. package/esm2015/lib/_common/avatar-photo-lib/avatar-photo-lib.component.js +113 -0
  5. package/esm2015/lib/_common/avatar-photo-lib/avatar-photo-lib.module.js +47 -0
  6. package/esm2015/lib/_common/calender/calender-day/calender-day.component.js +51 -0
  7. package/esm2015/lib/_common/calender/calender.component.js +191 -0
  8. package/esm2015/lib/_common/calender/calender.module.js +45 -0
  9. package/esm2015/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.js +89 -0
  10. package/esm2015/lib/_common/cards/card-karma-programs/card-karma-programs.component.js +96 -0
  11. package/esm2015/lib/_common/cards/card-karma-programs-v2/card-karma-programs-v2.component.js +90 -0
  12. package/esm2015/lib/_common/cards/card-landscape/card-landscape.component.js +109 -0
  13. package/esm2015/lib/_common/cards/card-mdo-channel/card-mdo-channel.component.js +77 -0
  14. package/esm2015/lib/_common/cards/card-mdo-channel-v1/card-mdo-channel-v1.component.js +77 -0
  15. package/esm2015/lib/_common/cards/card-portrait/card-portrait.component.js +95 -0
  16. package/esm2015/lib/_common/cards/card-portrait-ext/card-portrait-ext.component.js +97 -0
  17. package/esm2015/lib/_common/cards/card-progress-portrait-lib/card-progress-portrait-lib.component.js +150 -0
  18. package/esm2015/lib/_common/cards/card-resource/card-resource.component.js +23 -0
  19. package/esm2015/lib/_common/cards/card-user/card-user.component.js +74 -0
  20. package/esm2015/lib/_common/cards/card-wide/card-wide.component.js +92 -0
  21. package/esm2015/lib/_common/cards/card-wide-v2/card-wide-v2.component.js +91 -0
  22. package/esm2015/lib/_common/cards/cards.component.js +104 -0
  23. package/esm2015/lib/_common/cards/cards.module.js +168 -0
  24. package/esm2015/lib/_common/cards/provider-card/provider-card.component.js +52 -0
  25. package/esm2015/lib/_common/cbp-plan/cbp-plan.component.js +95 -0
  26. package/esm2015/lib/_common/cbp-plan/cbp-plan.module.js +38 -0
  27. package/esm2015/lib/_common/common-strip/common-strip.component.js +323 -0
  28. package/esm2015/lib/_common/common-strip/common-strip.model.js +2 -0
  29. package/esm2015/lib/_common/common-strip/common-strip.module.js +147 -0
  30. package/esm2015/lib/_common/competency-passbook/competency-passbook.component.js +366 -0
  31. package/esm2015/lib/_common/competency-passbook/competency-passbook.module.js +36 -0
  32. package/esm2015/lib/_common/competency-passbook/competency-passbook.service.js +30 -0
  33. package/esm2015/lib/_common/competency-passbook-mdo/competency-passbook-mdo.component.js +190 -0
  34. package/esm2015/lib/_common/competency-passbook-mdo/competency-passbook-mdo.module.js +36 -0
  35. package/esm2015/lib/_common/competency-passbook-mdo/competency-passbook-mdo.service.js +30 -0
  36. package/esm2015/lib/_common/content-progress/content-progress.component.js +76 -0
  37. package/esm2015/lib/_common/content-progress/content-progress.module.js +30 -0
  38. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +1661 -0
  39. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.js +2 -0
  40. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.module.js +152 -0
  41. package/esm2015/lib/_common/data-points/data-points.component.js +119 -0
  42. package/esm2015/lib/_common/data-points/data-points.module.js +28 -0
  43. package/esm2015/lib/_common/dialog-components/certificate-dialog/certificate-dialog.component.js +138 -0
  44. package/esm2015/lib/_common/dialog-components/dialog-components.module.js +65 -0
  45. package/esm2015/lib/_common/display-content-type-lib/display-content-type-lib.component.js +33 -0
  46. package/esm2015/lib/_common/display-content-type-lib/display-content-type-lib.module.js +19 -0
  47. package/esm2015/lib/_common/events/event-card/event-card.component.js +46 -0
  48. package/esm2015/lib/_common/events/events.component.js +111 -0
  49. package/esm2015/lib/_common/events/events.module.js +35 -0
  50. package/esm2015/lib/_common/highlights-of-week/highlights-of-week.component.js +50 -0
  51. package/esm2015/lib/_common/highlights-of-week/highlights-of-week.module.js +40 -0
  52. package/esm2015/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.js +258 -0
  53. package/esm2015/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.module.js +34 -0
  54. package/esm2015/lib/_common/key-highlights/key-highlights.component.js +45 -0
  55. package/esm2015/lib/_common/key-highlights/key-highlights.module.js +37 -0
  56. package/esm2015/lib/_common/mdo-leaderboard/mdo-leaderboard.component.js +103 -0
  57. package/esm2015/lib/_common/mdo-leaderboard/mdo-leaderboard.module.js +42 -0
  58. package/esm2015/lib/_common/microsites/mdo-channels/mdo-channel-v1/mdo-channel-v1.component.js +18 -0
  59. package/esm2015/lib/_common/microsites/mdo-channels/mdo-channel-v2/mdo-channel-v2.component.js +158 -0
  60. package/esm2015/lib/_common/microsites/mdo-channels/mdo-channel.module.js +93 -0
  61. package/esm2015/lib/_common/microsites/national-learning-week/national-learning/national-learning.component.js +85 -0
  62. package/esm2015/lib/_common/microsites/national-learning-week/national-learning.module.js +87 -0
  63. package/esm2015/lib/_common/microsites/providers/providers-v2/providers-v2.component.js +156 -0
  64. package/esm2015/lib/_common/microsites/providers/providers.module.js +90 -0
  65. package/esm2015/lib/_common/pills/pills.component.js +44 -0
  66. package/esm2015/lib/_common/pills/pills.module.js +34 -0
  67. package/esm2015/lib/_common/skeleton-loader-lib/skeleton-loader-lib.component.js +29 -0
  68. package/esm2015/lib/_common/skeleton-loader-lib/skeleton-loader-lib.module.js +40 -0
  69. package/esm2015/lib/_common/sliders/sliders.component.js +117 -0
  70. package/esm2015/lib/_common/sliders/sliders.model.js +2 -0
  71. package/esm2015/lib/_common/sliders/sliders.module.js +53 -0
  72. package/esm2015/lib/_common/sliders-ng-content/sliders-ng-content.component.js +138 -0
  73. package/esm2015/lib/_common/sliders-ng-content/sliders-ng-content.model.js +2 -0
  74. package/esm2015/lib/_common/sliders-ng-content/sliders-ng-content.module.js +53 -0
  75. package/esm2015/lib/_common/speakers/speakers.component.js +73 -0
  76. package/esm2015/lib/_common/speakers/speakers.module.js +40 -0
  77. package/esm2015/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.component.js +684 -0
  78. package/esm2015/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.model.js +5 -0
  79. package/esm2015/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.module.js +152 -0
  80. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.js +957 -0
  81. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.model.js +2 -0
  82. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.module.js +152 -0
  83. package/esm2015/lib/_common/top-learners/top-learners.component.js +104 -0
  84. package/esm2015/lib/_common/top-learners/top-learners.module.js +30 -0
  85. package/esm2015/lib/_common/user-content-rating/user-content-rating-lib.component.js +83 -0
  86. package/esm2015/lib/_common/user-content-rating/user-content-rating-lib.module.js +58 -0
  87. package/esm2015/lib/_common/user-content-rating/user-content-rating-lib.service.js +23 -0
  88. package/esm2015/lib/_common/user-progress/user-progress.component.js +111 -0
  89. package/esm2015/lib/_common/user-progress/user-progress.module.js +40 -0
  90. package/esm2015/lib/_constants/misc.constants.js +2 -0
  91. package/esm2015/lib/_directives/default-thumbnail/default-thumbnail.directive.js +40 -0
  92. package/esm2015/lib/_directives/default-thumbnail/default-thumbnail.module.js +22 -0
  93. package/esm2015/lib/_directives/image-responsive/image-responsive.directive.js +87 -0
  94. package/esm2015/lib/_directives/image-responsive/image-responsive.module.js +22 -0
  95. package/esm2015/lib/_directives/navigation/navigation.directive.js +43 -0
  96. package/esm2015/lib/_directives/navigation/navigation.module.js +22 -0
  97. package/esm2015/lib/_directives/scrollable-item/scrollable-item.directive.js +22 -0
  98. package/esm2015/lib/_directives/scrollable-item/scrollable-item.module.js +22 -0
  99. package/esm2015/lib/_models/card-content-v2.model.js +23 -0
  100. package/esm2015/lib/_models/card-content.model.js +23 -0
  101. package/esm2015/lib/_models/card-users.model.js +2 -0
  102. package/esm2015/lib/_models/compentencies.model.js +2 -0
  103. package/esm2015/lib/_models/content-strip-multiple.model.js +2 -0
  104. package/esm2015/lib/_models/event.js +2 -0
  105. package/esm2015/lib/_models/profile-v3.models.js +2 -0
  106. package/esm2015/lib/_models/rating.model.js +2 -0
  107. package/esm2015/lib/_models/widget-content.model.js +241 -0
  108. package/esm2015/lib/_models/widget-search.model.js +2 -0
  109. package/esm2015/lib/_models/widget-user.model.js +2 -0
  110. package/esm2015/lib/_pipes/object-to-array/object-to-array.pipe.js +24 -0
  111. package/esm2015/lib/_pipes/object-to-array/object-to-array.pipe.module.js +22 -0
  112. package/esm2015/lib/_pipes/pipe-duration-transform/pipe-duration-transform.module.js +22 -0
  113. package/esm2015/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +84 -0
  114. package/esm2015/lib/_pipes/pipe-public-URL/pipe-public-URL.module.js +22 -0
  115. package/esm2015/lib/_pipes/pipe-public-URL/pipe-public-URL.pipe.js +24 -0
  116. package/esm2015/lib/_services/certificate.service.js +27 -0
  117. package/esm2015/lib/_services/common-methods.service.js +52 -0
  118. package/esm2015/lib/_services/configurations.service.js +106 -0
  119. package/esm2015/lib/_services/insite-data.service.js +56 -0
  120. package/esm2015/lib/_services/multilingual-translations.service.js +134 -0
  121. package/esm2015/lib/_services/rating.service.js +90 -0
  122. package/esm2015/lib/_services/viewer-route-util.js +100 -0
  123. package/esm2015/lib/_services/widget-content.service.js +477 -0
  124. package/esm2015/lib/_services/widget-user.service.js +300 -0
  125. package/esm2015/lib/consumption.component.js +26 -0
  126. package/esm2015/lib/consumption.config.js +7 -0
  127. package/esm2015/lib/consumption.module.js +56 -0
  128. package/esm2015/lib/consumption.service.js +14 -0
  129. package/esm2015/lib/registration-lib.config.js +15 -0
  130. package/esm2015/public-api.js +73 -0
  131. package/esm2015/sunbird-cb-consumption.js +5 -0
  132. package/fesm2015/sunbird-cb-consumption.js +11436 -0
  133. package/fesm2015/sunbird-cb-consumption.js.map +1 -0
  134. package/lib/_common/announcements/announcements.component.d.ts +25 -0
  135. package/lib/_common/announcements/announcements.component.d.ts.map +1 -0
  136. package/lib/_common/announcements/announcements.module.d.ts +11 -0
  137. package/lib/_common/announcements/announcements.module.d.ts.map +1 -0
  138. package/lib/_common/avatar-photo-lib/avatar-photo-lib.component.d.ts +24 -0
  139. package/lib/_common/avatar-photo-lib/avatar-photo-lib.component.d.ts.map +1 -0
  140. package/lib/_common/avatar-photo-lib/avatar-photo-lib.module.d.ts +15 -0
  141. package/lib/_common/avatar-photo-lib/avatar-photo-lib.module.d.ts.map +1 -0
  142. package/lib/_common/calender/calender-day/calender-day.component.d.ts +22 -0
  143. package/lib/_common/calender/calender-day/calender-day.component.d.ts.map +1 -0
  144. package/lib/_common/calender/calender.component.d.ts +38 -0
  145. package/lib/_common/calender/calender.component.d.ts.map +1 -0
  146. package/lib/_common/calender/calender.module.d.ts +14 -0
  147. package/lib/_common/calender/calender.module.d.ts.map +1 -0
  148. package/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.d.ts +35 -0
  149. package/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.d.ts.map +1 -0
  150. package/lib/_common/cards/card-karma-programs/card-karma-programs.component.d.ts +32 -0
  151. package/lib/_common/cards/card-karma-programs/card-karma-programs.component.d.ts.map +1 -0
  152. package/lib/_common/cards/card-karma-programs-v2/card-karma-programs-v2.component.d.ts +30 -0
  153. package/lib/_common/cards/card-karma-programs-v2/card-karma-programs-v2.component.d.ts.map +1 -0
  154. package/lib/_common/cards/card-landscape/card-landscape.component.d.ts +40 -0
  155. package/lib/_common/cards/card-landscape/card-landscape.component.d.ts.map +1 -0
  156. package/lib/_common/cards/card-mdo-channel/card-mdo-channel.component.d.ts +31 -0
  157. package/lib/_common/cards/card-mdo-channel/card-mdo-channel.component.d.ts.map +1 -0
  158. package/lib/_common/cards/card-mdo-channel-v1/card-mdo-channel-v1.component.d.ts +31 -0
  159. package/lib/_common/cards/card-mdo-channel-v1/card-mdo-channel-v1.component.d.ts.map +1 -0
  160. package/lib/_common/cards/card-portrait/card-portrait.component.d.ts +37 -0
  161. package/lib/_common/cards/card-portrait/card-portrait.component.d.ts.map +1 -0
  162. package/lib/_common/cards/card-portrait-ext/card-portrait-ext.component.d.ts +37 -0
  163. package/lib/_common/cards/card-portrait-ext/card-portrait-ext.component.d.ts.map +1 -0
  164. package/lib/_common/cards/card-progress-portrait-lib/card-progress-portrait-lib.component.d.ts +46 -0
  165. package/lib/_common/cards/card-progress-portrait-lib/card-progress-portrait-lib.component.d.ts.map +1 -0
  166. package/lib/_common/cards/card-resource/card-resource.component.d.ts +12 -0
  167. package/lib/_common/cards/card-resource/card-resource.component.d.ts.map +1 -0
  168. package/lib/_common/cards/card-user/card-user.component.d.ts +28 -0
  169. package/lib/_common/cards/card-user/card-user.component.d.ts.map +1 -0
  170. package/lib/_common/cards/card-wide/card-wide.component.d.ts +34 -0
  171. package/lib/_common/cards/card-wide/card-wide.component.d.ts.map +1 -0
  172. package/lib/_common/cards/card-wide-v2/card-wide-v2.component.d.ts +38 -0
  173. package/lib/_common/cards/card-wide-v2/card-wide-v2.component.d.ts.map +1 -0
  174. package/lib/_common/cards/cards.component.d.ts +30 -0
  175. package/lib/_common/cards/cards.component.d.ts.map +1 -0
  176. package/lib/_common/cards/cards.module.d.ts +39 -0
  177. package/lib/_common/cards/cards.module.d.ts.map +1 -0
  178. package/lib/_common/cards/provider-card/provider-card.component.d.ts +18 -0
  179. package/lib/_common/cards/provider-card/provider-card.component.d.ts.map +1 -0
  180. package/lib/_common/cbp-plan/cbp-plan.component.d.ts +29 -0
  181. package/lib/_common/cbp-plan/cbp-plan.component.d.ts.map +1 -0
  182. package/lib/_common/cbp-plan/cbp-plan.module.d.ts +13 -0
  183. package/lib/_common/cbp-plan/cbp-plan.module.d.ts.map +1 -0
  184. package/lib/_common/common-strip/common-strip.component.d.ts +108 -0
  185. package/lib/_common/common-strip/common-strip.component.d.ts.map +1 -0
  186. package/lib/_common/common-strip/common-strip.model.d.ts +143 -0
  187. package/lib/_common/common-strip/common-strip.model.d.ts.map +1 -0
  188. package/lib/_common/common-strip/common-strip.module.d.ts +36 -0
  189. package/lib/_common/common-strip/common-strip.module.d.ts.map +1 -0
  190. package/lib/_common/competency-passbook/competency-passbook.component.d.ts +52 -0
  191. package/lib/_common/competency-passbook/competency-passbook.component.d.ts.map +1 -0
  192. package/lib/_common/competency-passbook/competency-passbook.module.d.ts +12 -0
  193. package/lib/_common/competency-passbook/competency-passbook.module.d.ts.map +1 -0
  194. package/lib/_common/competency-passbook/competency-passbook.service.d.ts +13 -0
  195. package/lib/_common/competency-passbook/competency-passbook.service.d.ts.map +1 -0
  196. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.component.d.ts +50 -0
  197. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.component.d.ts.map +1 -0
  198. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.module.d.ts +12 -0
  199. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.module.d.ts.map +1 -0
  200. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.service.d.ts +13 -0
  201. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.service.d.ts.map +1 -0
  202. package/lib/_common/content-progress/content-progress.component.d.ts +17 -0
  203. package/lib/_common/content-progress/content-progress.component.d.ts.map +1 -0
  204. package/lib/_common/content-progress/content-progress.module.d.ts +11 -0
  205. package/lib/_common/content-progress/content-progress.module.d.ts.map +1 -0
  206. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.d.ts +207 -0
  207. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.d.ts.map +1 -0
  208. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.d.ts +151 -0
  209. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.model.d.ts.map +1 -0
  210. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.module.d.ts +39 -0
  211. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.module.d.ts.map +1 -0
  212. package/lib/_common/data-points/data-points.component.d.ts +24 -0
  213. package/lib/_common/data-points/data-points.component.d.ts.map +1 -0
  214. package/lib/_common/data-points/data-points.module.d.ts +10 -0
  215. package/lib/_common/data-points/data-points.module.d.ts.map +1 -0
  216. package/lib/_common/dialog-components/certificate-dialog/certificate-dialog.component.d.ts +26 -0
  217. package/lib/_common/dialog-components/certificate-dialog/certificate-dialog.component.d.ts.map +1 -0
  218. package/lib/_common/dialog-components/dialog-components.module.d.ts +15 -0
  219. package/lib/_common/dialog-components/dialog-components.module.d.ts.map +1 -0
  220. package/lib/_common/display-content-type-lib/display-content-type-lib.component.d.ts +16 -0
  221. package/lib/_common/display-content-type-lib/display-content-type-lib.component.d.ts.map +1 -0
  222. package/lib/_common/display-content-type-lib/display-content-type-lib.module.d.ts +10 -0
  223. package/lib/_common/display-content-type-lib/display-content-type-lib.module.d.ts.map +1 -0
  224. package/lib/_common/events/event-card/event-card.component.d.ts +17 -0
  225. package/lib/_common/events/event-card/event-card.component.d.ts.map +1 -0
  226. package/lib/_common/events/events.component.d.ts +21 -0
  227. package/lib/_common/events/events.component.d.ts.map +1 -0
  228. package/lib/_common/events/events.module.d.ts +13 -0
  229. package/lib/_common/events/events.module.d.ts.map +1 -0
  230. package/lib/_common/highlights-of-week/highlights-of-week.component.d.ts +18 -0
  231. package/lib/_common/highlights-of-week/highlights-of-week.component.d.ts.map +1 -0
  232. package/lib/_common/highlights-of-week/highlights-of-week.module.d.ts +13 -0
  233. package/lib/_common/highlights-of-week/highlights-of-week.module.d.ts.map +1 -0
  234. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +37 -0
  235. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts.map +1 -0
  236. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.module.d.ts +12 -0
  237. package/lib/_common/horizontal-scroller-v2/horizontal-scroller-v2.module.d.ts.map +1 -0
  238. package/lib/_common/key-highlights/key-highlights.component.d.ts +20 -0
  239. package/lib/_common/key-highlights/key-highlights.component.d.ts.map +1 -0
  240. package/lib/_common/key-highlights/key-highlights.module.d.ts +12 -0
  241. package/lib/_common/key-highlights/key-highlights.module.d.ts.map +1 -0
  242. package/lib/_common/mdo-leaderboard/mdo-leaderboard.component.d.ts +24 -0
  243. package/lib/_common/mdo-leaderboard/mdo-leaderboard.component.d.ts.map +1 -0
  244. package/lib/_common/mdo-leaderboard/mdo-leaderboard.module.d.ts +13 -0
  245. package/lib/_common/mdo-leaderboard/mdo-leaderboard.module.d.ts.map +1 -0
  246. package/lib/_common/microsites/mdo-channels/mdo-channel-v1/mdo-channel-v1.component.d.ts +9 -0
  247. package/lib/_common/microsites/mdo-channels/mdo-channel-v1/mdo-channel-v1.component.d.ts.map +1 -0
  248. package/lib/_common/microsites/mdo-channels/mdo-channel-v2/mdo-channel-v2.component.d.ts +46 -0
  249. package/lib/_common/microsites/mdo-channels/mdo-channel-v2/mdo-channel-v2.component.d.ts.map +1 -0
  250. package/lib/_common/microsites/mdo-channels/mdo-channel.module.d.ts +25 -0
  251. package/lib/_common/microsites/mdo-channels/mdo-channel.module.d.ts.map +1 -0
  252. package/lib/_common/microsites/national-learning-week/national-learning/national-learning.component.d.ts +24 -0
  253. package/lib/_common/microsites/national-learning-week/national-learning/national-learning.component.d.ts.map +1 -0
  254. package/lib/_common/microsites/national-learning-week/national-learning.module.d.ts +23 -0
  255. package/lib/_common/microsites/national-learning-week/national-learning.module.d.ts.map +1 -0
  256. package/lib/_common/microsites/providers/providers-v2/providers-v2.component.d.ts +40 -0
  257. package/lib/_common/microsites/providers/providers-v2/providers-v2.component.d.ts.map +1 -0
  258. package/lib/_common/microsites/providers/providers.module.d.ts +23 -0
  259. package/lib/_common/microsites/providers/providers.module.d.ts.map +1 -0
  260. package/lib/_common/pills/pills.component.d.ts +17 -0
  261. package/lib/_common/pills/pills.component.d.ts.map +1 -0
  262. package/lib/_common/pills/pills.module.d.ts +12 -0
  263. package/lib/_common/pills/pills.module.d.ts.map +1 -0
  264. package/lib/_common/skeleton-loader-lib/skeleton-loader-lib.component.d.ts +12 -0
  265. package/lib/_common/skeleton-loader-lib/skeleton-loader-lib.component.d.ts.map +1 -0
  266. package/lib/_common/skeleton-loader-lib/skeleton-loader-lib.module.d.ts +12 -0
  267. package/lib/_common/skeleton-loader-lib/skeleton-loader-lib.module.d.ts.map +1 -0
  268. package/lib/_common/sliders/sliders.component.d.ts +31 -0
  269. package/lib/_common/sliders/sliders.component.d.ts.map +1 -0
  270. package/lib/_common/sliders/sliders.model.d.ts +41 -0
  271. package/lib/_common/sliders/sliders.model.d.ts.map +1 -0
  272. package/lib/_common/sliders/sliders.module.d.ts +13 -0
  273. package/lib/_common/sliders/sliders.module.d.ts.map +1 -0
  274. package/lib/_common/sliders-ng-content/sliders-ng-content.component.d.ts +34 -0
  275. package/lib/_common/sliders-ng-content/sliders-ng-content.component.d.ts.map +1 -0
  276. package/lib/_common/sliders-ng-content/sliders-ng-content.model.d.ts +35 -0
  277. package/lib/_common/sliders-ng-content/sliders-ng-content.model.d.ts.map +1 -0
  278. package/lib/_common/sliders-ng-content/sliders-ng-content.module.d.ts +13 -0
  279. package/lib/_common/sliders-ng-content/sliders-ng-content.module.d.ts.map +1 -0
  280. package/lib/_common/speakers/speakers.component.d.ts +19 -0
  281. package/lib/_common/speakers/speakers.component.d.ts.map +1 -0
  282. package/lib/_common/speakers/speakers.module.d.ts +13 -0
  283. package/lib/_common/speakers/speakers.module.d.ts.map +1 -0
  284. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.component.d.ts +135 -0
  285. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.component.d.ts.map +1 -0
  286. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.model.d.ts +159 -0
  287. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.model.d.ts.map +1 -0
  288. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.module.d.ts +37 -0
  289. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.module.d.ts.map +1 -0
  290. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.d.ts +165 -0
  291. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.d.ts.map +1 -0
  292. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.model.d.ts +151 -0
  293. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.model.d.ts.map +1 -0
  294. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.module.d.ts +39 -0
  295. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.module.d.ts.map +1 -0
  296. package/lib/_common/top-learners/top-learners.component.d.ts +22 -0
  297. package/lib/_common/top-learners/top-learners.component.d.ts.map +1 -0
  298. package/lib/_common/top-learners/top-learners.module.d.ts +11 -0
  299. package/lib/_common/top-learners/top-learners.module.d.ts.map +1 -0
  300. package/lib/_common/user-content-rating/user-content-rating-lib.component.d.ts +26 -0
  301. package/lib/_common/user-content-rating/user-content-rating-lib.component.d.ts.map +1 -0
  302. package/lib/_common/user-content-rating/user-content-rating-lib.module.d.ts +17 -0
  303. package/lib/_common/user-content-rating/user-content-rating-lib.module.d.ts.map +1 -0
  304. package/lib/_common/user-content-rating/user-content-rating-lib.service.d.ts +11 -0
  305. package/lib/_common/user-content-rating/user-content-rating-lib.service.d.ts.map +1 -0
  306. package/lib/_common/user-progress/user-progress.component.d.ts +28 -0
  307. package/lib/_common/user-progress/user-progress.component.d.ts.map +1 -0
  308. package/lib/_common/user-progress/user-progress.module.d.ts +13 -0
  309. package/lib/_common/user-progress/user-progress.module.d.ts.map +1 -0
  310. package/lib/_constants/misc.constants.d.ts +3 -0
  311. package/lib/_constants/misc.constants.d.ts.map +1 -0
  312. package/lib/_directives/default-thumbnail/default-thumbnail.directive.d.ts +13 -0
  313. package/lib/_directives/default-thumbnail/default-thumbnail.directive.d.ts.map +1 -0
  314. package/lib/_directives/default-thumbnail/default-thumbnail.module.d.ts +9 -0
  315. package/lib/_directives/default-thumbnail/default-thumbnail.module.d.ts.map +1 -0
  316. package/lib/_directives/image-responsive/image-responsive.directive.d.ts +21 -0
  317. package/lib/_directives/image-responsive/image-responsive.directive.d.ts.map +1 -0
  318. package/lib/_directives/image-responsive/image-responsive.module.d.ts +9 -0
  319. package/lib/_directives/image-responsive/image-responsive.module.d.ts.map +1 -0
  320. package/lib/_directives/navigation/navigation.directive.d.ts +13 -0
  321. package/lib/_directives/navigation/navigation.directive.d.ts.map +1 -0
  322. package/lib/_directives/navigation/navigation.module.d.ts +9 -0
  323. package/lib/_directives/navigation/navigation.module.d.ts.map +1 -0
  324. package/lib/_directives/scrollable-item/scrollable-item.directive.d.ts +11 -0
  325. package/lib/_directives/scrollable-item/scrollable-item.directive.d.ts.map +1 -0
  326. package/lib/_directives/scrollable-item/scrollable-item.module.d.ts +9 -0
  327. package/lib/_directives/scrollable-item/scrollable-item.module.d.ts.map +1 -0
  328. package/lib/_models/card-content-v2.model.d.ts +45 -0
  329. package/lib/_models/card-content-v2.model.d.ts.map +1 -0
  330. package/lib/_models/card-content.model.d.ts +42 -0
  331. package/lib/_models/card-content.model.d.ts.map +1 -0
  332. package/lib/_models/card-users.model.d.ts +51 -0
  333. package/lib/_models/card-users.model.d.ts.map +1 -0
  334. package/lib/_models/compentencies.model.d.ts +10 -0
  335. package/lib/_models/compentencies.model.d.ts.map +1 -0
  336. package/lib/_models/content-strip-multiple.model.d.ts +130 -0
  337. package/lib/_models/content-strip-multiple.model.d.ts.map +1 -0
  338. package/lib/_models/event.d.ts +19 -0
  339. package/lib/_models/event.d.ts.map +1 -0
  340. package/lib/_models/profile-v3.models.d.ts +92 -0
  341. package/lib/_models/profile-v3.models.d.ts.map +1 -0
  342. package/lib/_models/rating.model.d.ts +18 -0
  343. package/lib/_models/rating.model.d.ts.map +1 -0
  344. package/lib/_models/widget-content.model.d.ts +499 -0
  345. package/lib/_models/widget-content.model.d.ts.map +1 -0
  346. package/lib/_models/widget-search.model.d.ts +253 -0
  347. package/lib/_models/widget-search.model.d.ts.map +1 -0
  348. package/lib/_models/widget-user.model.d.ts +6 -0
  349. package/lib/_models/widget-user.model.d.ts.map +1 -0
  350. package/lib/_pipes/object-to-array/object-to-array.pipe.d.ts +8 -0
  351. package/lib/_pipes/object-to-array/object-to-array.pipe.d.ts.map +1 -0
  352. package/lib/_pipes/object-to-array/object-to-array.pipe.module.d.ts +9 -0
  353. package/lib/_pipes/object-to-array/object-to-array.pipe.module.d.ts.map +1 -0
  354. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.module.d.ts +9 -0
  355. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.module.d.ts.map +1 -0
  356. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +10 -0
  357. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts.map +1 -0
  358. package/lib/_pipes/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
  359. package/lib/_pipes/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
  360. package/lib/_pipes/pipe-public-URL/pipe-public-URL.pipe.d.ts +10 -0
  361. package/lib/_pipes/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
  362. package/lib/_services/certificate.service.d.ts +12 -0
  363. package/lib/_services/certificate.service.d.ts.map +1 -0
  364. package/lib/_services/common-methods.service.d.ts +43 -0
  365. package/lib/_services/common-methods.service.d.ts.map +1 -0
  366. package/lib/_services/configurations.service.d.ts +75 -0
  367. package/lib/_services/configurations.service.d.ts.map +1 -0
  368. package/lib/_services/insite-data.service.d.ts +19 -0
  369. package/lib/_services/insite-data.service.d.ts.map +1 -0
  370. package/lib/_services/multilingual-translations.service.d.ts +24 -0
  371. package/lib/_services/multilingual-translations.service.d.ts.map +1 -0
  372. package/lib/_services/rating.service.d.ts +19 -0
  373. package/lib/_services/rating.service.d.ts.map +1 -0
  374. package/lib/_services/viewer-route-util.d.ts +9 -0
  375. package/lib/_services/viewer-route-util.d.ts.map +1 -0
  376. package/lib/_services/widget-content.service.d.ts +91 -0
  377. package/lib/_services/widget-content.service.d.ts.map +1 -0
  378. package/lib/_services/widget-user.service.d.ts +37 -0
  379. package/lib/_services/widget-user.service.d.ts.map +1 -0
  380. package/lib/consumption.component.d.ts +9 -0
  381. package/lib/consumption.component.d.ts.map +1 -0
  382. package/lib/consumption.config.d.ts +7 -0
  383. package/lib/consumption.config.d.ts.map +1 -0
  384. package/lib/consumption.module.d.ts +16 -0
  385. package/lib/consumption.module.d.ts.map +1 -0
  386. package/lib/consumption.service.d.ts +7 -0
  387. package/lib/consumption.service.d.ts.map +1 -0
  388. package/lib/registration-lib.config.d.ts +5 -0
  389. package/lib/registration-lib.config.d.ts.map +1 -0
  390. package/package.json +21 -0
  391. package/public-api.d.ts +70 -0
  392. package/public-api.d.ts.map +1 -0
  393. package/sunbird-cb-consumption.d.ts +6 -0
  394. package/sunbird-cb-consumption.d.ts.map +1 -0
@@ -0,0 +1,684 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Component, Input, HostBinding, Inject, EventEmitter, Output } from '@angular/core';
3
+ import { WidgetBaseComponent } from '@sunbird-cb/resolver-v2';
4
+ import { ApiRequestFor } from './content-strip-facet-filter.model';
5
+ import { WsEvents, } from '@sunbird-cb/utils-v2';
6
+ import { filter } from 'rxjs/operators';
7
+ // import { environment } from 'src/environments/environment'
8
+ // tslint:disable-next-line
9
+ import * as _ from 'lodash';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../../_services/widget-content.service";
12
+ import * as i2 from "@sunbird-cb/utils-v2";
13
+ import * as i3 from "@angular/router";
14
+ import * as i4 from "../../../_services/widget-user.service";
15
+ import * as i5 from "@ngx-translate/core";
16
+ import * as i6 from "../../../_services/multilingual-translations.service";
17
+ import * as i7 from "@angular/forms";
18
+ import * as i8 from "@angular/material/button";
19
+ import * as i9 from "@angular/material/icon";
20
+ import * as i10 from "@angular/material/tabs";
21
+ import * as i11 from "@angular/material/chips";
22
+ import * as i12 from "../../horizontal-scroller-v2/horizontal-scroller-v2.component";
23
+ import * as i13 from "@angular/common";
24
+ import * as i14 from "@sunbird-cb/resolver-v2";
25
+ import * as i15 from "@angular/material/tooltip";
26
+ export class ContentStripFacetFilterComponent extends WidgetBaseComponent {
27
+ constructor(environment, contentSvc, loggerSvc, eventSvc, configSvc, utilitySvc, router, userSvc, translate, langtranslations, _fb) {
28
+ super();
29
+ this.contentSvc = contentSvc;
30
+ this.loggerSvc = loggerSvc;
31
+ this.eventSvc = eventSvc;
32
+ this.configSvc = configSvc;
33
+ this.utilitySvc = utilitySvc;
34
+ this.router = router;
35
+ this.userSvc = userSvc;
36
+ this.translate = translate;
37
+ this.langtranslations = langtranslations;
38
+ this._fb = _fb;
39
+ this.emptyResponse = new EventEmitter();
40
+ this.viewAllResponse = new EventEmitter();
41
+ this.telemtryResponse = new EventEmitter();
42
+ this.providerId = '';
43
+ this.emitViewAll = false;
44
+ this.channnelName = '';
45
+ this.id = `ws-strip-miltiple_${Math.random()}`;
46
+ this.stripsResultDataMap = {};
47
+ this.stripsKeyOrder = [];
48
+ this.showAccordionData = true;
49
+ this.showParentLoader = false;
50
+ this.showParentError = false;
51
+ this.showParentNoData = false;
52
+ this.errorDataCount = 0;
53
+ this.noDataCount = 0;
54
+ this.successDataCount = 0;
55
+ this.contentAvailable = true;
56
+ this.baseUrl = this.configSvc.sitePath || '';
57
+ this.veifiedKarmayogi = false;
58
+ this.changeEventSubscription = null;
59
+ this.defaultMaxWidgets = 12;
60
+ this.todaysEvents = [];
61
+ if (localStorage.getItem('websiteLanguage')) {
62
+ this.translate.setDefaultLang('en');
63
+ let lang = JSON.stringify(localStorage.getItem('websiteLanguage'));
64
+ lang = lang.replace(/\"/g, '');
65
+ this.translate.use(lang);
66
+ }
67
+ this.environment = environment;
68
+ }
69
+ ngOnDestroy() {
70
+ }
71
+ ngOnInit() {
72
+ this.initData();
73
+ this.contentSvc.telemetryData$.subscribe((data) => {
74
+ this.telemtryResponse.emit(data);
75
+ });
76
+ this.facetForm = this._fb.group({
77
+ org: ['0']
78
+ });
79
+ }
80
+ initData() {
81
+ this.stripsKeyOrder = this.widgetData && this.widgetData.strips && this.widgetData.strips.map(strip => strip.key) || [];
82
+ if (this.widgetData.loader && this.widgetData.strips.length) {
83
+ this.showParentLoader = true;
84
+ }
85
+ // Fetch the data
86
+ for (const strip of this.widgetData.strips) {
87
+ if (this.checkForEmptyWidget(strip)) {
88
+ this.fetchStripFromRequestData(strip, false);
89
+ }
90
+ else {
91
+ this.processStrip(strip, [], 'done', true, null);
92
+ }
93
+ }
94
+ // Subscription for changes
95
+ const keyAndEvent = this.widgetData.strips
96
+ .map(strip => ({
97
+ key: strip.key,
98
+ type: (strip.refreshEvent && strip.refreshEvent.eventType) || '',
99
+ from: (strip.refreshEvent && strip.refreshEvent.from.toString()) || '',
100
+ }))
101
+ .filter(({ key, type, from }) => key && type && from);
102
+ const eventTypeSet = new Set(keyAndEvent.map(e => e.type));
103
+ this.changeEventSubscription = this.eventSvc.events$
104
+ .pipe(filter(event => eventTypeSet.has(event.eventType)))
105
+ .subscribe(event => {
106
+ keyAndEvent
107
+ .filter(e => e.type === event.eventType && e.from === event.from)
108
+ .map(e => e.key)
109
+ .forEach(k => this.fetchStripFromKey(k, false));
110
+ });
111
+ }
112
+ fetchStripFromKey(key, calculateParentStatus = true) {
113
+ const stripData = this.widgetData.strips.find(strip => strip.key === key);
114
+ if (stripData) {
115
+ this.fetchStripFromRequestData(stripData, calculateParentStatus);
116
+ }
117
+ }
118
+ fetchStripFromRequestData(strip, calculateParentStatus = true) {
119
+ // setting initial values
120
+ strip.loaderWidgets = this.transformSkeletonToWidgets(strip);
121
+ this.processStrip(strip, [], 'fetching', false, null);
122
+ if (strip && strip.stripRequestFor === ApiRequestFor.SEARCH && !strip.onTabClickRequest) {
123
+ this.fetchFromSearch(strip, calculateParentStatus);
124
+ }
125
+ }
126
+ transformSkeletonToWidgets(strip) {
127
+ return [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10].map(_content => ({
128
+ widgetType: 'cardLib',
129
+ widgetSubType: 'cardContentLib',
130
+ widgetHostClass: 'mb-2',
131
+ widgetData: {
132
+ cardSubType: strip.loaderConfig && strip.loaderConfig.cardSubType || 'card-standard-skeleton',
133
+ cardCustomeClass: strip.customeClass ? strip.customeClass : '',
134
+ },
135
+ }));
136
+ }
137
+ processStrip(strip, results = [], fetchStatus, calculateParentStatus = true, _viewMoreUrl, tabsResults) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ const stripData = {
140
+ viewMoreUrl: strip.viewMoreUrl,
141
+ key: strip.key,
142
+ canHideStrip: Boolean(strip.canHideStrip),
143
+ showStrip: this.getIfStripHidden(strip.key),
144
+ noDataWidget: strip.noDataWidget,
145
+ errorWidget: strip.errorWidget,
146
+ stripInfo: strip.info,
147
+ stripTitle: strip.title,
148
+ stripTitleLink: strip.stripTitleLink,
149
+ disableTranslate: strip.disableTranslate,
150
+ sliderConfig: strip.sliderConfig,
151
+ tabs: tabsResults ? tabsResults : strip.tabs,
152
+ stripName: strip.name,
153
+ mode: strip.mode,
154
+ stripConfig: strip.stripConfig,
155
+ stripBackground: strip.stripBackground,
156
+ secondaryHeading: strip.secondaryHeading,
157
+ loaderWidgets: strip.loaderWidgets || [],
158
+ hideViewMoreUrl: strip.hideViewMoreUrl || false,
159
+ widgets: fetchStatus === 'done'
160
+ ? [
161
+ ...(strip.preWidgets || []).map(w => (Object.assign(Object.assign({}, w), { widgetHostClass: `mb-2 ${w.widgetHostClass}` }))),
162
+ ...results,
163
+ ...(strip.postWidgets || []).map(w => (Object.assign(Object.assign({}, w), { widgetHostClass: `mb-2 ${w.widgetHostClass}` }))),
164
+ ]
165
+ : [],
166
+ showOnNoData: Boolean(strip.noDataWidget &&
167
+ !((strip.preWidgets || []).length + results.length + (strip.postWidgets || []).length) &&
168
+ fetchStatus === 'done'),
169
+ showOnLoader: Boolean(strip.loader && fetchStatus === 'fetching'),
170
+ showOnError: Boolean(strip.errorWidget && fetchStatus === 'error'),
171
+ };
172
+ // const stripData = this.stripsResultDataMap[strip.key]
173
+ this.stripsResultDataMap = Object.assign(Object.assign({}, this.stripsResultDataMap), { [strip.key]: stripData });
174
+ if (!tabsResults) {
175
+ if (calculateParentStatus &&
176
+ (fetchStatus === 'done' || fetchStatus === 'error') &&
177
+ stripData.widgets) {
178
+ this.checkParentStatus(fetchStatus, stripData.widgets.length);
179
+ }
180
+ if (calculateParentStatus && !(results && results.length > 0)) {
181
+ this.contentAvailable = false;
182
+ }
183
+ else if (results && results.length > 0) {
184
+ this.contentAvailable = true;
185
+ }
186
+ }
187
+ else {
188
+ this.contentAvailable = true;
189
+ }
190
+ });
191
+ }
192
+ checkParentStatus(fetchStatus, stripWidgetsCount) {
193
+ if (fetchStatus === 'done' && !stripWidgetsCount) {
194
+ this.noDataCount += 1;
195
+ }
196
+ else if (fetchStatus === 'done' && stripWidgetsCount) {
197
+ this.successDataCount += 1;
198
+ }
199
+ else if (fetchStatus === 'error') {
200
+ this.errorDataCount += 1;
201
+ }
202
+ const settledCount = this.noDataCount + this.successDataCount + this.errorDataCount;
203
+ const totalCount = this.widgetData.strips.length;
204
+ if (this.successDataCount > 0 && settledCount < totalCount) {
205
+ return;
206
+ }
207
+ this.showParentLoader = settledCount !== totalCount;
208
+ this.showParentNoData =
209
+ this.noDataCount > 0 && this.noDataCount + this.errorDataCount === totalCount;
210
+ this.showParentError = this.errorDataCount === totalCount;
211
+ }
212
+ checkForEmptyWidget(strip) {
213
+ if (strip.request &&
214
+ ((strip.request.requestBody && Object.keys(strip.request.requestBody).length))) {
215
+ return true;
216
+ }
217
+ return false;
218
+ }
219
+ // strip settings
220
+ toggleInfo(data) {
221
+ const stripInfo = this.stripsResultDataMap[data.key].stripInfo;
222
+ if (stripInfo) {
223
+ if (stripInfo.mode !== 'below') {
224
+ this.loggerSvc.warn(`strip info mode: ${stripInfo.mode} not implemented yet`);
225
+ stripInfo.mode = 'below';
226
+ }
227
+ if (stripInfo.mode === 'below') {
228
+ this.stripsResultDataMap[data.key].stripInfo = Object.assign(Object.assign({}, stripInfo), { visibilityMode: stripInfo.visibilityMode === 'hidden' ? 'visible' : 'hidden' });
229
+ }
230
+ }
231
+ }
232
+ raiseTelemetry(stripData) {
233
+ this.telemtryResponse.emit(stripData);
234
+ }
235
+ setHiddenForStrip(key) {
236
+ this.stripsResultDataMap[key].showStrip = false;
237
+ sessionStorage.setItem(`cstrip_${key}`, '1');
238
+ }
239
+ // selected pills data
240
+ getSelectedPillIndex(tabdata, tabIndex) {
241
+ if (tabdata.pillsData && tabdata.pillsData.length) {
242
+ let index = tabdata.pillsData.findIndex((pill) => {
243
+ return pill.selected;
244
+ });
245
+ return index;
246
+ }
247
+ return 0;
248
+ }
249
+ getdata(data) {
250
+ if (data.stripInfo) {
251
+ return data.stripInfo.widget;
252
+ }
253
+ return {};
254
+ }
255
+ tabClicked(tabEvent, pillIndex, stripMap, stripKey) {
256
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
257
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].fetchTabStatus = 'inprogress';
258
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].tabLoading = true;
259
+ stripMap.showOnLoader = true;
260
+ }
261
+ const data = {
262
+ label: `${tabEvent.tab.textLabel}`,
263
+ index: tabEvent.index,
264
+ };
265
+ this.eventSvc.raiseInteractTelemetry({
266
+ type: WsEvents.EnumInteractTypes.CLICK,
267
+ subType: WsEvents.EnumInteractSubTypes.HOME_PAGE_STRIP_TABS,
268
+ id: `${_.camelCase(data.label)}-tab`,
269
+ }, {}, {
270
+ module: WsEvents.EnumTelemetrymodules.HOME,
271
+ });
272
+ const currentTabFromMap = stripMap.tabs && stripMap.tabs[tabEvent.index];
273
+ const currentPillFromMap = stripMap.tabs && stripMap.tabs[tabEvent.index].pillsData[pillIndex];
274
+ const currentStrip = this.widgetData.strips.find(s => s.key === stripKey);
275
+ if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
276
+ this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = Object.assign(Object.assign({}, this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams), { tabSelected: currentTabFromMap.value, pillSelected: currentPillFromMap.value });
277
+ }
278
+ if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick && currentPillFromMap) {
279
+ if (currentPillFromMap.requestRequired && currentPillFromMap.request) {
280
+ if (currentPillFromMap.request.searchV6) {
281
+ // this.getTabDataByNewReqSearchV6(currentStrip, tabEvent.index, currentTabFromMap, true);
282
+ }
283
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].tabLoading = false;
284
+ }
285
+ else {
286
+ this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
287
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
288
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].fetchTabStatus = 'inprogress';
289
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].tabLoading = false;
290
+ stripMap.showOnLoader = true;
291
+ this.resetFilter(stripMap, tabEvent.index, pillIndex);
292
+ }
293
+ setTimeout(() => {
294
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
295
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].fetchTabStatus = 'done';
296
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].tabLoading = false;
297
+ stripMap.showOnLoader = false;
298
+ this.resetSelectedPill(stripMap.tabs[tabEvent.index].pillsData);
299
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex]['selected'] = true;
300
+ }
301
+ }, 200);
302
+ }
303
+ }
304
+ }
305
+ pillClicked(event, stripMap, stripKey, pillIndex, tabIndex) {
306
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
307
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'inprogress';
308
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = true;
309
+ stripMap.showOnLoader = true;
310
+ }
311
+ const currentTabFromMap = stripMap.tabs && stripMap.tabs[tabIndex];
312
+ const currentPillFromMap = stripMap.tabs && stripMap.tabs[tabIndex].pillsData[pillIndex];
313
+ const currentStrip = this.widgetData.strips.find(s => s.key === stripKey);
314
+ if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
315
+ this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = Object.assign(Object.assign({}, this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams), { tabSelected: currentTabFromMap.value, pillSelected: currentPillFromMap.value });
316
+ }
317
+ if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick && currentPillFromMap) {
318
+ if (currentPillFromMap.requestRequired && currentPillFromMap.request) {
319
+ // call API to get tab data and process
320
+ // this.processStrip(currentStrip, [], 'fetching', true, null)
321
+ if (currentPillFromMap.request.searchV6) {
322
+ // this.getTabDataByNewReqSearchV6(currentStrip, tabIndex, pillIndex, currentPillFromMap, true);
323
+ }
324
+ else if (currentPillFromMap.request.trendingSearch) {
325
+ // this.getTabDataByNewReqTrending(currentStrip, tabIndex, pillIndex, currentPillFromMap, true);
326
+ }
327
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
328
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
329
+ // }
330
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
331
+ }
332
+ else {
333
+ this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
334
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
335
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'inprogress';
336
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
337
+ stripMap.showOnLoader = true;
338
+ this.resetFilter(stripMap, tabIndex, pillIndex);
339
+ }
340
+ setTimeout(() => {
341
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
342
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'done';
343
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
344
+ stripMap.showOnLoader = false;
345
+ this.resetSelectedPill(stripMap.tabs[tabIndex].pillsData);
346
+ stripMap.tabs[tabIndex].pillsData[pillIndex]['selected'] = true;
347
+ }
348
+ }, 200);
349
+ }
350
+ }
351
+ }
352
+ resetSelectedPill(pillData) {
353
+ if (pillData && pillData.length) {
354
+ pillData.forEach((pill) => {
355
+ pill['selected'] = false;
356
+ });
357
+ }
358
+ }
359
+ getTabDataByfilter(strip, currentTab, calculateParentStatus) {
360
+ // tslint:disable:no-console
361
+ console.log('strip -- ', strip);
362
+ // tslint:disable:no-console
363
+ console.log('currentTab -- ', currentTab);
364
+ // tslint:disable:no-console
365
+ console.log('calculateParentStatus-- ', calculateParentStatus);
366
+ // TODO: Write logic for individual filter if passed in config
367
+ // add switch case based on config key passed
368
+ }
369
+ getIfStripHidden(key) {
370
+ const storageItem = sessionStorage.getItem(`cstrip_${key}`);
371
+ return Boolean(storageItem !== '1');
372
+ }
373
+ // translate labes
374
+ translateLabels(label, type) {
375
+ return this.langtranslations.translateLabel(label, type, '');
376
+ }
377
+ redirectViewAll(stripData, path, queryParamsData) {
378
+ if (this.emitViewAll) {
379
+ this.viewAllResponse.emit(stripData);
380
+ }
381
+ else {
382
+ this.router.navigate([path], { queryParams: queryParamsData });
383
+ }
384
+ }
385
+ identify(index, item) {
386
+ if (index >= 0) { }
387
+ return item;
388
+ }
389
+ tracker(index, item) {
390
+ if (index >= 0) { }
391
+ return _.get(item, 'widgetData.content.identifier');
392
+ }
393
+ getContineuLearningLenth(data) {
394
+ return data.widgets ? data.widgets.length : 0;
395
+ }
396
+ showAccordion(key) {
397
+ if (this.utilitySvc.isMobile && this.stripsResultDataMap[key].mode === 'accordion') {
398
+ return this.showAccordionData;
399
+ }
400
+ return true;
401
+ }
402
+ checkCondition(wData, data) {
403
+ if (wData.strips[0].stripConfig && wData.strips[0].stripConfig.hideShowAll) {
404
+ return !wData.strips[0].stripConfig.hideShowAll;
405
+ }
406
+ return wData.strips[0].viewMoreUrl && data.widgets && data.widgets.length >= 4;
407
+ }
408
+ checkVisible(data) {
409
+ return data.stripInfo && data.stripInfo.visibilityMode === 'visible';
410
+ }
411
+ getSelectedIndex(stripsResultDataMap, key) {
412
+ let returnValue = 0;
413
+ return returnValue;
414
+ }
415
+ getLength(data) {
416
+ if (!data.tabs || !data.tabs.length) {
417
+ return data.widgets ? data.widgets.length : 0;
418
+ }
419
+ {
420
+ // if tabs are there check if each tab has widgets and get the tab with max widgets
421
+ let tabWithMaxWidgets = {};
422
+ data.tabs.forEach((tab) => {
423
+ if (tab.pillsData && tab.pillsData.length) {
424
+ tabWithMaxWidgets = tab.pillsData.reduce((prev, current) => {
425
+ if (!prev.widgets && !current.widgets) {
426
+ return current;
427
+ }
428
+ if (prev.widgets && current.widgets) {
429
+ return (prev.widgets.length > current.widgets.length) ? prev : current;
430
+ }
431
+ if (current.widgets && !prev.widgets) {
432
+ return current;
433
+ }
434
+ if (!current.widgets && prev.widgets) {
435
+ return prev;
436
+ }
437
+ return current;
438
+ // return (prev.widgets && current.widgets && (prev.widgets.length > current.widgets.length) ) ? prev : current
439
+ // tslint:disable-next-line: align
440
+ }, data.tabs[0]);
441
+ }
442
+ });
443
+ // if tabs has atleast 1 widgets then strip will show or else not
444
+ return tabWithMaxWidgets.widgets ? tabWithMaxWidgets.widgets.length : 0;
445
+ }
446
+ }
447
+ isStripShowing(data) {
448
+ let count = 0;
449
+ if (data && data.key === this.environment.programStripKey && (!data.tabs || !data.tabs.length) &&
450
+ data.stripTitle === this.environment.programStripName && data.widgets.length > 0) {
451
+ data.widgets.forEach((key) => {
452
+ if (key && key.widgetData.content.primaryCategory === this.environment.programStripPrimaryCategory) {
453
+ count = count + 1;
454
+ }
455
+ });
456
+ if (count > 0) {
457
+ data.showStrip = true;
458
+ }
459
+ else {
460
+ data.showStrip = false;
461
+ }
462
+ }
463
+ // console.log('data.key', data, data.key, data.widgets);
464
+ return data.showStrip;
465
+ }
466
+ get isMobile() {
467
+ return this.utilitySvc.isMobile || false;
468
+ }
469
+ // search api with facets
470
+ postRequestMethod(strip, request, apiUrl, calculateParentStatus) {
471
+ return __awaiter(this, void 0, void 0, function* () {
472
+ return new Promise((resolve, reject) => {
473
+ if (request && request) {
474
+ this.contentSvc.postApiMethod(apiUrl, request).subscribe(results => {
475
+ if (results.result && results.result.content) {
476
+ const showViewMore = Boolean(results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
477
+ const viewMoreUrl = showViewMore
478
+ ? {
479
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
480
+ queryParams: {
481
+ tab: 'Learn',
482
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
483
+ f: {},
484
+ },
485
+ }
486
+ : null;
487
+ resolve({ results, viewMoreUrl });
488
+ }
489
+ }, (error) => {
490
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
491
+ reject(error);
492
+ });
493
+ }
494
+ });
495
+ });
496
+ }
497
+ fetchFromSearch(strip, calculateParentStatus = true) {
498
+ return __awaiter(this, void 0, void 0, function* () {
499
+ if (strip.request && Object.keys(strip.request.requestBody).length) {
500
+ try {
501
+ const response = yield this.postRequestMethod(strip, strip.request.requestBody, strip.request.apiUrl, calculateParentStatus);
502
+ let tabIndex = 0;
503
+ let pillIndex = 0;
504
+ if (response.results && response.results.result) {
505
+ this.mapAllDataWithFacets(strip, response.results.result.content, response.results.result.facets, calculateParentStatus);
506
+ const widgets = this.transformContentsToWidgets(response.results.result.content, strip);
507
+ let tabResults = [];
508
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
509
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
510
+ // const allPills = this.stripsResultDataMap[strip.key].tabs[tabIndex].pillsData;
511
+ // this.resetSelectedPill(allPills)
512
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
513
+ // if(allPills && allPills.length && allPills[pillIndex]){
514
+ // allPills[pillIndex] = {
515
+ // ...allPills[pillIndex],
516
+ // widgets,
517
+ // fetchTabStatus: 'done',
518
+ // selected: true
519
+ // };
520
+ // }
521
+ // allTabs[tabIndex] = {
522
+ // ...allTabs[tabIndex],
523
+ // widgets,
524
+ // fetchTabStatus: 'done',
525
+ // };
526
+ // tabResults = allTabs;
527
+ // }
528
+ // }
529
+ // this.processStrip(
530
+ // strip,
531
+ // widgets,
532
+ // 'done',
533
+ // calculateParentStatus,
534
+ // response.viewMoreUrl,
535
+ // tabResults // tabResults as widgets
536
+ // );
537
+ }
538
+ }
539
+ catch (error) {
540
+ // Handle errors
541
+ // console.error('Error:', error);
542
+ }
543
+ }
544
+ });
545
+ }
546
+ mapAllDataWithFacets(strip, content, facets, calculateParentStatus) {
547
+ console.log(strip, content);
548
+ const allTabs = this.stripsResultDataMap[strip.key].tabs;
549
+ let facet = [];
550
+ allTabs.forEach((ele) => {
551
+ ele['fetchTabStatus'] = 'done';
552
+ let filteredData = content.filter((contEle) => contEle.nlwUserExp.includes(ele.value));
553
+ // filteredData.forEach(element => {
554
+ // facet = [...facet,..._.difference(element.nlwOrgs ,facet)];
555
+ // });
556
+ ele['widgets'] = filteredData;
557
+ ele.pillsData.forEach((pill) => {
558
+ if (pill.value === 'all') {
559
+ pill['widgets'] = this.transformContentsToWidgets(filteredData, strip);
560
+ pill['fetchTabStatus'] = 'done';
561
+ }
562
+ else if (pill.value === 'course') {
563
+ let contentFilteredData = filteredData.filter((contEle) => contEle.courseCategory.toLowerCase() === pill.value);
564
+ pill['widgets'] = this.transformContentsToWidgets(contentFilteredData, strip);
565
+ pill['fetchTabStatus'] = 'done';
566
+ }
567
+ else {
568
+ let contentFilteredData = filteredData.filter((contEle) => contEle.courseCategory.toLowerCase() !== 'course');
569
+ pill['widgets'] = this.transformContentsToWidgets(contentFilteredData, strip);
570
+ pill['fetchTabStatus'] = 'done';
571
+ }
572
+ });
573
+ // ele['facets'] = [{
574
+ // name:'nlwOrgs',
575
+ // values: facet
576
+ // }]
577
+ ele['facets'] = facets;
578
+ });
579
+ strip.tabs[0].pillsData[0].fetchTabStatus = 'done';
580
+ strip.tabs[0].pillsData[0].tabLoading = false;
581
+ strip.showOnLoader = false;
582
+ this.resetSelectedPill(strip.tabs[0].pillsData);
583
+ strip.tabs[0].pillsData[0]['selected'] = true;
584
+ this.processStrip(strip, [], 'done', calculateParentStatus, strip.viewMoreUrl, allTabs // tabResults as widgets
585
+ );
586
+ }
587
+ transformContentsToWidgets(contents, strip) {
588
+ return (contents || []).map((content, idx) => (content ? {
589
+ widgetType: 'cardLib',
590
+ widgetSubType: 'cardContentLib',
591
+ widgetHostClass: 'mb-2',
592
+ widgetData: Object.assign(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 }),
593
+ } : {
594
+ widgetType: 'card',
595
+ widgetSubType: 'cardContent',
596
+ widgetHostClass: 'mb-2',
597
+ widgetData: {},
598
+ }));
599
+ }
600
+ getorgData(eventData, stripMap, tabIndex) {
601
+ console.log(eventData);
602
+ let selectedValue = eventData.target.value;
603
+ let pillIndex = this.getSelectedPillIndex(stripMap.tabs[tabIndex], tabIndex);
604
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
605
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'inprogress';
606
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
607
+ stripMap.showOnLoader = true;
608
+ let returnedValues = stripMap.tabs[tabIndex].widgets.filter((ele) => {
609
+ var words = ele.nlwOrgs.map(v => v.toLowerCase());
610
+ return words.includes(selectedValue);
611
+ });
612
+ stripMap.tabs[tabIndex].pillsData[pillIndex]['widgets'] = this.transformContentsToWidgets(returnedValues, stripMap);
613
+ }
614
+ setTimeout(() => {
615
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
616
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'done';
617
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
618
+ stripMap.showOnLoader = false;
619
+ this.resetSelectedPill(stripMap.tabs[tabIndex].pillsData);
620
+ stripMap.tabs[tabIndex].pillsData[pillIndex]['selected'] = true;
621
+ }
622
+ }, 200);
623
+ }
624
+ resetFilter(stripMap, tabIndex, pillIndex) {
625
+ // let selectedValue = eventData.target.value
626
+ if (pillIndex) {
627
+ pillIndex = this.getSelectedPillIndex(stripMap.tabs[tabIndex], tabIndex);
628
+ }
629
+ this.facetForm.reset({
630
+ org: 0
631
+ });
632
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
633
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'inprogress';
634
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
635
+ stripMap.showOnLoader = true;
636
+ // let returnedValues = stripMap.tabs[tabIndex].widgets.filter((ele: any) => {
637
+ // var words = ele.nlwOrgs.map(v => v.toLowerCase());
638
+ // return words.includes(selectedValue)
639
+ // })
640
+ let contentData = stripMap.tabs[tabIndex].widgets || [];
641
+ stripMap.tabs[tabIndex].pillsData[pillIndex]['widgets'] = this.transformContentsToWidgets(contentData, stripMap);
642
+ }
643
+ setTimeout(() => {
644
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
645
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'done';
646
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
647
+ stripMap.showOnLoader = false;
648
+ this.resetSelectedPill(stripMap.tabs[tabIndex].pillsData);
649
+ stripMap.tabs[tabIndex].pillsData[pillIndex]['selected'] = true;
650
+ }
651
+ }, 200);
652
+ }
653
+ }
654
+ ContentStripFacetFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ContentStripFacetFilterComponent, deps: [{ token: 'environment' }, { token: i1.WidgetContentService }, { token: i2.LoggerService }, { token: i2.EventService }, { token: i2.ConfigurationsService }, { token: i2.UtilityService }, { token: i3.Router }, { token: i4.WidgetUserService }, { token: i5.TranslateService }, { token: i6.MultilingualTranslationsService }, { token: i7.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
655
+ ContentStripFacetFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ContentStripFacetFilterComponent, selector: "sb-uic-content-strip-facet-filter", inputs: { widgetData: "widgetData", providerId: "providerId", emitViewAll: "emitViewAll", channnelName: "channnelName" }, outputs: { emptyResponse: "emptyResponse", viewAllResponse: "viewAllResponse", telemtryResponse: "telemtryResponse" }, host: { properties: { "id": "this.id" } }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!contentAvailable; else otherTemplate\"></ng-container>\n<ng-template #otherTemplate>\n <!-- <div *ngIf=\"showParentLoader\" class=\"text-center my-2\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div> -->\n <ng-container *ngIf=\"showParentError\" [sbUiResolverWidget]=\"widgetData.errorWidget\"></ng-container>\n <ng-container *ngIf=\"showParentNoData\" [sbUiResolverWidget]=\"widgetData.noDataWidget\"></ng-container>\n <ng-container *ngFor=\"let key of stripsKeyOrder; let i = index; trackBy: identify\">\n <ng-container *ngIf=\"isStripShowing(stripsResultDataMap[key])\">\n <a name=\"{{stripsResultDataMap[key]?.stripTitle}}\" [class]=\"key\">\n <div *ngIf=\"stripsResultDataMap && (getLength(stripsResultDataMap[key]) ||\n stripsResultDataMap[key]?.showOnNoData ||\n stripsResultDataMap[key]?.showOnLoader ||\n stripsResultDataMap[key]?.showOnError)\n \" [ngClass]=\"\n !widgetData?.isChannelStrip ? 'xs:px-8 sx:px-10ss' : i > 0 ? 'mt-12' : ''\n \" [id]=\"key\" [ngClass]=\"!widgetData?.isChannelStrip ? 'margin-bottom-custom' : 'margin-bottom-xs'\">\n <div [ngClass]=\"{ pad: stripsResultDataMap[key]?.stripBackground }\"\n [ngStyle]=\"{ 'background-color': stripsResultDataMap[key]?.stripBackground }\">\n <div class=\"flex flex-col pl-4 pr-4 md:pr-0 md:pl-0 \" [ngClass]=\"\n !widgetData?.isChannelStrip\n ? ''\n : stripsResultDataMap[key]?.stripTitle\n ? 'mb-8'\n : ''\n \">\n <div class=\"flex flex-1 items-center\">\n <p class=\"mat-subheading-1 margin-remove inline-block \" *ngIf=\"stripsResultDataMap[key]?.stripTitle\">\n <span class=\"capitalize\" *ngIf=\"stripsResultDataMap[key]?.disableTranslate\">\n {{stripsResultDataMap[key]?.stripTitle}}\n </span>\n <span *ngIf=\"!stripsResultDataMap[key]?.disableTranslate\">\n {{ translateLabels(stripsResultDataMap[key]?.stripTitle, 'home') }}\n </span>\n </p>\n\n <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])\" class=\"block md:hidden\">\n <div \n class=\"ml-4 pl-2 view-more ws-mat-default-text \">\n <a class=\"flex ws-mat-default-text items-center justify-center mat-body-1 cursor-pointer\" \n (click)=\"raiseTelemetry(stripsResultDataMap[key]);redirectViewAll(stripsResultDataMap[key], stripsResultDataMap[key]?.viewMoreUrl?.path, 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 </div>\n <!-- viewAll end-->\n </div>\n <button mat-icon-button (click)=\"setHiddenForStrip(key)\" *ngIf=\"stripsResultDataMap[key]?.canHideStrip\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-icon class=\"cursor-pointer\" *ngIf=\"stripsResultDataMap[key]?.mode === 'accordion' && isMobile\"\n (click)=\"showAccordionData = !showAccordionData\">{{ showAccordionData ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"checkVisible(stripsResultDataMap[key])\">\n <ng-container [sbUiResolverWidget]=\"getdata(stripsResultDataMap[key])\">\n </ng-container>\n </div>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnNoData\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.noDataWidget\"></ng-container>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnError\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.errorWidget\"></ng-container>\n <!-- IF no errors then proceed to show tabs or non tabs strip -->\n <ng-container *ngIf=\"!stripsResultDataMap[key]?.showOnNoData && !stripsResultDataMap[key]?.showOnError\">\n <ng-container *ngIf=\"stripsResultDataMap[key].tabs && stripsResultDataMap[key].tabs.length\">\n <mat-tab-group animationDuration=\"0ms\" [selectedIndex]=\"getSelectedIndex(stripsResultDataMap[key], key)\"\n class=\"mat-tab-labels w-full strips-tabgroup\" dynamicHeight\n (selectedTabChange)=\"tabClicked($event, 0, stripsResultDataMap[key], key)\">\n <mat-tab label=\"{{tab?.label}}\" *ngFor=\"let tab of stripsResultDataMap[key].tabs; let last = last;let tabIndex = index\">\n <ng-template mat-tab-label>\n <span><span *ngIf=\"!tab?.disableTranslate\">{{ translateLabels(tab?.label, 'home') }}</span>\n <span class=\"tab-highlight\" *ngIf=\"tab?.disableTranslate\">{{tab?.label}}</span> &nbsp;</span>\n <span *ngIf=\"tab?.showTabDataCount && tab?.widgets?.length\">({{tab?.widgets?.length}})</span>\n </ng-template>\n\n <div class=\"wfull\" *ngIf=\"tab?.pillsData && tab?.pillsData?.length\">\n <div class=\"flex justify-between item-center flex-wrap gap-4\">\n <div class=\"\">\n <ng-container *ngFor=\"let facet of tab?.facets\">\n <form [formGroup]=\"facetForm\">\n <div class=\"facets-select\">\n <select formControlName=\"org\" (change)=\"getorgData($event, stripsResultDataMap[key], tabIndex)\">\n <option value=\"0\" selected disabled>Choose by organisation</option>\n <option value=\"{{d.name}}\" *ngFor=\"let d of facet.values\" >{{d.name}}</option>\n </select>\n </div>\n </form>\n </ng-container>\n </div>\n <div>\n <ng-container >\n <mat-chip-list class=\"content-pill-data\" aria-label=\"Fish selection\">\n <ng-container *ngFor=\"let pill of tab?.pillsData;let p = index\">\n <mat-chip [selected]=\"pill?.selected\" (click)=\"pillClicked($event, stripsResultDataMap[key], key, p, tabIndex)\">\n <span class=\"pill-name\">{{pill?.label}}</span></mat-chip>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n </div>\n <!-- viewAll start-->\n <div *ngIf=\"!stripsResultDataMap[key]?.hideViewMoreUrl && checkCondition(widgetData , stripsResultDataMap[key])\" class=\" hidden md:block\">\n <div class=\"ml-4 pl-2 view-more ws-mat-default-text\">\n <a class=\"flex ws-mat-default-text items-center justify-center mat-body-1 cursor-pointer\" \n (click)=\"raiseTelemetry(stripsResultDataMap[key]);redirectViewAll(stripsResultDataMap[key], stripsResultDataMap[key]?.viewMoreUrl?.path, 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 </div>\n \n <!-- viewAll end-->\n </div>\n <div *ngIf=\"stripsResultDataMap && stripsResultDataMap[key]?.showOnLoader ||\n !tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus\"\n class=\"text-center my-2\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [id]=\"key+'-scroller'\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n <ng-container *ngIf=\"tab?.pillsData && tab?.pillsData.length && tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]\">\n <div *ngIf=\"((tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus && tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus === 'done') &&\n (!tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets || !tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets?.length))\">\n <ng-container *ngIf=\"tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.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?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.nodataMsg, 'home') }}</div>\n </div>\n </ng-template>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus === 'done' || tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets?.length)\">\n <ng-container *ngIf=\"!tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.tabLoading\">\n <sb-uic-horizontal-scroller-v2 [id]=\"key+'-scroller'\" [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [widgetsLength]=\"tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets?.length\"\n [loadStatus]=\"'done'\" [defaultMaxWidgets]=\"tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets| slice:0:(tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets); trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </ng-container>\n </ng-container>\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </a>\n\n </ng-container>\n </ng-container>\n</ng-template>", styles: ["@charset \"UTF-8\";.facets-select{position:relative;display:inline-block;width:250px}.facets-select select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-color:#fff;border:1px solid #ccc;border-radius:25px;padding:10px 30px 10px 10px;font-size:16px;font-family:Arial,sans-serif;width:100%;height:100%;cursor:pointer}.facets-select:after{content:\"\\25bc\";position:absolute;top:50%;right:10px;transform:translateY(-50%);pointer-events:none;font-size:14px;color:#555}.tab-highlight{color:#1b4ca1!important;font-weight:bold}::ng-deep mat-chip-list.content-pill-data .mat-chip-selected{background-color:#1b4ca1!important}::ng-deep mat-chip-list.content-pill-data .mat-chip-selected .pill-name{color:#fff!important}::ng-deep mat-chip-list.content-pill-data .mat-chip-list-wrapper .mat-chip{cursor:pointer!important}::ng-deep mat-chip-list.content-pill-data .mat-chip-list-wrapper .mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background:#1B4CA1!important;color:#fff!important}::ng-deep mat-chip-list.content-pill-data .mat-chip-list-wrapper .mat-chip.mat-standard-chip{background:#ffffff!important;border:1px solid rgba(0,0,0,.0784313725)!important}\n"], components: [{ type: i8.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i10.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby"], exportAs: ["matTab"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["aria-orientation", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "selectable", "tabIndex", "errorStateMatcher"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i12.HorizontalScrollerV2Component, selector: "sb-uic-horizontal-scroller-v2", inputs: ["loadStatus", "id", "onHover", "sliderConfig", "widgetsLength", "defaultMaxWidgets", "stripConfig"], outputs: ["loadNext"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.SbUiResolverDirective, selector: "[sbUiResolverWidget]", inputs: ["sbUiResolverWidget"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i13.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i10.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }], pipes: { "translate": i5.TranslatePipe, "slice": i13.SlicePipe } });
656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ContentStripFacetFilterComponent, decorators: [{
657
+ type: Component,
658
+ args: [{
659
+ selector: 'sb-uic-content-strip-facet-filter',
660
+ templateUrl: './content-strip-facet-filter.component.html',
661
+ styleUrls: ['./content-strip-facet-filter.component.scss']
662
+ }]
663
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
664
+ type: Inject,
665
+ args: ['environment']
666
+ }] }, { type: i1.WidgetContentService }, { type: i2.LoggerService }, { type: i2.EventService }, { type: i2.ConfigurationsService }, { type: i2.UtilityService }, { type: i3.Router }, { type: i4.WidgetUserService }, { type: i5.TranslateService }, { type: i6.MultilingualTranslationsService }, { type: i7.FormBuilder }]; }, propDecorators: { widgetData: [{
667
+ type: Input
668
+ }], emptyResponse: [{
669
+ type: Output
670
+ }], viewAllResponse: [{
671
+ type: Output
672
+ }], telemtryResponse: [{
673
+ type: Output
674
+ }], providerId: [{
675
+ type: Input
676
+ }], emitViewAll: [{
677
+ type: Input
678
+ }], channnelName: [{
679
+ type: Input
680
+ }], id: [{
681
+ type: HostBinding,
682
+ args: ['id']
683
+ }] } });
684
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NvbnN1bXB0aW9uL3NyYy9saWIvX2NvbW1vbi9zdHJpcHMvY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIvY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NvbnN1bXB0aW9uL3NyYy9saWIvX2NvbW1vbi9zdHJpcHMvY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIvY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLFdBQVcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQW9CLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEYsT0FBTyxFQUE0QixhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUs3RixPQUFPLEVBTUwsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLDZEQUE2RDtBQUM3RCwyQkFBMkI7QUFDM0IsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUQzQixNQUFNLE9BQU8sZ0NBQWlDLFNBQVEsbUJBQW1CO0lBaUN2RSxZQUN5QixXQUFnQixFQUMvQixVQUFnQyxFQUNoQyxTQUF3QixFQUN4QixRQUFzQixFQUN0QixTQUFnQyxFQUNqQyxVQUEwQixFQUMxQixNQUFjLEVBQ2IsT0FBMEIsRUFDMUIsU0FB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QUFDLElBQUksQ0FBQTthQUM5RDtRQUNILENBQUMsRUFBVSxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDOzs4SEE1dEJVLGdDQUFnQyxrQkFrQ2pDLGFBQWE7a0hBbENaLGdDQUFnQyw0WEMzRTdDLHk4YUFrTGM7NEZEdkdELGdDQUFnQztrQkFMNUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUNBQW1DO29CQUM3QyxXQUFXLEVBQUUsNkNBQTZDO29CQUMxRCxTQUFTLEVBQUUsQ0FBQyw2Q0FBNkMsQ0FBQztpQkFDM0Q7OzBCQW1DSSxNQUFNOzJCQUFDLGFBQWE7bVdBN0JkLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFQyxFQUFFO3NCQURSLFdBQVc7dUJBQUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25EZXN0cm95LCBIb3N0QmluZGluZywgSW5qZWN0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciwgV2lkZ2V0QmFzZUNvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJztcbmltcG9ydCB7IE5zQ29udGVudFN0cmlwV2l0aEZhY2V0cywgQXBpUmVxdWVzdEZvciB9IGZyb20gJy4vY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIubW9kZWwnO1xuLy8gaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi8uLi9fbW9kZWxzL3dpZGdldC1jb250ZW50Lm1vZGVsJztcbmltcG9ydCB7IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvbXVsdGlsaW5ndWFsLXRyYW5zbGF0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFRGZXRjaFN0YXR1cyxcbiAgTG9nZ2VyU2VydmljZSxcbiAgRXZlbnRTZXJ2aWNlLFxuICBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gIFV0aWxpdHlTZXJ2aWNlLFxuICBXc0V2ZW50cyxcbn0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBXaWRnZXRVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtdXNlci5zZXJ2aWNlJztcbi8vIGltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnc3JjL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCdcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBNYXRUYWJDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgTnNDYXJkQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL19tb2RlbHMvY2FyZC1jb250ZW50LXYyLm1vZGVsJztcbmltcG9ydCB7IElUb2RheUV2ZW50cyB9IGZyb20gJy4uLy4uLy4uL19tb2RlbHMvZXZlbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbnRlcmZhY2UgSVN0cmlwVW5pdENvbnRlbnREYXRhIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNhbkhpZGVTdHJpcDogYm9vbGVhbjtcbiAgbW9kZT86IHN0cmluZztcbiAgc2hvd1N0cmlwOiBib29sZWFuO1xuICBkaXNhYmxlVHJhbnNsYXRlOiBib29sZWFuO1xuICB3aWRnZXRzPzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXTtcbiAgc3RyaXBUaXRsZTogc3RyaW5nO1xuICBoaWRlVmlld01vcmVVcmw/OiBib29sZWFuO1xuICBzdHJpcFRpdGxlTGluaz86IHtcbiAgICBsaW5rOiAge1xuICAgICAgcXVlcnlQYXJhbXM6IHN0cmluZ1xuICAgIH0sXG4gICAgaWNvbjogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zOiBzdHJpbmdcbiAgfTtcbiAgc2xpZGVyQ29uZmlnPzoge1xuICAgIHNob3dOYXZzOiBib29sZWFuLFxuICAgIHNob3dEb3RzOiBib29sZWFuLFxuICAgIG1heFdpZGdldHM/OiBudW1iZXJcbiAgICBjZXJpZmljYXRlQ2FyZE1hcmdpbj86IGJvb2xlYW5cbiAgfTtcbiAgc3RyaXBDb25maWc6IGFueTtcbiAgdGFicz86IE5zQ29udGVudFN0cmlwV2l0aEZhY2V0cy5JQ29udGVudFN0cmlwVGFiW10gfCB1bmRlZmluZWQ7XG4gIHN0cmlwTmFtZT86IHN0cmluZztcbiAgc3RyaXBMb2dvPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgc3RyaXBJbmZvPzogTnNDb250ZW50U3RyaXBXaXRoRmFjZXRzLklTdHJpcEluZm87XG4gIG5vRGF0YVdpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhO1xuICBlcnJvcldpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhO1xuICBzaG93T25Ob0RhdGE6IGJvb2xlYW47XG4gIHNob3dPbkxvYWRlcjogYm9vbGVhbjtcbiAgc2hvd09uRXJyb3I6IGJvb2xlYW47XG4gIGxvYWRlcldpZGdldHM/OiBhbnk7XG4gIHN0cmlwQmFja2dyb3VuZD86IHN0cmluZztcbiAgc2Vjb25kYXJ5SGVhZGluZz86IGFueTtcbiAgdmlld01vcmVVcmw6IGFueTtcbiAgcmVxdWVzdD86IGFueVxuICBcbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzYi11aWMtY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGVudC1zdHJpcC1mYWNldC1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb250ZW50LXN0cmlwLWZhY2V0LWZpbHRlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbnRlbnRTdHJpcEZhY2V0RmlsdGVyQ29tcG9uZW50IGV4dGVuZHMgV2lkZ2V0QmFzZUNvbXBvbmVudFxuaW1wbGVtZW50c1xuT25Jbml0LFxuT25EZXN0cm95LFxuTnNXaWRnZXRSZXNvbHZlci5JV2lkZ2V0RGF0YTxOc0NvbnRlbnRTdHJpcFdpdGhGYWNldHMuSUNvbnRlbnRTdHJpcE11bHRpcGxlPiB7XG4gIEBJbnB1dCgpIHdpZGdldERhdGEhOiBOc0NvbnRlbnRTdHJpcFdpdGhGYWNldHMuSUNvbnRlbnRTdHJpcE11bHRpcGxlO1xuICBAT3V0cHV0KCkgZW1wdHlSZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSB2aWV3QWxsUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgdGVsZW10cnlSZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBJbnB1dCgpIHByb3ZpZGVySWQgOiBhbnkgPSAnJ1xuICBASW5wdXQoKSBlbWl0Vmlld0FsbCA6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBjaGFubm5lbE5hbWU6IGFueSA9ICcnXG4gIEBIb3N0QmluZGluZygnaWQnKVxuICBwdWJsaWMgaWQgPSBgd3Mtc3RyaXAtbWlsdGlwbGVfJHtNYXRoLnJhbmRvbSgpfWA7XG4gIHN0cmlwc1Jlc3VsdERhdGFNYXA6IHsgW2tleTogc3RyaW5nXTogSVN0cmlwVW5pdENvbnRlbnREYXRhIH0gPSB7fTtcbiAgc3RyaXBzS2V5T3JkZXI6IHN0cmluZ1tdID0gW107XG4gIHNob3dBY2NvcmRpb25EYXRhID0gdHJ1ZTtcbiAgc2hvd1BhcmVudExvYWRlciA9IGZhbHNlO1xuICBzaG93UGFyZW50RXJyb3IgPSBmYWxzZTtcbiAgc2hvd1BhcmVudE5vRGF0YSA9IGZhbHNlO1xuICBlcnJvckRhdGFDb3VudCA9IDA7XG4gIG5vRGF0YUNvdW50ID0gMDtcbiAgc3VjY2Vzc0RhdGFDb3VudCA9IDA7XG4gIGNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICBiYXNlVXJsID0gdGhpcy5jb25maWdTdmMuc2l0ZVBhdGggfHwgJyc7XG4gIHZlaWZpZWRLYXJtYXlvZ2kgPSBmYWxzZTtcbiAgZW52aXJvbm1lbnQhOiBhbnk7XG4gIGNoYW5nZUV2ZW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgZGVmYXVsdE1heFdpZGdldHMgPSAxMjtcbiAgZW5yb2xsSW50ZXJ2YWw6IGFueTtcbiAgdG9kYXlzRXZlbnRzOiBhbnkgPSBbXTtcbiAgZW5yb2xsbWVudE1hcERhdGE6IGFueVxuICBmYWNldEZvcm06IGFueVxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIGVudmlyb25tZW50OiBhbnksXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlclN2YzogTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U3ZjOiBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwdWJsaWMgdXRpbGl0eVN2YzogVXRpbGl0eVNlcnZpY2UsXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdXNlclN2YzogV2lkZ2V0VXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndHJhbnNsYXRpb25zOiBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlclxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCdlbicpO1xuICAgICAgbGV0IGxhbmcgPSBKU09OLnN0cmluZ2lmeShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpO1xuICAgICAgbGFuZyA9IGxhbmcucmVwbGFjZSgvXFxcIi9nLCAnJyk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobGFuZyk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXREYXRhKCk7XG4gICAgdGhpcy5jb250ZW50U3ZjLnRlbGVtZXRyeURhdGEkLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnRlbGVtdHJ5UmVzcG9uc2UuZW1pdChkYXRhKVxuICAgIH0pXG4gICAgdGhpcy5mYWNldEZvcm0gPSB0aGlzLl9mYi5ncm91cCh7XG4gICAgICBvcmc6IFsnMCddXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XG4gICAgdGhpcy5zdHJpcHNLZXlPcmRlciA9IHRoaXMud2lkZ2V0RGF0YSAmJiB0aGlzLndpZGdldERhdGEuc3RyaXBzICYmIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMubWFwKHN0cmlwID0+IHN0cmlwLmtleSkgfHwgW107XG4gICAgaWYgKHRoaXMud2lkZ2V0RGF0YS5sb2FkZXIgJiYgdGhpcy53aWRnZXREYXRhLnN0cmlwcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvd1BhcmVudExvYWRlciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEZldGNoIHRoZSBkYXRhXG4gICAgZm9yIChjb25zdCBzdHJpcCBvZiB0aGlzLndpZGdldERhdGEuc3RyaXBzKSB7XG4gICAgICBpZiAodGhpcy5jaGVja0ZvckVtcHR5V2lkZ2V0KHN0cmlwKSkge1xuICAgICAgICB0aGlzLmZldGNoU3RyaXBGcm9tUmVxdWVzdERhdGEoc3RyaXAsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2RvbmUnLCB0cnVlLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU3Vic2NyaXB0aW9uIGZvciBjaGFuZ2VzXG4gICAgY29uc3Qga2V5QW5kRXZlbnQ6IHsga2V5OiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZnJvbTogc3RyaW5nIH1bXSA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHNcbiAgICAgIC5tYXAoc3RyaXAgPT4gKHtcbiAgICAgICAga2V5OiBzdHJpcC5rZXksXG4gICAgICAgIHR5cGU6IChzdHJpcC5yZWZyZXNoRXZlbnQgJiYgc3RyaXAucmVmcmVzaEV2ZW50LmV2ZW50VHlwZSkgfHwgJycsXG4gICAgICAgIGZyb206IChzdHJpcC5yZWZyZXNoRXZlbnQgJiYgc3RyaXAucmVmcmVzaEV2ZW50LmZyb20udG9TdHJpbmcoKSkgfHwgJycsXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKHsga2V5LCB0eXBlLCBmcm9tIH0pID0+IGtleSAmJiB0eXBlICYmIGZyb20pO1xuICAgIGNvbnN0IGV2ZW50VHlwZVNldCA9IG5ldyBTZXQoa2V5QW5kRXZlbnQubWFwKGUgPT4gZS50eXBlKSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRTdmMuZXZlbnRzJFxuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50VHlwZVNldC5oYXMoZXZlbnQuZXZlbnRUeXBlKSkpXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAga2V5QW5kRXZlbnRcbiAgICAgICAgICAuZmlsdGVyKGUgPT4gZS50eXBlID09PSBldmVudC5ldmVudFR5cGUgJiYgZS5mcm9tID09PSBldmVudC5mcm9tKVxuICAgICAgICAgIC5tYXAoZSA9PiBlLmtleSlcbiAgICAgICAgICAuZm9yRWFjaChrID0+IHRoaXMuZmV0Y2hTdHJpcEZyb21LZXkoaywgZmFsc2UpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFN0cmlwRnJvbUtleShrZXk6IHN0cmluZywgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHN0cmlwRGF0YSA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMuZmluZChzdHJpcCA9PiBzdHJpcC5rZXkgPT09IGtleSk7XG4gICAgaWYgKHN0cmlwRGF0YSkge1xuICAgICAgdGhpcy5mZXRjaFN0cmlwRnJvbVJlcXVlc3REYXRhKHN0cmlwRGF0YSwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgZmV0Y2hTdHJpcEZyb21SZXF1ZXN0RGF0YShcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoRmFjZXRzLklDb250ZW50U3RyaXBVbml0LFxuICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUsXG4gICkge1xuICAgIC8vIHNldHRpbmcgaW5pdGlhbCB2YWx1ZXNcbiAgICBzdHJpcC5sb2FkZXJXaWRnZXRzID0gdGhpcy50cmFuc2Zvcm1Ta2VsZXRvblRvV2lkZ2V0cyhzdHJpcCk7XG4gICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZmV0Y2hpbmcnLCBmYWxzZSwgbnVsbCk7XG4gICAgaWYoc3RyaXAgJiYgc3RyaXAuc3RyaXBSZXF1ZXN0Rm9yID09PSAgQXBpUmVxdWVzdEZvci5TRUFSQ0ggJiYgIXN0cmlwLm9uVGFiQ2xpY2tSZXF1ZXN0KSB7XG4gICAgICB0aGlzLmZldGNoRnJvbVNlYXJjaChzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybVNrZWxldG9uVG9XaWRnZXRzKFxuICAgIHN0cmlwOiBhbnlcbiAgKSB7XG4gICAgcmV0dXJuIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA3LCA4LCA5LCAxMF0ubWFwKF9jb250ZW50ID0+ICh7XG4gICAgICB3aWRnZXRUeXBlOiAnY2FyZExpYicsXG4gICAgICB3aWRnZXRTdWJUeXBlOiAnY2FyZENvbnRlbnRMaWInLFxuICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbWItMicsXG4gICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgIGNhcmRTdWJUeXBlOiBzdHJpcC5sb2FkZXJDb25maWcgJiYgc3RyaXAubG9hZGVyQ29uZmlnLmNhcmRTdWJUeXBlIHx8ICdjYXJkLXN0YW5kYXJkLXNrZWxldG9uJyxcbiAgICAgICAgY2FyZEN1c3RvbWVDbGFzczogc3RyaXAuY3VzdG9tZUNsYXNzID8gc3RyaXAuY3VzdG9tZUNsYXNzIDogJycsXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1N0cmlwKFxuICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhGYWNldHMuSUNvbnRlbnRTdHJpcFVuaXQsXG4gICAgcmVzdWx0czogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXSA9IFtdLFxuICAgIGZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSxcbiAgICBfdmlld01vcmVVcmw6IGFueSxcbiAgICB0YWJzUmVzdWx0cz86IE5zQ29udGVudFN0cmlwV2l0aEZhY2V0cy5JQ29udGVudFN0cmlwVGFiW10gfCB1bmRlZmluZWQsXG4gICAgLy8gY2FsY3VsYXRlUGFyZW50U3RhdHVzIGlzIHVzZWQgc28gdGhhdCBwYXJlbnRzJyBzdGF0dXMgaXMgbm90IHJlLWNhbGN1bGF0ZWQgaWYgdGhlIEFQSSBpcyBjYWxsZWQgYWdhaW4gY296IG9mIGZpbHRlcnMsIGV0Yy5cbiAgKSB7XG4gICAgY29uc3Qgc3RyaXBEYXRhID0ge1xuICAgICAgdmlld01vcmVVcmw6IHN0cmlwLnZpZXdNb3JlVXJsLFxuICAgICAga2V5OiBzdHJpcC5rZXksXG4gICAgICBjYW5IaWRlU3RyaXA6IEJvb2xlYW4oc3RyaXAuY2FuSGlkZVN0cmlwKSxcbiAgICAgIHNob3dTdHJpcDogdGhpcy5nZXRJZlN0cmlwSGlkZGVuKHN0cmlwLmtleSksXG4gICAgICBub0RhdGFXaWRnZXQ6IHN0cmlwLm5vRGF0YVdpZGdldCxcbiAgICAgIGVycm9yV2lkZ2V0OiBzdHJpcC5lcnJvcldpZGdldCxcbiAgICAgIHN0cmlwSW5mbzogc3RyaXAuaW5mbyxcbiAgICAgIHN0cmlwVGl0bGU6IHN0cmlwLnRpdGxlLFxuICAgICAgc3RyaXBUaXRsZUxpbms6IHN0cmlwLnN0cmlwVGl0bGVMaW5rLFxuICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogc3RyaXAuZGlzYWJsZVRyYW5zbGF0ZSxcbiAgICAgIHNsaWRlckNvbmZpZzogc3RyaXAuc2xpZGVyQ29uZmlnLFxuICAgICAgdGFiczogdGFic1Jlc3VsdHMgPyB0YWJzUmVzdWx0cyA6IHN0cmlwLnRhYnMsXG4gICAgICBzdHJpcE5hbWU6IHN0cmlwLm5hbWUsXG4gICAgICBtb2RlOiBzdHJpcC5tb2RlLFxuICAgICAgc3RyaXBDb25maWc6IHN0cmlwLnN0cmlwQ29uZmlnLFxuICAgICAgc3RyaXBCYWNrZ3JvdW5kOiBzdHJpcC5zdHJpcEJhY2tncm91bmQsXG4gICAgICBzZWNvbmRhcnlIZWFkaW5nOiBzdHJpcC5zZWNvbmRhcnlIZWFkaW5nLFxuICAgICAgbG9hZGVyV2lkZ2V0czogc3RyaXAubG9hZGVyV2lkZ2V0cyB8fCBbXSxcbiAgICAgIGhpZGVWaWV3TW9yZVVybDpzdHJpcC5oaWRlVmlld01vcmVVcmwgfHwgZmFsc2UsXG4gICAgICB3aWRnZXRzOlxuICAgICAgICBmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi4oc3RyaXAucHJlV2lkZ2V0cyB8fCBbXSkubWFwKHcgPT4gKHtcbiAgICAgICAgICAgICAgLi4udyxcbiAgICAgICAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiBgbWItMiAke3cud2lkZ2V0SG9zdENsYXNzfWAsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAuLi5yZXN1bHRzLFxuICAgICAgICAgICAgLi4uKHN0cmlwLnBvc3RXaWRnZXRzIHx8IFtdKS5tYXAodyA9PiAoe1xuICAgICAgICAgICAgICAuLi53LFxuICAgICAgICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6IGBtYi0yICR7dy53aWRnZXRIb3N0Q2xhc3N9YCxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICAgIHNob3dPbk5vRGF0YTogQm9vbGVhbihcbiAgICAgICAgc3RyaXAubm9EYXRhV2lkZ2V0ICYmXG4gICAgICAgICEoKHN0cmlwLnByZVdpZGdldHMgfHwgW10pLmxlbmd0aCArIHJlc3VsdHMubGVuZ3RoICsgKHN0cmlwLnBvc3RXaWRnZXRzIHx8IFtdKS5sZW5ndGgpICYmXG4gICAgICAgIGZldGNoU3RhdHVzID09PSAnZG9uZScsXG4gICAgICApLFxuICAgICAgc2hvd09uTG9hZGVyOiBCb29sZWFuKHN0cmlwLmxvYWRlciAmJiBmZXRjaFN0YXR1cyA9PT0gJ2ZldGNoaW5nJyksXG4gICAgICBzaG93T25FcnJvcjogQm9vbGVhbihzdHJpcC5lcnJvcldpZGdldCAmJiBmZXRjaFN0YXR1cyA9PT0gJ2Vycm9yJyksXG4gICAgfTtcbiAgICAvLyBjb25zdCBzdHJpcERhdGEgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XVxuICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcCA9IHtcbiAgICAgIC4uLnRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcCxcbiAgICAgIFtzdHJpcC5rZXldOiBzdHJpcERhdGEsXG4gICAgfTtcbiAgICBpZiAoIXRhYnNSZXN1bHRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyAmJlxuICAgICAgICAoZmV0Y2hTdGF0dXMgPT09ICdkb25lJyB8fCBmZXRjaFN0YXR1cyA9PT0gJ2Vycm9yJykgJiZcbiAgICAgICAgc3RyaXBEYXRhLndpZGdldHNcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoZWNrUGFyZW50U3RhdHVzKGZldGNoU3RhdHVzLCBzdHJpcERhdGEud2lkZ2V0cy5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKGNhbGN1bGF0ZVBhcmVudFN0YXR1cyAmJiAhKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSkge1xuICAgICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50QXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUGFyZW50U3RhdHVzKGZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMsIHN0cmlwV2lkZ2V0c0NvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZmV0Y2hTdGF0dXMgPT09ICdkb25lJyAmJiAhc3RyaXBXaWRnZXRzQ291bnQpIHtcbiAgICAgIHRoaXMubm9EYXRhQ291bnQgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGZldGNoU3RhdHVzID09PSAnZG9uZScgJiYgc3RyaXBXaWRnZXRzQ291bnQpIHtcbiAgICAgIHRoaXMuc3VjY2Vzc0RhdGFDb3VudCArPSAxO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hTdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgIHRoaXMuZXJyb3JEYXRhQ291bnQgKz0gMTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlZENvdW50ID0gdGhpcy5ub0RhdGFDb3VudCArIHRoaXMuc3VjY2Vzc0RhdGFDb3VudCArIHRoaXMuZXJyb3JEYXRhQ291bnQ7XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMubGVuZ3RoO1xuICAgIGlmICh0aGlzLnN1Y2Nlc3NEYXRhQ291bnQgPiAwICYmIHNldHRsZWRDb3VudCA8IHRvdGFsQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93UGFyZW50TG9hZGVyID0gc2V0dGxlZENvdW50ICE9PSB0b3RhbENvdW50O1xuICAgIHRoaXMuc2hvd1BhcmVudE5vRGF0YSA9XG4gICAgICB0aGlzLm5vRGF0YUNvdW50ID4gMCAmJiB0aGlzLm5vRGF0YUNvdW50ICsgdGhpcy5lcnJvckRhdGFDb3VudCA9PT0gdG90YWxDb3VudDtcbiAgICB0aGlzLnNob3dQYXJlbnRFcnJvciA9IHRoaXMuZXJyb3JEYXRhQ291bnQgPT09IHRvdGFsQ291bnQ7XG4gIH1cbiAgY2hlY2tGb3JFbXB0eVdpZGdldChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoRmFjZXRzLklDb250ZW50U3RyaXBVbml0KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3RyaXAucmVxdWVzdCAmJlxuICAgICAgKChzdHJpcC5yZXF1ZXN0LnJlcXVlc3RCb2R5ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QucmVxdWVzdEJvZHkpLmxlbmd0aCkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIHN0cmlwIHNldHRpbmdzXG4gIHRvZ2dsZUluZm8oZGF0YTogSVN0cmlwVW5pdENvbnRlbnREYXRhKSB7XG4gICAgY29uc3Qgc3RyaXBJbmZvID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW2RhdGEua2V5XS5zdHJpcEluZm87XG4gICAgaWYgKHN0cmlwSW5mbykge1xuICAgICAgaWYgKHN0cmlwSW5mby5tb2RlICE9PSAnYmVsb3cnKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oYHN0cmlwIGluZm8gbW9kZTogJHtzdHJpcEluZm8ubW9kZX0gbm90IGltcGxlbWVudGVkIHlldGApO1xuICAgICAgICBzdHJpcEluZm8ubW9kZSA9ICdiZWxvdyc7XG4gICAgICB9XG4gICAgICBpZiAoc3RyaXBJbmZvLm1vZGUgPT09ICdiZWxvdycpIHtcbiAgICAgICAgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW2RhdGEua2V5XS5zdHJpcEluZm8gPSB7XG4gICAgICAgICAgLi4uc3RyaXBJbmZvLFxuICAgICAgICAgIHZpc2liaWxpdHlNb2RlOiBzdHJpcEluZm8udmlzaWJpbGl0eU1vZGUgPT09ICdoaWRkZW4nID8gJ3Zpc2libGUnIDogJ2hpZGRlbicsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnkoc3RyaXBEYXRhOiBhbnkpe1xuICAgIHRoaXMudGVsZW10cnlSZXNwb25zZS5lbWl0KHN0cmlwRGF0YSlcbiAgfVxuICBzZXRIaWRkZW5Gb3JTdHJpcChrZXk6IHN0cmluZykge1xuICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLnNob3dTdHJpcCA9IGZhbHNlO1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYGNzdHJpcF8ke2tleX1gLCAnMScpO1xuICB9XG4gIC8vIHNlbGVjdGVkIHBpbGxzIGRhdGFcbiAgZ2V0U2VsZWN0ZWRQaWxsSW5kZXgodGFiZGF0YTogYW55LCB0YWJJbmRleDogYW55KSB7XG4gICAgaWYodGFiZGF0YS5waWxsc0RhdGEgJiYgdGFiZGF0YS5waWxsc0RhdGEubGVuZ3RoKSB7XG4gICAgICBsZXQgaW5kZXggPSB0YWJkYXRhLnBpbGxzRGF0YS5maW5kSW5kZXgoKHBpbGw6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwaWxsLnNlbGVjdGVkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpbmRleFxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9XG5cbiAgZ2V0ZGF0YShkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICBpZiAoZGF0YS5zdHJpcEluZm8pIHtcbiAgICAgIHJldHVybiBkYXRhLnN0cmlwSW5mby53aWRnZXQ7XG4gICAgfVxuICAgIHJldHVybiB7fTtcblxuICB9XG5cbiAgcHVibGljIHRhYkNsaWNrZWQodGFiRXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50LCBwaWxsSW5kZXg6IGFueSwgc3RyaXBNYXA6IElTdHJpcFVuaXRDb250ZW50RGF0YSwgc3RyaXBLZXk6IHN0cmluZykge1xuICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdKSB7XG4gICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdpbnByb2dyZXNzJztcbiAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLnRhYkxvYWRpbmcgPSB0cnVlO1xuICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZGF0YTogV3NFdmVudHMuSVRlbGVtZXRyeVRhYkRhdGEgPSB7XG4gICAgICBsYWJlbDogYCR7dGFiRXZlbnQudGFiLnRleHRMYWJlbH1gLFxuICAgICAgaW5kZXg6IHRhYkV2ZW50LmluZGV4LFxuICAgIH07XG4gICAgdGhpcy5ldmVudFN2Yy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RUeXBlcy5DTElDSyxcbiAgICAgICAgc3ViVHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuSE9NRV9QQUdFX1NUUklQX1RBQlMsXG4gICAgICAgIGlkOiBgJHtfLmNhbWVsQ2FzZShkYXRhLmxhYmVsKX0tdGFiYCxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5IT01FLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50VGFiRnJvbU1hcDogYW55ID0gc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XTtcbiAgICBjb25zdCBjdXJyZW50UGlsbEZyb21NYXA6IGFueSA9IHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF07XG4gICAgY29uc3QgY3VycmVudFN0cmlwID0gdGhpcy53aWRnZXREYXRhLnN0cmlwcy5maW5kKHMgPT4gcy5rZXkgPT09IHN0cmlwS2V5KTtcbiAgICBpZiAodGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XSAmJiBjdXJyZW50VGFiRnJvbU1hcCkge1xuICAgICAgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgLi4udGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgICAgICAgdGFiU2VsZWN0ZWQ6IGN1cnJlbnRUYWJGcm9tTWFwLnZhbHVlLFxuICAgICAgICBwaWxsU2VsZWN0ZWQ6IGN1cnJlbnRQaWxsRnJvbU1hcC52YWx1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRTdHJpcCAmJiBjdXJyZW50VGFiRnJvbU1hcCAmJiAhY3VycmVudFRhYkZyb21NYXAuY29tcHV0ZURhdGFPbkNsaWNrICYmIGN1cnJlbnRQaWxsRnJvbU1hcCkge1xuICAgICAgaWYgKGN1cnJlbnRQaWxsRnJvbU1hcC5yZXF1ZXN0UmVxdWlyZWQgJiYgY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3QpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRQaWxsRnJvbU1hcC5yZXF1ZXN0LnNlYXJjaFY2KSB7XG4gICAgICAgICAgLy8gdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihjdXJyZW50U3RyaXAsIHRhYkV2ZW50LmluZGV4LCBjdXJyZW50VGFiRnJvbU1hcCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLnRhYkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5ZmlsdGVyKGN1cnJlbnRTdHJpcCwgY3VycmVudFRhYkZyb21NYXAsIHRydWUpO1xuICAgICAgICBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XSkge1xuICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLmZldGNoVGFiU3RhdHVzID0gJ2lucHJvZ3Jlc3MnO1xuICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLnRhYkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBzdHJpcE1hcC5zaG93T25Mb2FkZXIgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVzZXRGaWx0ZXIoc3RyaXBNYXAsIHRhYkV2ZW50LmluZGV4ICxwaWxsSW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0pIHtcbiAgICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLmZldGNoVGFiU3RhdHVzID0gJ2RvbmUnO1xuICAgICAgICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRQaWxsKHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YSlcbiAgICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdWydzZWxlY3RlZCddPXRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sICAgICAgICAgMjAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwaWxsQ2xpY2tlZChldmVudDogYW55LCBzdHJpcE1hcDogSVN0cmlwVW5pdENvbnRlbnREYXRhLCBzdHJpcEtleTogYW55LCBwaWxsSW5kZXg6IGFueSwgdGFiSW5kZXg6IGFueSkge1xuICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdKSB7XG4gICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdpbnByb2dyZXNzJztcbiAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLnRhYkxvYWRpbmcgPSB0cnVlO1xuICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFRhYkZyb21NYXA6IGFueSA9IHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJJbmRleF07XG4gICAgY29uc3QgY3VycmVudFBpbGxGcm9tTWFwOiBhbnkgPSBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdO1xuICAgIGNvbnN0IGN1cnJlbnRTdHJpcCA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMuZmluZChzID0+IHMua2V5ID09PSBzdHJpcEtleSk7XG4gICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcEtleV0gJiYgY3VycmVudFRhYkZyb21NYXApIHtcbiAgICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcEtleV0udmlld01vcmVVcmwucXVlcnlQYXJhbXMgPSB7XG4gICAgICAgIC4uLnRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcEtleV0udmlld01vcmVVcmwucXVlcnlQYXJhbXMsXG4gICAgICAgIHRhYlNlbGVjdGVkOiBjdXJyZW50VGFiRnJvbU1hcC52YWx1ZSxcbiAgICAgICAgcGlsbFNlbGVjdGVkOiBjdXJyZW50UGlsbEZyb21NYXAudmFsdWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY3VycmVudFN0cmlwICYmIGN1cnJlbnRUYWJGcm9tTWFwICYmICFjdXJyZW50VGFiRnJvbU1hcC5jb21wdXRlRGF0YU9uQ2xpY2sgJiYgY3VycmVudFBpbGxGcm9tTWFwKSB7XG4gICAgICBpZiAoY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3RSZXF1aXJlZCAmJiBjdXJyZW50UGlsbEZyb21NYXAucmVxdWVzdCkge1xuICAgICAgICAvLyBjYWxsIEFQSSB0byBnZXQgdGFiIGRhdGEgYW5kIHByb2Nlc3NcbiAgICAgICAgLy8gdGhpcy5wcm9jZXNzU3RyaXAoY3VycmVudFN0cmlwLCBbXSwgJ2ZldGNoaW5nJywgdHJ1ZSwgbnVsbClcbiAgICAgICAgaWYgKGN1cnJlbnRQaWxsRnJvbU1hcC5yZXF1ZXN0LnNlYXJjaFY2KSB7XG4gICAgICAgICAgLy8gdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihjdXJyZW50U3RyaXAsIHRhYkluZGV4LCBwaWxsSW5kZXgsIGN1cnJlbnRQaWxsRnJvbU1hcCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gpIHtcbiAgICAgICAgICAvLyB0aGlzLmdldFRhYkRhdGFCeU5ld1JlcVRyZW5kaW5nKGN1cnJlbnRTdHJpcCwgdGFiSW5kZXgsIHBpbGxJbmRleCwgY3VycmVudFBpbGxGcm9tTWFwLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XSkge1xuICAgICAgICAvLyAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnRhYkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdldFRhYkRhdGFCeWZpbHRlcihjdXJyZW50U3RyaXAsIGN1cnJlbnRUYWJGcm9tTWFwLCB0cnVlKTtcbiAgICAgICAgaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJJbmRleF0pIHtcbiAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdpbnByb2dyZXNzJztcbiAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJlc2V0RmlsdGVyKHN0cmlwTWFwLCB0YWJJbmRleCAscGlsbEluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdKSB7XG4gICAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdkb25lJztcbiAgICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLnRhYkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHN0cmlwTWFwLnNob3dPbkxvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkUGlsbChzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGEpXG4gICAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XVsnc2VsZWN0ZWQnXT10cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9LCAgICAgICAgIDIwMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzZXRTZWxlY3RlZFBpbGwocGlsbERhdGE6IGFueSl7XG4gICAgaWYocGlsbERhdGEgJiYgcGlsbERhdGEubGVuZ3RoKXtcbiAgICAgIHBpbGxEYXRhLmZvckVhY2goKHBpbGw6IGFueSkgPT4ge1xuICAgICAgICBwaWxsWydzZWxlY3RlZCddID0gZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldFRhYkRhdGFCeWZpbHRlcihcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoRmFjZXRzLklDb250ZW50U3RyaXBVbml0LFxuICAgIGN1cnJlbnRUYWI6IE5zQ29udGVudFN0cmlwV2l0aEZhY2V0cy5JQ29udGVudFN0cmlwVGFiLFxuICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1czogYm9vbGVhblxuICApIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ3N0cmlwIC0tICcsIHN0cmlwKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ2N1cnJlbnRUYWIgLS0gJywgY3VycmVudFRhYik7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdjYWxjdWxhdGVQYXJlbnRTdGF0dXMtLSAnLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIC8vIFRPRE86IFdyaXRlIGxvZ2ljIGZvciBpbmRpdmlkdWFsIGZpbHRlciBpZiBwYXNzZWQgaW4gY29uZmlnXG4gICAgLy8gYWRkIHN3aXRjaCBjYXNlIGJhc2VkIG9uIGNvbmZpZyBrZXkgcGFzc2VkXG4gIH1cblxuICBwcml2YXRlIGdldElmU3RyaXBIaWRkZW4oa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdG9yYWdlSXRlbSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oYGNzdHJpcF8ke2tleX1gKTtcbiAgICByZXR1cm4gQm9vbGVhbihzdG9yYWdlSXRlbSAhPT0gJzEnKTtcbiAgfVxuXG4gIC8vIHRyYW5zbGF0ZSBsYWJlc1xuICB0cmFuc2xhdGVMYWJlbHMobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbChsYWJlbCwgdHlwZSwgJycpO1xuICB9XG5cbiAgcmVkaXJlY3RWaWV3QWxsKHN0cmlwRGF0YTogYW55LCBwYXRoOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zRGF0YTogYW55KSB7XG4gICAgaWYodGhpcy5lbWl0Vmlld0FsbCkge1xuICAgICAgdGhpcy52aWV3QWxsUmVzcG9uc2UuZW1pdChzdHJpcERhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYXRoXSwgeyAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zRGF0YSB9KVxuICAgIH1cbiAgfVxuICBpZGVudGlmeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgICBpZiAoaW5kZXggPj0gMCkgeyB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgdHJhY2tlcihpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgICBpZiAoaW5kZXggPj0gMCkgeyB9XG4gICAgcmV0dXJuIF8uZ2V0KGl0ZW0sICd3aWRnZXREYXRhLmNvbnRlbnQuaWRlbnRpZmllcicpXG4gIH1cblxuICBnZXRDb250aW5ldUxlYXJuaW5nTGVudGgoZGF0YTogSVN0cmlwVW5pdENvbnRlbnREYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEud2lkZ2V0cyA/IGRhdGEud2lkZ2V0cy5sZW5ndGggOiAwO1xuICB9XG5cbiAgc2hvd0FjY29yZGlvbihrZXk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGUgJiYgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW2tleV0ubW9kZSA9PT0gJ2FjY29yZGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dBY2NvcmRpb25EYXRhO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNoZWNrQ29uZGl0aW9uKHdEYXRhOiBOc0NvbnRlbnRTdHJpcFdpdGhGYWNldHMuSUNvbnRlbnRTdHJpcE11bHRpcGxlLCBkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICBpZiAod0RhdGEuc3RyaXBzWzBdLnN0cmlwQ29uZmlnICYmIHdEYXRhLnN0cmlwc1swXS5zdHJpcENvbmZpZy5oaWRlU2hvd0FsbCkge1xuICAgICAgcmV0dXJuICF3RGF0YS5zdHJpcHNbMF0uc3RyaXBDb25maWcuaGlkZVNob3dBbGw7XG4gICAgfVxuICAgIHJldHVybiB3RGF0YS5zdHJpcHNbMF0udmlld01vcmVVcmwgJiYgZGF0YS53aWRnZXRzICYmIGRhdGEud2lkZ2V0cy5sZW5ndGggPj0gNDtcbiAgfVxuICBjaGVja1Zpc2libGUoZGF0YTogSVN0cmlwVW5pdENvbnRlbnREYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEuc3RyaXBJbmZvICYmIGRhdGEuc3RyaXBJbmZvLnZpc2liaWxpdHlNb2RlID09PSAndmlzaWJsZSc7XG4gIH1cblxuICBnZXRTZWxlY3RlZEluZGV4KHN0cmlwc1Jlc3VsdERhdGFNYXA6IGFueSwga2V5OiBhbnkpOiBudW1iZXIge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IDA7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgZ2V0TGVuZ3RoKGRhdGE6IElTdHJpcFVuaXRDb250ZW50RGF0YSkge1xuICAgIGlmICghZGF0YS50YWJzIHx8ICFkYXRhLnRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YS53aWRnZXRzID8gZGF0YS53aWRnZXRzLmxlbmd0aCA6IDA7XG4gICAgfSB7XG4gICAgICAvLyBpZiB0YWJzIGFyZSB0aGVyZSBjaGVjayBpZiBlYWNoIHRhYiBoYXMgd2lkZ2V0cyBhbmQgZ2V0IHRoZSB0YWIgd2l0aCBtYXggd2lkZ2V0c1xuICAgICAgbGV0IHRhYldpdGhNYXhXaWRnZXRzOiBhbnkgPSB7fVxuICAgICAgZGF0YS50YWJzLmZvckVhY2goKHRhYjogYW55KT0+e1xuICAgICAgICBpZih0YWIucGlsbHNEYXRhICYmIHRhYi5waWxsc0RhdGEubGVuZ3RoKXtcbiAgICAgICAgICB0YWJXaXRoTWF4V2lkZ2V0cyA9IHRhYi5waWxsc0RhdGEucmVkdWNlKFxuICAgICAgICAgICAgKHByZXY6IGFueSwgY3VycmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghcHJldi53aWRnZXRzICYmICFjdXJyZW50LndpZGdldHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocHJldi53aWRnZXRzICYmIGN1cnJlbnQud2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiAocHJldi53aWRnZXRzLmxlbmd0aCA+IGN1cnJlbnQud2lkZ2V0cy5sZW5ndGgpID8gcHJldiA6IGN1cnJlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQud2lkZ2V0cyAmJiAhcHJldi53aWRnZXRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFjdXJyZW50LndpZGdldHMgJiYgcHJldi53aWRnZXRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgIC8vIHJldHVybiAocHJldi53aWRnZXRzICYmIGN1cnJlbnQud2lkZ2V0cyAmJiAocHJldi53aWRnZXRzLmxlbmd0aCA+IGN1cnJlbnQud2lkZ2V0cy5sZW5ndGgpICkgPyBwcmV2IDogY3VycmVudFxuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGFsaWduXG4gICAgICAgICAgICB9LCBkYXRhLnRhYnNbMF0pO1xuXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvLyBpZiB0YWJzIGhhcyBhdGxlYXN0IDEgd2lkZ2V0cyB0aGVuIHN0cmlwIHdpbGwgc2hvdyBvciBlbHNlIG5vdFxuICAgICAgcmV0dXJuIHRhYldpdGhNYXhXaWRnZXRzLndpZGdldHMgPyB0YWJXaXRoTWF4V2lkZ2V0cy53aWRnZXRzLmxlbmd0aCA6IDA7XG4gICAgfVxuICB9XG4gIGlzU3RyaXBTaG93aW5nKGRhdGE6IGFueSkge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5rZXkgPT09IHRoaXMuZW52aXJvbm1lbnQucHJvZ3JhbVN0cmlwS2V5ICYmICghZGF0YS50YWJzIHx8ICFkYXRhLnRhYnMubGVuZ3RoKSAmJlxuICAgICAgZGF0YS5zdHJpcFRpdGxlID09PSB0aGlzLmVudmlyb25tZW50LnByb2dyYW1TdHJpcE5hbWUgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGEud2lkZ2V0cy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xuICAgICAgICBpZiAoa2V5ICYmIGtleS53aWRnZXREYXRhLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLmVudmlyb25tZW50LnByb2dyYW1TdHJpcFByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgZGF0YS5zaG93U3RyaXAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5zaG93U3RyaXAgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGEua2V5JywgZGF0YSwgZGF0YS5rZXksIGRhdGEud2lkZ2V0cyk7XG4gICAgcmV0dXJuIGRhdGEuc2hvd1N0cmlwO1xuICB9XG4gIGdldCBpc01vYmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlIHx8IGZhbHNlO1xuICB9XG5cblxuXG4gIC8vIHNlYXJjaCBhcGkgd2l0aCBmYWNldHNcbiAgYXN5bmMgcG9zdFJlcXVlc3RNZXRob2Qoc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aEZhY2V0cy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICByZXF1ZXN0OiBOc0NvbnRlbnRTdHJpcFdpdGhGYWNldHMuSUNvbnRlbnRTdHJpcFVuaXRbJ3JlcXVlc3QnXSxcbiAgICBhcGlVcmw6IHN0cmluZyxcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMuY29udGVudFN2Yy5wb3N0QXBpTWV0aG9kKGFwaVVybCwgcmVxdWVzdCkuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHRzLnJlc3VsdCAmJiByZXN1bHRzLnJlc3VsdC5jb250ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBzaG93Vmlld01vcmUgPSBCb29sZWFuKFxuICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdC5jb250ZW50ICYmIHJlc3VsdHMucmVzdWx0LmNvbnRlbnQubGVuZ3RoID4gNSAmJiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB2aWV3TW9yZVVybCA9IHNob3dWaWV3TW9yZVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBwYXRoOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5wYXRoIHx8ICcnLFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICB0YWI6ICdMZWFybicsXG4gICAgICAgICAgICAgICAgICBxOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgICAgICAgIGY6IHt9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3VsdHMsIHZpZXdNb3JlVXJsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRnJvbVNlYXJjaChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoRmFjZXRzLklDb250ZW50U3RyaXBVbml0LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5yZXF1ZXN0Qm9keSkubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnBvc3RSZXF1ZXN0TWV0aG9kKHN0cmlwLCBzdHJpcC5yZXF1ZXN0LnJlcXVlc3RCb2R5LCBzdHJpcC5yZXF1ZXN0LmFwaVVybCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICAgICAgICBsZXQgdGFiSW5kZXg9MFxuICAgICAgICAgIGxldCBwaWxsSW5kZXg9IDBcbiAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0cyAmJiByZXNwb25zZS5yZXN1bHRzLnJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5tYXBBbGxEYXRhV2l0aEZhY2V0cyhzdHJpcCwgcmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuY29udGVudCwgcmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuZmFjZXRzLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpXG4gICAgICAgICAgICBjb25zdCB3aWRnZXRzID0gdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50LCBzdHJpcCk7XG4gICAgICAgICAgICBsZXQgdGFiUmVzdWx0czogYW55W10gPSBbXTtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzKSB7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzO1xuICAgICAgICAgICAgLy8gICBjb25zdCBhbGxQaWxscyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YTtcbiAgICAgICAgICAgIC8vICAgdGhpcy5yZXNldFNlbGVjdGVkUGlsbChhbGxQaWxscylcbiAgICAgICAgICAgIC8vICAgaWYgKGFsbFRhYnMgJiYgYWxsVGFicy5sZW5ndGggJiYgYWxsVGFic1t0YWJJbmRleF0pIHtcbiAgICAgICAgICAgIC8vICAgICBpZihhbGxQaWxscyAmJiBhbGxQaWxscy5sZW5ndGggJiYgYWxsUGlsbHNbcGlsbEluZGV4XSl7XG4gICAgICAgICAgICAvLyAgICAgICBhbGxQaWxsc1twaWxsSW5kZXhdID0ge1xuICAgICAgICAgICAgLy8gICAgICAgICAuLi5hbGxQaWxsc1twaWxsSW5kZXhdLFxuICAgICAgICAgICAgLy8gICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICAgLy8gICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgLy8gICAgICAgICBzZWxlY3RlZDogdHJ1ZVxuICAgICAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgYWxsVGFic1t0YWJJbmRleF0gPSB7XG4gICAgICAgICAgICAvLyAgICAgICAuLi5hbGxUYWJzW3RhYkluZGV4XSxcbiAgICAgICAgICAgIC8vICAgICAgIHdpZGdldHMsXG4gICAgICAgICAgICAvLyAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgLy8gICAgIH07XG4gICAgICAgICAgICAvLyAgICAgdGFiUmVzdWx0cyA9IGFsbFRhYnM7XG4gICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgICAgICAgLy8gICBzdHJpcCxcbiAgICAgICAgICAgIC8vICAgd2lkZ2V0cyxcbiAgICAgICAgICAgIC8vICAgJ2RvbmUnLFxuICAgICAgICAgICAgLy8gICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgICAvLyAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAgICAgICAgICAgLy8gICB0YWJSZXN1bHRzIC8vIHRhYlJlc3VsdHMgYXMgd2lkZ2V0c1xuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgXG4gICAgfVxuICB9XG5cbiAgbWFwQWxsRGF0YVdpdGhGYWNldHMoc3RyaXAgOmFueSwgY29udGVudCA6IGFueSwgZmFjZXRzOmFueSwgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhzdHJpcCwgY29udGVudClcbiAgICBjb25zdCBhbGxUYWJzID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicztcbiAgICBsZXQgZmFjZXQ6IGFueSA9IFtdXG4gICAgYWxsVGFicy5mb3JFYWNoKChlbGU6IGFueSk9PiB7XG4gICAgICBlbGVbJ2ZldGNoVGFiU3RhdHVzJ109ICdkb25lJ1xuICAgICAgbGV0IGZpbHRlcmVkRGF0YSA9ICBjb250ZW50LmZpbHRlcigoY29udEVsZTogYW55KSA9PiBjb250RWxlLm5sd1VzZXJFeHAuaW5jbHVkZXMoZWxlLnZhbHVlKSlcbiAgICAgIC8vIGZpbHRlcmVkRGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgLy8gICBmYWNldCA9ICBbLi4uZmFjZXQsLi4uXy5kaWZmZXJlbmNlKGVsZW1lbnQubmx3T3JncyAsZmFjZXQpXTtcbiAgICAgIC8vIH0pO1xuICAgICAgZWxlWyd3aWRnZXRzJ10gPSBmaWx0ZXJlZERhdGFcbiAgICAgIGVsZS5waWxsc0RhdGEuZm9yRWFjaCgocGlsbDogYW55KSA9PiB7XG4gICAgICAgIGlmKHBpbGwudmFsdWUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgcGlsbFsnd2lkZ2V0cyddID0gdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhmaWx0ZXJlZERhdGEsIHN0cmlwKTtcbiAgICAgICAgICBwaWxsWydmZXRjaFRhYlN0YXR1cyddPSAnZG9uZSdcbiAgICAgICAgfSBlbHNlIGlmKHBpbGwudmFsdWUgPT09ICdjb3Vyc2UnKSB7XG4gICAgICAgICAgbGV0IGNvbnRlbnRGaWx0ZXJlZERhdGEgPSAgZmlsdGVyZWREYXRhLmZpbHRlcigoY29udEVsZTogYW55KSA9PiBjb250RWxlLmNvdXJzZUNhdGVnb3J5LnRvTG93ZXJDYXNlKCkgPT09IHBpbGwudmFsdWUpXG4gICAgICAgICAgcGlsbFsnd2lkZ2V0cyddID0gdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb250ZW50RmlsdGVyZWREYXRhLCBzdHJpcCk7XG4gICAgICAgICAgcGlsbFsnZmV0Y2hUYWJTdGF0dXMnXT0gJ2RvbmUnXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGNvbnRlbnRGaWx0ZXJlZERhdGEgPSAgZmlsdGVyZWREYXRhLmZpbHRlcigoY29udEVsZTogYW55KSA9PiBjb250RWxlLmNvdXJzZUNhdGVnb3J5LnRvTG93ZXJDYXNlKCkgIT09ICdjb3Vyc2UnKVxuICAgICAgICAgIHBpbGxbJ3dpZGdldHMnXSA9IHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudEZpbHRlcmVkRGF0YSwgc3RyaXApO1xuICAgICAgICAgIHBpbGxbJ2ZldGNoVGFiU3RhdHVzJ109ICdkb25lJ1xuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBlbGVbJ2ZhY2V0cyddID0gW3tcbiAgICAgIC8vICAgbmFtZTonbmx3T3JncycsXG4gICAgICAvLyAgIHZhbHVlczogZmFjZXRcbiAgICAgIC8vIH1dXG4gICAgICBlbGVbJ2ZhY2V0cyddID0gZmFjZXRzXG4gICAgfSlcbiAgICBzdHJpcC50YWJzWzBdLnBpbGxzRGF0YVswXS5mZXRjaFRhYlN0YXR1cyA9ICdkb25lJztcbiAgICBzdHJpcC50YWJzWzBdLnBpbGxzRGF0YVswXS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgc3RyaXAuc2hvd09uTG9hZGVyID0gZmFsc2U7XG4gICAgdGhpcy5yZXNldFNlbGVjdGVkUGlsbChzdHJpcC50YWJzWzBdLnBpbGxzRGF0YSlcbiAgICBzdHJpcC50YWJzWzBdLnBpbGxzRGF0YVswXVsnc2VsZWN0ZWQnXT10cnVlXG4gICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgICAgIHN0cmlwLnZpZXdNb3JlVXJsLFxuICAgICAgICAgICAgICBhbGxUYWJzIC8vIHRhYlJlc3VsdHMgYXMgd2lkZ2V0c1xuICAgICAgICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoXG4gICAgY29udGVudHM6IE5zQ29udGVudC5JQ29udGVudFtdLFxuICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhGYWNldHMuSUNvbnRlbnRTdHJpcFVuaXQsXG4gICkge1xuICAgIHJldHVybiAoY29udGVudHMgfHwgW10pLm1hcCgoY29udGVudCwgaWR4KSA9PiAoXG4gICAgICBjb250ZW50ID8ge1xuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZExpYicsXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjYXJkQ29udGVudExpYicsXG4gICAgICAgIHdpZGdldEhvc3RDbGFzczogJ21iLTInLFxuICAgICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAuLi4oY29udGVudC5iYXRjaCAmJiB7IGJhdGNoOiBjb250ZW50LmJhdGNoIH0pLFxuICAgICAgICAgIGNhcmRTdWJUeXBlOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5jYXJkU3ViVHlwZSxcbiAgICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb250ZXh0OiB7IHBhZ2VTZWN0aW9uOiBzdHJpcC5rZXksIHBvc2l0aW9uOiBpZHggfSxcbiAgICAgICAgICBpbnRyYW5ldE1vZGU6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmludHJhbmV0TW9kZSxcbiAgICAgICAgICBkZWxldGVkTW9kZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuZGVsZXRlZE1vZGUsXG4gICAgICAgICAgY29udGVudFRhZ3M6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmNvbnRlbnRUYWdzLFxuICAgICAgICB9LFxuICAgICAgfSA6IHtcbiAgICAgICAgd2lkZ2V0VHlwZTogJ2NhcmQnLFxuICAgICAgICB3aWRnZXRTdWJUeXBlOiAnY2FyZENvbnRlbnQnLFxuICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6ICdtYi0yJyxcbiAgICAgICAgd2lkZ2V0RGF0YToge30sXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBnZXRvcmdEYXRhKGV2ZW50RGF0YTogYW55LCBzdHJpcE1hcDogYW55LCB0YWJJbmRleDogYW55KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnREYXRhKVxuICAgIGxldCBzZWxlY3RlZFZhbHVlID0gZXZlbnREYXRhLnRhcmdldC52YWx1ZVxuICAgIGxldCBwaWxsSW5kZXg6IGFueSA9IHRoaXMuZ2V0U2VsZWN0ZWRQaWxsSW5kZXgoc3RyaXBNYXAudGFic1t0YWJJbmRleF0sIHRhYkluZGV4KVxuICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdKSB7XG4gICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdpbnByb2dyZXNzJztcbiAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLnRhYkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHN0cmlwTWFwLnNob3dPbkxvYWRlciA9IHRydWU7XG4gICAgICBsZXQgcmV0dXJuZWRWYWx1ZXMgPSBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS53aWRnZXRzLmZpbHRlcigoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgdmFyIHdvcmRzID0gZWxlLm5sd09yZ3MubWFwKHYgPT4gdi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuIHdvcmRzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpXG4gICAgICB9KVxuICAgICAgc3RyaXBNYXAudGFic1t0YWJJbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF1bJ3dpZGdldHMnXSA9IHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMocmV0dXJuZWRWYWx1ZXMsIHN0cmlwTWFwKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkluZGV4XSkge1xuICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdkb25lJztcbiAgICAgICAgc3RyaXBNYXAudGFic1t0YWJJbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBzdHJpcE1hcC5zaG93T25Mb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkUGlsbChzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGEpXG4gICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdWydzZWxlY3RlZCddPXRydWVcbiAgICAgIH1cbiAgICB9LCAgICAgICAgIDIwMCk7XG4gIH1cblxuICByZXNldEZpbHRlcihzdHJpcE1hcDogYW55LCAgdGFiSW5kZXg6IGFueSwgcGlsbEluZGV4OiBhbnkpIHtcbiAgICAvLyBsZXQgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50RGF0YS50YXJnZXQudmFsdWVcbiAgICBpZihwaWxsSW5kZXgpIHtcbiAgICAgcGlsbEluZGV4ID0gdGhpcy5nZXRTZWxlY3RlZFBpbGxJbmRleChzdHJpcE1hcC50YWJzW3RhYkluZGV4XSwgdGFiSW5kZXgpXG4gICAgfVxuICAgIHRoaXMuZmFjZXRGb3JtLnJlc2V0KHtcbiAgICAgIG9yZzogMFxuICAgICB9KTtcbiAgICBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkluZGV4XSkge1xuICAgICAgc3RyaXBNYXAudGFic1t0YWJJbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF0uZmV0Y2hUYWJTdGF0dXMgPSAnaW5wcm9ncmVzcyc7XG4gICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICBzdHJpcE1hcC5zaG93T25Mb2FkZXIgPSB0cnVlO1xuICAgICAgLy8gbGV0IHJldHVybmVkVmFsdWVzID0gc3RyaXBNYXAudGFic1t0YWJJbmRleF0ud2lkZ2V0cy5maWx0ZXIoKGVsZTogYW55KSA9PiB7XG4gICAgICAvLyAgIHZhciB3b3JkcyA9IGVsZS5ubHdPcmdzLm1hcCh2ID0+IHYudG9Mb3dlckNhc2UoKSk7XG4gICAgICAvLyAgIHJldHVybiB3b3Jkcy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKVxuICAgICAgLy8gfSlcbiAgICAgIGxldCBjb250ZW50RGF0YTogYW55ID0gc3RyaXBNYXAudGFic1t0YWJJbmRleF0ud2lkZ2V0cyB8fCBbXVxuICAgICAgc3RyaXBNYXAudGFic1t0YWJJbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF1bJ3dpZGdldHMnXSA9IHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudERhdGEsIHN0cmlwTWFwKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkluZGV4XSkge1xuICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdkb25lJztcbiAgICAgICAgc3RyaXBNYXAudGFic1t0YWJJbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBzdHJpcE1hcC5zaG93T25Mb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkUGlsbChzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGEpXG4gICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdWydzZWxlY3RlZCddPXRydWVcbiAgICAgIH1cbiAgICB9LCAgICAgICAgIDIwMCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudEF2YWlsYWJsZTsgZWxzZSBvdGhlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI290aGVyVGVtcGxhdGU+XG4gIDwhLS0gPGRpdiAqbmdJZj1cInNob3dQYXJlbnRMb2FkZXJcIiBjbGFzcz1cInRleHQtY2VudGVyIG15LTJcIj5cbiAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJpbmxpbmUtYmxvY2tcIj48L21hdC1zcGlubmVyPlxuICA8L2Rpdj4gLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UGFyZW50RXJyb3JcIiBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cIndpZGdldERhdGEuZXJyb3JXaWRnZXRcIj48L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dQYXJlbnROb0RhdGFcIiBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cIndpZGdldERhdGEubm9EYXRhV2lkZ2V0XCI+PC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBzdHJpcHNLZXlPcmRlcjsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogaWRlbnRpZnlcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdHJpcFNob3dpbmcoc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldKVwiPlxuICAgICAgPGEgbmFtZT1cInt7c3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcFRpdGxlfX1cIiBbY2xhc3NdPVwia2V5XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdHJpcHNSZXN1bHREYXRhTWFwICYmIChnZXRMZW5ndGgoc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldKSB8fFxuICAgICAgICAgICAgICAgICAgICBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNob3dPbk5vRGF0YSB8fFxuICAgICAgICAgICAgICAgICAgICBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNob3dPbkxvYWRlciB8fFxuICAgICAgICAgICAgICAgICAgICBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNob3dPbkVycm9yKVxuICAgICAgICAgICAgICAgICAgXCIgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICF3aWRnZXREYXRhPy5pc0NoYW5uZWxTdHJpcCA/ICd4czpweC04IHN4OnB4LTEwc3MnIDogaSA+IDAgPyAnbXQtMTInIDogJydcbiAgICAgICAgICAgICAgICAgIFwiIFtpZF09XCJrZXlcIiBbbmdDbGFzc109XCIhd2lkZ2V0RGF0YT8uaXNDaGFubmVsU3RyaXAgPyAnbWFyZ2luLWJvdHRvbS1jdXN0b20nIDogJ21hcmdpbi1ib3R0b20teHMnXCI+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7IHBhZDogc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcEJhY2tncm91bmQgfVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcEJhY2tncm91bmQgfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcGwtNCBwci00IG1kOnByLTAgbWQ6cGwtMCBcIiBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICF3aWRnZXREYXRhPy5pc0NoYW5uZWxTdHJpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcFRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ21iLTgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBtYXJnaW4tcmVtb3ZlIGlubGluZS1ibG9jayBcIiAqbmdJZj1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc3RyaXBUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXBpdGFsaXplXCIgKm5nSWY9XCJzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LmRpc2FibGVUcmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3tzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnN0cmlwVGl0bGV9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5kaXNhYmxlVHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyhzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnN0cmlwVGl0bGUsICdob21lJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcEluZm8/Lmljb25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSW5mbyhzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0pXCIgaTE4bi1tYXRUb29sdGlwIG1hdFRvb2x0aXA9XCJpbmZvXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWxlZnQteHNcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57eyBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnN0cmlwSW5mbz8uaWNvbi5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc3RyaXBUaXRsZUxpbms/LmxpbmtcIlxuICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwic3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcFRpdGxlTGluaz8ubGlua1wiXG4gICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwic3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcFRpdGxlTGluaz8ubGluaz8ucXVlcnlQYXJhbXNcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXByaW1hcnktdGV4dCB3cy1tYXQtZGVmYXVsdC10ZXh0XCIgW2NvbG9yXT1cIidhY2NlbnQnXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zdHJpcFRpdGxlTGluaz8uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3BhY2VyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwhLS0gdmlld0FsbCBzdGFydC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGVja0NvbmRpdGlvbih3aWRnZXREYXRhICwgc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldKVwiIGNsYXNzPVwiYmxvY2sgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTQgcGwtMiB2aWV3LW1vcmUgd3MtbWF0LWRlZmF1bHQtdGV4dCAgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCB3cy1tYXQtZGVmYXVsdC10ZXh0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYXQtYm9keS0xIGN1cnNvci1wb2ludGVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5KHN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XSk7cmVkaXJlY3RWaWV3QWxsKHN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XSwgc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy52aWV3TW9yZVVybD8ucGF0aCwgc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy52aWV3TW9yZVVybD8ucXVlcnlQYXJhbXMgKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGkxOG4gY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0XCI+e3t0cmFuc2xhdGVMYWJlbHMod2lkZ2V0RGF0YS5zdHJpcHNbMF0udmlld01vcmVVcmwudmlld01vcmVUZXh0LCdob21lJykgIHx8ICdTZWUgYWxsJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgbWF0LWljb24gbm90cmFuc2xhdGUgbWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tbm8tY29sb3JcIiBjb2xvcj1cImFjY2VudFwiPm5hdmlnYXRlX25leHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIHZpZXdBbGwgZW5kLS0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2V0SGlkZGVuRm9yU3RyaXAoa2V5KVwiICpuZ0lmPVwic3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5jYW5IaWRlU3RyaXBcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8ubW9kZSA9PT0gJ2FjY29yZGlvbicgJiYgaXNNb2JpbGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93QWNjb3JkaW9uRGF0YSA9ICFzaG93QWNjb3JkaW9uRGF0YVwiPnt7IHNob3dBY2NvcmRpb25EYXRhID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiICpuZ0lmPVwiY2hlY2tWaXNpYmxlKHN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XSlcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cImdldGRhdGEoc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldKVwiPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc2hvd09uTm9EYXRhXCJcbiAgICAgICAgICAgICAgW3NiVWlSZXNvbHZlcldpZGdldF09XCJzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/Lm5vRGF0YVdpZGdldFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc2hvd09uRXJyb3JcIlxuICAgICAgICAgICAgICBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uZXJyb3JXaWRnZXRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gSUYgbm8gZXJyb3JzIHRoZW4gcHJvY2VlZCB0byBzaG93IHRhYnMgb3Igbm9uIHRhYnMgc3RyaXAgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc2hvd09uTm9EYXRhICYmICFzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNob3dPbkVycm9yXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0udGFicyAmJiBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0udGFicy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBhbmltYXRpb25EdXJhdGlvbj1cIjBtc1wiIFtzZWxlY3RlZEluZGV4XT1cImdldFNlbGVjdGVkSW5kZXgoc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLCBrZXkpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC10YWItbGFiZWxzIHctZnVsbCBzdHJpcHMtdGFiZ3JvdXBcIiBkeW5hbWljSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRUYWJDaGFuZ2UpPVwidGFiQ2xpY2tlZCgkZXZlbnQsIDAsIHN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XSwga2V5KVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJ7e3RhYj8ubGFiZWx9fVwiICpuZ0Zvcj1cImxldCB0YWIgb2Ygc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLnRhYnM7IGxldCBsYXN0ID0gbGFzdDtsZXQgdGFiSW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48c3BhbiAqbmdJZj1cIiF0YWI/LmRpc2FibGVUcmFuc2xhdGVcIj57eyB0cmFuc2xhdGVMYWJlbHModGFiPy5sYWJlbCwgJ2hvbWUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi1oaWdobGlnaHRcIiAqbmdJZj1cInRhYj8uZGlzYWJsZVRyYW5zbGF0ZVwiPnt7dGFiPy5sYWJlbH19PC9zcGFuPiAmbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YWI/LnNob3dUYWJEYXRhQ291bnQgJiYgdGFiPy53aWRnZXRzPy5sZW5ndGhcIj4oe3t0YWI/LndpZGdldHM/Lmxlbmd0aH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Z1bGxcIiAqbmdJZj1cInRhYj8ucGlsbHNEYXRhICYmIHRhYj8ucGlsbHNEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbS1jZW50ZXIgZmxleC13cmFwIGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZhY2V0IG9mIHRhYj8uZmFjZXRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmYWNldEZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFjZXRzLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJvcmdcIiAoY2hhbmdlKT1cImdldG9yZ0RhdGEoJGV2ZW50LCAgc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLCB0YWJJbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjBcIiBzZWxlY3RlZCBkaXNhYmxlZD5DaG9vc2UgYnkgb3JnYW5pc2F0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7e2QubmFtZX19XCIgKm5nRm9yPVwibGV0IGQgb2YgZmFjZXQudmFsdWVzXCIgPnt7ZC5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCAgY2xhc3M9XCJjb250ZW50LXBpbGwtZGF0YVwiIGFyaWEtbGFiZWw9XCJGaXNoIHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwaWxsIG9mIHRhYj8ucGlsbHNEYXRhO2xldCBwID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBbc2VsZWN0ZWRdPVwicGlsbD8uc2VsZWN0ZWRcIiAoY2xpY2spPVwicGlsbENsaWNrZWQoJGV2ZW50LCBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0sIGtleSwgcCwgdGFiSW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlsbC1uYW1lXCI+e3twaWxsPy5sYWJlbH19PC9zcGFuPjwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHZpZXdBbGwgc3RhcnQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LmhpZGVWaWV3TW9yZVVybCAmJiBjaGVja0NvbmRpdGlvbih3aWRnZXREYXRhICwgc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldKVwiIGNsYXNzPVwiIGhpZGRlbiBtZDpibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwibWwtNCBwbC0yIHZpZXctbW9yZSB3cy1tYXQtZGVmYXVsdC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggd3MtbWF0LWRlZmF1bHQtdGV4dCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWF0LWJvZHktMSBjdXJzb3ItcG9pbnRlclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnkoc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldKTtyZWRpcmVjdFZpZXdBbGwoc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLCBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnZpZXdNb3JlVXJsPy5wYXRoLCBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnZpZXdNb3JlVXJsPy5xdWVyeVBhcmFtcyApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGkxOG4gY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0XCI+e3t0cmFuc2xhdGVMYWJlbHMod2lkZ2V0RGF0YS5zdHJpcHNbMF0udmlld01vcmVVcmwudmlld01vcmVUZXh0LCdob21lJykgIHx8ICdTZWUgYWxsJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yXCIgY29sb3I9XCJhY2NlbnRcIj5uYXZpZ2F0ZV9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdmlld0FsbCBlbmQtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3RyaXBzUmVzdWx0RGF0YU1hcCAmJiBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNob3dPbkxvYWRlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICF0YWI/LnBpbGxzRGF0YVtnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWIgLHRhYkluZGV4KV0/LmZldGNoVGFiU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2ItdWljLWhvcml6b250YWwtc2Nyb2xsZXItdjIgW3NsaWRlckNvbmZpZ109XCJzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNsaWRlckNvbmZpZ1wiIFtpZF09XCJrZXkrJy1zY3JvbGxlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvYWRTdGF0dXNdPVwiJ2ZldGNoaW5nJ1wiIFtzdHJpcENvbmZpZ109XCJzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnN0cmlwQ29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZGdldCBvZiBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LmxvYWRlcldpZGdldHM7IHRyYWNrQnk6IHRyYWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cIndpZGdldFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zYi11aWMtaG9yaXpvbnRhbC1zY3JvbGxlci12Mj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWI/LnBpbGxzRGF0YSAmJiB0YWI/LnBpbGxzRGF0YS5sZW5ndGggJiYgdGFiPy5waWxsc0RhdGFbZ2V0U2VsZWN0ZWRQaWxsSW5kZXgodGFiICx0YWJJbmRleCldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIigodGFiPy5waWxsc0RhdGFbZ2V0U2VsZWN0ZWRQaWxsSW5kZXgodGFiICx0YWJJbmRleCldPy5mZXRjaFRhYlN0YXR1cyAmJiB0YWI/LnBpbGxzRGF0YVtnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWIgLHRhYkluZGV4KV0/LmZldGNoVGFiU3RhdHVzID09PSAnZG9uZScpICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCF0YWI/LnBpbGxzRGF0YVtnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWIgLHRhYkluZGV4KV0/LndpZGdldHMgfHwgIXRhYj8ucGlsbHNEYXRhW2dldFNlbGVjdGVkUGlsbEluZGV4KHRhYiAsdGFiSW5kZXgpXT8ud2lkZ2V0cz8ubGVuZ3RoKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFiPy5waWxsc0RhdGFbZ2V0U2VsZWN0ZWRQaWxsSW5kZXgodGFiICx0YWJJbmRleCldPy52YWx1ZSA9PT0gJ2lucHJvZ3Jlc3MnOyBlbHNlIG1zZ1RlbXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBhbHQ9XCJcIiBjbGFzcz1cIm10LTQgbWItNFwiIHNyYz1cImFzc2V0cy9pY29ucy9ob21lL25vZGF0YURlZmF1bHQuc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIHRleHQtY2VudGVyIGluZm8tY29udGVudFwiPnt7ICdjb250ZW50c3RyaXBtdWx0aXBsZS5nZXRSZWFkeUZvckxlYXJuaW5nQWR2ZW50dXJlJyB8IHRyYW5zbGF0ZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjbGljay1oZXJlXCIgW3JvdXRlckxpbmtdPVwiJy9wYWdlL2xlYXJuJ1wiPnt7ICdjb250ZW50c3RyaXBtdWx0aXBsZS5jbGlja0hlcmUnIHwgdHJhbnNsYXRlIH19PC9hPiB7eyAnY29udGVudHN0cmlwbXVsdGlwbGUudG9FbnJvbGxOZXh0Q291cnNlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtc2dUZW1wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGFsdD1cIlwiIGNsYXNzPVwibXQtNCBtYi00XCIgc3JjPVwiYXNzZXRzL2ljb25zL2hvbWUvbm9kYXRhRGVmYXVsdC5wbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgdGV4dC1jZW50ZXJcIj57eyB0cmFuc2xhdGVMYWJlbHModGFiPy5waWxsc0RhdGFbZ2V0U2VsZWN0ZWRQaWxsSW5kZXgodGFiICx0YWJJbmRleCldPy5ub2RhdGFNc2csICdob21lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRhYj8ucGlsbHNEYXRhW2dldFNlbGVjdGVkUGlsbEluZGV4KHRhYiAsdGFiSW5kZXgpXT8uZmV0Y2hUYWJTdGF0dXMgPT09ICdkb25lJyB8fCB0YWI/LnBpbGxzRGF0YVtnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWIgLHRhYkluZGV4KV0/LndpZGdldHM/Lmxlbmd0aClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgICpuZ0lmPVwiIXRhYj8ucGlsbHNEYXRhW2dldFNlbGVjdGVkUGlsbEluZGV4KHRhYiAsdGFiSW5kZXgpXT8udGFiTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2ItdWljLWhvcml6b250YWwtc2Nyb2xsZXItdjIgW2lkXT1cImtleSsnLXNjcm9sbGVyJ1wiIFtzbGlkZXJDb25maWddPVwic3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldPy5zbGlkZXJDb25maWdcIiBbd2lkZ2V0c0xlbmd0aF09XCJ0YWI/LnBpbGxzRGF0YVtnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWIgLHRhYkluZGV4KV0/LndpZGdldHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvYWRTdGF0dXNdPVwiJ2RvbmUnXCIgW2RlZmF1bHRNYXhXaWRnZXRzXT1cInRhYj8ucGlsbHNEYXRhW2dldFNlbGVjdGVkUGlsbEluZGV4KHRhYiAsdGFiSW5kZXgpXT8ubWF4V2lkZ2V0cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc2xpZGVyQ29uZmlnPy5tYXhXaWRnZXRzIHx8IGRlZmF1bHRNYXhXaWRnZXRzXCIgW3N0cmlwQ29uZmlnXT1cInN0cmlwc1Jlc3VsdERhdGFNYXBba2V5XT8uc3RyaXBDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWRnZXQgb2YgdGFiPy5waWxsc0RhdGFbZ2V0U2VsZWN0ZWRQaWxsSW5kZXgodGFiICx0YWJJbmRleCldPy53aWRnZXRzfCBzbGljZTowOih0YWI/LnBpbGxzRGF0YVtnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWIgLHRhYkluZGV4KV0/Lm1heFdpZGdldHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcHNSZXN1bHREYXRhTWFwW2tleV0/LnNsaWRlckNvbmZpZz8ubWF4V2lkZ2V0cyB8fCBkZWZhdWx0TWF4V2lkZ2V0cyk7IHRyYWNrQnk6IHRyYWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cIndpZGdldFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NiLXVpYy1ob3Jpem9udGFsLXNjcm9sbGVyLXYyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2E+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPiJdfQ==