@sunbird-cb/toc 0.0.1-mauritius

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 (346) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -0
  4. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -0
  5. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -0
  6. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -0
  7. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -0
  8. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -0
  9. package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
  10. package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
  11. package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
  12. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +221 -0
  13. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +96 -0
  14. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -0
  15. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -0
  16. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -0
  17. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -0
  18. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -0
  19. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -0
  20. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -0
  21. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -0
  22. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -0
  23. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -0
  24. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -0
  25. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -0
  26. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -0
  27. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -0
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +961 -0
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -0
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -0
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -0
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +304 -0
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1229 -0
  34. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -0
  35. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -0
  36. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -0
  37. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -0
  38. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -0
  39. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -0
  40. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -0
  41. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +833 -0
  42. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +224 -0
  43. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +212 -0
  44. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -0
  45. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -0
  46. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -0
  47. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -0
  48. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -0
  49. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -0
  50. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -0
  51. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -0
  52. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -0
  53. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -0
  54. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -0
  55. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -0
  56. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -0
  57. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -0
  58. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -0
  59. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -0
  60. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -0
  61. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -0
  62. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -0
  63. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -0
  64. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -0
  65. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -0
  66. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -0
  67. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -0
  68. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -0
  69. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -0
  70. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -0
  71. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -0
  72. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -0
  73. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -0
  74. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -0
  75. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -0
  76. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -0
  77. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -0
  78. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -0
  79. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -0
  80. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -0
  81. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -0
  82. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -0
  83. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -0
  84. package/esm2022/lib/_collection-api.mjs +57 -0
  85. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -0
  86. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -0
  87. package/esm2022/lib/_models/common.model.mjs +2 -0
  88. package/esm2022/lib/_models/error.model.mjs +2 -0
  89. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -0
  90. package/esm2022/lib/_services/rating.service.mjs +89 -0
  91. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -0
  92. package/esm2022/lib/_services/viewer-route-util.mjs +103 -0
  93. package/esm2022/lib/_services/widget-content.model.mjs +254 -0
  94. package/esm2022/lib/_services/widget-content.service.mjs +594 -0
  95. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -0
  96. package/esm2022/lib/app-toc-lib.module.mjs +503 -0
  97. package/esm2022/lib/collection.config.mjs +161 -0
  98. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -0
  99. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -0
  100. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +505 -0
  101. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -0
  102. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -0
  103. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -0
  104. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -0
  105. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -0
  106. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2230 -0
  107. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +3001 -0
  108. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -0
  109. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -0
  110. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -0
  111. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -0
  112. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -0
  113. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -0
  114. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -0
  115. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -0
  116. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -0
  117. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -0
  118. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -0
  119. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +258 -0
  120. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -0
  121. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -0
  122. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -0
  123. package/esm2022/lib/models/app-toc.model.mjs +38 -0
  124. package/esm2022/lib/models/auto-complete.model.mjs +2 -0
  125. package/esm2022/lib/models/card-content.model.mjs +13 -0
  126. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -0
  127. package/esm2022/lib/models/discussion-forum.model.mjs +14 -0
  128. package/esm2022/lib/models/goal.model.mjs +2 -0
  129. package/esm2022/lib/models/meta-tag.model.mjs +8 -0
  130. package/esm2022/lib/models/playlist.model.mjs +2 -0
  131. package/esm2022/lib/models/profile-revamp.model.mjs +2 -0
  132. package/esm2022/lib/models/rating.model.mjs +2 -0
  133. package/esm2022/lib/models/user-profile.model.mjs +21 -0
  134. package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
  135. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -0
  136. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -0
  137. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -0
  138. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -0
  139. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -0
  140. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -0
  141. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -0
  142. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -0
  143. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -0
  144. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -0
  145. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -0
  146. package/esm2022/lib/services/access-control.service.mjs +56 -0
  147. package/esm2022/lib/services/action.service.mjs +23 -0
  148. package/esm2022/lib/services/app-toc-v2.service.mjs +368 -0
  149. package/esm2022/lib/services/app-toc.service.mjs +1577 -0
  150. package/esm2022/lib/services/certificate.service.mjs +114 -0
  151. package/esm2022/lib/services/discuss-utils.service.mjs +58 -0
  152. package/esm2022/lib/services/editor.service.mjs +34 -0
  153. package/esm2022/lib/services/load-check.service.mjs +21 -0
  154. package/esm2022/lib/services/loader.service.mjs +33 -0
  155. package/esm2022/lib/services/mobile-apps.service.mjs +67 -0
  156. package/esm2022/lib/services/netcore.service.mjs +56 -0
  157. package/esm2022/lib/services/nps-grid.service.mjs +31 -0
  158. package/esm2022/lib/services/otp.service.mjs +43 -0
  159. package/esm2022/lib/services/profile-v2.service.mjs +43 -0
  160. package/esm2022/lib/services/reset-ratings.service.mjs +19 -0
  161. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -0
  162. package/esm2022/lib/services/root.service.mjs +106 -0
  163. package/esm2022/lib/services/timer.service.mjs +23 -0
  164. package/esm2022/lib/services/title-tag.service.mjs +71 -0
  165. package/esm2022/lib/services/user-profile.service.mjs +55 -0
  166. package/esm2022/lib/services/viewer-data.service.mjs +64 -0
  167. package/esm2022/lib/services/viewer-util.service.mjs +627 -0
  168. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -0
  169. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -0
  170. package/esm2022/public-api.mjs +80 -0
  171. package/esm2022/sunbird-cb-toc.mjs +5 -0
  172. package/fesm2022/sunbird-cb-toc.mjs +27111 -0
  173. package/fesm2022/sunbird-cb-toc.mjs.map +1 -0
  174. package/index.d.ts +5 -0
  175. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
  176. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
  177. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -0
  178. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -0
  179. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -0
  180. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -0
  181. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -0
  182. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -0
  183. package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
  184. package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
  185. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
  186. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +30 -0
  187. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -0
  188. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -0
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -0
  190. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -0
  191. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -0
  192. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -0
  193. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -0
  194. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -0
  195. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -0
  196. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -0
  197. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -0
  198. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -0
  199. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -0
  200. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -0
  201. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -0
  202. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +187 -0
  203. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -0
  204. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -0
  205. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -0
  206. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +56 -0
  207. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +195 -0
  208. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -0
  209. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -0
  210. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -0
  211. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -0
  212. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -0
  213. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -0
  214. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -0
  215. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +131 -0
  216. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -0
  217. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -0
  218. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -0
  219. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -0
  220. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -0
  221. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -0
  222. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -0
  223. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -0
  224. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -0
  225. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -0
  226. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -0
  227. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -0
  228. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -0
  229. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -0
  230. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -0
  231. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -0
  232. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -0
  233. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -0
  234. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -0
  235. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -0
  236. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -0
  237. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -0
  238. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -0
  239. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -0
  240. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -0
  241. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -0
  242. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -0
  243. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -0
  244. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -0
  245. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -0
  246. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -0
  247. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -0
  248. package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -0
  249. package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -0
  250. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -0
  251. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -0
  252. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -0
  253. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -0
  254. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -0
  255. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -0
  256. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -0
  257. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -0
  258. package/lib/_collection-api.d.ts +34 -0
  259. package/lib/_constants/widget-content.constants.d.ts +7 -0
  260. package/lib/_directives/tooltip.directive.d.ts +17 -0
  261. package/lib/_models/common.model.d.ts +3 -0
  262. package/lib/_models/error.model.d.ts +5 -0
  263. package/lib/_pipes/highlight.pipe.d.ts +10 -0
  264. package/lib/_services/rating.service.d.ts +18 -0
  265. package/lib/_services/samuhik-charcha.service.d.ts +13 -0
  266. package/lib/_services/viewer-route-util.d.ts +8 -0
  267. package/lib/_services/widget-content.model.d.ts +521 -0
  268. package/lib/_services/widget-content.service.d.ts +101 -0
  269. package/lib/_shared/translate-loader.factory.d.ts +7 -0
  270. package/lib/app-toc-lib.module.d.ts +89 -0
  271. package/lib/collection.config.d.ts +159 -0
  272. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -0
  273. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -0
  274. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +82 -0
  275. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -0
  276. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -0
  277. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -0
  278. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -0
  279. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -0
  280. package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -0
  281. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +417 -0
  282. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -0
  283. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -0
  284. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -0
  285. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -0
  286. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -0
  287. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -0
  288. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -0
  289. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -0
  290. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -0
  291. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -0
  292. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -0
  293. package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -0
  294. package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -0
  295. package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -0
  296. package/lib/models/app-toc-analytics.model.d.ts +152 -0
  297. package/lib/models/app-toc.model.d.ts +84 -0
  298. package/lib/models/auto-complete.model.d.ts +27 -0
  299. package/lib/models/card-content.model.d.ts +19 -0
  300. package/lib/models/content-strip-with-tabs.model.d.ts +44 -0
  301. package/lib/models/discussion-forum.model.d.ts +40 -0
  302. package/lib/models/goal.model.d.ts +22 -0
  303. package/lib/models/meta-tag.model.d.ts +6 -0
  304. package/lib/models/playlist.model.d.ts +23 -0
  305. package/lib/models/profile-revamp.model.d.ts +14 -0
  306. package/lib/models/rating.model.d.ts +17 -0
  307. package/lib/models/user-profile.model.d.ts +37 -0
  308. package/lib/registration-toc-lib.config.d.ts +4 -0
  309. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -0
  310. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -0
  311. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -0
  312. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -0
  313. package/lib/resolvers/app-toc-resolver.service.d.ts +16 -0
  314. package/lib/resolvers/config-resolver.service.d.ts +11 -0
  315. package/lib/resolvers/profile-resolver.service.d.ts +11 -0
  316. package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -0
  317. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -0
  318. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -0
  319. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -0
  320. package/lib/services/access-control.service.d.ts +29 -0
  321. package/lib/services/action.service.d.ts +9 -0
  322. package/lib/services/app-toc-v2.service.d.ts +17 -0
  323. package/lib/services/app-toc.service.d.ts +190 -0
  324. package/lib/services/certificate.service.d.ts +41 -0
  325. package/lib/services/discuss-utils.service.d.ts +33 -0
  326. package/lib/services/editor.service.d.ts +17 -0
  327. package/lib/services/load-check.service.d.ts +8 -0
  328. package/lib/services/loader.service.d.ts +16 -0
  329. package/lib/services/mobile-apps.service.d.ts +38 -0
  330. package/lib/services/netcore.service.d.ts +33 -0
  331. package/lib/services/nps-grid.service.d.ts +15 -0
  332. package/lib/services/otp.service.d.ts +20 -0
  333. package/lib/services/profile-v2.service.d.ts +20 -0
  334. package/lib/services/reset-ratings.service.d.ts +8 -0
  335. package/lib/services/resource-download-helper.service.d.ts +29 -0
  336. package/lib/services/root.service.d.ts +26 -0
  337. package/lib/services/timer.service.d.ts +9 -0
  338. package/lib/services/title-tag.service.d.ts +21 -0
  339. package/lib/services/user-profile.service.d.ts +24 -0
  340. package/lib/services/viewer-data.service.d.ts +62 -0
  341. package/lib/services/viewer-util.service.d.ts +76 -0
  342. package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -0
  343. package/lib/share-toc/share-toc.module.d.ts +32 -0
  344. package/package.json +34 -0
  345. package/public-api.d.ts +64 -0
  346. package/sunbird-cb-toc-0.0.1-mauritius.tgz +0 -0
@@ -0,0 +1,3001 @@
1
+ import { Component, HostListener, ViewChild, ViewEncapsulation, Input, Inject, } from '@angular/core';
2
+ import { NavigationEnd } from '@angular/router';
3
+ import { UntypedFormControl, Validators } from '@angular/forms';
4
+ import { Subject, of, from } from 'rxjs';
5
+ import { catchError, share, switchMap, takeUntil } from 'rxjs/operators';
6
+ import dayjs from 'dayjs';
7
+ // tslint:disable-next-line
8
+ import _ from 'lodash';
9
+ import moment from 'moment';
10
+ import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
11
+ import { NsContent } from '../../_services/widget-content.model';
12
+ import { viewerRouteGenerator } from '../../_services/viewer-route-util';
13
+ import { WsEvents, } from '@sunbird-cb/utils-v2';
14
+ import { ConfirmationDialogComponent, TOCMultiLingualDialogComponent } from '@sunbird-cb/consumption';
15
+ import { NsAppToc } from '../../models/app-toc.model';
16
+ import { AppTocDialogIntroVideoComponent } from '../app-toc-dialog-intro-video/app-toc-dialog-intro-video.component';
17
+ import { ContentRatingV2DialogComponent } from '../../_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component';
18
+ import { EnrollLanguageDialogueComponent } from '../enroll-language-dialogue/enroll-language-dialogue.component';
19
+ import { CompletionSurveyFormComponent } from '../completion-survey-form/completion-survey-form.component';
20
+ import { PublicSurveyFormComponent } from '../public-survey-form/public-survey-form.component';
21
+ import { NsCardContent } from '../../models/card-content.model';
22
+ import { NonReleventFeedbackDialogComponent } from '../non-relevent-feedback-dialog/non-relevent-feedback-dialog.component';
23
+ import * as i0 from "@angular/core";
24
+ import * as i1 from "@angular/router";
25
+ import * as i2 from "../../_services/widget-content.service";
26
+ import * as i3 from "../../services/app-toc.service";
27
+ import * as i4 from "@sunbird-cb/utils-v2";
28
+ import * as i5 from "@angular/platform-browser";
29
+ import * as i6 from "@angular/material/legacy-snack-bar";
30
+ import * as i7 from "@angular/material/legacy-dialog";
31
+ import * as i8 from "../../services/mobile-apps.service";
32
+ import * as i9 from "@sunbird-cb/consumption";
33
+ import * as i10 from "../../services/action.service";
34
+ import * as i11 from "../../services/viewer-util.service";
35
+ import * as i12 from "../../_services/rating.service";
36
+ import * as i13 from "@ngx-translate/core";
37
+ import * as i14 from "../../services/load-check.service";
38
+ import * as i15 from "../../_collection/_common/content-toc/content-services/handle-claim.service";
39
+ import * as i16 from "../../services/reset-ratings.service";
40
+ import * as i17 from "../../services/timer.service";
41
+ import * as i18 from "@angular/material/snack-bar";
42
+ import * as i19 from "../../services/netcore.service";
43
+ import * as i20 from "../../services/app-toc-v2.service";
44
+ import * as i21 from "@angular/common";
45
+ import * as i22 from "@angular/material/icon";
46
+ import * as i23 from "@angular/material/legacy-button";
47
+ import * as i24 from "@angular/material/legacy-menu";
48
+ import * as i25 from "@angular/material/legacy-chips";
49
+ import * as i26 from "@angular/material/legacy-radio";
50
+ import * as i27 from "../../_collection/_common/skeleton-loader/skeleton-loader.component";
51
+ import * as i28 from "../../_collection/_common/content-progress/content-progress.component";
52
+ import * as i29 from "../../_collection/_common/avatar-photo/avatar-photo.component";
53
+ import * as i30 from "../../_collection/_common/content-toc/content-toc.component";
54
+ import * as i31 from "../../share-toc/share-toc/share-toc.component";
55
+ import * as i32 from "../../_collection/_common/toc-kpi-values/toc-kpi-values.component";
56
+ import * as i33 from "../../_collection/_common/content-toc/karma-points/karma-points.component";
57
+ import * as i34 from "../../_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component";
58
+ import * as i35 from "../app-toc-banner/app-toc-banner.component";
59
+ dayjs.extend(isSameOrBefore);
60
+ export var ErrorType;
61
+ (function (ErrorType) {
62
+ ErrorType["internalServer"] = "internalServer";
63
+ ErrorType["serviceUnavailable"] = "serviceUnavailable";
64
+ ErrorType["somethingWrong"] = "somethingWrong";
65
+ })(ErrorType || (ErrorType = {}));
66
+ const flattenItems = (items, key) => {
67
+ return items.reduce((flattenedItems, item) => {
68
+ flattenedItems.push(item);
69
+ if (Array.isArray(item[key])) {
70
+ // tslint:disable-next-line
71
+ flattenedItems = flattenedItems.concat(flattenItems(item[key], key));
72
+ }
73
+ return flattenedItems;
74
+ // tslint:disable-next-line
75
+ }, []);
76
+ };
77
+ const SNACKBAR_DURATION = 3000;
78
+ export class AppTocHomeV2Component {
79
+ handleScroll() {
80
+ const windowScroll = window.pageYOffset;
81
+ if (windowScroll >= this.elementPosition - 100) {
82
+ this.sticky = true;
83
+ }
84
+ else {
85
+ this.sticky = false;
86
+ }
87
+ if (this.scrollLimit) {
88
+ if ((window.scrollY + this.rcElem.BottomPos) >= this.scrollLimit) {
89
+ this.rcElement.nativeElement.style.position = 'sticky';
90
+ }
91
+ else {
92
+ if (this.rcElement) {
93
+ this.rcElement.nativeElement.style.position = 'fixed';
94
+ }
95
+ }
96
+ }
97
+ // 236... (OffsetTop of right container + 104)
98
+ if (window.scrollY > (this.rcElem.offSetTop + 104)) {
99
+ this.scrolled = true;
100
+ }
101
+ else {
102
+ this.scrolled = false;
103
+ }
104
+ }
105
+ constructor(route, router, contentSvc, tocSvc, loggerSvc, configSvc, domSanitizer, snackBar, dialog, mobileAppsSvc, utilitySvc,
106
+ // private progressSvc: ContentProgressService,
107
+ contentLangSvc, actionSVC, viewerSvc, ratingSvc, telemetryService, translate, langtranslations, events,
108
+ // private matSnackBar: MatSnackBar,
109
+ loadCheckService, handleClaimService, resetRatingsService, timerService, enrollSvc, contentLibSvc, dataTransferSvc, matSnackbarNew, userServiceLib, netCoreService, appTocV2Svc, location, domainConfSvc, environment) {
110
+ this.route = route;
111
+ this.router = router;
112
+ this.contentSvc = contentSvc;
113
+ this.tocSvc = tocSvc;
114
+ this.loggerSvc = loggerSvc;
115
+ this.configSvc = configSvc;
116
+ this.domSanitizer = domSanitizer;
117
+ this.snackBar = snackBar;
118
+ this.dialog = dialog;
119
+ this.mobileAppsSvc = mobileAppsSvc;
120
+ this.utilitySvc = utilitySvc;
121
+ this.contentLangSvc = contentLangSvc;
122
+ this.actionSVC = actionSVC;
123
+ this.viewerSvc = viewerSvc;
124
+ this.ratingSvc = ratingSvc;
125
+ this.telemetryService = telemetryService;
126
+ this.translate = translate;
127
+ this.langtranslations = langtranslations;
128
+ this.events = events;
129
+ this.loadCheckService = loadCheckService;
130
+ this.handleClaimService = handleClaimService;
131
+ this.resetRatingsService = resetRatingsService;
132
+ this.timerService = timerService;
133
+ this.enrollSvc = enrollSvc;
134
+ this.contentLibSvc = contentLibSvc;
135
+ this.dataTransferSvc = dataTransferSvc;
136
+ this.matSnackbarNew = matSnackbarNew;
137
+ this.userServiceLib = userServiceLib;
138
+ this.netCoreService = netCoreService;
139
+ this.appTocV2Svc = appTocV2Svc;
140
+ this.location = location;
141
+ this.domainConfSvc = domainConfSvc;
142
+ this.environment = environment;
143
+ this.queryParamsData = {}; // Initialize queryParamsData
144
+ this.show = false;
145
+ this.changeTab = false;
146
+ this.skeletonLoader = true;
147
+ this.banners = null;
148
+ this.showMoreGlance = false;
149
+ this.content = null;
150
+ this.contentReadData = null;
151
+ this.baseContentReadData = null;
152
+ this.errorCode = null;
153
+ this.resumeData = null;
154
+ this.nsCardContentData = NsCardContent.ACBPConst;
155
+ this.batchData = null;
156
+ this.currentCourseBatchId = null;
157
+ this.routeSubscription = null;
158
+ this.pageNavbar = this.configSvc.pageNavBar;
159
+ this.isCohortsRestricted = false;
160
+ this.sticky = false;
161
+ this.isInIframe = false;
162
+ this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('/author/') || window.location.href.includes('/preview/');
163
+ this.displayViewBtn = true;
164
+ // forPreview = window.location.href.includes('/author/')
165
+ this.analytics = this.route.snapshot.data?.pageData?.data?.analytics;
166
+ this.errorWidgetData = {
167
+ widgetType: 'errorResolver',
168
+ widgetSubType: 'errorResolver',
169
+ widgetData: {
170
+ errorType: 'internalServer',
171
+ },
172
+ };
173
+ this.isAuthor = false;
174
+ this.authorBtnWidget = {
175
+ actionBtnId: 'feature_authoring',
176
+ config: {
177
+ type: 'mat-button',
178
+ },
179
+ };
180
+ this.tocConfig = null;
181
+ this.primaryCategory = NsContent.EPrimaryCategory;
182
+ this.courseCategory = NsContent.ECourseCategory;
183
+ this.WFBlendedProgramStatus = NsContent.WFBlendedProgramStatus;
184
+ this.askAuthorEnabled = true;
185
+ this.trainingLHubEnabled = false;
186
+ this.body = null;
187
+ this.viewMoreRelatedTopics = false;
188
+ this.hasTocStructure = false;
189
+ this.tocStructure = null;
190
+ this.contentParents = {};
191
+ this.objKeys = Object.keys;
192
+ this.activeFragment = this.route.fragment.pipe(share());
193
+ this.currentFragment = 'overview';
194
+ this.showScrollHeight = 300;
195
+ this.hideScrollHeight = 10;
196
+ this.batchSubscription = null;
197
+ this.batchDataSubscription = null;
198
+ this.resumeDataSubscription = null;
199
+ this.translationSubscription = null;
200
+ this.hashmapUpdatedSubscription = null;
201
+ this.batchControl = new UntypedFormControl('', Validators.required);
202
+ this.contentProgress = 0;
203
+ this.bannerUrl = null;
204
+ this.routePath = 'overview';
205
+ this.validPaths = new Set(['overview', 'contents', 'analytics']);
206
+ this.routerParamSubscription = null;
207
+ this.actionBtnStatus = 'wait';
208
+ this.isRegistrationSupported = false;
209
+ this.showIntranetMessage = false;
210
+ this.firstResourceLink = null;
211
+ this.resumeDataLink = null;
212
+ this.certData = null;
213
+ this.showTakeAssessment = null;
214
+ this.checkRegistrationSources = new Set([
215
+ 'SkillSoft Digitalization',
216
+ 'SkillSoft Leadership',
217
+ 'Pluralsight',
218
+ ]);
219
+ this.externalContentFetchStatus = 'done';
220
+ this.registerForExternal = false;
221
+ this.isGoalsEnabled = false;
222
+ this.defaultSLogo = '';
223
+ this.disableEnrollBtn = false;
224
+ this.isAssessVisible = false;
225
+ this.isPracticeVisible = false;
226
+ this.certificateOpen = false;
227
+ this.courseCompleteState = 2;
228
+ this.dakshtaName = this.environment.dakshtaName;
229
+ this.cscmsUrl = this.environment.cscmsUrl;
230
+ this.showBtn = false;
231
+ this.kparray = [];
232
+ this.enrollBtnLoading = false;
233
+ this.isAcbpCourse = false;
234
+ this.isAcbpClaim = false;
235
+ this.isClaimed = false;
236
+ this.monthlyCapExceed = false;
237
+ this.isCompletedThisMonth = false;
238
+ this.sourceEllipsis = false;
239
+ this.scrollLimit = 0;
240
+ this.rcElem = {
241
+ offSetTop: 0,
242
+ BottomPos: 0,
243
+ };
244
+ this.scrolled = false;
245
+ this.pathSet = new Set();
246
+ this.canShare = false;
247
+ this.enableShare = false;
248
+ this.contentCreatorData = [];
249
+ // randomlearnAdvisoryObj: any
250
+ // learnAdvisoryDataLength: any
251
+ this.destroySubject$ = new Subject();
252
+ this.isReleventBtnHovered = false;
253
+ this.SAKSHAMAI_ICON_NORMAL = '/assets/images/sakshamAI/ai-icon.svg';
254
+ this.SAKSHAMAI_ICON_LOADER = '/assets/images/sakshamAI/saksham_ai_loader.gif';
255
+ this.recommendedCoursesId = '';
256
+ this.preAssessmentCompletionStatus = false;
257
+ this.fromAITutor = false;
258
+ this.languageList = [];
259
+ this.preAssessmentRequiredFlag = false;
260
+ this.lockCertificate = false;
261
+ this.lastProgressRefreshTime = 0;
262
+ this.isRefreshingProgress = false;
263
+ this.historyData = history.state;
264
+ this.handleBreadcrumbs();
265
+ this.mobileAppsSvc.mobileTopHeaderVisibilityStatus.next(true);
266
+ if (localStorage.getItem('websiteLanguage')) {
267
+ this.translate.setDefaultLang('en');
268
+ const lang = localStorage.getItem('websiteLanguage');
269
+ this.translate.use(lang);
270
+ }
271
+ this.loadCheckService.childComponentLoaded$.subscribe(_isLoaded => {
272
+ // Present in app-toc-about.component
273
+ if (document.getElementById('ratingsDiv')) {
274
+ setTimeout(() => {
275
+ const ratingsDiv = document.getElementById('ratingsDiv');
276
+ if (ratingsDiv) {
277
+ this.scrollLimit = ratingsDiv.getBoundingClientRect().bottom;
278
+ }
279
+ }, 500);
280
+ }
281
+ if (document.getElementById('contentContainer')) {
282
+ const contentDiv = document.getElementById('contentContainer');
283
+ if (contentDiv) {
284
+ this.scrollLimit = contentDiv.getBoundingClientRect().bottom;
285
+ }
286
+ }
287
+ });
288
+ this.handleClaimService.getClaimData().subscribe((_eventData) => {
289
+ this.onClickOfClaim(_eventData);
290
+ });
291
+ }
292
+ getKarmapointsLimit() {
293
+ if (!this.forPreview) {
294
+ this.contentSvc.userKarmaPoints().subscribe((res) => {
295
+ if (res && res.kpList) {
296
+ const info = res.kpList.addinfo;
297
+ if (info) {
298
+ this.monthlyCapExceed = JSON.parse(info).claimedNonACBPCourseKarmaQuota >= 4;
299
+ }
300
+ }
301
+ });
302
+ }
303
+ }
304
+ isCourseCompletedOnThisMonth() {
305
+ const now = moment(this.serverDate).format('YYYY-MM-DD');
306
+ if (this.content) {
307
+ const courseData = this.enrolledCourseData;
308
+ if (courseData && courseData.completionPercentage === 100 && courseData.completedOn) {
309
+ const completedOn = moment(courseData.completedOn).format('YYYY-MM-DD');
310
+ const completedMonth = moment(completedOn, 'YYYY-MM-DD').month();
311
+ const currentMonth = moment(now, 'YYYY-MM-DD').month();
312
+ this.isCompletedThisMonth = completedMonth === currentMonth;
313
+ this.content['viewMore'] = false;
314
+ this.content['completedOn'] = courseData.completedOn;
315
+ }
316
+ }
317
+ }
318
+ filteredAcbpList(res) {
319
+ return res.filter((v) => v.identifier === this.courseID);
320
+ }
321
+ findACPB() {
322
+ const localCbp = localStorage.getItem('cbpData');
323
+ if (localCbp) {
324
+ const storeageCbp = JSON.parse(localCbp);
325
+ const cbp = this.filteredAcbpList(storeageCbp);
326
+ if (cbp.length) {
327
+ const acbp = 'cbPlan';
328
+ this.cbPlanEndDate = cbp[0].endDate;
329
+ const sDate = dayjs(this.serverDate).format('YYYY-MM-DD');
330
+ const daysCount = dayjs(this.cbPlanEndDate).diff(this.serverDate, 'day');
331
+ this.cbPlanDuration = daysCount < 0 ? NsCardContent.ACBPConst.OVERDUE : daysCount > 29
332
+ ? NsCardContent.ACBPConst.SUCCESS : NsCardContent.ACBPConst.UPCOMING;
333
+ if (acbp && this.cbPlanEndDate && acbp === 'cbPlan') {
334
+ this.isAcbpCourse = true;
335
+ const eDate = dayjs(this.cbPlanEndDate).format('YYYY-MM-DD');
336
+ if (dayjs(sDate).isSameOrBefore(eDate)) {
337
+ const requestObj = {
338
+ request: {
339
+ filters: {
340
+ contextType: 'Course',
341
+ contextId: this.courseID,
342
+ },
343
+ },
344
+ };
345
+ this.contentSvc.getCourseKarmaPoints(requestObj).subscribe((res) => {
346
+ if (res && res.kpList) {
347
+ const row = res.kpList;
348
+ if (row.addinfo) {
349
+ if (JSON.parse(row.addinfo).ACBP) {
350
+ this.isAcbpClaim = false;
351
+ this.isClaimed = true;
352
+ }
353
+ else {
354
+ this.isAcbpClaim = true;
355
+ }
356
+ }
357
+ else {
358
+ this.isAcbpClaim = true;
359
+ }
360
+ }
361
+ else {
362
+ this.isAcbpClaim = true;
363
+ }
364
+ });
365
+ }
366
+ }
367
+ }
368
+ }
369
+ }
370
+ raiseTelemeteryForProvider(providerName, prividerId) {
371
+ this.events.raiseInteractTelemetry({
372
+ type: 'click',
373
+ id: 'btn-provider',
374
+ }, {
375
+ id: providerName,
376
+ type: prividerId,
377
+ }, {
378
+ pageIdExt: 'btn-provider',
379
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
380
+ });
381
+ }
382
+ raiseTelemetry() {
383
+ this.events.raiseInteractTelemetry({
384
+ type: 'click',
385
+ subType: 'karmapoints-claim',
386
+ id: this.courseID,
387
+ }, {
388
+ id: this.courseID,
389
+ type: 'course',
390
+ }, {
391
+ pageIdExt: 'btn-acbp-claim',
392
+ module: WsEvents.EnumTelemetrymodules.KARMAPOINTS,
393
+ });
394
+ }
395
+ onClickOfClaim(event) {
396
+ const request = {
397
+ userId: this.configSvc.unMappedUser.identifier,
398
+ courseId: this.courseID,
399
+ };
400
+ this.raiseTelemetry();
401
+ this.contentSvc.claimKarmapoints(request).subscribe((res) => {
402
+ this.isClaimed = true;
403
+ this.openSnackbar('Karma points are successfully claimed.');
404
+ // this.getUserEnrollmentList()
405
+ this.checkIfUserEnrolled();
406
+ }, (error) => {
407
+ this.openSnackbar('something went wrong.');
408
+ });
409
+ }
410
+ ngAfterViewInit() {
411
+ if (this.rcElement) {
412
+ this.rcElem.BottomPos = this.rcElement.nativeElement.offsetTop + this.rcElement.nativeElement.offsetHeight;
413
+ this.rcElem.offSetTop = this.rcElement.nativeElement.offsetTop;
414
+ }
415
+ // Get Time for the batch
416
+ this.timerUnsubscribe = this.timerService.getTimerData()
417
+ .pipe(takeUntil(this.destroySubject$))
418
+ .subscribe((_timer) => {
419
+ this.timer = _timer;
420
+ });
421
+ }
422
+ handleBreadcrumbs() {
423
+ if (this.historyData) {
424
+ if (this.historyData.path === 'Search') {
425
+ const searchurl = `/app/globalsearch`;
426
+ const qParam = {
427
+ q: this.historyData.param,
428
+ };
429
+ // tslint:disable-next-line:max-line-length
430
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'Search', url: searchurl, queryParams: qParam }, { title: 'Details', url: 'none' }] };
431
+ }
432
+ else if (this.historyData.path === 'competency-details') {
433
+ const finalUrl = `/app/learn/browse-by/competency/${this.historyData.param}`;
434
+ // tslint:disable-next-line: max-line-length
435
+ this.breadcrumbs = { url: 'home', titles: [{ title: this.historyData.param, url: finalUrl }, { title: 'Details', url: 'none' }] };
436
+ }
437
+ else if (this.historyData.path === 'all-CBP') {
438
+ const finalURL = `/app/learn/browse-by/provider/${this.historyData.param}`;
439
+ this.breadcrumbs = { url: 'home', titles: [{ title: `all CBP's`, url: finalURL }, { title: 'Details', url: 'none' }] };
440
+ }
441
+ else if (this.historyData.path === 'all-competencies') {
442
+ const finalUrl = `/app/learn/browse-by/competency/all-competencies`;
443
+ // tslint:disable-next-line: max-line-length
444
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'all competencies', url: finalUrl }, { title: 'Details', url: 'none' }] };
445
+ }
446
+ else if (this.historyData.path === 'curatedCollections') {
447
+ const finalUrl = `/app/curatedCollections/home`;
448
+ // tslint:disable-next-line: max-line-length
449
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'curated collections', url: finalUrl }, { title: 'Details', url: 'none' }] };
450
+ }
451
+ else {
452
+ // tslint:disable-next-line:max-line-length
453
+ this.breadcrumbs = { url: 'home', titles: [{ title: 'Learn', url: '/page/learn', icon: 'school' }, { title: 'Details', url: 'none' }] };
454
+ }
455
+ }
456
+ }
457
+ ngAfterViewChecked() {
458
+ try {
459
+ if (this.fragment) {
460
+ // tslint:disable-next-line: no-non-null-assertion
461
+ document.querySelector(`#${this.fragment}`).scrollTo({
462
+ top: 80,
463
+ behavior: 'smooth',
464
+ });
465
+ }
466
+ }
467
+ catch (e) { }
468
+ }
469
+ get enableAnalytics() {
470
+ if (this.configSvc.restrictedFeatures) {
471
+ return !this.configSvc.restrictedFeatures.has('tocAnalytics');
472
+ }
473
+ return false;
474
+ }
475
+ get isResource() {
476
+ if (this.content) {
477
+ const isResource = this.content.primaryCategory === NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT ||
478
+ this.content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE
479
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE
480
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT
481
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.COMP_ASSESSMENT
482
+ || this.content.primaryCategory === NsContent.EPrimaryCategory.OFFLINE_SESSION
483
+ || !(this.content.children && this.content.children.length);
484
+ if (isResource) {
485
+ this.mobileAppsSvc.sendViewerData(this.content);
486
+ }
487
+ return isResource;
488
+ }
489
+ return false;
490
+ }
491
+ get getStartDate() {
492
+ if (this.enrolledCourseData) {
493
+ const now = new Date().getTime();
494
+ // const batch = _.first(_.filter(this.content['batches'], { batchId: this.currentCourseBatchId }) || [])
495
+ const batch = this.enrolledCourseData.batch;
496
+ this.currentCourseBatchId = batch.batchId;
497
+ if (batch && this.currentCourseBatchId) {
498
+ this.startDate = (_.get(batch, 'startDate'));
499
+ // const parsedDate = moment(this.startDate);
500
+ // const dateOnly = parsedDate.clone().startOf('day');
501
+ const startDateTime = this.startDate && new Date(this.startDate).getTime();
502
+ this.startDateDifference = startDateTime - now;
503
+ if (this.startDateDifference && this.startDateDifference > 0) {
504
+ const days = Math.floor(this.startDateDifference / (1000 * 60 * 60 * 24));
505
+ const hours = Math.floor((this.startDateDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
506
+ const minutes = Math.floor((this.startDateDifference % (1000 * 60 * 60)) / (1000 * 60));
507
+ return (`${days} Days : ${hours} Hours : ${minutes} Minutes`);
508
+ }
509
+ return 'NA';
510
+ }
511
+ return 'NA';
512
+ // if (_.get(batch, 'startDate') && moment(_.get(batch, 'startDate')).isAfter()) {
513
+ // return moment(_.get(batch, 'startDate')).from(now)
514
+ // }
515
+ // if (_.get(batch, 'endDate') && moment(_.get(batch, 'endDate')).isBefore()) {
516
+ // return 'NA'
517
+ // }
518
+ // if (startDateTime && moment(startDateTime).isAfter()) {
519
+ // return moment(startDateTime).from(now)
520
+ // }
521
+ // if (endDateTime && moment(endDateTime).isBefore()) {
522
+ // return 'NA'
523
+ // }
524
+ // return 'NA'
525
+ }
526
+ return 'NA';
527
+ }
528
+ get isBatchInProgress() {
529
+ // if (this.content && this.content['batches']) {
530
+ // const batches = this.content['batches'] as NsContent.IBatch
531
+ // if (this.currentCourseBatchId) {
532
+ // // const now = moment().format('YYYY-MM-DD HH:mm:ss')
533
+ // const now = new Date().getTime()
534
+ // if (this.batchData && this.batchData.content) {
535
+ // const batch = _.first(_.filter(this.batchData.content, { batchId: this.currentCourseBatchId }) || [])
536
+ // if (batch) {
537
+ // // const startDate = moment(batch.startDate).format('YYYY-MM-DD HH:mm:ss')
538
+ // // const endDate = batch.endDate ? moment(batch.endDate).format('YYYY-MM-DD HH:mm:ss') : now
539
+ // // return (
540
+ // // // batch.status &&
541
+ // // moment(startDate).isSameOrBefore(now)
542
+ // // && moment(endDate).isSameOrAfter(now)
543
+ // // )
544
+ // this.startDate = batch && (_.get(batch, 'startTime'))
545
+ // this.endDate = batch && (_.get(batch, 'endTime'))
546
+ // const endDateTime = new Date(this.endDate).getTime()
547
+ // this.endDateDifference = endDateTime - now
548
+ // if(this.endDateDifference > 0) {
549
+ // return batch.status
550
+ // }
551
+ // }
552
+ // return false
553
+ // }
554
+ // return false
555
+ // } return false
556
+ if (this.enrolledCourseData) {
557
+ const now = new Date().getTime();
558
+ const batch = this.enrolledCourseData.batch;
559
+ this.currentCourseBatchId = batch.batchId;
560
+ if (batch && this.currentCourseBatchId) {
561
+ this.startDate = (_.get(batch, 'startDate'));
562
+ this.endDate = (_.get(batch, 'endDate'));
563
+ if (this.endDate) {
564
+ const startDateTime = this.startDate && new Date(this.startDate).getTime();
565
+ let endDate = this.endDate && new Date(this.endDate);
566
+ endDate.setHours(23, 59, 59, 999);
567
+ const endDateTime = endDate.getTime();
568
+ this.startDateDifference = now - startDateTime;
569
+ this.endDateDifference = endDateTime - now;
570
+ if (this.endDateDifference > 0 && this.startDateDifference > 0 && batch.status !== 2) {
571
+ return true;
572
+ }
573
+ return false;
574
+ }
575
+ return true;
576
+ }
577
+ return false;
578
+ }
579
+ return false;
580
+ }
581
+ getUserRating(fireUpdate) {
582
+ if (!this.forPreview) {
583
+ if (this.configSvc.userProfile) {
584
+ this.userId = this.configSvc.userProfile.userId || '';
585
+ }
586
+ if (this.content && this.content.identifier && this.content.primaryCategory) {
587
+ this.ratingSvc.getRating(this.content.identifier, this.content.primaryCategory, this.userId).subscribe((res) => {
588
+ if (res && res.result && res.result.response) {
589
+ this.userRating = res.result.response;
590
+ if (fireUpdate) {
591
+ this.tocSvc.changeUpdateReviews(true);
592
+ }
593
+ }
594
+ this.contentViewEventForNetCore('view');
595
+ }, (err) => {
596
+ this.loggerSvc.error('USER RATING FETCH ERROR >', err);
597
+ });
598
+ }
599
+ }
600
+ setTimeout(() => {
601
+ if (this.contentSource && this.contentSource.nativeElement.offsetHeight > 44) {
602
+ this.sourceEllipsis = true;
603
+ }
604
+ }, 250);
605
+ }
606
+ fetchUserWFForBlended() {
607
+ const applicationIds = (this.batchData && this.batchData.content && this.batchData.content.map(e => e.batchId)) || [];
608
+ const req = {
609
+ applicationIds,
610
+ serviceName: 'blendedprogram',
611
+ limit: 100,
612
+ offset: 0,
613
+ };
614
+ this.contentSvc.fetchBlendedUserWF(req).then((data) => {
615
+ if (data && data.result && data.result.data.length) {
616
+ const latestWF = _.maxBy(data.result.data[0].wfInfo, (el) => {
617
+ return new Date(el.lastUpdatedOn).getTime();
618
+ });
619
+ // latestWF.currentStatus = this.WFBlendedProgramStatus.REJECTED
620
+ /* tslint:disable-next-line */
621
+ this.batchData.workFlow = {
622
+ wfInitiated: true,
623
+ /* tslint:disable-next-line */
624
+ batch: this.batchData && this.batchData.content && this.batchData.content.find((e) => e.batchId === latestWF.applicationId),
625
+ wfItem: latestWF,
626
+ };
627
+ this.tocSvc.setWFData(this.batchData);
628
+ }
629
+ this.loggerSvc.info('fetchBlendedUserWF data == ', data);
630
+ }, (error) => {
631
+ this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
632
+ });
633
+ }
634
+ checkIfBatchExists(latest) {
635
+ if (!this.batchData || !this.batchData.content) {
636
+ return false;
637
+ }
638
+ return this.batchData.content.find(b => b.batchId === latest.batchId);
639
+ }
640
+ getBatchId() {
641
+ let batchId = '';
642
+ if (this.batchData && this.batchData.content) {
643
+ for (const batch of this.batchData.content) {
644
+ batchId = batch.batchId;
645
+ }
646
+ }
647
+ return batchId;
648
+ }
649
+ handleAutoBatchAssign() {
650
+ if (this.forPreview) {
651
+ this.navigateToPlayerPage('');
652
+ }
653
+ else {
654
+ this.enrollBtnLoading = true;
655
+ this.changeTab = !this.changeTab;
656
+ this.raiseEnrollTelemetry();
657
+ if (this.recommendedCoursesId) {
658
+ this.raiseEnrollTelementryForSakshamAIGenerated();
659
+ }
660
+ if (this.recommendedCoursesId) {
661
+ this.raiseEnrollTelementryForSakshamAIGenerated();
662
+ }
663
+ const batchData = this.contentReadData && this.contentReadData.batches && this.contentReadData.batches[0];
664
+ if (this.content && this.content.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM) {
665
+ this.autoEnrollCuratedProgram(NsContent.ECourseCategory.CURATED_PROGRAM, batchData);
666
+ }
667
+ else if (this.content && this.content.courseCategory === NsContent.ECourseCategory.MODERATED_PROGRAM) {
668
+ let moderatedBatchData;
669
+ if (this.batchData && this.batchData.content && this.batchData.content.length > 1) {
670
+ moderatedBatchData = this.selectedBatchData && this.selectedBatchData.content && this.selectedBatchData.content[0];
671
+ }
672
+ else {
673
+ moderatedBatchData = this.batchData && this.batchData.content && this.batchData.content[0];
674
+ }
675
+ this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, moderatedBatchData);
676
+ }
677
+ else if (this.content.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
678
+ this.autoEnrollLearningPathway(batchData);
679
+ }
680
+ else {
681
+ this.autoAssignEnroll();
682
+ }
683
+ }
684
+ this.contentViewEventForNetCore('enroll');
685
+ }
686
+ autoEnrollLearningPathway(batchData) {
687
+ let batchId = batchData?.batchId;
688
+ if (batchId) {
689
+ this.contentSvc.autoEnrollLP(this.content?.identifier).subscribe((res) => {
690
+ if (res) {
691
+ this.navigateToPlayerPage(batchId);
692
+ this.enrollBtnLoading = false;
693
+ }
694
+ }, (err) => {
695
+ let errMsg = err?.error?.params?.errmsg || err?.params?.errmsg || 'Something went wrong';
696
+ if (errMsg?.includes('course.') && this.content?.courseCategory) {
697
+ errMsg = errMsg.replace('course.', this.content?.courseCategory) + '.';
698
+ }
699
+ this.snackBar.open(errMsg);
700
+ this.enrollBtnLoading = false;
701
+ });
702
+ }
703
+ else {
704
+ this.snackBar.open('No batches found');
705
+ this.enrollBtnLoading = false;
706
+ }
707
+ }
708
+ autoEnrollCuratedProgram(programType, batchData) {
709
+ if (!batchData) {
710
+ this.enrollBtnLoading = false;
711
+ this.snackBar.open('No bacthes found');
712
+ return;
713
+ }
714
+ if (this.content && this.content.identifier) {
715
+ let userId = '';
716
+ if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
717
+ userId = this.configSvc.userProfile.userId;
718
+ }
719
+ const req = {
720
+ request: {
721
+ userId,
722
+ programId: this.content.identifier,
723
+ // as of now curated program only one batch is coming need to check and modify
724
+ batchId: batchData?.batchId,
725
+ },
726
+ };
727
+ this.contentSvc.autoAssignCuratedBatchApi(req, programType).subscribe((data) => {
728
+ if (data) {
729
+ if (programType === NsContent.ECourseCategory.MODERATED_PROGRAM && batchData.endDate) {
730
+ this.batchData = {
731
+ content: [batchData],
732
+ enrolled: true,
733
+ };
734
+ this.routerChangeHandler(true);
735
+ setTimeout(() => {
736
+ // this.getUserEnrollmentList()
737
+ this.checkIfUserEnrolled();
738
+ }, 2000);
739
+ }
740
+ else {
741
+ this.navigateToPlayerPage(req.request.batchId);
742
+ }
743
+ }
744
+ }, (_error) => {
745
+ // console.log('_error', _error)
746
+ // if(_error && _error.error && _error.error.params && _error.error.params.err && _error.error.params.err.errmsg) {
747
+ this.snackBar.open(_.get(_error, 'error.params.errmsg') || 'Please try again later');
748
+ // }
749
+ this.enrollBtnLoading = false;
750
+ });
751
+ }
752
+ }
753
+ autoAssignEnroll() {
754
+ /************* ✨ Windsurf Command ⭐ *************/
755
+ /**
756
+ * If the user is not enrolled in the course, auto-assigns a batch and navigates to the player page.
757
+ * If the user is already enrolled, does nothing.
758
+ */
759
+ /******* 6d94c646-254c-44d6-a7c3-90bdb9507318 *******/ if (this.baseContentReadData && this.baseContentReadData.identifier) {
760
+ this.contentSvc.autoAssignBatchApi(this.baseContentReadData.identifier, this.selectedLanguage).subscribe((data) => {
761
+ this.batchData = {
762
+ content: data.content,
763
+ enrolled: true,
764
+ };
765
+ const batchId = this.getBatchId();
766
+ if (batchId) {
767
+ this.navigateToPlayerPage(batchId);
768
+ }
769
+ // this.enrollBtnLoading = false
770
+ }, (_error) => {
771
+ this.snackBar.open(_.get(_error, 'error.params.errmsg') || 'Please try again later');
772
+ this.enrollBtnLoading = false;
773
+ });
774
+ }
775
+ }
776
+ async navigateToPlayerPage(batchId) {
777
+ if (this.content) {
778
+ this.enrollBtnLoading = true;
779
+ let firstPlayableContent;
780
+ if (this.content && this.content.identifier === this.selectedLanguage.identifier) {
781
+ firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
782
+ }
783
+ else {
784
+ // fetch hierarchy for the selected language in popup first, then get first playable content and redirect to it
785
+ await this.fetchContentHierarchy(this.selectedLanguage.identifier);
786
+ firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
787
+ }
788
+ let primaryCategory;
789
+ if (this.content.secureSettings !== undefined) {
790
+ primaryCategory = 'Learning Resource';
791
+ }
792
+ else {
793
+ primaryCategory = firstPlayableContent.primaryCategory || this.content.primaryCategory;
794
+ }
795
+ this.firstResourceLink = this.getResumeUrl(firstPlayableContent, batchId, primaryCategory);
796
+ this.router.navigate([`${this.firstResourceLink.url}`], { queryParams: { ...this.firstResourceLink.queryParams, fromAITutor: this.fromAITutor } });
797
+ }
798
+ }
799
+ fetchBatchDetails() {
800
+ if (this.content && this.content.identifier) {
801
+ const req = {
802
+ request: {
803
+ filters: {
804
+ courseId: this.content.identifier,
805
+ status: ['0', '1', '2'],
806
+ // createdBy: 'fca2925f-1eee-4654-9177-fece3fd6afc9',
807
+ },
808
+ sort_by: { createdDate: 'desc' },
809
+ },
810
+ };
811
+ this.contentSvc.fetchCourseBatches(req).subscribe((data) => {
812
+ this.batchData = data;
813
+ this.batchData.enrolled = false;
814
+ this.tocSvc.setBatchData(this.batchData);
815
+ this.routerChangeHandler(false);
816
+ }, (error) => {
817
+ this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
818
+ });
819
+ }
820
+ }
821
+ scrollToTop() {
822
+ (function smoothscroll() {
823
+ const currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
824
+ if (currentScroll > 0) {
825
+ // window.requestAnimationFrame(smoothscroll)
826
+ // window.scrollTo(0, currentScroll - (currentScroll / 5))
827
+ window.scrollTo({
828
+ top: 0,
829
+ behavior: 'smooth',
830
+ });
831
+ }
832
+ })();
833
+ }
834
+ getCompetencies(competencies) {
835
+ const competenciesArray = JSON.parse(competencies);
836
+ const competencyStringArray = [];
837
+ competenciesArray.map((c) => {
838
+ competencyStringArray.push(c.name);
839
+ });
840
+ return competencyStringArray;
841
+ }
842
+ get showIntranetMsg() {
843
+ if (this.isMobile) {
844
+ return true;
845
+ }
846
+ return this.showIntranetMessage;
847
+ }
848
+ get showStart() {
849
+ return this.tocSvc.showStartButton(this.content);
850
+ }
851
+ get isPostAssessment() {
852
+ if (!(this.tocConfig && this.tocConfig.postAssessment)) {
853
+ return false;
854
+ }
855
+ if (this.content) {
856
+ return (this.content.primaryCategory === NsContent.EPrimaryCategory.COURSE &&
857
+ this.content.learningMode === 'Instructor-Led');
858
+ }
859
+ return false;
860
+ }
861
+ get isMobile() {
862
+ return this.utilitySvc.isMobile;
863
+ }
864
+ get showSubtitleOnBanner() {
865
+ return this.tocSvc.subtitleOnBanners;
866
+ }
867
+ handleEnrollmentEndDate(batch) {
868
+ const enrollmentEndDate = dayjs(_.get(batch, 'enrollmentEndDate')).format('YYYY-MM-DD');
869
+ const systemDate = dayjs();
870
+ return enrollmentEndDate ? dayjs(enrollmentEndDate).isBefore(systemDate) : false;
871
+ }
872
+ openSnackbar(primaryMsg, duration = 5000) {
873
+ this.snackBar.open(primaryMsg, 'X', {
874
+ duration,
875
+ });
876
+ }
877
+ get showInstructorLedMsg() {
878
+ return (this.showActionButtons &&
879
+ this.content &&
880
+ this.content.learningMode === 'Instructor-Led' &&
881
+ !this.content.children.length &&
882
+ !this.content.artifactUrl);
883
+ }
884
+ get isHeaderHidden() {
885
+ return this.isResource && this.content && !this.content.artifactUrl.length;
886
+ }
887
+ get showActionButtons() {
888
+ return (this.actionBtnStatus !== 'wait' &&
889
+ this.content &&
890
+ this.content.status !== 'Deleted' &&
891
+ this.content.status !== 'Expired');
892
+ }
893
+ get showButtonContainer() {
894
+ return (this.actionBtnStatus === 'grant' &&
895
+ !(this.isMobile && this.content && this.content.isInIntranet) &&
896
+ !(this.content &&
897
+ this.content.contentType === 'Course' &&
898
+ this.content.children.length === 0 &&
899
+ !this.content.artifactUrl) &&
900
+ !(this.content && this.content.contentType === 'Resource' && !this.content.artifactUrl));
901
+ }
902
+ getResumeDataFromList(type) {
903
+ const resumeCopy = [...this.resumeData];
904
+ if (resumeCopy && resumeCopy.length) {
905
+ if (!type) {
906
+ // tslint:disable-next-line:max-line-length
907
+ const lastItem = resumeCopy && resumeCopy.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
908
+ return {
909
+ identifier: lastItem.contentId,
910
+ mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
911
+ };
912
+ }
913
+ const firstItem = resumeCopy && resumeCopy.length && resumeCopy[0];
914
+ return {
915
+ identifier: firstItem.contentId,
916
+ mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
917
+ };
918
+ }
919
+ return {};
920
+ }
921
+ modifySensibleContentRating() {
922
+ if (this.content &&
923
+ this.content.averageRating &&
924
+ typeof this.content.averageRating !== 'number') {
925
+ this.content.averageRating = this.content.averageRating[this.configSvc.rootOrg || ''];
926
+ }
927
+ if (this.content && this.content.totalRating && typeof this.content.totalRating !== 'number') {
928
+ this.content.totalRating = this.content.totalRating[this.configSvc.rootOrg || ''];
929
+ }
930
+ }
931
+ getLearningUrls() {
932
+ if (this.content) {
933
+ this.isPracticeVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.PRACTICE));
934
+ this.isAssessVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.ASSESS));
935
+ const firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
936
+ let primaryCategory;
937
+ if (this.content.secureSettings !== undefined) {
938
+ primaryCategory = 'Learning Resource';
939
+ }
940
+ else {
941
+ primaryCategory = firstPlayableContent.primaryCategory || this.content.primaryCategory;
942
+ }
943
+ this.firstResourceLink = this.getResumeUrl(firstPlayableContent, null, primaryCategory);
944
+ /* tslint:disable-next-line */
945
+ // if (firstPlayableContent.optionalReading && firstPlayableContent.primaryCategory === 'Learning Resource') {
946
+ // this.updateProgress(2, firstPlayableContent.identifier)
947
+ // }
948
+ }
949
+ }
950
+ assignPathAndUpdateBanner(url) {
951
+ const path = url.split('/').pop();
952
+ if (path && this.validPaths.has(path)) {
953
+ this.routePath = path;
954
+ this.updateBannerUrl();
955
+ }
956
+ }
957
+ updateBannerUrl() {
958
+ if (this.banners) {
959
+ this.bannerUrl = this.domSanitizer.bypassSecurityTrustStyle(`url(${this.banners[this.routePath]})`);
960
+ }
961
+ }
962
+ playIntroVideo() {
963
+ if (this.content) {
964
+ this.dialog.open(AppTocDialogIntroVideoComponent, {
965
+ data: this.content.introductoryVideo,
966
+ height: '350px',
967
+ width: '620px',
968
+ });
969
+ }
970
+ }
971
+ get sanitizedIntroductoryVideoIcon() {
972
+ if (this.content && this.content.introductoryVideoIcon) {
973
+ return this.domSanitizer.bypassSecurityTrustStyle(`url(${this.content.introductoryVideoIcon})`);
974
+ }
975
+ return null;
976
+ }
977
+ fetchExternalContentAccess() {
978
+ if (this.content && this.content.registrationUrl) {
979
+ if (!this.forPreview) {
980
+ this.externalContentFetchStatus = 'fetching';
981
+ this.registerForExternal = false;
982
+ this.tocSvc.fetchExternalContentAccess(this.content.identifier).subscribe(data => {
983
+ this.externalContentFetchStatus = 'done';
984
+ this.registerForExternal = data.hasAccess;
985
+ }, _error => {
986
+ this.externalContentFetchStatus = 'done';
987
+ this.registerForExternal = false;
988
+ });
989
+ }
990
+ else {
991
+ this.externalContentFetchStatus = 'done';
992
+ this.registerForExternal = true;
993
+ }
994
+ }
995
+ }
996
+ getRatingIcon(ratingIndex) {
997
+ if (this.content && this.content.averageRating) {
998
+ const avgRating = this.content.averageRating;
999
+ const ratingFloor = Math.floor(avgRating);
1000
+ if (ratingIndex <= ratingFloor) {
1001
+ return 'star';
1002
+ }
1003
+ if (ratingFloor === ratingIndex - 1 && avgRating % 1 > 0) {
1004
+ return 'star_half';
1005
+ }
1006
+ }
1007
+ return 'star_border';
1008
+ }
1009
+ checkRegistrationStatus() {
1010
+ const source = (this.content && this.content.sourceShortName) || '';
1011
+ if (!this.forPreview &&
1012
+ !this.isRegistrationSupported &&
1013
+ this.checkRegistrationSources.has(source)) {
1014
+ this.contentSvc
1015
+ .getRegistrationStatus(source)
1016
+ .then(res => {
1017
+ if (res.hasAccess) {
1018
+ this.actionBtnStatus = 'grant';
1019
+ }
1020
+ else {
1021
+ this.actionBtnStatus = 'reject';
1022
+ if (res.registrationUrl && this.content) {
1023
+ this.content.registrationUrl = res.registrationUrl;
1024
+ }
1025
+ }
1026
+ })
1027
+ .catch(_err => { });
1028
+ }
1029
+ else {
1030
+ this.actionBtnStatus = 'grant';
1031
+ }
1032
+ }
1033
+ generateQuery(type) {
1034
+ if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
1035
+ let qParams = {
1036
+ ...this.firstResourceLink.queryParams,
1037
+ viewMode: type,
1038
+ batchId: this.getBatchId(),
1039
+ };
1040
+ if (this.contextId && this.contextPath) {
1041
+ qParams = {
1042
+ ...qParams,
1043
+ collectionId: this.contextId,
1044
+ collectionType: this.contextPath,
1045
+ };
1046
+ }
1047
+ if (this.forPreview) {
1048
+ delete qParams.viewMode;
1049
+ }
1050
+ qParams = {
1051
+ ...qParams,
1052
+ channelId: this.channelId,
1053
+ };
1054
+ return qParams;
1055
+ }
1056
+ if (this.resumeDataLink && type === 'RESUME') {
1057
+ let qParams = {
1058
+ ...this.resumeDataLink.queryParams,
1059
+ batchId: this.getBatchId(),
1060
+ viewMode: 'RESUME',
1061
+ // courseName: this.content ? this.content.name : '',
1062
+ };
1063
+ if (this.contextId && this.contextPath) {
1064
+ qParams = {
1065
+ ...qParams,
1066
+ collectionId: this.contextId,
1067
+ collectionType: this.contextPath,
1068
+ };
1069
+ }
1070
+ if (this.forPreview) {
1071
+ delete qParams.viewMode;
1072
+ }
1073
+ qParams = {
1074
+ ...qParams,
1075
+ channelId: this.channelId,
1076
+ };
1077
+ return qParams;
1078
+ }
1079
+ if (this.forPreview) {
1080
+ return {};
1081
+ }
1082
+ return {
1083
+ batchId: this.getBatchId(),
1084
+ viewMode: type,
1085
+ };
1086
+ }
1087
+ get isInIFrame() {
1088
+ try {
1089
+ return window.self !== window.top;
1090
+ }
1091
+ catch (e) {
1092
+ return true;
1093
+ }
1094
+ }
1095
+ openFeedbackDialog(content) {
1096
+ const dialogRef = this.dialog.open(ContentRatingV2DialogComponent, {
1097
+ width: '768px',
1098
+ data: { content, userId: this.userId, userRating: this.userRating },
1099
+ });
1100
+ dialogRef.afterClosed().subscribe((result) => {
1101
+ if (result) {
1102
+ this.getUserRating(true);
1103
+ // this.getUserEnrollmentList()
1104
+ this.checkIfUserEnrolled();
1105
+ this.resetRatingsService.setRatingServiceUpdate(true);
1106
+ }
1107
+ });
1108
+ }
1109
+ updateProgress(status, resourceId) {
1110
+ const collectionId = this.route.snapshot.params.id ?
1111
+ this.route.snapshot.params.id : '';
1112
+ const batchId = this.route.snapshot.queryParams.batchId ?
1113
+ this.route.snapshot.queryParams.batchId : '';
1114
+ const isPreAssessment = this.route.snapshot.queryParams.preAssessment;
1115
+ if (isPreAssessment) {
1116
+ return this.viewerSvc
1117
+ .realTimeProgressUpdateForPreAssessmentQuiz(resourceId, status);
1118
+ }
1119
+ return this.viewerSvc.realTimeProgressUpdateQuiz(resourceId, collectionId, batchId, status);
1120
+ }
1121
+ getProgramDuration(batchData) {
1122
+ if (batchData) {
1123
+ const startDate = dayjs(dayjs(batchData.startDate).format('YYYY-MM-DD'));
1124
+ const endDate = dayjs(dayjs(batchData.endDate).format('YYYY-MM-DD'));
1125
+ // adding 1 to include the start date
1126
+ return (endDate.diff(startDate, 'days') + 1);
1127
+ }
1128
+ return '';
1129
+ }
1130
+ withdrawOrEnroll(data) {
1131
+ if (data === NsContent.WFBlendedProgramStatus.INITIATE) {
1132
+ this.fetchUserWFForBlended();
1133
+ }
1134
+ }
1135
+ handleCapitalize(str, type) {
1136
+ let returnValue = '';
1137
+ if (str) {
1138
+ if (type === 'name') {
1139
+ returnValue = str.split(' ').map(_str => {
1140
+ return _str.charAt(0).toUpperCase() + _str.slice(1);
1141
+ }).join(' ');
1142
+ }
1143
+ else {
1144
+ returnValue = str && (str.charAt(0).toUpperCase() + str.slice(1));
1145
+ }
1146
+ }
1147
+ return returnValue;
1148
+ }
1149
+ handleParseJsonData(s) {
1150
+ try {
1151
+ const parsedString = JSON.parse(s);
1152
+ return parsedString;
1153
+ }
1154
+ catch {
1155
+ return [];
1156
+ }
1157
+ }
1158
+ handleNavigateToReviews() {
1159
+ const elementToView = document.getElementById('reviewContainer');
1160
+ if (elementToView) {
1161
+ window.scrollTo({
1162
+ top: elementToView.offsetTop,
1163
+ behavior: 'smooth',
1164
+ });
1165
+ }
1166
+ }
1167
+ raiseCertIntreactTelemetry() {
1168
+ this.events.raiseInteractTelemetry({
1169
+ type: WsEvents.EnumInteractTypes.CLICK,
1170
+ id: 'view-certificate',
1171
+ subType: WsEvents.EnumInteractSubTypes.CERTIFICATE,
1172
+ }, {
1173
+ id: this.certId,
1174
+ type: WsEvents.EnumInteractSubTypes.CERTIFICATE,
1175
+ });
1176
+ }
1177
+ translateLabels(label, type) {
1178
+ return this.langtranslations.translateLabel(label, type, '');
1179
+ }
1180
+ getLastPlayedResource() {
1181
+ let firstPlayableContent;
1182
+ let resumeDataV2;
1183
+ if (this.resumeData && this.resumeData.length > 0 && this.content) {
1184
+ if (this.content.completionPercentage === 100) {
1185
+ resumeDataV2 = this.getResumeDataFromList('start');
1186
+ }
1187
+ else {
1188
+ resumeDataV2 = this.getResumeDataFromList();
1189
+ }
1190
+ this.expandThePath(resumeDataV2.identifier);
1191
+ }
1192
+ else {
1193
+ if (this.content) {
1194
+ firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
1195
+ this.expandThePath(firstPlayableContent.identifier);
1196
+ }
1197
+ }
1198
+ }
1199
+ expandThePath(resourceId) {
1200
+ if (this.content && resourceId) {
1201
+ const path = this.utilitySvc.getPath(this.content, resourceId);
1202
+ this.pathSet = new Set(path.map((u) => u.identifier));
1203
+ }
1204
+ }
1205
+ raiseEnrollTelemetry() {
1206
+ this.events.raiseInteractTelemetry({
1207
+ type: 'click',
1208
+ subType: 'enroll',
1209
+ id: this.content ? this.content.identifier : '',
1210
+ }, {
1211
+ id: this.content ? this.content.identifier : '',
1212
+ type: this.content ? this.content.primaryCategory : '',
1213
+ }, {
1214
+ pageIdExt: `btn-enroll`,
1215
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1216
+ });
1217
+ }
1218
+ raiseEnrollTelementryForSakshamAIGenerated() {
1219
+ this.events.raiseInteractTelemetry({
1220
+ type: 'click',
1221
+ subType: 'enroll',
1222
+ id: this.content ? this.content.identifier : '',
1223
+ target: {
1224
+ id: this.recommendedCoursesId,
1225
+ ver: "1.0",
1226
+ type: "igot-ai"
1227
+ },
1228
+ }, {
1229
+ id: this.content ? this.content.identifier : '',
1230
+ type: this.content ? this.content.primaryCategory : '',
1231
+ }, {
1232
+ pageId: `/app/toc/${this.content?.identifier}/overview_btn-enroll`,
1233
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1234
+ });
1235
+ }
1236
+ onClickOfShare() {
1237
+ this.enableShare = true;
1238
+ this.raiseTelemetryForShare('shareContent');
1239
+ }
1240
+ /* tslint:disable */
1241
+ raiseTelemetryForShare(subType) {
1242
+ this.events.raiseInteractTelemetry({
1243
+ type: 'click',
1244
+ subType,
1245
+ id: this.content ? this.content.identifier : '',
1246
+ }, {
1247
+ id: this.content ? this.content.identifier : '',
1248
+ type: this.content ? this.content.primaryCategory : '',
1249
+ }, {
1250
+ pageIdExt: `btn-${subType}`,
1251
+ module: WsEvents.EnumTelemetrymodules.CONTENT,
1252
+ });
1253
+ }
1254
+ resetEnableShare() {
1255
+ this.enableShare = false;
1256
+ }
1257
+ translateLabel(label, type) {
1258
+ if (label && type) {
1259
+ return this.langtranslations.translateLabel(label, type, '');
1260
+ }
1261
+ }
1262
+ ngOnDestroy() {
1263
+ if (this.routeSubscription) {
1264
+ this.routeSubscription.unsubscribe();
1265
+ }
1266
+ if (this.batchSubscription) {
1267
+ this.batchSubscription.unsubscribe();
1268
+ }
1269
+ if (this.batchDataSubscription) {
1270
+ this.batchDataSubscription.unsubscribe();
1271
+ }
1272
+ this.tocSvc.analyticsFetchStatus = 'none';
1273
+ if (this.routerParamSubscription) {
1274
+ this.routerParamSubscription.unsubscribe();
1275
+ }
1276
+ if (this.selectedBatchSubscription) {
1277
+ this.selectedBatchSubscription.unsubscribe();
1278
+ }
1279
+ if (this.resumeDataSubscription) {
1280
+ this.resumeDataSubscription.unsubscribe();
1281
+ }
1282
+ if (this.timerUnsubscribe) {
1283
+ this.timerUnsubscribe.unsubscribe();
1284
+ }
1285
+ if (this.hashmapUpdatedSubscription) {
1286
+ this.hashmapUpdatedSubscription.unsubscribe();
1287
+ }
1288
+ // Clear content data to prevent stale data when navigating between contents
1289
+ this.tocSvc.resetContentData();
1290
+ }
1291
+ programEnrollCall(batchData) {
1292
+ this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, batchData);
1293
+ }
1294
+ raiseTelemetryForPublic($event) {
1295
+ // Check if we should first prevent navigation to player page
1296
+ const shouldPreventNavigation = this.shouldShowSurveyPopup();
1297
+ if (shouldPreventNavigation) {
1298
+ $event.preventDefault();
1299
+ $event.stopPropagation();
1300
+ }
1301
+ this.events.raiseInteractTelemetry({
1302
+ type: 'click',
1303
+ id: "view-assessment",
1304
+ subType: "anonymous-assessment",
1305
+ }, {}, {
1306
+ module: 'Landing Page',
1307
+ });
1308
+ if (shouldPreventNavigation) {
1309
+ // Prepare navigation details
1310
+ const navigationUrl = (this.resumeData && !this.certData) ? this.resumeDataLink?.url : this.firstResourceLink?.url;
1311
+ const queryParams = (this.resumeData && !this.certData) ? this.generateQuery('RESUME') : this.generateQuery('START');
1312
+ // Open survey popup directly with navigation details
1313
+ if (navigationUrl) {
1314
+ this.openPublicSurveyPopup(navigationUrl, queryParams);
1315
+ }
1316
+ return false;
1317
+ }
1318
+ }
1319
+ shouldShowSurveyPopup() {
1320
+ // Single source of truth for survey popup condition
1321
+ // Check if it's public view and content is a case study
1322
+ return this.forPreview && this.content && this.contentReadData
1323
+ && this.contentReadData.courseCategory === NsContent.ECourseCategory.CASE_STUDY;
1324
+ }
1325
+ async checkIfUserEnrolled() {
1326
+ this.contentLibSvc.oneStepResumeEnable = false;
1327
+ this.enrollBtnLoading = true;
1328
+ this.tocSvc.contentLoader.next(true);
1329
+ // only for resource
1330
+ // tslint:disable-next-line
1331
+ if (this.baseContentReadData && this.baseContentReadData.identifier && this.baseContentReadData.primaryCategory !== this.primaryCategory.COURSE &&
1332
+ this.baseContentReadData.primaryCategory !== this.primaryCategory.PROGRAM &&
1333
+ this.baseContentReadData.primaryCategory !== this.primaryCategory.MANDATORY_COURSE_GOAL &&
1334
+ this.baseContentReadData.primaryCategory !== this.primaryCategory.STANDALONE_ASSESSMENT &&
1335
+ this.baseContentReadData.primaryCategory !== this.primaryCategory.BLENDED_PROGRAM &&
1336
+ this.baseContentReadData.primaryCategory !== this.primaryCategory.CURATED_PROGRAM) {
1337
+ // const collectionId = this.isResource ? '' : this.baseContentReadData.identifier
1338
+ return this.getContinueLearningData(this.baseContentReadData.identifier);
1339
+ }
1340
+ let enrolledCourse;
1341
+ if (this.content && this.baseContentReadData && this.baseContentReadData.identifier && !this.forPreview) {
1342
+ if (this.userEnrollmentList && this.userEnrollmentList.length) {
1343
+ enrolledCourse = this.userEnrollmentList.find((course) => {
1344
+ const identifier = this.baseContentReadData && this.baseContentReadData.identifier || '';
1345
+ if (course.courseId !== identifier) {
1346
+ return undefined;
1347
+ }
1348
+ return course;
1349
+ });
1350
+ }
1351
+ // If current course is present in the list of user enrolled course
1352
+ if (enrolledCourse && enrolledCourse.batchId) {
1353
+ this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
1354
+ if (res) {
1355
+ this.resumeData = res;
1356
+ this.getLastPlayedResource();
1357
+ this.generateResumeDataLinkNew();
1358
+ }
1359
+ });
1360
+ this.tocSvc.checkModuleWiseData(this.content);
1361
+ this.enrolledCourseData = enrolledCourse;
1362
+ this.isCourseCompletedOnThisMonth();
1363
+ this.currentCourseBatchId = enrolledCourse.batchId;
1364
+ // this.downloadCert(enrolledCourse.issuedCertificates)
1365
+ if (enrolledCourse && enrolledCourse.issuedCertificates &&
1366
+ enrolledCourse.issuedCertificates.length) {
1367
+ const certificate = enrolledCourse.issuedCertificates.sort((a, b) => new Date(b.lastIssuedOn).getTime() - new Date(a.lastIssuedOn).getTime());
1368
+ const certId = certificate[0].identifier;
1369
+ this.certId = certId;
1370
+ if (this.content) {
1371
+ this.content['certificateObj'] = {
1372
+ certId,
1373
+ certData: '',
1374
+ };
1375
+ }
1376
+ }
1377
+ // if enrolled course is completed then to make all languages courses as well as all content as completed
1378
+ if (this.contentReadData.courseCategory !== NsContent.ECourseCategory.LEARNING_PATHWAY && enrolledCourse.status === 2) {
1379
+ this.content['completionPercentage'] = 100;
1380
+ this.content['completionStatus'] = 2;
1381
+ await this.tocSvc.mapCompletionChildPercentageProgram(this.content);
1382
+ let contentLag = this.contentLangSvc.getContentLanguage(this.contentReadData);
1383
+ this.getContinueLearningData(this.baseContentReadData.identifier, enrolledCourse.batchId, contentLag);
1384
+ this.enrollBtnLoading = false;
1385
+ this.tocSvc.mapModuleCount(this.content);
1386
+ this.checkForCompletionSurveyTrigger();
1387
+ }
1388
+ else {
1389
+ if (this.contentReadData && this.contentReadData.cumulativeTracking && this.contentReadData.courseCategory !== NsContent.ECourseCategory.LEARNING_PATHWAY) {
1390
+ await this.tocSvc.mapCompletionPercentageProgram(this.content, this.userEnrollmentList);
1391
+ this.checkForCompletionSurveyTrigger();
1392
+ this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
1393
+ if (res) {
1394
+ this.resumeData = res;
1395
+ this.getLastPlayedResource();
1396
+ this.generateResumeDataLinkNew();
1397
+ }
1398
+ });
1399
+ this.enrollBtnLoading = false;
1400
+ // this.tocSvc.contentLoader.next(false)
1401
+ }
1402
+ else {
1403
+ if (this.contentReadData && this.contentReadData.courseCategory !== NsContent.ECourseCategory.LEARNING_PATHWAY) {
1404
+ let contentLag = this.contentLangSvc.getContentLanguage(this.contentReadData);
1405
+ this.getContinueLearningData(this.baseContentReadData.identifier, enrolledCourse.batchId, contentLag);
1406
+ this.content['completionPercentage'] = enrolledCourse.completionPercentage;
1407
+ this.tocSvc.mapModuleCount(this.content);
1408
+ }
1409
+ this.enrollBtnLoading = false;
1410
+ // this.tocSvc.contentLoader.next(false)
1411
+ }
1412
+ }
1413
+ if (this.baseContentReadData?.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
1414
+ // this.appTocV2Svc.mapContentHierarchyProgressUpdate(this.content,this.userEnrollmentList)
1415
+ console.log('mapping progress for learning pathway', this.content);
1416
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
1417
+ console.log('mapped progress for learning pathway', this.tocSvc.hashmap);
1418
+ this.tocSvc.computeMilestoneLockingStatus(true);
1419
+ this.syncMilestoneLockStatus();
1420
+ }
1421
+ this.batchData = {
1422
+ content: [enrolledCourse.batch],
1423
+ enrolled: true,
1424
+ };
1425
+ this.tocSvc.setBatchData(this.batchData);
1426
+ this.tocSvc.getSelectedBatchData(this.batchData);
1427
+ this.tocSvc.mapSessionCompletionPercentage(this.batchData, this.resumeData);
1428
+ this.routerChangeHandler(true);
1429
+ this.tocSvc.contentLoader.next(false);
1430
+ }
1431
+ else {
1432
+ this.tocSvc.checkModuleWiseData(this.content);
1433
+ this.tocSvc.mapModuleCount(this.content);
1434
+ // It's understood that user is not already enrolled
1435
+ // Fetch the available batches and present to user
1436
+ if (this.content.primaryCategory === this.primaryCategory.COURSE
1437
+ || this.content.primaryCategory !== this.primaryCategory.PROGRAM) {
1438
+ // Disabling auto enrollment to batch
1439
+ if (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
1440
+ this.fetchBatchDetails();
1441
+ }
1442
+ }
1443
+ else {
1444
+ this.fetchBatchDetails();
1445
+ }
1446
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
1447
+ // For Learning Pathways, compute milestone locking when not enrolled (all locked)
1448
+ if (this.baseContentReadData?.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
1449
+ this.tocSvc.computeMilestoneLockingStatus(false);
1450
+ this.syncMilestoneLockStatus();
1451
+ }
1452
+ this.enrollBtnLoading = false;
1453
+ this.tocSvc.contentLoader.next(false);
1454
+ }
1455
+ }
1456
+ this.skeletonLoader = false;
1457
+ }
1458
+ bindCompletionPercentage() {
1459
+ let completionPercentage = 0;
1460
+ let completionStatus = 0;
1461
+ if (this.languageMapProgress && Object.keys(this.languageMapProgress).length) {
1462
+ let langPercentage = this.languageMapProgress[this.selectedLanguage.langId] || 0;
1463
+ completionPercentage = langPercentage;
1464
+ completionStatus = langPercentage >= 100 ? 2 : 0;
1465
+ }
1466
+ else {
1467
+ let enrolledData = this.tocSvc.findEnrolmentByCollectionId(this.userEnrollmentList, (this.baseContentReadData?.identifier || ''));
1468
+ if (enrolledData && enrolledData.completionPercentage) {
1469
+ completionPercentage = enrolledData.completionPercentage;
1470
+ completionStatus = enrolledData.status;
1471
+ }
1472
+ }
1473
+ if (this.content) {
1474
+ this.content.completionPercentage = completionPercentage;
1475
+ this.content.completionStatus = completionStatus;
1476
+ }
1477
+ }
1478
+ handleAcceptRelevent() {
1479
+ this.saveFeedback('', 1);
1480
+ }
1481
+ handleDeclineRelevent() {
1482
+ const dialogRef = this.dialog.open(NonReleventFeedbackDialogComponent, {
1483
+ disableClose: true,
1484
+ width: '502px',
1485
+ panelClass: ['relevent-feedback-dialog'],
1486
+ });
1487
+ dialogRef.afterClosed().subscribe((result) => {
1488
+ if (result) {
1489
+ this.saveFeedback(result, 0);
1490
+ dialogRef.close();
1491
+ }
1492
+ else {
1493
+ dialogRef.close();
1494
+ }
1495
+ });
1496
+ }
1497
+ contentViewEventForNetCore(eventType) {
1498
+ if (this.configSvc.netcoreConfig && this.configSvc.netcoreConfig.netcoreWebConfig // NOSONAR
1499
+ && this.configSvc.netcoreConfig.netcoreWebConfig.isActive // NOSONAR
1500
+ && this.configSvc.netcoreConfig.netcoreWebConfig.events // NOSONAR
1501
+ && this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view // NOSONAR
1502
+ && this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view.isActive // NOSONAR
1503
+ ) {
1504
+ let payload = {};
1505
+ // if (this.configSvc && this.configSvc.unMappedUser && this.configSvc.unMappedUser.identifier) { // NOSONAR
1506
+ // payload['pk^userid'] = this.configSvc.unMappedUser.identifier.trim().toLowerCase()
1507
+ // }
1508
+ if (this.content && this.content.name) {
1509
+ payload['content_name'] = this.content.name;
1510
+ }
1511
+ if (this.content && this.content.courseCategory) {
1512
+ payload['content_category'] = this.content.courseCategory;
1513
+ }
1514
+ if (this.content && this.content.identifier) {
1515
+ payload['content_id'] = this.content.identifier;
1516
+ }
1517
+ // if(this.content && this.content.name) {
1518
+ payload['content_url'] = window.location.href;
1519
+ // }
1520
+ if (this.content && this.content.appIcon) {
1521
+ payload['content_image'] = this.content.appIcon;
1522
+ }
1523
+ if (this.content && this.content.duration) {
1524
+ payload['content_duration'] = this.content.duration && Number(this.content.duration) > 0 ? Number(this.content.duration) : 0;
1525
+ }
1526
+ else {
1527
+ payload['content_duration'] = 0;
1528
+ }
1529
+ if (this.content && this.content.avgRating) {
1530
+ payload['content_rating'] = this.content.avgRating;
1531
+ payload['content rating'] = this.content.avgRating;
1532
+ }
1533
+ if (this.content && this.content.totalNoOfRating) {
1534
+ payload['no_users_rated'] = this.content.totalNoOfRating;
1535
+ }
1536
+ // if(this.content && this.content.name) {
1537
+ payload['learning_path_content'] = this.userEnrollmentList && this.userEnrollmentList.length ? true : false;
1538
+ payload['learning path content'] = this.userEnrollmentList && this.userEnrollmentList.length ? true : false;
1539
+ // }
1540
+ if (this.content && this.content.source) {
1541
+ payload['content_provider_name'] = this.content.source;
1542
+ }
1543
+ // console.log('payload', payload)
1544
+ if (eventType === 'view') {
1545
+ this.netCoreService.trackEventForContentAndEvent('content_view', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
1546
+ }
1547
+ else if (eventType === 'enroll') {
1548
+ this.netCoreService.trackEventForContentAndEvent('content_enrolment', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
1549
+ }
1550
+ else if (eventType === 'complete') {
1551
+ this.netCoreService.trackEventForContentAndEvent('content_completion', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
1552
+ }
1553
+ }
1554
+ }
1555
+ secondsToTime(d) {
1556
+ d = Number(d);
1557
+ var h = Math.floor(d / 3600);
1558
+ var m = Math.floor(d % 3600 / 60);
1559
+ var s = Math.floor(d % 3600 % 60);
1560
+ var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
1561
+ var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
1562
+ var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
1563
+ return hDisplay + mDisplay + sDisplay;
1564
+ }
1565
+ async saveFeedback(comment, rating = 0) {
1566
+ const payload = {
1567
+ "recommendation_id": this.recommendedCoursesId,
1568
+ "course_id": this.courseID,
1569
+ "rating": rating,
1570
+ "comments": comment,
1571
+ "user_id": this.configSvc.userProfile?.userId || ''
1572
+ };
1573
+ const response = await this.contentLibSvc.saveFeedbackSakshamAI(payload).toPromise().catch(() => { });
1574
+ if (response && response?.message) {
1575
+ this.matSnackbarNew.open('Thank you for your feedback.', 'X', { duration: SNACKBAR_DURATION, panelClass: ['success'] });
1576
+ this.feedbackGiven = { course_id: this.courseID, rating: rating, comments: comment };
1577
+ }
1578
+ else if (!response) {
1579
+ this.matSnackbarNew.open('Something is wrong. Please try again later.', 'X', { duration: SNACKBAR_DURATION, panelClass: ['error'] });
1580
+ }
1581
+ }
1582
+ playResumeForAI() {
1583
+ if (this.content) {
1584
+ if (this.firstResourceLink) {
1585
+ this.router.navigate([this.firstResourceLink.url], { queryParams: this.firstResourceLink.queryParams });
1586
+ }
1587
+ }
1588
+ }
1589
+ enrollUserToAI() {
1590
+ this.fromAITutor = true;
1591
+ this.handleAutoBatchAssign();
1592
+ }
1593
+ openSurveyFormPopup(event) {
1594
+ if (event) {
1595
+ this.openCompletionSurveyFormPopup();
1596
+ }
1597
+ }
1598
+ generatePreAssessmentQuery(type) {
1599
+ if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
1600
+ let qParams = {
1601
+ ...this.firstResourceLink.queryParams,
1602
+ viewMode: type,
1603
+ batchId: this.getBatchId(),
1604
+ };
1605
+ if (this.contextId && this.contextPath) {
1606
+ qParams = {
1607
+ ...qParams,
1608
+ collectionId: this.contextId,
1609
+ collectionType: this.contextPath,
1610
+ };
1611
+ }
1612
+ if (this.forPreview) {
1613
+ delete qParams.viewMode;
1614
+ }
1615
+ qParams = {
1616
+ ...qParams,
1617
+ channelId: this.channelId,
1618
+ };
1619
+ return qParams;
1620
+ }
1621
+ if (this.resumeDataLink && type === 'RESUME') {
1622
+ let qParams = {
1623
+ ...this.resumeDataLink.queryParams,
1624
+ batchId: this.getBatchId(),
1625
+ viewMode: 'RESUME',
1626
+ // courseName: this.content ? this.content.name : '',
1627
+ };
1628
+ if (this.contextId && this.contextPath) {
1629
+ qParams = {
1630
+ ...qParams,
1631
+ collectionId: this.contextId,
1632
+ collectionType: this.contextPath,
1633
+ };
1634
+ }
1635
+ if (this.forPreview) {
1636
+ delete qParams.viewMode;
1637
+ }
1638
+ qParams = {
1639
+ ...qParams,
1640
+ channelId: this.channelId,
1641
+ };
1642
+ return qParams;
1643
+ }
1644
+ if (this.forPreview) {
1645
+ return {};
1646
+ }
1647
+ return {
1648
+ batchId: this.getBatchId(),
1649
+ viewMode: type,
1650
+ };
1651
+ }
1652
+ routeToPreAssessent() {
1653
+ if (this.contentReadData) {
1654
+ // this.generatePreAssessmentQuery('START')
1655
+ let firstResource = this.contentReadData.preEnrolmentResources[0];
1656
+ let mimeType = firstResource?.courseCategory === 'Pre Enrolment Assessment' ? 'application/vnd.sunbird.questionset' : firstResource.mimeType;
1657
+ this.firstResourceLink = viewerRouteGenerator(firstResource.identifier, mimeType, this.contentReadData?.identifier, this.contentReadData?.courseCategory, this.forPreview, this.contentReadData && this.contentReadData.preEnrolmentResources[0]?.primaryCategory || '', '');
1658
+ let routerLink = this.firstResourceLink?.url;
1659
+ let queryParams = this.generatePreAssessmentQuery('START');
1660
+ queryParams = { ...queryParams, preAssessment: 'true' };
1661
+ this.router.navigate([`${routerLink}`], { queryParams });
1662
+ }
1663
+ }
1664
+ getPreAssessmentRequired() {
1665
+ this.preAssessmentRequiredFlag = false;
1666
+ if (this.contentReadData?.preEnrolmentResources?.length) {
1667
+ this.contentReadData?.preEnrolmentResources?.forEach((item) => {
1668
+ if (item && item?.isMandatory) {
1669
+ this.preAssessmentRequiredFlag = true;
1670
+ }
1671
+ });
1672
+ }
1673
+ }
1674
+ getPreAssessmentCompletionStatus() {
1675
+ this.preAssessmentCompletionStatus = false;
1676
+ let preEnrollmentResourcesArr = [];
1677
+ let preEnrollmentMandatoryResourcesArr = [];
1678
+ if (this.contentReadData?.preEnrolmentResources?.length) {
1679
+ this.contentReadData?.preEnrolmentResources?.forEach((item) => {
1680
+ preEnrollmentResourcesArr.push(item?.identifier);
1681
+ if (item && item?.isMandatory) {
1682
+ preEnrollmentMandatoryResourcesArr.push(item?.identifier);
1683
+ }
1684
+ });
1685
+ }
1686
+ if (preEnrollmentResourcesArr && preEnrollmentResourcesArr.length) {
1687
+ let req = {
1688
+ "request": {
1689
+ "contentIds": preEnrollmentResourcesArr,
1690
+ "fields": []
1691
+ }
1692
+ };
1693
+ this.tocSvc.readPreEnrollmentResourcesState(req).subscribe((data) => {
1694
+ let mandatoryIdsCompleted = [];
1695
+ if (data && data.result && data.result.contentList && data.result.contentList.length) {
1696
+ for (let i = 0; i < data.result.contentList.length; i++) {
1697
+ if (data.result.contentList[i]['status'] === 2 && preEnrollmentMandatoryResourcesArr.includes(data.result.contentList[i]['contentId'])) {
1698
+ mandatoryIdsCompleted.push(data.result.contentList[i]['contentId']);
1699
+ }
1700
+ }
1701
+ if (preEnrollmentResourcesArr?.length === data.result.contentList?.length) {
1702
+ this.preAssessmentCompletionStatus = true;
1703
+ }
1704
+ else if (mandatoryIdsCompleted.length === preEnrollmentMandatoryResourcesArr.length) {
1705
+ this.preAssessmentCompletionStatus = true;
1706
+ }
1707
+ else {
1708
+ this.preAssessmentCompletionStatus = false;
1709
+ }
1710
+ }
1711
+ else {
1712
+ this.preAssessmentCompletionStatus = false;
1713
+ }
1714
+ });
1715
+ }
1716
+ }
1717
+ ngOnInit() {
1718
+ this.dataTransferSvc.setEnrollData(null);
1719
+ this.getServerDateTime();
1720
+ this.mobile1200 = window.innerWidth < 1201;
1721
+ this.getI18NTranslations();
1722
+ this.loadLearnerAdvisoryData();
1723
+ this.setupSelectedBatchSubscription();
1724
+ this.setChannelId();
1725
+ this.checkIframeContext();
1726
+ this.queryParamsData = this.setupRouteSubscriptions();
1727
+ this.setupFragmentSubscription();
1728
+ this.setupBatchSubscriptions();
1729
+ this.configureDefaultLogo();
1730
+ this.configureFeatureFlags();
1731
+ this.checkRegistrationStatus();
1732
+ this.setupRouterEventSubscription();
1733
+ this.getContentCreatorData();
1734
+ this.setupHashmapUpdateSubscription();
1735
+ this.userId = this.configSvc?.userProfile?.userId || '';
1736
+ this.domainConfSvc.initFromConfig(this.configSvc.globalConfig.applicationConfig);
1737
+ }
1738
+ initData(data) {
1739
+ const initData = this.tocSvc.initData(data, true);
1740
+ this.setErrorCode(initData.errorCode);
1741
+ this.setupBatchControlSubscription();
1742
+ this.tocSvc.contentLoader.next(false);
1743
+ }
1744
+ setErrorCode(errorCode) {
1745
+ this.errorCode = errorCode;
1746
+ switch (this.errorCode) {
1747
+ case NsAppToc.EWsTocErrorCode.API_FAILURE:
1748
+ case NsAppToc.EWsTocErrorCode.INVALID_DATA:
1749
+ case NsAppToc.EWsTocErrorCode.NO_DATA:
1750
+ this.errorWidgetData.widgetData.errorType = ErrorType.internalServer;
1751
+ break;
1752
+ default:
1753
+ this.errorWidgetData.widgetData.errorType = ErrorType.somethingWrong;
1754
+ break;
1755
+ }
1756
+ }
1757
+ initializeTocStructure() {
1758
+ this.contentParents = {};
1759
+ this.tocStructure = {
1760
+ assessment: 0,
1761
+ course: 0,
1762
+ handsOn: 0,
1763
+ interactiveVideo: 0,
1764
+ learningModule: 0,
1765
+ other: 0,
1766
+ pdf: 0,
1767
+ survey: 0,
1768
+ podcast: 0,
1769
+ practiceTest: 0,
1770
+ finalTest: 0,
1771
+ quiz: 0,
1772
+ video: 0,
1773
+ webModule: 0,
1774
+ webPage: 0,
1775
+ youtube: 0,
1776
+ interactivecontent: 0,
1777
+ offlineSession: 0,
1778
+ preEnrollmentAssessment: 0,
1779
+ };
1780
+ }
1781
+ setupBatchControlSubscription() {
1782
+ this.batchControl.valueChanges.subscribe((batch) => {
1783
+ if (batch) {
1784
+ this.handleBatchEnrollment(batch);
1785
+ }
1786
+ });
1787
+ }
1788
+ handleBatchEnrollment(batch) {
1789
+ this.disableEnrollBtn = true;
1790
+ let userId = this.configSvc.userProfile?.userId || '';
1791
+ const req = {
1792
+ request: {
1793
+ userId,
1794
+ courseId: batch.courseId,
1795
+ batchId: batch.batchId,
1796
+ },
1797
+ };
1798
+ this.contentSvc.enrollUserToBatch(req).then((datab) => {
1799
+ if (datab?.result?.response === 'SUCCESS') {
1800
+ this.handleSuccessfulEnrollment(batch);
1801
+ }
1802
+ else {
1803
+ this.handleEnrollmentFailure();
1804
+ }
1805
+ });
1806
+ }
1807
+ handleSuccessfulEnrollment(batch) {
1808
+ this.batchData = {
1809
+ content: [batch],
1810
+ enrolled: true,
1811
+ };
1812
+ this.tocSvc.getSelectedBatchData(this.batchData);
1813
+ this.tocSvc.mapSessionCompletionPercentage(this.batchData);
1814
+ // CRITICAL: For Learning Pathways, compute milestone locking status after enrollment
1815
+ // This ensures milestones are properly locked until pre-assessment is completed
1816
+ if (this.baseContentReadData?.courseCategory === 'Learning Pathway') {
1817
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
1818
+ this.tocSvc.computeMilestoneLockingStatus(true);
1819
+ this.syncMilestoneLockStatus();
1820
+ }
1821
+ this.routerChangeHandler(true);
1822
+ this.openSnackbar('Enrolled Successfully!');
1823
+ this.disableEnrollBtn = false;
1824
+ }
1825
+ handleEnrollmentFailure() {
1826
+ this.openSnackbar('Something went wrong, please try again later!');
1827
+ this.disableEnrollBtn = false;
1828
+ }
1829
+ loadLearnerAdvisoryData() {
1830
+ if (this.route.snapshot.data.pageData && this.route.snapshot.data.pageData.data) {
1831
+ this.learnAdvisoryData = this.route.snapshot.data.pageData.data.learnerAdvisory;
1832
+ }
1833
+ }
1834
+ setupSelectedBatchSubscription() {
1835
+ this.selectedBatchSubscription = this.tocSvc.getSelectedBatch.subscribe(batchData => {
1836
+ this.selectedBatchData = batchData;
1837
+ });
1838
+ }
1839
+ setChannelId() {
1840
+ this.channelId = this.telemetryService.telemetryConfig
1841
+ ? this.telemetryService.telemetryConfig.channel
1842
+ : '';
1843
+ }
1844
+ checkIframeContext() {
1845
+ try {
1846
+ this.isInIframe = window.self !== window.top;
1847
+ }
1848
+ catch (_ex) {
1849
+ this.isInIframe = false;
1850
+ }
1851
+ }
1852
+ setupRouteSubscriptions() {
1853
+ let queryParamstemp = {};
1854
+ if (this.route) {
1855
+ this.skeletonLoader = true;
1856
+ this.routeSubscription = this.route.data.subscribe(async (data) => {
1857
+ if (data?.content?.data?.identifier) {
1858
+ queryParamstemp = await this.processRouteData(data);
1859
+ }
1860
+ else {
1861
+ const tempData = {
1862
+ content: {
1863
+ data: this.inputContent
1864
+ }
1865
+ };
1866
+ queryParamstemp = await this.processRouteData(tempData);
1867
+ }
1868
+ });
1869
+ }
1870
+ return queryParamstemp;
1871
+ }
1872
+ async processRouteData(data) {
1873
+ this.courseID = data?.content?.data?.status === 'Retired' ? '' : data.content.data?.identifier;
1874
+ const initData = this.tocSvc.initData(data, true);
1875
+ // Get query parameters
1876
+ const queryParamsDataTemp = await this.getQueryParams();
1877
+ // Handle multilingual content if mlId is present in query parameters
1878
+ if (queryParamsDataTemp.MLId) {
1879
+ // Store the original content data for reference
1880
+ this.baseContentReadData = initData.content;
1881
+ // Fetch the multilingual content
1882
+ try {
1883
+ if (this.baseContentReadData.identifier === queryParamsDataTemp.MLId) {
1884
+ this.contentReadData = initData.content;
1885
+ }
1886
+ else {
1887
+ const success = await this.fetchContentRead(queryParamsDataTemp.MLId);
1888
+ if (!success) {
1889
+ // If multilingual content fetch fails, fall back to the original content
1890
+ this.contentReadData = initData.content;
1891
+ this.loggerSvc.warn('Failed to load multilingual content, using original content instead');
1892
+ }
1893
+ }
1894
+ }
1895
+ catch (error) {
1896
+ // On error, use the original content
1897
+ this.contentReadData = initData.content;
1898
+ this.loggerSvc.error('Error loading multilingual content:', error);
1899
+ this.snackBar.open('Failed to load content in selected language', 'X', {
1900
+ duration: 3000,
1901
+ });
1902
+ }
1903
+ }
1904
+ else {
1905
+ // No multilingual content requested, use the original content
1906
+ this.contentReadData = initData.content;
1907
+ this.baseContentReadData = initData.content;
1908
+ }
1909
+ // Added to make sure this reference was incorrect, assigning again to make sure global variable is properly updated
1910
+ this.queryParamsData = queryParamsDataTemp;
1911
+ // Continue with the rest of the processing
1912
+ this.loadLanguageData();
1913
+ this.getPreAssessmentCompletionStatus();
1914
+ this.getPreAssessmentRequired();
1915
+ await this.handleContentPreviewOrEnrollment();
1916
+ this.initialrouteData = data;
1917
+ this.loadBannerAndTocConfig(data);
1918
+ this.fetchPostAssessmentStatusIfNeeded();
1919
+ this.initData(data);
1920
+ // to clear public survey data if any on load,
1921
+ // if not cleared then it will be cleared on popup close,
1922
+ // but the teachers notes will be visible on ciming back from player page
1923
+ const surveyId = this.environment.publicContentSurveyId || '';
1924
+ const courseId = this.contentReadData?.identifier || '';
1925
+ this.clearExistingPublicSurveyData(surveyId, courseId);
1926
+ return queryParamsDataTemp;
1927
+ }
1928
+ openCompletionSurveyFormPopup() {
1929
+ if (this.baseContentReadData && _.get(this.baseContentReadData, 'completionSurveyLink')) {
1930
+ const sID = this.baseContentReadData.completionSurveyLink.split('surveys/');
1931
+ const surveyId = sID[1];
1932
+ const data = {
1933
+ surveyId,
1934
+ courseName: this.contentReadData?.name || '',
1935
+ courseID: this.contentReadData?.identifier || '',
1936
+ contextOrgId: this.contentReadData?.createdFor && this.contentReadData?.createdFor.length > 0 ?
1937
+ this.contentReadData?.createdFor[0] : ''
1938
+ };
1939
+ const dialogRef = this.dialog.open(CompletionSurveyFormComponent, {
1940
+ disableClose: true,
1941
+ width: '750px',
1942
+ maxWidth: '90vw',
1943
+ data: data,
1944
+ autoFocus: false,
1945
+ });
1946
+ dialogRef.afterClosed().subscribe((result) => {
1947
+ if (result) {
1948
+ this.openConfirmationDialog();
1949
+ }
1950
+ else {
1951
+ this.lockCertificate = true;
1952
+ }
1953
+ });
1954
+ }
1955
+ }
1956
+ openConfirmationDialog() {
1957
+ const dialogData = {
1958
+ messages: [
1959
+ {
1960
+ message: this.translate.instant('apptoc.surveySubmitted'),
1961
+ classes: 'dialog-title'
1962
+ },
1963
+ {
1964
+ message: this.translate.instant('apptoc.surveyCompletedCertificateGenerating'),
1965
+ classes: 'dialog-description mb-2'
1966
+ }
1967
+ ],
1968
+ iconName: 'check_circle',
1969
+ type: 'primary',
1970
+ buttonsPositionClass: 'justify-center items-center',
1971
+ buttons: [
1972
+ {
1973
+ classes: 'succes-button width-full',
1974
+ text: this.translate.instant('apptoc.returnToProgramPage'),
1975
+ response: true
1976
+ }
1977
+ ]
1978
+ };
1979
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
1980
+ data: dialogData,
1981
+ disableClose: true,
1982
+ width: '500px',
1983
+ maxWidth: '90vw'
1984
+ });
1985
+ dialogRef.afterClosed().subscribe((result) => {
1986
+ if (result) {
1987
+ this.lockCertificate = false;
1988
+ }
1989
+ });
1990
+ }
1991
+ loadLanguageData() {
1992
+ this.languageList = this.contentLangSvc.getAllContentLanguages(this.contentReadData);
1993
+ this.selectedLanguage = this.contentLangSvc.getSelectedLanguage(this.contentReadData);
1994
+ }
1995
+ async handleContentPreviewOrEnrollment() {
1996
+ if (this.forPreview) {
1997
+ await this.loadContentForPreview();
1998
+ }
1999
+ else {
2000
+ // // If we're working with multilingual content, make sure to fetch its hierarchy
2001
+ // if (this.queryParamsData.mlId && this.contentReadData &&
2002
+ // this.contentReadData.identifier === this.queryParamsData.mlId) {
2003
+ // // Fetch content hierarchy for the multilingual content
2004
+ // try {
2005
+ // await this.fetchContentHierarchy(this.contentReadData.identifier);
2006
+ // // After fetching hierarchy, update UI components
2007
+ // this.getLearningUrls();
2008
+ // } catch (error) {
2009
+ // this.loggerSvc.error('Error fetching hierarchy for multilingual content:', error);
2010
+ // }
2011
+ // }
2012
+ // Continue with regular enrollment flow
2013
+ this.fetchUserEnrollmentDataV2();
2014
+ }
2015
+ }
2016
+ async loadContentForPreview() {
2017
+ this.tocSvc.contentLoader.next(true);
2018
+ await this.fetchContentHierarchy(this.contentReadData?.identifier || '');
2019
+ this.tocSvc.contentLoader.next(false);
2020
+ this.tocSvc.checkModuleWiseData(this.content);
2021
+ this.skeletonLoader = false;
2022
+ }
2023
+ loadBannerAndTocConfig(data) {
2024
+ this.banners = data?.pageData?.data?.banners || [];
2025
+ this.tocSvc.subtitleOnBanners = data?.pageData?.data?.subtitleOnBanners || false;
2026
+ this.tocSvc.showDescription = data?.pageData?.data?.showDescription || false;
2027
+ this.tocConfig = data?.pageData?.data || {};
2028
+ if (this.contentReadData?.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
2029
+ this.kparray = this.tocConfig.karmaPointsLP || [
2030
+ {
2031
+ "displayButton": "Resume",
2032
+ "textBeforeIcon": "earn",
2033
+ "points": "25",
2034
+ "textAfterPoints": "karmaPoints",
2035
+ "textAfterIcon": "byCompletingLP",
2036
+ "toolTipText": "lpCompleteTip"
2037
+ }
2038
+ ];
2039
+ }
2040
+ else {
2041
+ this.kparray = this.tocConfig.karmaPoints || [];
2042
+ }
2043
+ }
2044
+ fetchPostAssessmentStatusIfNeeded() {
2045
+ if (this.content && this.isPostAssessment) {
2046
+ this.tocSvc.fetchPostAssessmentStatus(this.content.identifier).subscribe(res => {
2047
+ const assessmentData = res.result;
2048
+ for (const o of assessmentData) {
2049
+ if (o.contentId === (this.content && this.content.identifier)) {
2050
+ this.showTakeAssessment = o;
2051
+ break;
2052
+ }
2053
+ }
2054
+ });
2055
+ }
2056
+ }
2057
+ setupFragmentSubscription() {
2058
+ this.currentFragment = 'overview';
2059
+ this.route.fragment.subscribe((fragment) => {
2060
+ this.currentFragment = fragment || 'overview';
2061
+ });
2062
+ }
2063
+ setupBatchSubscriptions() {
2064
+ this.batchSubscription = this.tocSvc.batchReplaySubject.subscribe(() => this.handleBatchUpdate(), () => this.loggerSvc.error('error on batchSubscription'));
2065
+ this.batchDataSubscription = this.tocSvc.setBatchDataSubject.subscribe(() => this.handleBlendedProgramUpdate(), () => this.loggerSvc.error('error on batchDataSubscription'));
2066
+ }
2067
+ handleBatchUpdate() {
2068
+ this.fetchBatchDetails();
2069
+ if (this.content?.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
2070
+ this.fetchUserWFForBlended();
2071
+ }
2072
+ }
2073
+ handleBlendedProgramUpdate() {
2074
+ if (this.content?.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
2075
+ this.fetchUserWFForBlended();
2076
+ }
2077
+ }
2078
+ configureDefaultLogo() {
2079
+ const instanceConfig = this.configSvc.instanceConfig;
2080
+ if (instanceConfig?.logos?.defaultSourceLogo) {
2081
+ this.defaultSLogo = instanceConfig.logos.defaultSourceLogo;
2082
+ }
2083
+ }
2084
+ configureFeatureFlags() {
2085
+ if (this.configSvc.restrictedFeatures) {
2086
+ this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
2087
+ this.isRegistrationSupported = this.configSvc.restrictedFeatures.has('registrationExternal');
2088
+ this.showIntranetMessage = !this.configSvc.restrictedFeatures.has('showIntranetMessageDesktop');
2089
+ }
2090
+ }
2091
+ setupRouterEventSubscription() {
2092
+ this.routerParamSubscription = this.router.events.subscribe((routerEvent) => {
2093
+ if (routerEvent instanceof NavigationEnd) {
2094
+ this.assignPathAndUpdateBanner(routerEvent.url);
2095
+ // Check if we're on the TOC/overview page for a Learning Pathway
2096
+ const isTocPage = routerEvent.url.includes('/app/toc') ||
2097
+ routerEvent.url.includes('/overview') ||
2098
+ routerEvent.url.includes('/content');
2099
+ }
2100
+ });
2101
+ }
2102
+ /**
2103
+ * Subscribe to hashmap updates to recompute milestone lock status in real-time
2104
+ * This ensures that when progress changes, milestone locks update immediately without page refresh
2105
+ */
2106
+ setupHashmapUpdateSubscription() {
2107
+ this.hashmapUpdatedSubscription = this.tocSvc.hashmapUpdated$.subscribe((update) => {
2108
+ if (update && this.baseContentReadData?.courseCategory === 'Learning Pathway') {
2109
+ const isEnrolled = this.userEnrollmentList && this.userEnrollmentList.length > 0;
2110
+ // Sync content tree's isLocked with the updated hashmap values
2111
+ this.syncMilestoneLockStatus();
2112
+ }
2113
+ });
2114
+ }
2115
+ fetchUserEnrollmentDataV2() {
2116
+ const identifier = this.baseContentReadData?.identifier || '';
2117
+ if (!identifier) {
2118
+ this.loggerSvc.error('Cannot fetch enrollment data: content identifier is missing');
2119
+ this.userEnrollmentList = [];
2120
+ this.checkIfUserEnrolled();
2121
+ return;
2122
+ }
2123
+ const request = {
2124
+ request: {
2125
+ retiredCoursesEnabled: true,
2126
+ courseId: [identifier]
2127
+ }
2128
+ };
2129
+ this.enrollSvc.fetchEnrollContentData(request).pipe(takeUntil(this.destroySubject$), switchMap((res) => {
2130
+ if (res?.result?.courses?.length) {
2131
+ this.userEnrollmentList = res.result.courses;
2132
+ // Check for completed content
2133
+ const completedContentData = this.userEnrollmentList.find((el) => el.collectionId === this.baseContentReadData?.identifier &&
2134
+ el.completionPercentage === 100);
2135
+ if (completedContentData) {
2136
+ this.contentViewEventForNetCore('complete');
2137
+ }
2138
+ this.dataTransferSvc.setEnrollData(this.userEnrollmentList);
2139
+ if (this.isMultilingual) {
2140
+ // in case of back from player we need to check recent language and load
2141
+ if (!this.contentLibSvc?.oneStepResumeEnable && this.baseContentReadData?.identifier === this.contentReadData?.identifier) {
2142
+ let lang = this.baseContentReadData?.language?.length ? this.baseContentReadData?.language[0] : '';
2143
+ let baseContentFromEnrollData = this.userEnrollmentList.find((el) => el.collectionId === this.baseContentReadData?.identifier);
2144
+ if (lang && baseContentFromEnrollData && baseContentFromEnrollData?.recent_language?.toLowerCase() !== lang) {
2145
+ let localLang = this.contentLangSvc.getRequiredLanguageDetails(this.baseContentReadData, baseContentFromEnrollData?.recent_language);
2146
+ if (localLang && Object.keys(localLang).length) {
2147
+ this.processLanguageSelection(this.contentLangSvc.getRequiredLanguageDetails(this.baseContentReadData, baseContentFromEnrollData?.recent_language));
2148
+ }
2149
+ else {
2150
+ this.processLanguageSelection(this.contentLangSvc.getSelectedLanguage(this.contentReadData));
2151
+ }
2152
+ }
2153
+ return of(false);
2154
+ }
2155
+ else {
2156
+ // Always call fetchContentHierarchy first
2157
+ return from(this.fetchContentHierarchy(this.contentReadData?.identifier || ''));
2158
+ }
2159
+ }
2160
+ else {
2161
+ // Always call fetchContentHierarchy first
2162
+ return from(this.fetchContentHierarchy(this.contentReadData?.identifier || ''));
2163
+ }
2164
+ }
2165
+ else {
2166
+ this.userEnrollmentList = [];
2167
+ // Check if we have content ID from either content or contentReadData
2168
+ const contentId = this.contentReadData?.identifier || this.baseContentReadData?.identifier || '';
2169
+ if (!contentId) {
2170
+ this.loggerSvc.error('Cannot fetch hierarchy: content identifier is missing');
2171
+ return of(false);
2172
+ }
2173
+ // Fetch hierarchy content for additional data
2174
+ return from(this.fetchContentHierarchy(contentId));
2175
+ }
2176
+ }),
2177
+ // Add catchError here to handle errors from fetchContentHierarchy
2178
+ catchError(error => {
2179
+ this.loggerSvc.error('Error in enrollment data processing', error);
2180
+ return of(false);
2181
+ })).subscribe({
2182
+ next: () => {
2183
+ if (this.userEnrollmentList?.length && this.contentLibSvc?.oneStepResumeEnable) {
2184
+ this.handleOneStepResume();
2185
+ this.checkIfUserEnrolled();
2186
+ }
2187
+ else {
2188
+ this.checkIfUserEnrolled();
2189
+ }
2190
+ },
2191
+ error: (error) => {
2192
+ this.loggerSvc.error('Failed to fetch user enrollment data', error);
2193
+ this.userEnrollmentList = [];
2194
+ this.checkIfUserEnrolled();
2195
+ },
2196
+ complete: () => {
2197
+ // Optional completion handler if needed
2198
+ }
2199
+ });
2200
+ }
2201
+ async handleOneStepResume() {
2202
+ try {
2203
+ if (!this.content) {
2204
+ this.loggerSvc.error('Content not available for one-step resume');
2205
+ }
2206
+ const foundContent = this.userEnrollmentList.find((el) => el.collectionId === this.baseContentReadData?.identifier);
2207
+ if (!foundContent) {
2208
+ this.loggerSvc.warn('No matching enrolled content found for one-step resume');
2209
+ }
2210
+ const urlData = await this.contentLibSvc.getResourseLink(this.content, [foundContent], true, this.baseContentReadData, this.contentReadData?.identifier || '');
2211
+ if (!urlData) {
2212
+ this.loggerSvc.warn('No URL data returned for one-step resume');
2213
+ }
2214
+ if (urlData?.url) {
2215
+ if (urlData.url.includes('app/toc')) {
2216
+ this.contentLibSvc.oneStepResumeEnable = false;
2217
+ }
2218
+ else {
2219
+ this.contentLibSvc.oneStepResumeEnable = false;
2220
+ // When coming from search page for particular language content, confirm first to one step resume or load the searched language
2221
+ if (urlData?.queryParams?.ML && (urlData?.queryParams?.ML !== this.queryParamsData['ML'])) {
2222
+ this.showOneStepResumeConfirm(urlData);
2223
+ }
2224
+ else {
2225
+ this.router.navigate([urlData.url], { queryParams: urlData.queryParams });
2226
+ }
2227
+ }
2228
+ }
2229
+ }
2230
+ catch (error) {
2231
+ this.loggerSvc.error('Error in handleOneStepResume', error);
2232
+ this.contentLibSvc.oneStepResumeEnable = false;
2233
+ }
2234
+ }
2235
+ fetchContentHierarchy(identifier) {
2236
+ if (this.baseContentReadData?.courseCategory === 'Learning Pathway') {
2237
+ return new Promise((resolve) => {
2238
+ const content = this.baseContentReadData;
2239
+ // STEP 1: Construct hierarchy structure
2240
+ let contentHeirarchyData = this.appTocV2Svc.constructHeirarchyData(content);
2241
+ // STEP 2: Update progress with latest enrollment data
2242
+ this.appTocV2Svc.mapContentHierarchyProgressUpdate(contentHeirarchyData, this.userEnrollmentList);
2243
+ // STEP 3: Create hashmap from updated hierarchy (this should preserve completion status)
2244
+ this.tocSvc.callHirarchyProgressHashmap(contentHeirarchyData);
2245
+ this.content = contentHeirarchyData;
2246
+ // Check if user is enrolled
2247
+ const isEnrolled = this.userEnrollmentList && this.userEnrollmentList.length > 0;
2248
+ // STEP 4: Compute milestone locking status with enrollment status and updated progress data
2249
+ this.tocSvc.computeMilestoneLockingStatus(isEnrolled);
2250
+ // STEP 5: Sync content tree's isLocked with computed values
2251
+ this.syncMilestoneLockStatus();
2252
+ this.getOrgIdForShare();
2253
+ this.getTocStructure();
2254
+ resolve(true);
2255
+ return;
2256
+ });
2257
+ }
2258
+ else {
2259
+ return new Promise((resolve, reject) => {
2260
+ if (!identifier) {
2261
+ resolve(false);
2262
+ return;
2263
+ }
2264
+ // Make sure fetchHierarchyContent returns an Observable
2265
+ const observable = this.contentSvc.fetchHierarchyContent(identifier, 'detail');
2266
+ if (!observable) {
2267
+ this.loggerSvc.error('fetchHierarchyContent did not return an Observable');
2268
+ resolve(false);
2269
+ return;
2270
+ }
2271
+ const subscription = observable.subscribe({
2272
+ next: (response) => {
2273
+ if (response?.result?.content) {
2274
+ this.content = response.result.content;
2275
+ this.getOrgIdForShare();
2276
+ this.getTocStructure();
2277
+ if (!this.forPreview) {
2278
+ this.userRating = undefined;
2279
+ this.getUserRating(false);
2280
+ }
2281
+ resolve(true);
2282
+ }
2283
+ else {
2284
+ resolve(false);
2285
+ }
2286
+ subscription.unsubscribe();
2287
+ },
2288
+ error: (error) => {
2289
+ this.loggerSvc.error('Failed to fetch hierarchy content', error);
2290
+ reject(error);
2291
+ subscription.unsubscribe();
2292
+ }
2293
+ });
2294
+ });
2295
+ }
2296
+ }
2297
+ getTocStructure() {
2298
+ this.initializeTocStructure();
2299
+ if (this.content && this.tocStructure) {
2300
+ this.hasTocStructure = false;
2301
+ this.tocStructure.learningModule = this.content.primaryCategory === this.primaryCategory.MODULE ? -1 : 0;
2302
+ this.tocStructure.course = this.content.primaryCategory === this.primaryCategory.COURSE ? -1 : 0;
2303
+ this.tocStructure = this.tocSvc.getTocStructure(this.content, this.tocStructure);
2304
+ for (const progType in this.tocStructure) {
2305
+ if (this.tocStructure[progType] > 0) {
2306
+ this.hasTocStructure = true;
2307
+ break;
2308
+ }
2309
+ }
2310
+ // from ngOnChanges
2311
+ this.fetchExternalContentAccess();
2312
+ this.modifySensibleContentRating();
2313
+ this.assignPathAndUpdateBanner(this.router.url);
2314
+ this.getLearningUrls();
2315
+ }
2316
+ }
2317
+ /**
2318
+ * Sync milestone isLocked property with computed locking status from hashmap
2319
+ * This ensures the content tree reflects the actual lock status
2320
+ */
2321
+ syncMilestoneLockStatus() {
2322
+ if (!this.content || !this.content.children)
2323
+ return;
2324
+ let hasChanges = false;
2325
+ this.content.children.forEach((child) => {
2326
+ if (child.primaryCategory === 'Milestone' && child.identifier) {
2327
+ const hashData = this.tocSvc.hashmap[child.identifier];
2328
+ if (hashData && hashData.computedIsLocked !== undefined) {
2329
+ const oldLocked = child.isLocked;
2330
+ child.isLocked = hashData.computedIsLocked;
2331
+ if (oldLocked !== child.isLocked) {
2332
+ hasChanges = true;
2333
+ }
2334
+ }
2335
+ }
2336
+ });
2337
+ }
2338
+ /**
2339
+ * Refresh milestone locking status from the already-updated hashmap
2340
+ * This method should be called after progress updates to sync UI with computed lock status
2341
+ * Note: Does NOT fetch enrollment data - uses existing hashmap which is already updated
2342
+ */
2343
+ refreshEnrollmentAndProgress() {
2344
+ if (!this.content) {
2345
+ return;
2346
+ }
2347
+ try {
2348
+ // Check if user is enrolled
2349
+ const isEnrolled = this.userEnrollmentList && this.userEnrollmentList.length > 0;
2350
+ // Recompute milestone locking status from existing hashmap
2351
+ // The hashmap is already updated with latest progress via hashmap update subscription
2352
+ this.tocSvc.computeMilestoneLockingStatus(isEnrolled);
2353
+ // Sync lock status from hashmap to content tree
2354
+ this.syncMilestoneLockStatus();
2355
+ }
2356
+ catch (error) {
2357
+ console.error('❌ Error in refreshEnrollmentAndProgress:', error);
2358
+ }
2359
+ }
2360
+ onLanguageSelect(lang) {
2361
+ // Check if the selected language is already set
2362
+ if (this.selectedLanguage && this.selectedLanguage.identifier === lang.identifier) {
2363
+ return; // Exit the function if the language is the same
2364
+ }
2365
+ if (this.userEnrollmentList && this.userEnrollmentList.length) {
2366
+ let data = {};
2367
+ // TODO: Remove hardcode strings
2368
+ const enrolledCourse = this.tocSvc.findEnrolmentByCollectionId(this.userEnrollmentList, (this.baseContentReadData?.identifier || ''));
2369
+ if (enrolledCourse && enrolledCourse.status === 2) {
2370
+ this.processLanguageSelection(lang);
2371
+ }
2372
+ else {
2373
+ // If there is progress in the selected language,
2374
+ if (this.languageMapProgress && this.languageMapProgress[lang.langId] > 0) {
2375
+ data = {
2376
+ width: '500px',
2377
+ height: 'auto',
2378
+ data: {
2379
+ from: 'languageSwitch',
2380
+ icon: 'translate',
2381
+ header: `Continue where you left off in ${lang.name}?`,
2382
+ message: `You've already made some progress in this language.\n If you continue it will resume from where you left off.`,
2383
+ cancelButton: 'Back',
2384
+ acceptButton: 'Resume',
2385
+ }
2386
+ };
2387
+ }
2388
+ else {
2389
+ // If there is no progress in the selected language, or first time selection
2390
+ data = {
2391
+ width: '500px',
2392
+ height: 'auto',
2393
+ data: {
2394
+ from: 'languageSwitch',
2395
+ icon: 'translate',
2396
+ header: 'Are you sure you want to change the language?',
2397
+ message: 'Switching the language will reset your progress. \n The course will restart from the beginning in the selected language.',
2398
+ cancelButton: 'Back',
2399
+ acceptButton: 'Change language',
2400
+ }
2401
+ };
2402
+ }
2403
+ this.showLangSwitchPopup(lang, data);
2404
+ }
2405
+ }
2406
+ else {
2407
+ this.processLanguageSelection(lang);
2408
+ }
2409
+ }
2410
+ showLangSwitchPopup(lang, data) {
2411
+ const dialogRef = this.dialog.open(TOCMultiLingualDialogComponent, data);
2412
+ dialogRef.afterClosed().subscribe((confirmed) => {
2413
+ if (confirmed) {
2414
+ this.processLanguageSelection(lang);
2415
+ }
2416
+ });
2417
+ }
2418
+ showOneStepResumeConfirm(urlData) {
2419
+ const data = {
2420
+ width: '500px',
2421
+ height: 'auto',
2422
+ data: {
2423
+ from: 'languageSwitch',
2424
+ icon: 'translate',
2425
+ header: `You've already started this course`,
2426
+ message: `You’ve made some <b>progress</b> in another language of this course. \nWould you like to <b>resume where you left off</b>, or continue with this version instead?`,
2427
+ cancelButton: 'Continue Here',
2428
+ acceptButton: 'Resume',
2429
+ }
2430
+ };
2431
+ const dialogRef = this.dialog.open(TOCMultiLingualDialogComponent, data);
2432
+ dialogRef.afterClosed().subscribe((confirmed) => {
2433
+ if (confirmed) {
2434
+ this.router.navigate([urlData.url], { queryParams: urlData.queryParams });
2435
+ }
2436
+ else {
2437
+ const lang = this.contentLangSvc.getRequiredLanguageDetails(this.baseContentReadData, this.queryParamsData['ML']);
2438
+ this.processLanguageSelection(lang);
2439
+ }
2440
+ });
2441
+ }
2442
+ processLanguageSelection(lang) {
2443
+ this.selectedLanguage = lang;
2444
+ // Set skeleton loader to show loading state
2445
+ this.skeletonLoader = true;
2446
+ // Check if language object has required properties
2447
+ if (lang && lang.identifier) {
2448
+ // Create a promise chain to fetch content data and hierarchy sequentially
2449
+ this.fetchContentRead(lang.identifier)
2450
+ .then(() => {
2451
+ // After content read is successful, fetch the hierarchy
2452
+ return this.fetchContentHierarchy(lang.identifier);
2453
+ })
2454
+ .then(() => {
2455
+ // Both operations were successful
2456
+ // Update UI as needed with new content
2457
+ this.routerChangeHandler(true);
2458
+ if (this.userEnrollmentList && this.userEnrollmentList.length) {
2459
+ this.generateResumeDataLinkNew();
2460
+ }
2461
+ if (this.content) {
2462
+ this.getLearningUrls();
2463
+ // Reset user progress and fetch enrollment data if not in preview mode
2464
+ if (!this.forPreview) {
2465
+ this.checkIfUserEnrolled();
2466
+ }
2467
+ }
2468
+ // Update subject to notify rating summry component and load the sumamry of selected language
2469
+ this.resetRatingsService.setRatingServiceUpdate(true);
2470
+ // Finally set loading state to false
2471
+ this.skeletonLoader = false;
2472
+ })
2473
+ .catch((error) => {
2474
+ // Handle any errors in the promise chain
2475
+ this.loggerSvc.error('Error during language change:', error);
2476
+ this.skeletonLoader = false;
2477
+ this.snackBar.open('Failed to load content in selected language', 'X', {
2478
+ duration: 3000,
2479
+ });
2480
+ });
2481
+ }
2482
+ else {
2483
+ this.loggerSvc.error('Invalid language selection', lang);
2484
+ this.skeletonLoader = false;
2485
+ this.snackBar.open('Invalid language selection', 'X', {
2486
+ duration: 3000,
2487
+ });
2488
+ }
2489
+ }
2490
+ /**
2491
+ * Fetches content data for a given identifier and updates the contentReadData property
2492
+ * @param identifier The content identifier to fetch
2493
+ * @returns Promise that resolves to true if content was fetched successfully, false otherwise
2494
+ */
2495
+ async fetchContentRead(identifier) {
2496
+ return new Promise((resolve, reject) => {
2497
+ if (!identifier) {
2498
+ this.loggerSvc.error('Cannot fetch content: identifier is missing');
2499
+ resolve(false);
2500
+ return;
2501
+ }
2502
+ const observable = this.contentSvc.fetchContentData(identifier);
2503
+ if (!observable) {
2504
+ this.loggerSvc.error('fetchContentData did not return an Observable');
2505
+ resolve(false);
2506
+ return;
2507
+ }
2508
+ const subscription = observable.subscribe({
2509
+ next: (response) => {
2510
+ if (response?.result?.content) {
2511
+ // Update contentReadData with the fetched content
2512
+ this.contentReadData = response.result.content;
2513
+ // Update language list after content is fetched
2514
+ if (this.contentReadData) {
2515
+ this.languageList = this.contentLangSvc.getAllContentLanguages(this.contentReadData);
2516
+ this.selectedLanguage = this.contentLangSvc.getSelectedLanguage(this.contentReadData);
2517
+ }
2518
+ resolve(true);
2519
+ }
2520
+ else {
2521
+ this.loggerSvc.warn('Content data not found in response', response);
2522
+ resolve(false);
2523
+ }
2524
+ subscription.unsubscribe();
2525
+ },
2526
+ error: (error) => {
2527
+ this.loggerSvc.error('Failed to fetch content data', error);
2528
+ reject(error);
2529
+ subscription.unsubscribe();
2530
+ }
2531
+ });
2532
+ });
2533
+ }
2534
+ routerChangeHandler(appendBatchId) {
2535
+ const queryParams = {};
2536
+ // Add batch ID if needed
2537
+ if (appendBatchId && this.getBatchId()) {
2538
+ queryParams.batchId = this.getBatchId();
2539
+ }
2540
+ // Add multilingual ID and language to query params if available
2541
+ if (this.contentReadData && this.contentReadData.identifier) {
2542
+ let language = '';
2543
+ // Handle both string and array language formats
2544
+ if (Array.isArray(this.contentReadData.language)) {
2545
+ language = this.contentReadData.language[0].toLowerCase();
2546
+ }
2547
+ else if (this.contentReadData.language) {
2548
+ language = this.contentReadData.language.toLowerCase();
2549
+ }
2550
+ if (!(this.selectedLanguage && Object.keys(this.selectedLanguage).length)) {
2551
+ this.selectedLanguage = {
2552
+ langId: language,
2553
+ name: this.contentReadData.language[0]
2554
+ };
2555
+ }
2556
+ // Only add parameters if we have valid data
2557
+ if (language) {
2558
+ queryParams.ML = language;
2559
+ }
2560
+ queryParams.MLId = this.contentReadData.identifier;
2561
+ }
2562
+ // Only navigate if we have batch ID or other parameters
2563
+ if (Object.keys(queryParams).length > 0) {
2564
+ this.router.navigate([], {
2565
+ relativeTo: this.route,
2566
+ queryParams: queryParams,
2567
+ queryParamsHandling: 'merge',
2568
+ });
2569
+ }
2570
+ }
2571
+ getContinueLearningData(contentId, batchId, lang) {
2572
+ this.tocSvc.contentLoader.next(true);
2573
+ this.resumeData = null;
2574
+ let userId;
2575
+ if (this.configSvc.userProfile) {
2576
+ userId = this.configSvc.userProfile.userId || '';
2577
+ }
2578
+ const req = {
2579
+ request: {
2580
+ batchId,
2581
+ userId,
2582
+ courseId: contentId || '',
2583
+ contentIds: [],
2584
+ fields: ['progressdetails'],
2585
+ ...(lang ? { language: lang } : null),
2586
+ },
2587
+ };
2588
+ if (this.content && this.content.primaryCategory !== NsContent.EPrimaryCategory.RESOURCE) {
2589
+ this.contentSvc.fetchContentHistoryV2(req).subscribe(data => {
2590
+ if (data && data.result && data.result.contentList && data.result.contentList.length) {
2591
+ const tempResumeData = _.get(data, 'result.contentList');
2592
+ this.languageMapProgress = _.get(data, 'result.languageProgress') || {};
2593
+ this.resumeData = _.map(tempResumeData, rr => {
2594
+ // tslint:disable-next-line
2595
+ const items = _.filter(flattenItems(_.get(this.content, 'children') || [], 'children'), { 'identifier': rr.contentId, primaryCategory: 'Learning Resource' });
2596
+ _.set(rr, 'progressdetails.mimeType', _.get(_.first(items), 'mimeType'));
2597
+ if (!_.get(rr, 'completionPercentage')) {
2598
+ if (_.get(rr, 'status') === 2) {
2599
+ _.set(rr, 'completionPercentage', 100);
2600
+ }
2601
+ else {
2602
+ _.set(rr, 'completionPercentage', 0);
2603
+ }
2604
+ }
2605
+ return rr;
2606
+ });
2607
+ const progress = _.map(this.resumeData, 'completionPercentage');
2608
+ const totalCount = _.toInteger(_.get(this.content, 'leafNodesCount')) || 1;
2609
+ if (progress.length < totalCount) {
2610
+ const diff = totalCount - progress.length;
2611
+ if (diff) {
2612
+ // tslint:disable-next-line
2613
+ _.each(new Array(diff), () => {
2614
+ progress.push(0);
2615
+ });
2616
+ }
2617
+ }
2618
+ this.generateResumeDataLinkNew();
2619
+ this.tocSvc.updateResumaData(this.resumeData);
2620
+ // this.tocSvc.mapModuleDurationAndProgress(this.content, this.content)
2621
+ this.getLastPlayedResource();
2622
+ if (this.content?.completionPercentage !== 100) {
2623
+ this.tocSvc.mapCompletionPercentage(this.content, this.resumeData);
2624
+ }
2625
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
2626
+ // Recompute milestone locking status after progress update
2627
+ if (this.baseContentReadData?.courseCategory === 'Learning Pathway') {
2628
+ const isEnrolled = this.userEnrollmentList && this.userEnrollmentList.length > 0;
2629
+ this.tocSvc.computeMilestoneLockingStatus(isEnrolled);
2630
+ this.syncMilestoneLockStatus();
2631
+ }
2632
+ this.tocSvc.contentLoader.next(false);
2633
+ }
2634
+ else {
2635
+ this.resumeData = null;
2636
+ this.tocSvc.callHirarchyProgressHashmap(this.content);
2637
+ // Recompute milestone locking status even with no progress data
2638
+ if (this.baseContentReadData?.courseCategory === 'Learning Pathway') {
2639
+ const isEnrolled = this.userEnrollmentList && this.userEnrollmentList.length > 0;
2640
+ this.tocSvc.computeMilestoneLockingStatus(isEnrolled);
2641
+ this.syncMilestoneLockStatus();
2642
+ }
2643
+ this.tocSvc.contentLoader.next(false);
2644
+ }
2645
+ this.contentSvc.setProgramChildResumeData(this.resumeData, contentId);
2646
+ if (this.content?.completionPercentage !== 100) {
2647
+ this.bindCompletionPercentage();
2648
+ }
2649
+ }, (error) => {
2650
+ this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
2651
+ });
2652
+ }
2653
+ }
2654
+ generateResumeDataLinkNew() {
2655
+ if (this.resumeData && this.content) {
2656
+ let resumeDataV2;
2657
+ if (this.content.completionPercentage === 100) {
2658
+ resumeDataV2 = this.getResumeDataFromList('start');
2659
+ }
2660
+ else {
2661
+ resumeDataV2 = this.getResumeDataFromList();
2662
+ }
2663
+ if (!resumeDataV2.mimeType) {
2664
+ resumeDataV2.mimeType = this.tocSvc.getMimeType(this.content, resumeDataV2.identifier);
2665
+ }
2666
+ this.resumeDataLink = this.getResumeUrl(resumeDataV2);
2667
+ this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
2668
+ /* tslint:disable-next-line */
2669
+ }
2670
+ }
2671
+ isSelectedInMoreDropdown() {
2672
+ if (!this.selectedLanguage?.identifier || !this.languageList) {
2673
+ return false;
2674
+ }
2675
+ return this.languageList.slice(5).some((lang) => lang?.identifier === this.selectedLanguage?.identifier);
2676
+ }
2677
+ async getQueryParams() {
2678
+ const tempQueryParamsData = {};
2679
+ this.routeSubscription = this.route.queryParamMap.subscribe(async (qParamsMap) => {
2680
+ // Extract all parameters from the ParamMap
2681
+ qParamsMap.keys.forEach(key => {
2682
+ tempQueryParamsData[key] = qParamsMap.get(key) ?? '';
2683
+ });
2684
+ tempQueryParamsData;
2685
+ // Process specific parameters
2686
+ const contextId = tempQueryParamsData['contextId'];
2687
+ const contextPath = tempQueryParamsData['contextPath'];
2688
+ const recommendedCoursesId = tempQueryParamsData['recommendationId'];
2689
+ if (contextId && contextPath) {
2690
+ this.contextId = contextId;
2691
+ this.contextPath = contextPath;
2692
+ }
2693
+ if (recommendedCoursesId) {
2694
+ this.recommendedCoursesId = recommendedCoursesId;
2695
+ try {
2696
+ const response = await this.userServiceLib.getRecommendedCoursesSakshamAI(recommendedCoursesId).toPromise();
2697
+ if (response && response.feedbacks && response.feedbacks.length) {
2698
+ this.feedbackGiven = response.feedbacks.find((feedback) => feedback?.course_id === this.courseID);
2699
+ }
2700
+ }
2701
+ catch (error) {
2702
+ this.loggerSvc.error('Error fetching recommended courses:', error);
2703
+ }
2704
+ }
2705
+ });
2706
+ return tempQueryParamsData;
2707
+ }
2708
+ getOrgIdForShare() {
2709
+ if (this.content && ![
2710
+ NsContent.ECourseCategory.MODERATED_COURSE,
2711
+ NsContent.ECourseCategory.MODERATED_ASSESSEMENT,
2712
+ NsContent.ECourseCategory.MODERATED_PROGRAM,
2713
+ NsContent.ECourseCategory.INVITE_ONLY_PROGRAM,
2714
+ ].includes(this.content.courseCategory)) {
2715
+ this.canShare = true;
2716
+ if (this.configSvc.userProfile) {
2717
+ this.rootOrgId = this.configSvc.userProfile.rootOrgId;
2718
+ }
2719
+ }
2720
+ }
2721
+ /**
2722
+ * Fetches and processes content creator data from the current content
2723
+ * - Sets contentCreatorData from parsed creator contacts
2724
+ * - Determines if "show button" flag should be enabled based on content name
2725
+ * - Includes proper error handling for null values and parsing
2726
+ */
2727
+ getContentCreatorData() {
2728
+ try {
2729
+ // Only proceed if we have valid content data
2730
+ if (!this.contentReadData) {
2731
+ this.loggerSvc.warn('Cannot get creator data: contentReadData is not available');
2732
+ return;
2733
+ }
2734
+ // Process content name for comparison (safely handle null/undefined)
2735
+ const contentName = this.contentReadData.name?.trim() || '';
2736
+ // Parse and set creator contacts if available
2737
+ if (this.contentReadData.creatorContacts) {
2738
+ // Use the existing parsing method to handle creator contacts
2739
+ this.contentCreatorData = this.handleParseJsonData(this.contentReadData.creatorContacts);
2740
+ }
2741
+ else {
2742
+ // Reset to empty array if no creator contacts
2743
+ this.contentCreatorData = [];
2744
+ }
2745
+ // Set showBtn flag based on dakshta name comparison (case insensitive)
2746
+ // This determines if the special button for dakshta content is shown
2747
+ this.showBtn = contentName.toLowerCase() === this.dakshtaName.toLowerCase();
2748
+ }
2749
+ catch (error) {
2750
+ // Handle any unexpected errors
2751
+ this.loggerSvc.error('Error processing content creator data:', error);
2752
+ this.contentCreatorData = [];
2753
+ this.showBtn = false;
2754
+ }
2755
+ }
2756
+ getI18NTranslations() {
2757
+ // Subscribe to language translation flag changes
2758
+ const translationSubscription = this.configSvc.languageTranslationFlag
2759
+ .pipe(takeUntil(this.destroySubject$)) // Ensure subscription is cleaned up on component destroy
2760
+ .subscribe({
2761
+ next: (data) => {
2762
+ // Only proceed if we have valid data
2763
+ if (data) {
2764
+ // Check if website language is set in localStorage
2765
+ const storedLanguage = localStorage.getItem('websiteLanguage');
2766
+ if (storedLanguage) {
2767
+ // Set default language as fallback
2768
+ this.translate.setDefaultLang('en');
2769
+ // Use the stored language preference
2770
+ this.translate.use(storedLanguage);
2771
+ }
2772
+ }
2773
+ },
2774
+ error: (error) => {
2775
+ // Log any errors that occur during subscription
2776
+ this.loggerSvc.error('Error in language translation subscription:', error);
2777
+ }
2778
+ });
2779
+ // Store subscription for cleanup (optional alternative to takeUntil)
2780
+ this.translationSubscription = translationSubscription;
2781
+ }
2782
+ getServerDateTime() {
2783
+ // Fetch the server date time and process the response
2784
+ this.tocSvc.getServerDate().subscribe((response) => {
2785
+ // Check if response contains valid system date
2786
+ if (response && response.systemDate) {
2787
+ // Update service with server date (removed duplicate call)
2788
+ this.tocSvc.changeServerDate(response.systemDate);
2789
+ this.serverDate = response.systemDate;
2790
+ }
2791
+ else {
2792
+ // Fallback to client's time if server time is not available
2793
+ const clientTime = new Date().getTime();
2794
+ this.tocSvc.changeServerDate(clientTime);
2795
+ this.serverDate = clientTime;
2796
+ }
2797
+ // Initialize dependent functions that need server date
2798
+ this.findACPB();
2799
+ this.getKarmapointsLimit();
2800
+ }, (error) => {
2801
+ // Log the error for debugging
2802
+ this.loggerSvc.error('Failed to get server date:', error);
2803
+ // Fallback to client's time on error
2804
+ const clientTime = new Date().getTime();
2805
+ this.tocSvc.changeServerDate(clientTime);
2806
+ this.serverDate = clientTime;
2807
+ });
2808
+ // Subscribe to server date changes from service
2809
+ this.serverDateSubscription = this.tocSvc.serverDate
2810
+ .pipe(takeUntil(this.destroySubject$)) // Ensure subscription is cleaned up
2811
+ .subscribe(serverDate => {
2812
+ this.serverDate = serverDate;
2813
+ });
2814
+ }
2815
+ get getBaseContentIdentifier() {
2816
+ return this.baseContentReadData?.identifier || this.content?.identifier || '';
2817
+ }
2818
+ get isMultilingual() {
2819
+ if (this.baseContentReadData && this.baseContentReadData.languageMapV1) {
2820
+ return this.languageList.length > 1;
2821
+ }
2822
+ return false;
2823
+ }
2824
+ handleEnrollment(event) {
2825
+ if (this.isMultilingual) {
2826
+ this.openLangDialog(event);
2827
+ }
2828
+ else {
2829
+ this.handleAutoBatchAssign();
2830
+ }
2831
+ }
2832
+ openLangDialog(_event) {
2833
+ const dialogRef = this.dialog.open(EnrollLanguageDialogueComponent, {
2834
+ width: '500px',
2835
+ height: 'auto',
2836
+ autoFocus: false,
2837
+ restoreFocus: false,
2838
+ data: {
2839
+ preSelect: this.selectedLanguage,
2840
+ languageList: this.languageList,
2841
+ }
2842
+ });
2843
+ dialogRef.afterClosed().subscribe((selectedLang) => {
2844
+ if (selectedLang) {
2845
+ this.selectedLanguage = selectedLang;
2846
+ this.handleAutoBatchAssign();
2847
+ }
2848
+ });
2849
+ }
2850
+ getResumeUrl(resourceData, batchId, primaryCategory) {
2851
+ let MLId = this.selectedLanguage?.identifier || '';
2852
+ let ML = this.selectedLanguage?.langId || '';
2853
+ let resumeDataUrl = viewerRouteGenerator(resourceData.identifier, resourceData.mimeType, this.isResource ? undefined : this.baseContentReadData && this.baseContentReadData?.identifier || '', this.isResource ? undefined : this.baseContentReadData && this.baseContentReadData?.contentType || '', this.forPreview, primaryCategory || 'Learning Resource', batchId || this.getBatchId(), this.baseContentReadData && this.baseContentReadData?.name || '', ML, MLId);
2854
+ return resumeDataUrl;
2855
+ }
2856
+ get contentCompletionPercent() {
2857
+ if (this.batchData?.enrolled) {
2858
+ if (this.contentReadData && this.contentReadData.primaryCategory === 'Course' && this.isMultilingual) {
2859
+ if (this.languageMapProgress && this.selectedLanguage?.langId && this.languageMapProgress[this.selectedLanguage?.langId]) {
2860
+ return this.languageMapProgress[this.selectedLanguage?.langId];
2861
+ }
2862
+ else {
2863
+ return 0;
2864
+ }
2865
+ }
2866
+ else {
2867
+ return this.content?.completionPercentage || 0;
2868
+ }
2869
+ }
2870
+ }
2871
+ checkForCompletionSurveyTrigger() {
2872
+ if (this.content && this.contentReadData) {
2873
+ // check if completion survey is enabled and user has completed the course before 23rd DEC 2023 (release date of completion survey)
2874
+ if (this.configSvc.instanceConfig && this.configSvc.instanceConfig.completionSurvey && this.configSvc.instanceConfig.completionSurvey.enabled &&
2875
+ this.enrolledCourseData && this.enrolledCourseData && this.enrolledCourseData.completedOn >= this.configSvc.instanceConfig.completionSurvey.startDate) {
2876
+ if ((this.content.completionStatus === 2 || this.content.completionPercentage === 100) && this.contentReadData.completionSurveyLink) {
2877
+ const sID = this.contentReadData.completionSurveyLink.split('surveys/');
2878
+ const surveyId = sID[1];
2879
+ const courseId = this.contentReadData.identifier;
2880
+ // Call API to see if survey is submitted or not
2881
+ this.tocSvc.getApllicationsById(surveyId, courseId).subscribe((res) => {
2882
+ if (res.result.response && Object.keys(res.result.response).length > 0) {
2883
+ this.lockCertificate = false;
2884
+ }
2885
+ else {
2886
+ this.lockCertificate = true;
2887
+ this.openCompletionSurveyFormPopup();
2888
+ }
2889
+ });
2890
+ }
2891
+ }
2892
+ }
2893
+ }
2894
+ // Clear existing survey data from local storage before opening popup
2895
+ clearExistingPublicSurveyData(surveyId, courseId) {
2896
+ const storageKey = `survey_${surveyId}_${courseId}`;
2897
+ if (localStorage.getItem(storageKey)) {
2898
+ localStorage.removeItem(storageKey);
2899
+ }
2900
+ }
2901
+ openPublicSurveyPopup(navigationUrl, queryParams) {
2902
+ // Get survey ID and course ID from environment and content data
2903
+ if (this.forPreview) {
2904
+ this.router.navigate([navigationUrl], { queryParams: queryParams });
2905
+ }
2906
+ else {
2907
+ const surveyId = this.environment.publicContentSurveyId || '';
2908
+ const courseId = this.contentReadData?.identifier || '';
2909
+ const courseName = this.contentReadData?.name || '';
2910
+ const contextOrgId = this.contentReadData?.createdFor && this.contentReadData?.createdFor.length > 0 ?
2911
+ this.contentReadData?.createdFor[0] : '';
2912
+ this.clearExistingPublicSurveyData(surveyId, courseId);
2913
+ const data = {
2914
+ surveyId: surveyId,
2915
+ courseId: courseId,
2916
+ courseName: courseName,
2917
+ contextOrgId: contextOrgId,
2918
+ forPreview: this.forPreview
2919
+ };
2920
+ const dialogRef = this.dialog.open(PublicSurveyFormComponent, {
2921
+ // disableClose: true,
2922
+ width: '750px',
2923
+ maxWidth: '90vw',
2924
+ height: '80vh',
2925
+ data: data,
2926
+ autoFocus: false,
2927
+ });
2928
+ dialogRef.afterClosed().subscribe((result) => {
2929
+ if (result) {
2930
+ // Navigate to the intended URL only when survey is submitted successfully
2931
+ if (navigationUrl) {
2932
+ this.router.navigate([navigationUrl], { queryParams: queryParams });
2933
+ }
2934
+ }
2935
+ });
2936
+ }
2937
+ }
2938
+ resumeContentData() {
2939
+ const navigationUrl = (this.resumeData && !this.certData) ? this.resumeDataLink?.url : this.firstResourceLink?.url;
2940
+ const queryParams = (this.resumeData && !this.certData) ? this.generateQuery('RESUME') : this.generateQuery('START');
2941
+ this.router.navigate([navigationUrl], { queryParams: queryParams });
2942
+ }
2943
+ /**
2944
+ * Check if user can enroll in the course
2945
+ * Returns true when enrollment is allowed
2946
+ */
2947
+ navigateToNewVersion() {
2948
+ this.router.navigateByUrl('/app/toc', { skipLocationChange: true }).then(() => {
2949
+ this.router.navigate([`app/toc/${this.contentReadData?.contentVersionInfo?.identifier}/overview`]);
2950
+ });
2951
+ }
2952
+ canEnroll() {
2953
+ if (this.contentReadData && this.contentReadData.lastEnrollmentDate) {
2954
+ const serverTime = dayjs(this.serverDate).format('YYYY-MM-DD');
2955
+ const eDate = dayjs(this.contentReadData.lastEnrollmentDate).format('YYYY-MM-DD');
2956
+ if (dayjs(serverTime).isSameOrBefore(eDate)) {
2957
+ return true;
2958
+ }
2959
+ else {
2960
+ return false;
2961
+ }
2962
+ }
2963
+ else {
2964
+ return true;
2965
+ }
2966
+ }
2967
+ goBack() {
2968
+ this.location.back();
2969
+ }
2970
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeV2Component, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.WidgetContentService }, { token: i3.AppTocService }, { token: i4.LoggerService }, { token: i4.ConfigurationsService }, { token: i5.DomSanitizer }, { token: i6.MatLegacySnackBar }, { token: i7.MatLegacyDialog }, { token: i8.MobileAppsService }, { token: i4.UtilityService }, { token: i9.ContentLanguageService }, { token: i10.ActionService }, { token: i11.ViewerUtilService }, { token: i12.RatingService }, { token: i4.TelemetryService }, { token: i13.TranslateService }, { token: i4.MultilingualTranslationsService }, { token: i4.EventService }, { token: i14.LoadCheckService }, { token: i15.HandleClaimService }, { token: i16.ResetRatingsService }, { token: i17.TimerService }, { token: i4.WidgetEnrollService }, { token: i9.WidgetContentLibService }, { token: i4.DataTransferService }, { token: i18.MatSnackBar }, { token: i9.WidgetUserServiceLib }, { token: i19.NetCoreService }, { token: i20.AppTocV2Service }, { token: i21.Location }, { token: i4.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
2971
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeV2Component, selector: "ws-app-app-toc-home-v2", inputs: { forPreview: "forPreview", inputContent: "inputContent", displayViewBtn: "displayViewBtn" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"mobile-back-btn\" (click)=\"goBack()\">\n <mat-icon class=\"text-white\">arrow_back</mat-icon>\n </div>\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <ng-container *ngIf=\"displayViewBtn\">\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n </ng-container>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}@media screen and (max-width: 576px){.toc-banner .banner-details{padding-top:10px;padding-bottom:20px}}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.mobile-back-btn{display:flex!important;align-items:center;justify-content:flex-start;cursor:pointer;padding:0;margin-bottom:8px;color:#fff!important}.mobile-back-btn mat-icon{font-size:24px!important;width:24px!important;height:24px!important}@media screen and (min-width: 577px){.mobile-back-btn{display:none!important}}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}@media (min-resolution: 1.5dppx){.toc-content{max-width:735px}}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i21.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i21.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i21.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i21.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i21.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i22.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i23.MatLegacyButton, 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"] }, { kind: "component", type: i24.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i24.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i25.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i25.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i26.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i26.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i27.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i28.ContentProgressComponent, selector: "ws-widget-content-progress", inputs: ["contentId", "progress", "progressType", "forPreview", "className", "customClassName"] }, { kind: "component", type: i29.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i30.ContentTocComponent, selector: "ws-widget-content-toc", inputs: ["content", "contentReadData", "initialRouteData", "changeTab", "baseContentReadData", "forPreview", "contentTabFlag", "resumeData", "batchData", "skeletonLoader", "tocStructure", "pathSet", "fromViewer", "hierarchyMapData", "condition", "kparray", "selectedBatchData", "config", "componentName", "isEnrolled", "playResourceId", "sideNavBarOpened", "languageList", "lockCertificate", "fromMDO"], outputs: ["playResumeForAI", "enrollUserToAI", "trigerCompletionSurveyForm", "resumeContent"] }, { kind: "component", type: i31.ShareTocComponent, selector: "ws-app-share-toc", inputs: ["rootOrgId", "content", "contentLink", "baseContentReadData"], outputs: ["resetEnableShare"] }, { kind: "component", type: i32.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i33.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "component", type: i34.TipsForLearnerCardComponent, selector: "ws-widget-tips-for-learner-card", inputs: ["learnAdvisoryData"] }, { kind: "component", type: i35.AppTocBannerComponent, selector: "ws-app-toc-banner", inputs: ["banners", "content", "resumeData", "analytics", "forPreview", "batchData", "userEnrollmentList", "contentReadData", "clickToShare"], outputs: ["withdrawOrEnroll", "programEnrollCall"] }, { kind: "pipe", type: i21.SlicePipe, name: "slice" }, { kind: "pipe", type: i21.DatePipe, name: "date" }, { kind: "pipe", type: i4.PipeCountTransformPipe, name: "pipeCountTransform" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
2972
+ }
2973
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeV2Component, decorators: [{
2974
+ type: Component,
2975
+ args: [{ selector: 'ws-app-app-toc-home-v2', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"mobile-back-btn\" (click)=\"goBack()\">\n <mat-icon class=\"text-white\">arrow_back</mat-icon>\n </div>\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <ng-container *ngIf=\"displayViewBtn\">\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n </ng-container>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}@media screen and (max-width: 576px){.toc-banner .banner-details{padding-top:10px;padding-bottom:20px}}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.mobile-back-btn{display:flex!important;align-items:center;justify-content:flex-start;cursor:pointer;padding:0;margin-bottom:8px;color:#fff!important}.mobile-back-btn mat-icon{font-size:24px!important;width:24px!important;height:24px!important}@media screen and (min-width: 577px){.mobile-back-btn{display:none!important}}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}@media (min-resolution: 1.5dppx){.toc-content{max-width:735px}}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"] }]
2976
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.WidgetContentService }, { type: i3.AppTocService }, { type: i4.LoggerService }, { type: i4.ConfigurationsService }, { type: i5.DomSanitizer }, { type: i6.MatLegacySnackBar }, { type: i7.MatLegacyDialog }, { type: i8.MobileAppsService }, { type: i4.UtilityService }, { type: i9.ContentLanguageService }, { type: i10.ActionService }, { type: i11.ViewerUtilService }, { type: i12.RatingService }, { type: i4.TelemetryService }, { type: i13.TranslateService }, { type: i4.MultilingualTranslationsService }, { type: i4.EventService }, { type: i14.LoadCheckService }, { type: i15.HandleClaimService }, { type: i16.ResetRatingsService }, { type: i17.TimerService }, { type: i4.WidgetEnrollService }, { type: i9.WidgetContentLibService }, { type: i4.DataTransferService }, { type: i18.MatSnackBar }, { type: i9.WidgetUserServiceLib }, { type: i19.NetCoreService }, { type: i20.AppTocV2Service }, { type: i21.Location }, { type: i4.DomainConfService }, { type: undefined, decorators: [{
2977
+ type: Inject,
2978
+ args: ['environment']
2979
+ }] }]; }, propDecorators: { forPreview: [{
2980
+ type: Input
2981
+ }], inputContent: [{
2982
+ type: Input
2983
+ }], displayViewBtn: [{
2984
+ type: Input
2985
+ }], menuElement: [{
2986
+ type: ViewChild,
2987
+ args: ['stickyMenu', { static: true }]
2988
+ }], rcElement: [{
2989
+ type: ViewChild,
2990
+ args: ['rightContainer']
2991
+ }], bannerElem: [{
2992
+ type: ViewChild,
2993
+ args: ['bannerDetails', { static: true }]
2994
+ }], contentSource: [{
2995
+ type: ViewChild,
2996
+ args: ['contentSource']
2997
+ }], handleScroll: [{
2998
+ type: HostListener,
2999
+ args: ['window:scroll', ['$event']]
3000
+ }] } });
3001
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS12Mi9hcHAtdG9jLWhvbWUtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lLXYyL2FwcC10b2MtaG9tZS12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUM3RCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUE7QUFHdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUVoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUV4RSxPQUFPLEVBSWdDLFFBQVEs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ZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDaEIsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQXNDMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsXG4gIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsXG4gIEluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgU2FmZUh0bWwsIERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBFdmVudCwgRGF0YSwgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG4vLyBpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHNoYXJlLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXG5cbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZUdlbmVyYXRvciB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy92aWV3ZXItcm91dGUtdXRpbCdcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSwgRGF0YVRyYW5zZmVyU2VydmljZSwgRG9tYWluQ29uZlNlcnZpY2UsIEV2ZW50U2VydmljZSxcbiAgTG9nZ2VyU2VydmljZSwgTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgTnNQYWdlLCBURmV0Y2hTdGF0dXMsIFRlbGVtZXRyeVNlcnZpY2UsXG4gIFV0aWxpdHlTZXJ2aWNlLCBXaWRnZXRFbnJvbGxTZXJ2aWNlLCBXc0V2ZW50cyxcbn0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXG5cbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwgQ29udGVudExhbmd1YWdlU2VydmljZSwgVE9DTXVsdGlMaW5ndWFsRGlhbG9nQ29tcG9uZW50LCBXaWRnZXRDb250ZW50TGliU2VydmljZSwgV2lkZ2V0VXNlclNlcnZpY2VMaWIgfSBmcm9tICdAc3VuYmlyZC1jYi9jb25zdW1wdGlvbidcbmltcG9ydCB7IE5zQXBwVG9jIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgSGFuZGxlQ2xhaW1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9jb250ZW50LXNlcnZpY2VzL2hhbmRsZS1jbGFpbS5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjdGlvbi5zZXJ2aWNlJ1xuaW1wb3J0IHsgUmF0aW5nU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy9yYXRpbmcuc2VydmljZSdcbmltcG9ydCB7IFZpZXdlclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlld2VyLXV0aWwuc2VydmljZSdcbmltcG9ydCB7IExvYWRDaGVja1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkLWNoZWNrLnNlcnZpY2UnXG5pbXBvcnQgeyBSZXNldFJhdGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzZXQtcmF0aW5ncy5zZXJ2aWNlJ1xuXG5pbXBvcnQgeyBBcHBUb2NEaWFsb2dJbnRyb1ZpZGVvQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwLXRvYy1kaWFsb2ctaW50cm8tdmlkZW8vYXBwLXRvYy1kaWFsb2ctaW50cm8tdmlkZW8uY29tcG9uZW50J1xuaW1wb3J0IHsgQ29udGVudFJhdGluZ1YyRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXJhdGluZy12Mi1kaWFsb2cvY29udGVudC1yYXRpbmctdjItZGlhbG9nLmNvbXBvbmVudCdcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpbWVyLnNlcnZpY2UnXG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZydcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIGFzIE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcidcbmltcG9ydCB7IE1hdFNuYWNrQmFyIGFzIE1hdFNuYWNrYmFyTmV3IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJ1xuaW1wb3J0IHsgTmV0Q29yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZXRjb3JlLnNlcnZpY2UnXG5pbXBvcnQgeyBFbnJvbGxMYW5ndWFnZURpYWxvZ3VlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW5yb2xsLWxhbmd1YWdlLWRpYWxvZ3VlL2Vucm9sbC1sYW5ndWFnZS1kaWFsb2d1ZS5jb21wb25lbnQnXG5pbXBvcnQgeyBDb21wbGV0aW9uU3VydmV5Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBsZXRpb24tc3VydmV5LWZvcm0vY29tcGxldGlvbi1zdXJ2ZXktZm9ybS5jb21wb25lbnQnXG5pbXBvcnQgeyBQdWJsaWNTdXJ2ZXlGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vcHVibGljLXN1cnZleS1mb3JtL3B1YmxpYy1zdXJ2ZXktZm9ybS5jb21wb25lbnQnXG5pbXBvcnQgeyBOc0NhcmRDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhcmQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IE5vblJlbGV2ZW50RmVlZGJhY2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9ub24tcmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cuY29tcG9uZW50J1xuaW1wb3J0IHsgQXBwVG9jVjJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLXRvYy12Mi5zZXJ2aWNlJ1xuXG5leHBvcnQgZW51bSBFcnJvclR5cGUge1xuICBpbnRlcm5hbFNlcnZlciA9ICdpbnRlcm5hbFNlcnZlcicsXG4gIHNlcnZpY2VVbmF2YWlsYWJsZSA9ICdzZXJ2aWNlVW5hdmFpbGFibGUnLFxuICBzb21ldGhpbmdXcm9uZyA9ICdzb21ldGhpbmdXcm9uZycsXG59XG5cbmNvbnN0IGZsYXR0ZW5JdGVtcyA9IChpdGVtczogYW55W10sIGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGZsYXR0ZW5lZEl0ZW1zLCBpdGVtKSA9PiB7XG4gICAgZmxhdHRlbmVkSXRlbXMucHVzaChpdGVtKVxuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSkpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgZmxhdHRlbmVkSXRlbXMgPSBmbGF0dGVuZWRJdGVtcy5jb25jYXQoZmxhdHRlbkl0ZW1zKGl0ZW1ba2V5XSwga2V5KSlcbiAgICB9XG4gICAgcmV0dXJuIGZsYXR0ZW5lZEl0ZW1zXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIH0sIFtdKVxufVxuY29uc3QgU05BQ0tCQVJfRFVSQVRJT04gPSAzMDAwXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy1hcHAtYXBwLXRvYy1ob21lLXYyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC10b2MtaG9tZS12Mi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtaG9tZS12Mi5jb21wb25lbnQuc2NzcyddLFxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHVzZS1jb21wb25lbnQtdmlldy1lbmNhcHN1bGF0aW9uXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEFwcFRvY0hvbWVWMkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0IHtcbiAgcXVlcnlQYXJhbXNEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307IC8vIEluaXRpYWxpemUgcXVlcnlQYXJhbXNEYXRhXG4gIHNob3cgPSBmYWxzZVxuICBjaGFuZ2VUYWIgPSBmYWxzZVxuICBza2VsZXRvbkxvYWRlciA9IHRydWVcbiAgYmFubmVyczogTnNBcHBUb2MuSVRvY0Jhbm5lciB8IG51bGwgPSBudWxsXG4gIHNob3dNb3JlR2xhbmNlID0gZmFsc2VcbiAgY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgY29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBiYXNlQ29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGE6IGFueSA9IG51bGxcbiAgbnNDYXJkQ29udGVudERhdGE6IGFueSA9IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0XG4gIGJhdGNoRGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSB8IG51bGwgPSBudWxsXG4gIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICB1c2VyRW5yb2xsbWVudExpc3QhOiBOc0NvbnRlbnQuSUNvdXJzZVtdXG4gIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBwYWdlTmF2YmFyOiBQYXJ0aWFsPE5zUGFnZS5JTmF2QmFja2dyb3VuZD4gPSB0aGlzLmNvbmZpZ1N2Yy5wYWdlTmF2QmFyXG4gIGlzQ29ob3J0c1Jlc3RyaWN0ZWQgPSBmYWxzZVxuICBzdGlja3kgPSBmYWxzZVxuICBpc0luSWZyYW1lID0gZmFsc2VcbiAgY2JQbGFuRW5kRGF0ZTogYW55XG4gIGNiUGxhbkR1cmF0aW9uOiBhbnlcbiAgZW5yb2xsZWRDb3Vyc2VEYXRhOiBhbnlcbiAgQElucHV0KCkgZm9yUHJldmlldzogYW55ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9hdXRob3IvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wcmV2aWV3LycpXG4gIEBJbnB1dCgpIGlucHV0Q29udGVudDogYW55XG4gIEBJbnB1dCgpIGRpc3BsYXlWaWV3QnRuOiBhbnkgPSB0cnVlXG4gIC8vIGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICBhbmFseXRpY3MgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGE/LnBhZ2VEYXRhPy5kYXRhPy5hbmFseXRpY3NcbiAgZXJyb3JXaWRnZXREYXRhOiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoVHlwZWREYXRhPGFueT4gPSB7XG4gICAgd2lkZ2V0VHlwZTogJ2Vycm9yUmVzb2x2ZXInLFxuICAgIHdpZGdldFN1YlR5cGU6ICdlcnJvclJlc29sdmVyJyxcbiAgICB3aWRnZXREYXRhOiB7XG4gICAgICBlcnJvclR5cGU6ICdpbnRlcm5hbFNlcnZlcicsXG4gICAgfSxcbiAgfVxuICBpc0F1dGhvciA9IGZhbHNlXG4gIGF1dGhvckJ0bldpZGdldDogTnNQYWdlLklOYXZMaW5rID0ge1xuICAgIGFjdGlvbkJ0bklkOiAnZmVhdHVyZV9hdXRob3JpbmcnLFxuICAgIGNvbmZpZzoge1xuICAgICAgdHlwZTogJ21hdC1idXR0b24nLFxuICAgIH0sXG4gIH1cbiAgdG9jQ29uZmlnOiBhbnkgPSBudWxsXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIGNvdXJzZUNhdGVnb3J5ID0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeVxuICBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzID0gTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1TdGF0dXNcbiAgYXNrQXV0aG9yRW5hYmxlZCA9IHRydWVcbiAgdHJhaW5pbmdMSHViRW5hYmxlZCA9IGZhbHNlXG4gIHRyYWluaW5nTEh1YkNvdW50JD86IE9ic2VydmFibGU8bnVtYmVyPlxuICBib2R5OiBTYWZlSHRtbCB8IG51bGwgPSBudWxsXG4gIHZpZXdNb3JlUmVsYXRlZFRvcGljcyA9IGZhbHNlXG4gIGhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXG4gIHRvY1N0cnVjdHVyZTogTnNBcHBUb2MuSVRvY1N0cnVjdHVyZSB8IG51bGwgPSBudWxsXG4gIGNvbnRlbnRQYXJlbnRzOiB7IFtrZXk6IHN0cmluZ106IE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVzcG9uc2VbXSB9ID0ge31cbiAgb2JqS2V5cyA9IE9iamVjdC5rZXlzXG4gIGZyYWdtZW50ITogc3RyaW5nXG4gIGFjdGl2ZUZyYWdtZW50ID0gdGhpcy5yb3V0ZS5mcmFnbWVudC5waXBlKHNoYXJlKCkpXG4gIGN1cnJlbnRGcmFnbWVudCA9ICdvdmVydmlldydcbiAgc2hvd1Njcm9sbCE6IGJvb2xlYW5cbiAgc2hvd1Njcm9sbEhlaWdodCA9IDMwMFxuICBoaWRlU2Nyb2xsSGVpZ2h0ID0gMTBcbiAgZWxlbWVudFBvc2l0aW9uOiBhbnlcbiAgYmF0Y2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGJhdGNoRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgdHJhbnNsYXRpb25TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBAVmlld0NoaWxkKCdzdGlja3lNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgbWVudUVsZW1lbnQhOiBFbGVtZW50UmVmXG4gIGJhdGNoQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gIGNvbnRlbnRQcm9ncmVzcyA9IDBcbiAgYmFubmVyVXJsOiBTYWZlU3R5bGUgfCBudWxsID0gbnVsbFxuICByb3V0ZVBhdGggPSAnb3ZlcnZpZXcnXG4gIHZhbGlkUGF0aHMgPSBuZXcgU2V0KFsnb3ZlcnZpZXcnLCAnY29udGVudHMnLCAnYW5hbHl0aWNzJ10pXG4gIHJvdXRlclBhcmFtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBpbml0aWFscm91dGVEYXRhOiBhbnlcbiAgYWN0aW9uQnRuU3RhdHVzID0gJ3dhaXQnXG4gIGlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gZmFsc2VcbiAgc2hvd0ludHJhbmV0TWVzc2FnZSA9IGZhbHNlXG4gIGZpcnN0UmVzb3VyY2VMaW5rOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxuICBjZXJ0RGF0YTogYW55ID0gbnVsbFxuICBzaG93VGFrZUFzc2Vzc21lbnQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudCB8IG51bGwgPSBudWxsXG4gIGNoZWNrUmVnaXN0cmF0aW9uU291cmNlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnU2tpbGxTb2Z0IERpZ2l0YWxpemF0aW9uJyxcbiAgICAnU2tpbGxTb2Z0IExlYWRlcnNoaXAnLFxuICAgICdQbHVyYWxzaWdodCcsXG4gIF0pXG4gIGV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgcmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gIGlzR29hbHNFbmFibGVkID0gZmFsc2VcbiAgY29udGV4dElkPzogc3RyaW5nXG4gIGNvbnRleHRQYXRoPzogc3RyaW5nXG4gIGRlZmF1bHRTTG9nbyA9ICcnXG4gIGRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICBpc0Fzc2Vzc1Zpc2libGUgPSBmYWxzZVxuICBpc1ByYWN0aWNlVmlzaWJsZSA9IGZhbHNlXG4gIGNlcnRpZmljYXRlT3BlbiA9IGZhbHNlXG4gIGJyZWFkY3J1bWJzOiBhbnlcbiAgaGlzdG9yeURhdGE6IGFueVxuICBjb3Vyc2VDb21wbGV0ZVN0YXRlID0gMlxuICB1c2VySWQ6IGFueVxuICB1c2VyUmF0aW5nOiBhbnlcbiAgZGFrc2h0YU5hbWUgPSB0aGlzLmVudmlyb25tZW50LmRha3NodGFOYW1lXG4gIGNzY21zVXJsID0gdGhpcy5lbnZpcm9ubWVudC5jc2Ntc1VybFxuICBzaG93QnRuID0gZmFsc2VcbiAgY2hhbm5lbElkOiBhbnlcbiAgc2VsZWN0ZWRCYXRjaERhdGE6IGFueVxuICBzZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uOiBhbnlcbiAgc2VydmVyRGF0ZVN1YnNjcmlwdGlvbjogYW55XG4gIHNlcnZlckRhdGU6IGFueVxuICBrcGFycmF5OiBhbnkgPSBbXVxuICBlbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgaXNBY2JwQ291cnNlID0gZmFsc2VcbiAgaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICBjb3Vyc2VJRDogYW55XG4gIGlzQ2xhaW1lZCA9IGZhbHNlXG4gIG1vbnRobHlDYXBFeGNlZWQgPSBmYWxzZVxuICBpc0NvbXBsZXRlZFRoaXNNb250aCA9IGZhbHNlXG4gIHN0YXJ0RGF0ZTogYW55XG4gIGVuZERhdGU6IGFueVxuICBzdGFydERhdGVEaWZmZXJlbmNlOiBhbnlcbiAgZW5kRGF0ZURpZmZlcmVuY2U6IGFueVxuICBAVmlld0NoaWxkKCdyaWdodENvbnRhaW5lcicpIHJjRWxlbWVudCE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnYmFubmVyRGV0YWlscycsIHsgc3RhdGljOiB0cnVlIH0pIGJhbm5lckVsZW0hOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRTb3VyY2UnKSBjb250ZW50U291cmNlITogRWxlbWVudFJlZlxuICBzb3VyY2VFbGxpcHNpcyA9IGZhbHNlXG4gIHNjcm9sbExpbWl0ID0gMFxuICByY0VsZW0gPSB7XG4gICAgb2ZmU2V0VG9wOiAwLFxuICAgIEJvdHRvbVBvczogMCxcbiAgfVxuICBzY3JvbGxlZCA9IGZhbHNlXG4gIHBhdGhTZXQgPSBuZXcgU2V0KClcbiAgY2FuU2hhcmUgPSBmYWxzZVxuICBlbmFibGVTaGFyZSA9IGZhbHNlXG4gIHJvb3RPcmdJZDogYW55XG4gIGNlcnRJZDogYW55XG4gIG1vYmlsZTEyMDA6IGFueVxuICBhc3Nlc3NtZW50U3RyaXA6IGFueVxuICBsZWFybkFkdmlzb3J5RGF0YTogYW55XG4gIGNvbnRlbnRDcmVhdG9yRGF0YTogYW55ID0gW11cbiAgLy8gcmFuZG9tbGVhcm5BZHZpc29yeU9iajogYW55XG4gIC8vIGxlYXJuQWR2aXNvcnlEYXRhTGVuZ3RoOiBhbnlcblxuICBwcml2YXRlIGRlc3Ryb3lTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICB0aW1lclVuc3Vic2NyaWJlOiBhbnlcbiAgdGltZXI6IGFueVxuICBpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXG4gIFNBS1NIQU1BSV9JQ09OX05PUk1BTCA9ICcvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvYWktaWNvbi5zdmcnXG4gIFNBS1NIQU1BSV9JQ09OX0xPQURFUiA9ICcvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvc2Frc2hhbV9haV9sb2FkZXIuZ2lmJ1xuICByZWNvbW1lbmRlZENvdXJzZXNJZCA9ICcnXG4gIGZlZWRiYWNrR2l2ZW46IGFueVxuICBwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gIGZyb21BSVR1dG9yID0gZmFsc2VcbiAgbGFuZ3VhZ2VMaXN0OiBhbnkgPSBbXVxuICBzZWxlY3RlZExhbmd1YWdlOiBhbnlcbiAgbGFuZ3VhZ2VNYXBQcm9ncmVzczogYW55XG4gIHByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWc6IGFueSA9IGZhbHNlXG4gIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIHByaXZhdGUgbGFzdFByb2dyZXNzUmVmcmVzaFRpbWU6IG51bWJlciA9IDBcbiAgcHJpdmF0ZSBpc1JlZnJlc2hpbmdQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICBoYW5kbGVTY3JvbGwoKSB7XG4gICAgY29uc3Qgd2luZG93U2Nyb2xsID0gd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgaWYgKHdpbmRvd1Njcm9sbCA+PSB0aGlzLmVsZW1lbnRQb3NpdGlvbiAtIDEwMCkge1xuICAgICAgdGhpcy5zdGlja3kgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgaWYgKCh3aW5kb3cuc2Nyb2xsWSArIHRoaXMucmNFbGVtLkJvdHRvbVBvcykgPj0gdGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0aWNreSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJjRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIzNi4uLiAoT2Zmc2V0VG9wIG9mIHJpZ2h0IGNvbnRhaW5lciArIDEwNClcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAodGhpcy5yY0VsZW0ub2ZmU2V0VG9wICsgMTA0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2JpbGVBcHBzU3ZjOiBNb2JpbGVBcHBzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgcHJvZ3Jlc3NTdmM6IENvbnRlbnRQcm9ncmVzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblNWQzogQWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHZpZXdlclN2YzogVmlld2VyVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByYXRpbmdTdmM6IFJhdGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZWxlbWV0cnlTZXJ2aWNlOiBUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3RyYW5zbGF0aW9uczogTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgbWF0U25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgbG9hZENoZWNrU2VydmljZTogTG9hZENoZWNrU2VydmljZSxcbiAgICBwcml2YXRlIGhhbmRsZUNsYWltU2VydmljZTogSGFuZGxlQ2xhaW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzZXRSYXRpbmdzU2VydmljZTogUmVzZXRSYXRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVyU2VydmljZTogVGltZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBlbnJvbGxTdmM6IFdpZGdldEVucm9sbFNlcnZpY2UsXG4gICAgcHVibGljIGNvbnRlbnRMaWJTdmM6IFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBkYXRhVHJhbnNmZXJTdmM6IERhdGFUcmFuc2ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXRTbmFja2Jhck5ldzogTWF0U25hY2tiYXJOZXcsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZUxpYjogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHVibGljIG5ldENvcmVTZXJ2aWNlOiBOZXRDb3JlU2VydmljZSxcbiAgICBwdWJsaWMgYXBwVG9jVjJTdmM6IEFwcFRvY1YyU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwdWJsaWMgZG9tYWluQ29uZlN2YzogRG9tYWluQ29uZlNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwdWJsaWMgZW52aXJvbm1lbnQ6IGFueVxuICApIHtcbiAgICB0aGlzLmhpc3RvcnlEYXRhID0gaGlzdG9yeS5zdGF0ZVxuICAgIHRoaXMuaGFuZGxlQnJlYWRjcnVtYnMoKVxuICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5tb2JpbGVUb3BIZWFkZXJWaXNpYmlsaXR5U3RhdHVzLm5leHQodHJ1ZSlcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgIH1cblxuICAgIHRoaXMubG9hZENoZWNrU2VydmljZS5jaGlsZENvbXBvbmVudExvYWRlZCQuc3Vic2NyaWJlKF9pc0xvYWRlZCA9PiB7XG4gICAgICAvLyBQcmVzZW50IGluIGFwcC10b2MtYWJvdXQuY29tcG9uZW50XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbmdzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSBhcyBhbnlcbiAgICAgICAgICBpZiAocmF0aW5nc0Rpdikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMaW1pdCA9IHJhdGluZ3NEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIGFzIGFueVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgNTAwKVxuICAgICAgfVxuXG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSkge1xuICAgICAgICBjb25zdCBjb250ZW50RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSBhcyBhbnlcbiAgICAgICAgaWYgKGNvbnRlbnREaXYpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbExpbWl0ID0gY29udGVudERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gYXMgYW55XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5oYW5kbGVDbGFpbVNlcnZpY2UuZ2V0Q2xhaW1EYXRhKCkuc3Vic2NyaWJlKChfZXZlbnREYXRhOiBhbnkpID0+IHtcbiAgICAgIHRoaXMub25DbGlja09mQ2xhaW0oX2V2ZW50RGF0YSlcbiAgICB9KVxuICB9XG5cbiAgZ2V0S2FybWFwb2ludHNMaW1pdCgpIHtcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLnVzZXJLYXJtYVBvaW50cygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMua3BMaXN0KSB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IHJlcy5rcExpc3QuYWRkaW5mb1xuICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRobHlDYXBFeGNlZWQgPSBKU09OLnBhcnNlKGluZm8pLmNsYWltZWROb25BQ0JQQ291cnNlS2FybWFRdW90YSA+PSA0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKSB7XG4gICAgY29uc3Qgbm93ID0gbW9tZW50KHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBjb25zdCBjb3Vyc2VEYXRhID0gdGhpcy5lbnJvbGxlZENvdXJzZURhdGFcbiAgICAgIGlmIChjb3Vyc2VEYXRhICYmIGNvdXJzZURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCAmJiBjb3Vyc2VEYXRhLmNvbXBsZXRlZE9uKSB7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZE9uID0gbW9tZW50KGNvdXJzZURhdGEuY29tcGxldGVkT24pLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZE1vbnRoID0gbW9tZW50KGNvbXBsZXRlZE9uLCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9tZW50KG5vdywgJ1lZWVktTU0tREQnKS5tb250aCgpXG4gICAgICAgIHRoaXMuaXNDb21wbGV0ZWRUaGlzTW9udGggPSBjb21wbGV0ZWRNb250aCA9PT0gY3VycmVudE1vbnRoXG4gICAgICAgIHRoaXMuY29udGVudFsndmlld01vcmUnXSA9IGZhbHNlXG4gICAgICAgIHRoaXMuY29udGVudFsnY29tcGxldGVkT24nXSA9IGNvdXJzZURhdGEuY29tcGxldGVkT25cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaWx0ZXJlZEFjYnBMaXN0KHJlczogYW55KSB7XG4gICAgcmV0dXJuIHJlcy5maWx0ZXIoKHY6IGFueSkgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmNvdXJzZUlEKVxuICB9XG5cbiAgZmluZEFDUEIoKSB7XG4gICAgY29uc3QgbG9jYWxDYnAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2JwRGF0YScpXG4gICAgaWYgKGxvY2FsQ2JwKSB7XG4gICAgICBjb25zdCBzdG9yZWFnZUNicCA9IEpTT04ucGFyc2UobG9jYWxDYnApXG4gICAgICBjb25zdCBjYnAgPSB0aGlzLmZpbHRlcmVkQWNicExpc3Qoc3RvcmVhZ2VDYnApXG4gICAgICBpZiAoY2JwLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhY2JwID0gJ2NiUGxhbidcbiAgICAgICAgdGhpcy5jYlBsYW5FbmREYXRlID0gY2JwWzBdLmVuZERhdGVcbiAgICAgICAgY29uc3Qgc0RhdGUgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGRheXNDb3VudCA9IGRheWpzKHRoaXMuY2JQbGFuRW5kRGF0ZSkuZGlmZih0aGlzLnNlcnZlckRhdGUsICdkYXknKVxuICAgICAgICB0aGlzLmNiUGxhbkR1cmF0aW9uID0gZGF5c0NvdW50IDwgMCA/IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUgOiBkYXlzQ291bnQgPiAyOVxuICAgICAgICAgID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuU1VDQ0VTUyA6IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0LlVQQ09NSU5HXG4gICAgICAgIGlmIChhY2JwICYmIHRoaXMuY2JQbGFuRW5kRGF0ZSAmJiBhY2JwID09PSAnY2JQbGFuJykge1xuICAgICAgICAgIHRoaXMuaXNBY2JwQ291cnNlID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGVEYXRlID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgIGlmIChkYXlqcyhzRGF0ZSkuaXNTYW1lT3JCZWZvcmUoZURhdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0T2JqID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAgICAgY29udGV4dFR5cGU6ICdDb3Vyc2UnLFxuICAgICAgICAgICAgICAgICAgY29udGV4dElkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRTdmMuZ2V0Q291cnNlS2FybWFQb2ludHMocmVxdWVzdE9iaikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSByZXMua3BMaXN0XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5hZGRpbmZvKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoSlNPTi5wYXJzZShyb3cuYWRkaW5mbykuQUNCUCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsYWltZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlVGVsZW1ldGVyeUZvclByb3ZpZGVyKHByb3ZpZGVyTmFtZTogc3RyaW5nLCBwcml2aWRlcklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBpZDogJ2J0bi1wcm92aWRlcicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogcHJvdmlkZXJOYW1lLFxuICAgICAgICB0eXBlOiBwcml2aWRlcklkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfSlcblxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnkoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2thcm1hcG9pbnRzLWNsYWltJyxcbiAgICAgICAgaWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgICAgdHlwZTogJ2NvdXJzZScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tYWNicC1jbGFpbScsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuS0FSTUFQT0lOVFMsXG4gICAgICB9KVxuICB9XG5cbiAgb25DbGlja09mQ2xhaW0oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB1c2VySWQ6IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLFxuICAgICAgY291cnNlSWQ6IHRoaXMuY291cnNlSUQsXG4gICAgfVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnkoKVxuICAgIHRoaXMuY29udGVudFN2Yy5jbGFpbUthcm1hcG9pbnRzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaXNDbGFpbWVkID0gdHJ1ZVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0thcm1hIHBvaW50cyBhcmUgc3VjY2Vzc2Z1bGx5IGNsYWltZWQuJylcbiAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdzb21ldGhpbmcgd2VudCB3cm9uZy4nKVxuICAgIH0pXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMucmNFbGVtZW50KSB7XG4gICAgICB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCArIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICB0aGlzLnJjRWxlbS5vZmZTZXRUb3AgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcFxuICAgIH1cbiAgICAvLyBHZXQgVGltZSBmb3IgdGhlIGJhdGNoXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlID0gdGhpcy50aW1lclNlcnZpY2UuZ2V0VGltZXJEYXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfdGltZXI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVyID0gX3RpbWVyXG4gICAgICB9KVxuICB9XG5cbiAgaGFuZGxlQnJlYWRjcnVtYnMoKSB7XG4gICAgaWYgKHRoaXMuaGlzdG9yeURhdGEpIHtcbiAgICAgIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdTZWFyY2gnKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaHVybCA9IGAvYXBwL2dsb2JhbHNlYXJjaGBcbiAgICAgICAgY29uc3QgcVBhcmFtID0ge1xuICAgICAgICAgIHE6IHRoaXMuaGlzdG9yeURhdGEucGFyYW0sXG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogJ1NlYXJjaCcsIHVybDogc2VhcmNodXJsLCBxdWVyeVBhcmFtczogcVBhcmFtIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdjb21wZXRlbmN5LWRldGFpbHMnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVXJsID0gYC9hcHAvbGVhcm4vYnJvd3NlLWJ5L2NvbXBldGVuY3kvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IHRoaXMuaGlzdG9yeURhdGEucGFyYW0sIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2FsbC1DQlAnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVVJMID0gYC9hcHAvbGVhcm4vYnJvd3NlLWJ5L3Byb3ZpZGVyLyR7dGhpcy5oaXN0b3J5RGF0YS5wYXJhbX1gXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiBgYWxsIENCUCdzYCwgdXJsOiBmaW5hbFVSTCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLWNvbXBldGVuY2llcycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS9hbGwtY29tcGV0ZW5jaWVzYFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogJ2FsbCBjb21wZXRlbmNpZXMnLCB1cmw6IGZpbmFsVXJsIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdjdXJhdGVkQ29sbGVjdGlvbnMnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVXJsID0gYC9hcHAvY3VyYXRlZENvbGxlY3Rpb25zL2hvbWVgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnY3VyYXRlZCBjb2xsZWN0aW9ucycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnTGVhcm4nLCB1cmw6ICcvcGFnZS9sZWFybicsIGljb246ICdzY2hvb2wnIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZnJhZ21lbnQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgZG9jdW1lbnQhLnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuZnJhZ21lbnR9YCkhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IDgwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxuXG4gIGdldCBlbmFibGVBbmFseXRpY3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgcmV0dXJuICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCd0b2NBbmFseXRpY3MnKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc1Jlc291cmNlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5LTk9XTEVER0VfQVJUSUZBQ1QgfHxcbiAgICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlRcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OXG4gICAgICAgIHx8ICEodGhpcy5jb250ZW50LmNoaWxkcmVuICYmIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICBpZiAoaXNSZXNvdXJjZSkge1xuICAgICAgICB0aGlzLm1vYmlsZUFwcHNTdmMuc2VuZFZpZXdlckRhdGEodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzUmVzb3VyY2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZ2V0U3RhcnREYXRlKCkge1xuICAgIGlmICh0aGlzLmVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIC8vIGNvbnN0IGJhdGNoID0gXy5maXJzdChfLmZpbHRlcih0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSwgeyBiYXRjaElkOiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkIH0pIHx8IFtdKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIC8vIGNvbnN0IHBhcnNlZERhdGUgPSBtb21lbnQodGhpcy5zdGFydERhdGUpO1xuICAgICAgICAvLyBjb25zdCBkYXRlT25seSA9IHBhcnNlZERhdGUuY2xvbmUoKS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IHRoaXMuc3RhcnREYXRlICYmIG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKS5nZXRUaW1lKClcbiAgICAgICAgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID0gc3RhcnREYXRlVGltZSAtIG5vd1xuICAgICAgICBpZiAodGhpcy5zdGFydERhdGVEaWZmZXJlbmNlICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDApIHtcbiAgICAgICAgICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcih0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpXG4gICAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjAgKiAyNCkpIC8gKDEwMDAgKiA2MCAqIDYwKSlcbiAgICAgICAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigodGhpcy5zdGFydERhdGVEaWZmZXJlbmNlICUgKDEwMDAgKiA2MCAqIDYwKSkgLyAoMTAwMCAqIDYwKSlcbiAgICAgICAgICByZXR1cm4gKGAke2RheXN9IERheXMgOiAke2hvdXJzfSBIb3VycyA6ICR7bWludXRlc30gTWludXRlc2ApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdOQSdcbiAgICAgIH1cbiAgICAgIHJldHVybiAnTkEnXG4gICAgICAvLyBpZiAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSkuaXNBZnRlcigpKSB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykgJiYgbW9tZW50KF8uZ2V0KGJhdGNoLCAnZW5kRGF0ZScpKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgIHJldHVybiAnTkEnXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoc3RhcnREYXRlVGltZSAmJiBtb21lbnQoc3RhcnREYXRlVGltZSkuaXNBZnRlcigpKSAge1xuICAgICAgLy8gICByZXR1cm4gbW9tZW50KHN0YXJ0RGF0ZVRpbWUpLmZyb20obm93KVxuICAgICAgLy8gfVxuICAgICAgLy8gaWYgKGVuZERhdGVUaW1lICYmIG1vbWVudChlbmREYXRlVGltZSkuaXNCZWZvcmUoKSkge1xuICAgICAgLy8gICAgIHJldHVybiAnTkEnXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIHJldHVybiAnTkEnXG4gICAgfSByZXR1cm4gJ05BJ1xuICB9XG5cbiAgZ2V0IGlzQmF0Y2hJblByb2dyZXNzKCkge1xuICAgIC8vIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50WydiYXRjaGVzJ10pIHtcbiAgICAvLyBjb25zdCBiYXRjaGVzID0gdGhpcy5jb250ZW50WydiYXRjaGVzJ10gYXMgTnNDb250ZW50LklCYXRjaFxuICAgIC8vIGlmICh0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgLy8gICAvLyBjb25zdCBub3cgPSBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKVxuICAgIC8vICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAvLyAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgLy8gICAgIGNvbnN0IGJhdGNoID0gXy5maXJzdChfLmZpbHRlcih0aGlzLmJhdGNoRGF0YS5jb250ZW50LCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgLy8gICAgIGlmIChiYXRjaCkge1xuICAgIC8vICAgICAgIC8vIGNvbnN0IHN0YXJ0RGF0ZSA9IG1vbWVudChiYXRjaC5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICAgICAgLy8gY29uc3QgZW5kRGF0ZSA9IGJhdGNoLmVuZERhdGUgPyBtb21lbnQoYmF0Y2guZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJykgOiBub3dcbiAgICAvLyAgICAgICAvLyByZXR1cm4gKFxuICAgIC8vICAgICAgIC8vICAgLy8gYmF0Y2guc3RhdHVzICYmXG4gICAgLy8gICAgICAgLy8gICBtb21lbnQoc3RhcnREYXRlKS5pc1NhbWVPckJlZm9yZShub3cpXG4gICAgLy8gICAgICAgLy8gICAmJiBtb21lbnQoZW5kRGF0ZSkuaXNTYW1lT3JBZnRlcihub3cpXG4gICAgLy8gICAgICAgLy8gKVxuICAgIC8vICAgICAgIHRoaXMuc3RhcnREYXRlID0gYmF0Y2ggJiYgKF8uZ2V0KGJhdGNoLCAnc3RhcnRUaW1lJykpXG4gICAgLy8gICAgICAgdGhpcy5lbmREYXRlID0gYmF0Y2ggJiYgKF8uZ2V0KGJhdGNoLCAnZW5kVGltZScpKVxuICAgIC8vICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gbmV3IERhdGUodGhpcy5lbmREYXRlKS5nZXRUaW1lKClcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGVEaWZmZXJlbmNlID0gZW5kRGF0ZVRpbWUgLSBub3dcbiAgICAvLyAgICAgICBpZih0aGlzLmVuZERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgIC8vICAgICAgIHJldHVybiAgYmF0Y2guc3RhdHVzXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBmYWxzZVxuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfSByZXR1cm4gZmFsc2VcblxuICAgIGlmICh0aGlzLmVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5lbnJvbGxlZENvdXJzZURhdGEuYmF0Y2hcbiAgICAgIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICBpZiAoYmF0Y2ggJiYgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKVxuICAgICAgICB0aGlzLmVuZERhdGUgPSAoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpXG4gICAgICAgIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgIGxldCBlbmREYXRlID0gdGhpcy5lbmREYXRlICYmIG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSlcbiAgICAgICAgICBlbmREYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSlcbiAgICAgICAgICBjb25zdCBlbmREYXRlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpXG4gICAgICAgICAgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID0gbm93IC0gc3RhcnREYXRlVGltZVxuICAgICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgICAgICAgIGlmICh0aGlzLmVuZERhdGVEaWZmZXJlbmNlID4gMCAmJiB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPiAwICYmIGJhdGNoLnN0YXR1cyAhPT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG5cblxuICBnZXRVc2VyUmF0aW5nKGZpcmVVcGRhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgICAgdGhpcy5yYXRpbmdTdmMuZ2V0UmF0aW5nKHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB0aGlzLnVzZXJJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLnVzZXJSYXRpbmcgPSByZXMucmVzdWx0LnJlc3BvbnNlXG4gICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlVXBkYXRlUmV2aWV3cyh0cnVlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCd2aWV3JylcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb250ZW50U291cmNlICYmIHRoaXMuY29udGVudFNvdXJjZS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ0KSB7XG4gICAgICAgIHRoaXMuc291cmNlRWxsaXBzaXMgPSB0cnVlXG4gICAgICB9XG4gICAgfSwgMjUwKVxuICB9XG5cblxuXG4gIHB1YmxpYyBmZXRjaFVzZXJXRkZvckJsZW5kZWQoKSB7XG4gICAgY29uc3QgYXBwbGljYXRpb25JZHMgPSAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lm1hcChlID0+IGUuYmF0Y2hJZCkpIHx8IFtdXG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgYXBwbGljYXRpb25JZHMsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2JsZW5kZWRwcm9ncmFtJyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQmxlbmRlZFVzZXJXRihyZXEpLnRoZW4oXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGF0ZXN0V0YgPSBfLm1heEJ5KGRhdGEucmVzdWx0LmRhdGFbMF0ud2ZJbmZvLCAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGVsLmxhc3RVcGRhdGVkT24pLmdldFRpbWUoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gbGF0ZXN0V0YuY3VycmVudFN0YXR1cyA9IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRFxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhIS53b3JrRmxvdyA9IHtcbiAgICAgICAgICAgIHdmSW5pdGlhdGVkOiB0cnVlLFxuICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICBiYXRjaDogdGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50LmZpbmQoKGU6IGFueSkgPT4gZS5iYXRjaElkID09PSBsYXRlc3RXRi5hcHBsaWNhdGlvbklkKSxcbiAgICAgICAgICAgIHdmSXRlbTogbGF0ZXN0V0YsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldFdGRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmluZm8oJ2ZldGNoQmxlbmRlZFVzZXJXRiBkYXRhID09ICcsIGRhdGEpXG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0lmQmF0Y2hFeGlzdHMobGF0ZXN0OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuYmF0Y2hEYXRhIHx8ICF0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQuZmluZChiID0+IGIuYmF0Y2hJZCA9PT0gbGF0ZXN0LmJhdGNoSWQpXG4gIH1cblxuICBwdWJsaWMgZ2V0QmF0Y2hJZCgpOiBzdHJpbmcge1xuICAgIGxldCBiYXRjaElkID0gJydcbiAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXRjaElkXG4gIH1cblxuXG4gIHB1YmxpYyBoYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKSB7XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZSgnJylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgICAgdGhpcy5jaGFuZ2VUYWIgPSAhdGhpcy5jaGFuZ2VUYWJcbiAgICAgIHRoaXMucmFpc2VFbnJvbGxUZWxlbWV0cnkoKVxuICAgICAgaWYgKHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKVxuICAgICAgfVxuICAgICAgY29uc3QgYmF0Y2hEYXRhID0gdGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuYmF0Y2hlcyAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzWzBdXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSwgYmF0Y2hEYXRhKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIGxldCBtb2RlcmF0ZWRCYXRjaERhdGE6IGFueVxuICAgICAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtb2RlcmF0ZWRCYXRjaERhdGEgPSB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudCAmJiB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlcmF0ZWRCYXRjaERhdGEgPSB0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLCBtb2RlcmF0ZWRCYXRjaERhdGEpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5MRUFSTklOR19QQVRIV0FZKSB7XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbExlYXJuaW5nUGF0aHdheShiYXRjaERhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF1dG9Bc3NpZ25FbnJvbGwoKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCdlbnJvbGwnKVxuICB9XG5cbiAgcHVibGljIGF1dG9FbnJvbGxMZWFybmluZ1BhdGh3YXkoYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBsZXQgYmF0Y2hJZCA9IGJhdGNoRGF0YT8uYmF0Y2hJZFxuICAgIGlmIChiYXRjaElkKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Vucm9sbExQKHRoaXMuY29udGVudD8uaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkKVxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sIChlcnI6IGFueSkgPT4ge1xuICAgICAgICBsZXQgZXJyTXNnID0gZXJyPy5lcnJvcj8ucGFyYW1zPy5lcnJtc2cgfHwgZXJyPy5wYXJhbXM/LmVycm1zZyB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcnXG4gICAgICAgIGlmIChlcnJNc2c/LmluY2x1ZGVzKCdjb3Vyc2UuJykgJiYgdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSkge1xuICAgICAgICAgIGVyck1zZyA9IGVyck1zZy5yZXBsYWNlKCdjb3Vyc2UuJywgdGhpcy5jb250ZW50Py5jb3Vyc2VDYXRlZ29yeSkgKyAnLic7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVyck1zZylcbiAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gYmF0Y2hlcyBmb3VuZCcpXG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhdXRvRW5yb2xsQ3VyYXRlZFByb2dyYW0ocHJvZ3JhbVR5cGU6IGFueSwgYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBpZiAoIWJhdGNoRGF0YSkge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gYmFjdGhlcyBmb3VuZCcpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgbGV0IHVzZXJJZCA9ICcnXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkKSB7XG4gICAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxuICAgICAgfVxuICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHByb2dyYW1JZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgLy8gYXMgb2Ygbm93IGN1cmF0ZWQgcHJvZ3JhbSBvbmx5IG9uZSBiYXRjaCBpcyBjb21pbmcgbmVlZCB0byBjaGVjayBhbmQgbW9kaWZ5XG4gICAgICAgICAgYmF0Y2hJZDogYmF0Y2hEYXRhPy5iYXRjaElkLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmF1dG9Bc3NpZ25DdXJhdGVkQmF0Y2hBcGkocmVxLCBwcm9ncmFtVHlwZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBpZiAocHJvZ3JhbVR5cGUgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0gJiYgYmF0Y2hEYXRhLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICAgICAgY29udGVudDogW2JhdGNoRGF0YV0sXG4gICAgICAgICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJDaGFuZ2VIYW5kbGVyKHRydWUpXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICAgICAgICB9LCAyMDAwKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShyZXEucmVxdWVzdC5iYXRjaElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ19lcnJvcicsIF9lcnJvcilcbiAgICAgICAgICAvLyBpZihfZXJyb3IgJiYgX2Vycm9yLmVycm9yICYmIF9lcnJvci5lcnJvci5wYXJhbXMgJiYgX2Vycm9yLmVycm9yLnBhcmFtcy5lcnIgJiYgX2Vycm9yLmVycm9yLnBhcmFtcy5lcnIuZXJybXNnKSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KF9lcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCAnUGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicpXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXV0b0Fzc2lnbkVucm9sbCgpIHtcbi8qKioqKioqKioqKioqICDinKggV2luZHN1cmYgQ29tbWFuZCDirZAgICoqKioqKioqKioqKiovXG4gIC8qKlxuICAgKiBJZiB0aGUgdXNlciBpcyBub3QgZW5yb2xsZWQgaW4gdGhlIGNvdXJzZSwgYXV0by1hc3NpZ25zIGEgYmF0Y2ggYW5kIG5hdmlnYXRlcyB0byB0aGUgcGxheWVyIHBhZ2UuXG4gICAqIElmIHRoZSB1c2VyIGlzIGFscmVhZHkgZW5yb2xsZWQsIGRvZXMgbm90aGluZy5cbiAgICovXG4vKioqKioqKiAgNmQ5NGM2NDYtMjU0Yy00NGQ2LWE3YzMtOTBiZGI5NTA3MzE4ICAqKioqKioqLyAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkJhdGNoQXBpKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyLCB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXRjaElkID0gdGhpcy5nZXRCYXRjaElkKClcbiAgICAgICAgICBpZiAoYmF0Y2hJZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICAoX2Vycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXy5nZXQoX2Vycm9yLCAnZXJyb3IucGFyYW1zLmVycm1zZycpIHx8ICdQbGVhc2UgdHJ5IGFnYWluIGxhdGVyJylcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmF2aWdhdGVUb1BsYXllclBhZ2UoYmF0Y2hJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgICAgbGV0IGZpcnN0UGxheWFibGVDb250ZW50XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UuaWRlbnRpZmllcikge1xuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmV0Y2ggaGllcmFyY2h5IGZvciB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UgaW4gcG9wdXAgZmlyc3QsIHRoZW4gZ2V0IGZpcnN0IHBsYXlhYmxlIGNvbnRlbnQgYW5kIHJlZGlyZWN0IHRvIGl0XG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuc2VsZWN0ZWRMYW5ndWFnZS5pZGVudGlmaWVyKVxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgbGV0IHByaW1hcnlDYXRlZ29yeVxuICAgICAgaWYgKHRoaXMuY29udGVudC5zZWN1cmVTZXR0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9ICdMZWFybmluZyBSZXNvdXJjZSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9IGZpcnN0UGxheWFibGVDb250ZW50LnByaW1hcnlDYXRlZ29yeSB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5XG4gICAgICB9XG4gICAgICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rID0gdGhpcy5nZXRSZXN1bWVVcmwoZmlyc3RQbGF5YWJsZUNvbnRlbnQsIGJhdGNoSWQsIHByaW1hcnlDYXRlZ29yeSlcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnVybH1gXSwgeyBxdWVyeVBhcmFtczogeyAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLCBmcm9tQUlUdXRvcjogdGhpcy5mcm9tQUlUdXRvciB9IH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZldGNoQmF0Y2hEZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIGNvdXJzZUlkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHN0YXR1czogWycwJywgJzEnLCAnMiddLFxuICAgICAgICAgICAgLy8gY3JlYXRlZEJ5OiAnZmNhMjkyNWYtMWVlZS00NjU0LTkxNzctZmVjZTNmZDZhZmM5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvcnRfYnk6IHsgY3JlYXRlZERhdGU6ICdkZXNjJyB9LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQ291cnNlQmF0Y2hlcyhyZXEpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IGRhdGFcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YS5lbnJvbGxlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcihmYWxzZSlcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuXG4gIHNjcm9sbFRvVG9wKCkge1xuICAgIChmdW5jdGlvbiBzbW9vdGhzY3JvbGwoKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuICAgICAgaWYgKGN1cnJlbnRTY3JvbGwgPiAwKSB7XG4gICAgICAgIC8vIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc21vb3Roc2Nyb2xsKVxuICAgICAgICAvLyB3aW5kb3cuc2Nyb2xsVG8oMCwgY3VycmVudFNjcm9sbCAtIChjdXJyZW50U2Nyb2xsIC8gNSkpXG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcGV0ZW5jaWVzKGNvbXBldGVuY2llczogYW55KSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzQXJyYXkgPSBKU09OLnBhcnNlKGNvbXBldGVuY2llcylcbiAgICBjb25zdCBjb21wZXRlbmN5U3RyaW5nQXJyYXk6IGFueVtdID0gW11cbiAgICBjb21wZXRlbmNpZXNBcnJheS5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgY29tcGV0ZW5jeVN0cmluZ0FycmF5LnB1c2goYy5uYW1lKVxuICAgIH0pXG4gICAgcmV0dXJuIGNvbXBldGVuY3lTdHJpbmdBcnJheVxuICB9XG5cbiAgZ2V0IHNob3dJbnRyYW5ldE1zZygpIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZVxuICB9XG5cbiAgZ2V0IHNob3dTdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc2hvd1N0YXJ0QnV0dG9uKHRoaXMuY29udGVudClcbiAgfVxuXG4gIGdldCBpc1Bvc3RBc3Nlc3NtZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRoaXMudG9jQ29uZmlnICYmIHRoaXMudG9jQ29uZmlnLnBvc3RBc3Nlc3NtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQubGVhcm5pbmdNb2RlID09PSAnSW5zdHJ1Y3Rvci1MZWQnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGVcbiAgfVxuXG4gIGdldCBzaG93U3VidGl0bGVPbkJhbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnNcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShiYXRjaDogYW55KSB7XG4gICAgY29uc3QgZW5yb2xsbWVudEVuZERhdGUgPSBkYXlqcyhfLmdldChiYXRjaCwgJ2Vucm9sbG1lbnRFbmREYXRlJykpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgY29uc3Qgc3lzdGVtRGF0ZSA9IGRheWpzKClcbiAgICByZXR1cm4gZW5yb2xsbWVudEVuZERhdGUgPyBkYXlqcyhlbnJvbGxtZW50RW5kRGF0ZSkuaXNCZWZvcmUoc3lzdGVtRGF0ZSkgOiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuU25hY2tiYXIocHJpbWFyeU1zZzogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gNTAwMCkge1xuICAgIHRoaXMuc25hY2tCYXIub3BlbihwcmltYXJ5TXNnLCAnWCcsIHtcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pXG4gIH1cblxuICBnZXQgc2hvd0luc3RydWN0b3JMZWRNc2coKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd0FjdGlvbkJ1dHRvbnMgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJyAmJlxuICAgICAgIXRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmxcbiAgICApXG4gIH1cblxuICBnZXQgaXNIZWFkZXJIaWRkZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXNvdXJjZSAmJiB0aGlzLmNvbnRlbnQgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybC5sZW5ndGhcbiAgfVxuXG4gIGdldCBzaG93QWN0aW9uQnV0dG9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJlxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRGVsZXRlZCcgJiZcbiAgICAgIHRoaXMuY29udGVudC5zdGF0dXMgIT09ICdFeHBpcmVkJ1xuICAgIClcbiAgfVxuXG4gIGdldCBzaG93QnV0dG9uQ29udGFpbmVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJlxuICAgICAgISh0aGlzLmlzTW9iaWxlICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaXNJbkludHJhbmV0KSAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0NvdXJzZScgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgICApICYmXG4gICAgICAhKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdSZXNvdXJjZScgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKTogYW55IHwgdm9pZCB7XG4gICAgY29uc3QgcmVzdW1lQ29weSA9IFsuLi50aGlzLnJlc3VtZURhdGFdXG4gICAgaWYgKHJlc3VtZUNvcHkgJiYgcmVzdW1lQ29weS5sZW5ndGgpIHtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgbmV3IERhdGUoYi5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpKS5zaGlmdCgpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxuICAgICAgICAgIG1pbWVUeXBlOiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoICYmIHJlc3VtZUNvcHlbMF1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGZpcnN0SXRlbS5jb250ZW50SWQsXG4gICAgICAgIG1pbWVUeXBlOiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgcHJpdmF0ZSBtb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nICE9PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSAodGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAmJiB0eXBlb2YgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gKHRoaXMuY29udGVudC50b3RhbFJhdGluZyBhcyBhbnkpW3RoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJyddXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWFybmluZ1VybHMoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5pc1ByYWN0aWNlVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0UpLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmlzQXNzZXNzVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTKSxcbiAgICAgIClcblxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHRoaXMuZ2V0UmVzdW1lVXJsKGZpcnN0UGxheWFibGVDb250ZW50LCBudWxsLCBwcmltYXJ5Q2F0ZWdvcnkpXG5cbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgLy8gaWYgKGZpcnN0UGxheWFibGVDb250ZW50Lm9wdGlvbmFsUmVhZGluZyAmJiBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdMZWFybmluZyBSZXNvdXJjZScpIHtcbiAgICAgIC8vICAgdGhpcy51cGRhdGVQcm9ncmVzcygyLCBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSB1cmwuc3BsaXQoJy8nKS5wb3AoKVxuICAgIGlmIChwYXRoICYmIHRoaXMudmFsaWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgIHRoaXMucm91dGVQYXRoID0gcGF0aFxuICAgICAgdGhpcy51cGRhdGVCYW5uZXJVcmwoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQmFubmVyVXJsKCkge1xuICAgIGlmICh0aGlzLmJhbm5lcnMpIHtcbiAgICAgIHRoaXMuYmFubmVyVXJsID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICBgdXJsKCR7dGhpcy5iYW5uZXJzW3RoaXMucm91dGVQYXRoXX0pYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwbGF5SW50cm9WaWRlbygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQsIHtcbiAgICAgICAgZGF0YTogdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvLFxuICAgICAgICBoZWlnaHQ6ICczNTBweCcsXG4gICAgICAgIHdpZHRoOiAnNjIwcHgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXQgc2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgdXJsKCR7dGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbn0pYClcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3MoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsKSB7XG4gICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2ZldGNoaW5nJ1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICB0aGlzLnRvY1N2Yy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2Vzcyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKFxuICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZGF0YS5oYXNBY2Nlc3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9lcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJhdGluZ0ljb24ocmF0aW5nSW5kZXg6IG51bWJlcik6ICdzdGFyJyB8ICdzdGFyX2JvcmRlcicgfCAnc3Rhcl9oYWxmJyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZykge1xuICAgICAgY29uc3QgYXZnUmF0aW5nID0gdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmdcbiAgICAgIGNvbnN0IHJhdGluZ0Zsb29yID0gTWF0aC5mbG9vcihhdmdSYXRpbmcpXG4gICAgICBpZiAocmF0aW5nSW5kZXggPD0gcmF0aW5nRmxvb3IpIHtcbiAgICAgICAgcmV0dXJuICdzdGFyJ1xuICAgICAgfVxuICAgICAgaWYgKHJhdGluZ0Zsb29yID09PSByYXRpbmdJbmRleCAtIDEgJiYgYXZnUmF0aW5nICUgMSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdzdGFyX2hhbGYnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnc3Rhcl9ib3JkZXInXG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xuICAgIGNvbnN0IHNvdXJjZSA9ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnNvdXJjZVNob3J0TmFtZSkgfHwgJydcbiAgICBpZiAoXG4gICAgICAhdGhpcy5mb3JQcmV2aWV3ICYmXG4gICAgICAhdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCAmJlxuICAgICAgdGhpcy5jaGVja1JlZ2lzdHJhdGlvblNvdXJjZXMuaGFzKHNvdXJjZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudFN2Y1xuICAgICAgICAuZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHNvdXJjZSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICBpZiAocmVzLmhhc0FjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ3JlamVjdCdcbiAgICAgICAgICAgIGlmIChyZXMucmVnaXN0cmF0aW9uVXJsICYmIHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsID0gcmVzLnJlZ2lzdHJhdGlvblVybFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKF9lcnIgPT4geyB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdncmFudCdcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVF1ZXJ5KHR5cGU6ICdSRVNVTUUnIHwgJ1NUQVJUX09WRVInIHwgJ1NUQVJUJyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmICh0aGlzLmZpcnN0UmVzb3VyY2VMaW5rICYmICh0eXBlID09PSAnU1RBUlQnIHx8IHR5cGUgPT09ICdTVEFSVF9PVkVSJykpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YUxpbmsgJiYgdHlwZSA9PT0gJ1JFU1VNRScpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgICAgdmlld01vZGU6ICdSRVNVTUUnLFxuICAgICAgICAvLyBjb3Vyc2VOYW1lOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQubmFtZSA6ICcnLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSW5JRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgb3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29udGVudFJhdGluZ1YyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzc2OHB4JyxcbiAgICAgIGRhdGE6IHsgY29udGVudCwgdXNlcklkOiB0aGlzLnVzZXJJZCwgdXNlclJhdGluZzogdGhpcy51c2VyUmF0aW5nIH0sXG4gICAgfSlcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyUmF0aW5nKHRydWUpXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnNldFJhdGluZ1NlcnZpY2VVcGRhdGUodHJ1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlUHJvZ3Jlc3Moc3RhdHVzOiBudW1iZXIsIHJlc291cmNlSWQ6IGFueSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkIDogJydcbiAgICBjb25zdCBiYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gICAgY29uc3QgaXNQcmVBc3Nlc3NtZW50ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5wcmVBc3Nlc3NtZW50XG4gICAgaWYgKGlzUHJlQXNzZXNzbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMudmlld2VyU3ZjXG4gICAgICAgIC5yZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudFF1aXoocmVzb3VyY2VJZCwgc3RhdHVzKVxuXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZXdlclN2Yy5yZWFsVGltZVByb2dyZXNzVXBkYXRlUXVpeihyZXNvdXJjZUlkLCBjb2xsZWN0aW9uSWQsIGJhdGNoSWQsIHN0YXR1cylcbiAgfVxuXG4gIGdldFByb2dyYW1EdXJhdGlvbihiYXRjaERhdGE6IGFueSkge1xuICAgIGlmIChiYXRjaERhdGEpIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGRheWpzKGRheWpzKGJhdGNoRGF0YS5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKVxuICAgICAgY29uc3QgZW5kRGF0ZSA9IGRheWpzKGRheWpzKGJhdGNoRGF0YS5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgIC8vIGFkZGluZyAxIHRvIGluY2x1ZGUgdGhlIHN0YXJ0IGRhdGVcbiAgICAgIHJldHVybiAoZW5kRGF0ZS5kaWZmKHN0YXJ0RGF0ZSwgJ2RheXMnKSArIDEpXG4gICAgfVxuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgd2l0aGRyYXdPckVucm9sbChkYXRhOiBzdHJpbmcpIHtcbiAgICBpZiAoZGF0YSA9PT0gTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1TdGF0dXMuSU5JVElBVEUpIHtcbiAgICAgIHRoaXMuZmV0Y2hVc2VyV0ZGb3JCbGVuZGVkKClcbiAgICB9XG4gIH1cblxuXG5cbiAgaGFuZGxlQ2FwaXRhbGl6ZShzdHI6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJydcbiAgICBpZiAoc3RyKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyLnNwbGl0KCcgJykubWFwKF9zdHIgPT4ge1xuICAgICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgICB9KS5qb2luKCcgJylcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdHIgJiYgKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGVUb1Jldmlld3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudFRvVmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdDb250YWluZXInKSBhcyBhbnlcblxuICAgIGlmIChlbGVtZW50VG9WaWV3KSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICB0b3A6IGVsZW1lbnRUb1ZpZXcub2Zmc2V0VG9wLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlQ2VydEludHJlYWN0VGVsZW1ldHJ5KCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBpZDogJ3ZpZXctY2VydGlmaWNhdGUnLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5DRVJUSUZJQ0FURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNlcnRJZCwgICAvLyBpZCBvZiB0aGUgY2VydGlmaWNhdGVcbiAgICAgICAgdHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9KVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICB9XG5cblxuXG4gIGdldExhc3RQbGF5ZWRSZXNvdXJjZSgpIHtcbiAgICBsZXQgZmlyc3RQbGF5YWJsZUNvbnRlbnRcbiAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG4gICAgICB0aGlzLmV4cGFuZFRoZVBhdGgocmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIpXG5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBhbmRUaGVQYXRoKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgcmVzb3VyY2VJZCkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMudXRpbGl0eVN2Yy5nZXRQYXRoKHRoaXMuY29udGVudCwgcmVzb3VyY2VJZClcbiAgICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQocGF0aC5tYXAoKHU6IHsgaWRlbnRpZmllcjogYW55IH0pID0+IHUuaWRlbnRpZmllcikpXG4gICAgfVxuICB9XG5cbiAgcmFpc2VFbnJvbGxUZWxlbWV0cnkoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2Vucm9sbCcsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi1lbnJvbGxgLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgcmFpc2VFbnJvbGxUZWxlbWVudHJ5Rm9yU2Frc2hhbUFJR2VuZXJhdGVkKCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGU6ICdlbnJvbGwnLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgaWQ6IHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQsXG4gICAgICAgICAgdmVyOiBcIjEuMFwiLFxuICAgICAgICAgIHR5cGU6IFwiaWdvdC1haVwiXG4gICAgICAgIH0sXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZDogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfS9vdmVydmlld19idG4tZW5yb2xsYCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIG9uQ2xpY2tPZlNoYXJlKCkge1xuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSB0cnVlXG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeUZvclNoYXJlKCdzaGFyZUNvbnRlbnQnKVxuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgcmFpc2VUZWxlbWV0cnlGb3JTaGFyZShzdWJUeXBlOiBhbnkpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6IGBidG4tJHtzdWJUeXBlfWAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICByZXNldEVuYWJsZVNoYXJlKCkge1xuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSBmYWxzZVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWwobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgaWYgKGxhYmVsICYmIHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJvdXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnbm9uZSdcbiAgICBpZiAodGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnRpbWVyVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudGltZXJVbnN1YnNjcmliZS51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLmhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICAvLyBDbGVhciBjb250ZW50IGRhdGEgdG8gcHJldmVudCBzdGFsZSBkYXRhIHdoZW4gbmF2aWdhdGluZyBiZXR3ZWVuIGNvbnRlbnRzXG4gICAgdGhpcy50b2NTdmMucmVzZXRDb250ZW50RGF0YSgpXG4gIH1cblxuICBwcm9ncmFtRW5yb2xsQ2FsbChiYXRjaERhdGE6IGFueSkge1xuICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIGJhdGNoRGF0YSlcbiAgfVxuXG4gIHJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKCRldmVudDogYW55KSB7XG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGZpcnN0IHByZXZlbnQgbmF2aWdhdGlvbiB0byBwbGF5ZXIgcGFnZVxuICAgIGNvbnN0IHNob3VsZFByZXZlbnROYXZpZ2F0aW9uID0gdGhpcy5zaG91bGRTaG93U3VydmV5UG9wdXAoKVxuICAgIGlmIChzaG91bGRQcmV2ZW50TmF2aWdhdGlvbikge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH1cblxuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiBcInZpZXctYXNzZXNzbWVudFwiLFxuICAgICAgICBzdWJUeXBlOiBcImFub255bW91cy1hc3Nlc3NtZW50XCIsXG4gICAgICB9LCB7fSxcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlOiAnTGFuZGluZyBQYWdlJyxcbiAgICAgIH0pXG5cbiAgICBpZiAoc2hvdWxkUHJldmVudE5hdmlnYXRpb24pIHtcbiAgICAgIC8vIFByZXBhcmUgbmF2aWdhdGlvbiBkZXRhaWxzXG4gICAgICBjb25zdCBuYXZpZ2F0aW9uVXJsID0gKHRoaXMucmVzdW1lRGF0YSAmJiAhdGhpcy5jZXJ0RGF0YSkgPyB0aGlzLnJlc3VtZURhdGFMaW5rPy51cmwgOiB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rPy51cmxcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gKHRoaXMucmVzdW1lRGF0YSAmJiAhdGhpcy5jZXJ0RGF0YSkgPyB0aGlzLmdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogdGhpcy5nZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXG5cbiAgICAgIC8vIE9wZW4gc3VydmV5IHBvcHVwIGRpcmVjdGx5IHdpdGggbmF2aWdhdGlvbiBkZXRhaWxzXG4gICAgICBpZiAobmF2aWdhdGlvblVybCkge1xuICAgICAgICB0aGlzLm9wZW5QdWJsaWNTdXJ2ZXlQb3B1cChuYXZpZ2F0aW9uVXJsLCBxdWVyeVBhcmFtcylcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHNob3VsZFNob3dTdXJ2ZXlQb3B1cCgpOiBib29sZWFuIHtcbiAgICAvLyBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBzdXJ2ZXkgcG9wdXAgY29uZGl0aW9uXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBwdWJsaWMgdmlldyBhbmQgY29udGVudCBpcyBhIGNhc2Ugc3R1ZHlcbiAgICByZXR1cm4gdGhpcy5mb3JQcmV2aWV3ICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YVxuICAgICAgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ0FTRV9TVFVEWVxuICB9XG5cblxuICBhc3luYyBjaGVja0lmVXNlckVucm9sbGVkKCkge1xuICAgIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlID0gZmFsc2VcbiAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgLy8gb25seSBmb3IgIHJlc291cmNlXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiZcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJlxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgLy8gY29uc3QgY29sbGVjdGlvbklkID0gdGhpcy5pc1Jlc291cmNlID8gJycgOiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgbGV0IGVucm9sbGVkQ291cnNlOiBOc0NvbnRlbnQuSUNvdXJzZSB8IHVuZGVmaW5lZFxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyICYmICF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgZW5yb2xsZWRDb3Vyc2UgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKChjb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgfHwgJydcbiAgICAgICAgICBpZiAoY291cnNlLmNvdXJzZUlkICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb3Vyc2VcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gSWYgY3VycmVudCBjb3Vyc2UgaXMgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiB1c2VyIGVucm9sbGVkIGNvdXJzZVxuICAgICAgaWYgKGVucm9sbGVkQ291cnNlICYmIGVucm9sbGVkQ291cnNlLmJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gcmVzXG4gICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhID0gZW5yb2xsZWRDb3Vyc2VcbiAgICAgICAgdGhpcy5pc0NvdXJzZUNvbXBsZXRlZE9uVGhpc01vbnRoKClcbiAgICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGVucm9sbGVkQ291cnNlLmJhdGNoSWRcbiAgICAgICAgLy8gdGhpcy5kb3dubG9hZENlcnQoZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzKVxuICAgICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzICYmXG4gICAgICAgICAgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgICBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSlcbiAgICAgICAgICBjb25zdCBjZXJ0SWQgPSBjZXJ0aWZpY2F0ZVswXS5pZGVudGlmaWVyXG4gICAgICAgICAgdGhpcy5jZXJ0SWQgPSBjZXJ0SWRcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ10gPSB7XG4gICAgICAgICAgICAgIGNlcnRJZCxcbiAgICAgICAgICAgICAgY2VydERhdGE6ICcnLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBlbnJvbGxlZCBjb3Vyc2UgaXMgY29tcGxldGVkIHRoZW4gdG8gbWFrZSBhbGwgbGFuZ3VhZ2VzIGNvdXJzZXMgYXMgd2VsbCBhcyBhbGwgY29udGVudCBhcyBjb21wbGV0ZWRcbiAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhLmNvdXJzZUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkxFQVJOSU5HX1BBVEhXQVkgJiYgZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzID09PSAyKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gMTAwXG4gICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uU3RhdHVzJ10gPSAyXG4gICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0odGhpcy5jb250ZW50KVxuICAgICAgICAgIGxldCBjb250ZW50TGFnID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UodGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgdGhpcy5nZXRDb250aW51ZUxlYXJuaW5nRGF0YSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciwgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCwgY29udGVudExhZylcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgICB0aGlzLmNoZWNrRm9yQ29tcGxldGlvblN1cnZleVRyaWdnZXIoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jdW11bGF0aXZlVHJhY2tpbmcgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgIT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTEVBUk5JTkdfUEFUSFdBWSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKHRoaXMuY29udGVudCwgdGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yQ29tcGxldGlvblN1cnZleVRyaWdnZXIoKVxuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmNvdXJzZUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkxFQVJOSU5HX1BBVEhXQVkpIHtcbiAgICAgICAgICAgICAgbGV0IGNvbnRlbnRMYWcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICAgICAgICAgICAgdGhpcy5nZXRDb250aW51ZUxlYXJuaW5nRGF0YSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciwgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCwgY29udGVudExhZylcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTEVBUk5JTkdfUEFUSFdBWSkge1xuICAgICAgICAgIC8vIHRoaXMuYXBwVG9jVjJTdmMubWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKHRoaXMuY29udGVudCx0aGlzLnVzZXJFbnJvbGxtZW50TGlzdClcbiAgICAgICAgICBjb25zb2xlLmxvZygnbWFwcGluZyBwcm9ncmVzcyBmb3IgbGVhcm5pbmcgcGF0aHdheScsIHRoaXMuY29udGVudClcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXBwZWQgcHJvZ3Jlc3MgZm9yIGxlYXJuaW5nIHBhdGh3YXknLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKHRydWUpXG4gICAgICAgICAgdGhpcy5zeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpXG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICBjb250ZW50OiBbZW5yb2xsZWRDb3Vyc2UuYmF0Y2hdLFxuICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSwgdGhpcy5yZXN1bWVEYXRhKVxuICAgICAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIodHJ1ZSlcbiAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgLy8gSXQncyB1bmRlcnN0b29kIHRoYXQgdXNlciBpcyBub3QgYWxyZWFkeSBlbnJvbGxlZFxuICAgICAgICAvLyBGZXRjaCB0aGUgYXZhaWxhYmxlIGJhdGNoZXMgYW5kIHByZXNlbnQgdG8gdXNlclxuICAgICAgICBpZiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFXG4gICAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSkge1xuICAgICAgICAgIC8vIERpc2FibGluZyBhdXRvIGVucm9sbG1lbnQgdG8gYmF0Y2hcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMuY2FsbEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKHRoaXMuY29udGVudClcbiAgICAgICAgLy8gRm9yIExlYXJuaW5nIFBhdGh3YXlzLCBjb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIHdoZW4gbm90IGVucm9sbGVkIChhbGwgbG9ja2VkKVxuICAgICAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5MRUFSTklOR19QQVRIV0FZKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMuY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXMoZmFsc2UpXG4gICAgICAgICAgdGhpcy5zeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICB9XG5cbiAgYmluZENvbXBsZXRpb25QZXJjZW50YWdlKCkge1xuICAgIGxldCBjb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICBsZXQgY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICBpZiAodGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzICYmIE9iamVjdC5rZXlzKHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzcykubGVuZ3RoKSB7XG4gICAgICBsZXQgbGFuZ1BlcmNlbnRhZ2UgPSB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3NbdGhpcy5zZWxlY3RlZExhbmd1YWdlLmxhbmdJZF0gfHwgMFxuICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2UgPSBsYW5nUGVyY2VudGFnZVxuICAgICAgY29tcGxldGlvblN0YXR1cyA9IGxhbmdQZXJjZW50YWdlID49IDEwMCA/IDIgOiAwXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlbnJvbGxlZERhdGEgPSB0aGlzLnRvY1N2Yy5maW5kRW5yb2xtZW50QnlDb2xsZWN0aW9uSWQodGhpcy51c2VyRW5yb2xsbWVudExpc3QsICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJycpKVxuICAgICAgaWYgKGVucm9sbGVkRGF0YSAmJiBlbnJvbGxlZERhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UpIHtcbiAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2UgPSBlbnJvbGxlZERhdGEuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgY29tcGxldGlvblN0YXR1cyA9IGVucm9sbGVkRGF0YS5zdGF0dXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBjb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBjb21wbGV0aW9uU3RhdHVzXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWNjZXB0UmVsZXZlbnQoKSB7XG4gICAgdGhpcy5zYXZlRmVlZGJhY2soJycsIDEpXG4gIH1cblxuICBoYW5kbGVEZWNsaW5lUmVsZXZlbnQoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOb25SZWxldmVudEZlZWRiYWNrRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMnB4JyxcbiAgICAgIHBhbmVsQ2xhc3M6IFsncmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nJ10sXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2F2ZUZlZWRiYWNrKHJlc3VsdCwgMClcbiAgICAgICAgZGlhbG9nUmVmLmNsb3NlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKGV2ZW50VHlwZTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnICAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuaXNBY3RpdmUgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldy5pc0FjdGl2ZSAvLyBOT1NPTkFSXG4gICAgKSB7XG4gICAgICBsZXQgcGF5bG9hZDogYW55ID0ge31cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIgJiYgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIpIHsgLy8gTk9TT05BUlxuICAgICAgLy8gICBwYXlsb2FkWydwa151c2VyaWQnXSA9IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfbmFtZSddID0gdGhpcy5jb250ZW50Lm5hbWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfY2F0ZWdvcnknXSA9IHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2lkJ10gPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgfVxuICAgICAgLy8gaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICBwYXlsb2FkWydjb250ZW50X3VybCddID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmFwcEljb24pIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9pbWFnZSddID0gdGhpcy5jb250ZW50LmFwcEljb25cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmR1cmF0aW9uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IHRoaXMuY29udGVudC5kdXJhdGlvbiAmJiBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA+IDAgPyBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA6IDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IDBcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnQgcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmcpIHtcbiAgICAgICAgcGF5bG9hZFsnbm9fdXNlcnNfcmF0ZWQnXSA9IHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmdcbiAgICAgIH1cbiAgICAgIC8vIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgcGF5bG9hZFsnbGVhcm5pbmdfcGF0aF9jb250ZW50J10gPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGggPyB0cnVlIDogZmFsc2VcbiAgICAgIHBheWxvYWRbJ2xlYXJuaW5nIHBhdGggY29udGVudCddID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2UpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9wcm92aWRlcl9uYW1lJ10gPSB0aGlzLmNvbnRlbnQuc291cmNlXG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncGF5bG9hZCcsIHBheWxvYWQpXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSAndmlldycpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X3ZpZXcnLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnZW5yb2xsJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfZW5yb2xtZW50JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfY29tcGxldGlvbicsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgc2Vjb25kc1RvVGltZShkOiBhbnkpIHtcbiAgICBkID0gTnVtYmVyKGQpXG4gICAgdmFyIGggPSBNYXRoLmZsb29yKGQgLyAzNjAwKVxuICAgIHZhciBtID0gTWF0aC5mbG9vcihkICUgMzYwMCAvIDYwKVxuICAgIHZhciBzID0gTWF0aC5mbG9vcihkICUgMzYwMCAlIDYwKVxuXG4gICAgdmFyIGhEaXNwbGF5ID0gaCA+IDAgPyBoICsgKGggPT0gMSA/IFwiIGhvdXIsIFwiIDogXCIgaG91cnMsIFwiKSA6IFwiXCJcbiAgICB2YXIgbURpc3BsYXkgPSBtID4gMCA/IG0gKyAobSA9PSAxID8gXCIgbWludXRlLCBcIiA6IFwiIG1pbnV0ZXMsIFwiKSA6IFwiXCJcbiAgICB2YXIgc0Rpc3BsYXkgPSBzID4gMCA/IHMgKyAocyA9PSAxID8gXCIgc2Vjb25kXCIgOiBcIiBzZWNvbmRzXCIpIDogXCJcIlxuICAgIHJldHVybiBoRGlzcGxheSArIG1EaXNwbGF5ICsgc0Rpc3BsYXlcbiAgfVxuXG5cbiAgYXN5bmMgc2F2ZUZlZWRiYWNrKGNvbW1lbnQ6IHN0cmluZywgcmF0aW5nID0gMCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBcInJlY29tbWVuZGF0aW9uX2lkXCI6IHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQsXG4gICAgICBcImNvdXJzZV9pZFwiOiB0aGlzLmNvdXJzZUlELFxuICAgICAgXCJyYXRpbmdcIjogcmF0aW5nLFxuICAgICAgXCJjb21tZW50c1wiOiBjb21tZW50LFxuICAgICAgXCJ1c2VyX2lkXCI6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlPy51c2VySWQgfHwgJydcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRlbnRMaWJTdmMuc2F2ZUZlZWRiYWNrU2Frc2hhbUFJKHBheWxvYWQpLnRvUHJvbWlzZSgpLmNhdGNoKCgpID0+IHsgfSlcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2U/Lm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubWF0U25hY2tiYXJOZXcub3BlbihcbiAgICAgICAgJ1RoYW5rIHlvdSBmb3IgeW91ciBmZWVkYmFjay4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IFNOQUNLQkFSX0RVUkFUSU9OLCBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3MnXSB9XG4gICAgICApXG4gICAgICB0aGlzLmZlZWRiYWNrR2l2ZW4gPSB7IGNvdXJzZV9pZDogdGhpcy5jb3Vyc2VJRCwgcmF0aW5nOiByYXRpbmcsIGNvbW1lbnRzOiBjb21tZW50IH1cblxuICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aGlzLm1hdFNuYWNrYmFyTmV3Lm9wZW4oXG4gICAgICAgICdTb21ldGhpbmcgaXMgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgJ1gnLFxuICAgICAgICB7IGR1cmF0aW9uOiBTTkFDS0JBUl9EVVJBVElPTiwgcGFuZWxDbGFzczogWydlcnJvciddIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwbGF5UmVzdW1lRm9yQUkoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKHRoaXMuZmlyc3RSZXNvdXJjZUxpbmspIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZmlyc3RSZXNvdXJjZUxpbmsudXJsXSwgeyBxdWVyeVBhcmFtczogdGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyB9KVxuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgZW5yb2xsVXNlclRvQUkoKSB7XG4gICAgdGhpcy5mcm9tQUlUdXRvciA9IHRydWVcbiAgICB0aGlzLmhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXG4gIH1cblxuICBvcGVuU3VydmV5Rm9ybVBvcHVwKGV2ZW50OiBib29sZWFuKSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLm9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKClcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIHJvdXRlVG9QcmVBc3Nlc3NlbnQoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAvLyB0aGlzLmdlbmVyYXRlUHJlQXNzZXNzbWVudFF1ZXJ5KCdTVEFSVCcpXG4gICAgICBsZXQgZmlyc3RSZXNvdXJjZSA9IHRoaXMuY29udGVudFJlYWREYXRhLnByZUVucm9sbWVudFJlc291cmNlc1swXVxuICAgICAgbGV0IG1pbWVUeXBlID0gZmlyc3RSZXNvdXJjZT8uY291cnNlQ2F0ZWdvcnkgPT09ICdQcmUgRW5yb2xtZW50IEFzc2Vzc21lbnQnID8gJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0JyA6IGZpcnN0UmVzb3VyY2UubWltZVR5cGVcbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5pZGVudGlmaWVyLFxuICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXNbMF0/LnByaW1hcnlDYXRlZ29yeSB8fCAnJyxcbiAgICAgICAgJycsXG4gICAgICApXG4gICAgICBsZXQgcm91dGVyTGluayA9IHRoaXMuZmlyc3RSZXNvdXJjZUxpbms/LnVybFxuICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSgnU1RBUlQnKVxuICAgICAgcXVlcnlQYXJhbXMgPSB7IC4uLnF1ZXJ5UGFyYW1zLCBwcmVBc3Nlc3NtZW50OiAndHJ1ZScgfVxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3JvdXRlckxpbmt9YF0sIHsgcXVlcnlQYXJhbXMgfSlcbiAgICB9XG4gIH1cblxuICBnZXRQcmVBc3Nlc3NtZW50UmVxdWlyZWQoKSB7XG4gICAgdGhpcy5wcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnID0gZmFsc2VcbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWcgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMoKSB7XG4gICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gICAgbGV0IHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnI6IGFueSA9IFtdXG4gICAgbGV0IHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnI6IGFueSA9IFtdXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8uZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnIucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtPy5pc01hbmRhdG9yeSkge1xuICAgICAgICAgIHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnIucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAocHJlRW5yb2xsbWVudFJlc291cmNlc0FyciAmJiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLmxlbmd0aCkge1xuICAgICAgbGV0IHJlcSA9IHtcbiAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcImNvbnRlbnRJZHNcIjogcHJlRW5yb2xsbWVudFJlc291cmNlc0FycixcbiAgICAgICAgICBcImZpZWxkc1wiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvY1N2Yy5yZWFkUHJlRW5yb2xsbWVudFJlc291cmNlc1N0YXRlKHJlcSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IG1hbmRhdG9yeUlkc0NvbXBsZXRlZCA9IFtdXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnc3RhdHVzJ10gPT09IDIgJiYgcHJlRW5yb2xsbWVudE1hbmRhdG9yeVJlc291cmNlc0Fyci5pbmNsdWRlcyhkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnY29udGVudElkJ10pKSB7XG4gICAgICAgICAgICAgIG1hbmRhdG9yeUlkc0NvbXBsZXRlZC5wdXNoKGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0W2ldWydjb250ZW50SWQnXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnI/Lmxlbmd0aCA9PT0gZGF0YS5yZXN1bHQuY29udGVudExpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IHRydWVcbiAgICAgICAgICB9IGVsc2UgaWYgKG1hbmRhdG9yeUlkc0NvbXBsZXRlZC5sZW5ndGggPT09IHByZUVucm9sbG1lbnRNYW5kYXRvcnlSZXNvdXJjZXNBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXJTdmMuc2V0RW5yb2xsRGF0YShudWxsKVxuICAgIHRoaXMuZ2V0U2VydmVyRGF0ZVRpbWUoKVxuICAgIHRoaXMubW9iaWxlMTIwMCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTIwMVxuICAgIHRoaXMuZ2V0STE4TlRyYW5zbGF0aW9ucygpXG4gICAgdGhpcy5sb2FkTGVhcm5lckFkdmlzb3J5RGF0YSgpXG4gICAgdGhpcy5zZXR1cFNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMuc2V0Q2hhbm5lbElkKClcbiAgICB0aGlzLmNoZWNrSWZyYW1lQ29udGV4dCgpXG4gICAgdGhpcy5xdWVyeVBhcmFtc0RhdGEgPSB0aGlzLnNldHVwUm91dGVTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLnNldHVwRnJhZ21lbnRTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMuc2V0dXBCYXRjaFN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuY29uZmlndXJlRGVmYXVsdExvZ28oKVxuICAgIHRoaXMuY29uZmlndXJlRmVhdHVyZUZsYWdzKClcbiAgICB0aGlzLmNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKClcbiAgICB0aGlzLnNldHVwUm91dGVyRXZlbnRTdWJzY3JpcHRpb24oKVxuICAgIHRoaXMuZ2V0Q29udGVudENyZWF0b3JEYXRhKClcbiAgICB0aGlzLnNldHVwSGFzaG1hcFVwZGF0ZVN1YnNjcmlwdGlvbigpXG5cbiAgICB0aGlzLnVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjPy51c2VyUHJvZmlsZT8udXNlcklkIHx8ICcnXG4gICAgdGhpcy5kb21haW5Db25mU3ZjLmluaXRGcm9tQ29uZmlnKHRoaXMuY29uZmlnU3ZjLmdsb2JhbENvbmZpZy5hcHBsaWNhdGlvbkNvbmZpZylcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoZGF0YTogRGF0YSkge1xuICAgIGNvbnN0IGluaXREYXRhOiBhbnkgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuICAgIHRoaXMuc2V0RXJyb3JDb2RlKGluaXREYXRhLmVycm9yQ29kZSlcbiAgICB0aGlzLnNldHVwQmF0Y2hDb250cm9sU3Vic2NyaXB0aW9uKClcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gIH1cblxuICBwcml2YXRlIHNldEVycm9yQ29kZShlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSkge1xuICAgIHRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlXG4gICAgc3dpdGNoICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuQVBJX0ZBSUxVUkU6XG4gICAgICBjYXNlIE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5JTlZBTElEX0RBVEE6XG4gICAgICBjYXNlIE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5OT19EQVRBOlxuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5pbnRlcm5hbFNlcnZlclxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuc29tZXRoaW5nV3JvbmdcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuXG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVG9jU3RydWN0dXJlKCkge1xuICAgIHRoaXMuY29udGVudFBhcmVudHMgPSB7fVxuICAgIHRoaXMudG9jU3RydWN0dXJlID0ge1xuICAgICAgYXNzZXNzbWVudDogMCxcbiAgICAgIGNvdXJzZTogMCxcbiAgICAgIGhhbmRzT246IDAsXG4gICAgICBpbnRlcmFjdGl2ZVZpZGVvOiAwLFxuICAgICAgbGVhcm5pbmdNb2R1bGU6IDAsXG4gICAgICBvdGhlcjogMCxcbiAgICAgIHBkZjogMCxcbiAgICAgIHN1cnZleTogMCxcbiAgICAgIHBvZGNhc3Q6IDAsXG4gICAgICBwcmFjdGljZVRlc3Q6IDAsXG4gICAgICBmaW5hbFRlc3Q6IDAsXG4gICAgICBxdWl6OiAwLFxuICAgICAgdmlkZW86IDAsXG4gICAgICB3ZWJNb2R1bGU6IDAsXG4gICAgICB3ZWJQYWdlOiAwLFxuICAgICAgeW91dHViZTogMCxcbiAgICAgIGludGVyYWN0aXZlY29udGVudDogMCxcbiAgICAgIG9mZmxpbmVTZXNzaW9uOiAwLFxuICAgICAgcHJlRW5yb2xsbWVudEFzc2Vzc21lbnQ6IDAsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEJhdGNoQ29udHJvbFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmJhdGNoQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChiYXRjaDogTnNDb250ZW50LklCYXRjaCkgPT4ge1xuICAgICAgaWYgKGJhdGNoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQmF0Y2hFbnJvbGxtZW50KGJhdGNoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJhdGNoRW5yb2xsbWVudChiYXRjaDogTnNDb250ZW50LklCYXRjaCkge1xuICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IHRydWVcbiAgICBsZXQgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU/LnVzZXJJZCB8fCAnJ1xuXG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkOiBiYXRjaC5jb3Vyc2VJZCxcbiAgICAgICAgYmF0Y2hJZDogYmF0Y2guYmF0Y2hJZCxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmVucm9sbFVzZXJUb0JhdGNoKHJlcSkudGhlbigoZGF0YWI6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGFiPy5yZXN1bHQ/LnJlc3BvbnNlID09PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzZnVsRW5yb2xsbWVudChiYXRjaClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRW5yb2xsbWVudEZhaWx1cmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3NmdWxFbnJvbGxtZW50KGJhdGNoOiBOc0NvbnRlbnQuSUJhdGNoKSB7XG4gICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICBjb250ZW50OiBbYmF0Y2hdLFxuICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgfVxuICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSlcblxuICAgIC8vIENSSVRJQ0FMOiBGb3IgTGVhcm5pbmcgUGF0aHdheXMsIGNvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgc3RhdHVzIGFmdGVyIGVucm9sbG1lbnRcbiAgICAvLyBUaGlzIGVuc3VyZXMgbWlsZXN0b25lcyBhcmUgcHJvcGVybHkgbG9ja2VkIHVudGlsIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICB0aGlzLnRvY1N2Yy5jb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyh0cnVlKVxuICAgICAgdGhpcy5zeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpXG4gICAgfVxuXG4gICAgdGhpcy5yb3V0ZXJDaGFuZ2VIYW5kbGVyKHRydWUpXG4gICAgdGhpcy5vcGVuU25hY2tiYXIoJ0Vucm9sbGVkIFN1Y2Nlc3NmdWxseSEnKVxuICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVucm9sbG1lbnRGYWlsdXJlKCkge1xuICAgIHRoaXMub3BlblNuYWNrYmFyKCdTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciEnKVxuICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGxvYWRMZWFybmVyQWR2aXNvcnlEYXRhKCkge1xuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEpIHtcbiAgICAgIHRoaXMubGVhcm5BZHZpc29yeURhdGEgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YS5sZWFybmVyQWR2aXNvcnlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwU2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoLnN1YnNjcmliZShiYXRjaERhdGEgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YSA9IGJhdGNoRGF0YVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldENoYW5uZWxJZCgpIHtcbiAgICB0aGlzLmNoYW5uZWxJZCA9IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlDb25maWdcbiAgICAgID8gdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeUNvbmZpZy5jaGFubmVsXG4gICAgICA6ICcnXG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZyYW1lQ29udGV4dCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0luSWZyYW1lID0gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3BcbiAgICB9IGNhdGNoIChfZXgpIHtcbiAgICAgIHRoaXMuaXNJbklmcmFtZSA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJvdXRlU3Vic2NyaXB0aW9ucygpIHtcbiAgICBsZXQgcXVlcnlQYXJhbXN0ZW1wOiBhbnkgPSB7fVxuICAgIGlmICh0aGlzLnJvdXRlKSB7XG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IERhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGE/LmNvbnRlbnQ/LmRhdGE/LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtc3RlbXAgPSBhd2FpdCB0aGlzLnByb2Nlc3NSb3V0ZURhdGEoZGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgZGF0YTogdGhpcy5pbnB1dENvbnRlbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcXVlcnlQYXJhbXN0ZW1wID0gYXdhaXQgdGhpcy5wcm9jZXNzUm91dGVEYXRhKHRlbXBEYXRhKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcXVlcnlQYXJhbXN0ZW1wXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NSb3V0ZURhdGEoZGF0YTogRGF0YSkge1xuICAgIHRoaXMuY291cnNlSUQgPSBkYXRhPy5jb250ZW50Py5kYXRhPy5zdGF0dXMgPT09ICdSZXRpcmVkJyA/ICcnIDogZGF0YS5jb250ZW50LmRhdGE/LmlkZW50aWZpZXJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMudG9jU3ZjLmluaXREYXRhKGRhdGEsIHRydWUpXG4gICAgLy8gR2V0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBjb25zdCBxdWVyeVBhcmFtc0RhdGFUZW1wID0gYXdhaXQgdGhpcy5nZXRRdWVyeVBhcmFtcygpXG4gICAgLy8gSGFuZGxlIG11bHRpbGluZ3VhbCBjb250ZW50IGlmIG1sSWQgaXMgcHJlc2VudCBpbiBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgaWYgKHF1ZXJ5UGFyYW1zRGF0YVRlbXAuTUxJZCkge1xuICAgICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIGNvbnRlbnQgZGF0YSBmb3IgcmVmZXJlbmNlXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgPSBpbml0RGF0YS5jb250ZW50XG5cbiAgICAgIC8vIEZldGNoIHRoZSBtdWx0aWxpbmd1YWwgY29udGVudFxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyID09PSBxdWVyeVBhcmFtc0RhdGFUZW1wLk1MSWQpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRSZWFkKHF1ZXJ5UGFyYW1zRGF0YVRlbXAuTUxJZClcbiAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIC8vIElmIG11bHRpbGluZ3VhbCBjb250ZW50IGZldGNoIGZhaWxzLCBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRlbnRcbiAgICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignRmFpbGVkIHRvIGxvYWQgbXVsdGlsaW5ndWFsIGNvbnRlbnQsIHVzaW5nIG9yaWdpbmFsIGNvbnRlbnQgaW5zdGVhZCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBPbiBlcnJvciwgdXNlIHRoZSBvcmlnaW5hbCBjb250ZW50XG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgbG9hZGluZyBtdWx0aWxpbmd1YWwgY29udGVudDonLCBlcnJvcilcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gbG9hZCBjb250ZW50IGluIHNlbGVjdGVkIGxhbmd1YWdlJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG11bHRpbGluZ3VhbCBjb250ZW50IHJlcXVlc3RlZCwgdXNlIHRoZSBvcmlnaW5hbCBjb250ZW50XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICB9XG4gICAgLy8gQWRkZWQgdG8gbWFrZSBzdXJlIHRoaXMgcmVmZXJlbmNlIHdhcyBpbmNvcnJlY3QsIGFzc2lnbmluZyBhZ2FpbiB0byBtYWtlIHN1cmUgZ2xvYmFsIHZhcmlhYmxlIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zRGF0YSA9IHF1ZXJ5UGFyYW1zRGF0YVRlbXBcblxuICAgIC8vIENvbnRpbnVlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NpbmdcbiAgICB0aGlzLmxvYWRMYW5ndWFnZURhdGEoKVxuICAgIHRoaXMuZ2V0UHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMoKVxuICAgIHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlcXVpcmVkKClcblxuICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29udGVudFByZXZpZXdPckVucm9sbG1lbnQoKVxuXG4gICAgdGhpcy5pbml0aWFscm91dGVEYXRhID0gZGF0YVxuICAgIHRoaXMubG9hZEJhbm5lckFuZFRvY0NvbmZpZyhkYXRhKVxuICAgIHRoaXMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1c0lmTmVlZGVkKClcbiAgICB0aGlzLmluaXREYXRhKGRhdGEpXG5cbiAgICAvLyB0byBjbGVhciBwdWJsaWMgc3VydmV5IGRhdGEgaWYgYW55IG9uIGxvYWQsXG4gICAgLy8gaWYgbm90IGNsZWFyZWQgdGhlbiBpdCB3aWxsIGJlIGNsZWFyZWQgb24gcG9wdXAgY2xvc2UsXG4gICAgLy8gIGJ1dCB0aGUgdGVhY2hlcnMgbm90ZXMgd2lsbCBiZSB2aXNpYmxlIG9uIGNpbWluZyBiYWNrIGZyb20gcGxheWVyIHBhZ2VcbiAgICBjb25zdCBzdXJ2ZXlJZCA9IHRoaXMuZW52aXJvbm1lbnQucHVibGljQ29udGVudFN1cnZleUlkIHx8ICcnXG4gICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIHRoaXMuY2xlYXJFeGlzdGluZ1B1YmxpY1N1cnZleURhdGEoc3VydmV5SWQsIGNvdXJzZUlkKVxuXG4gICAgcmV0dXJuIHF1ZXJ5UGFyYW1zRGF0YVRlbXBcbiAgfVxuXG4gIG9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKCkge1xuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgXy5nZXQodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCAnY29tcGxldGlvblN1cnZleUxpbmsnKSkge1xuICAgICAgY29uc3Qgc0lEID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmNvbXBsZXRpb25TdXJ2ZXlMaW5rLnNwbGl0KCdzdXJ2ZXlzLycpXG4gICAgICBjb25zdCBzdXJ2ZXlJZCA9IHNJRFsxXVxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgc3VydmV5SWQsXG4gICAgICAgIGNvdXJzZU5hbWU6IHRoaXMuY29udGVudFJlYWREYXRhPy5uYW1lIHx8ICcnLFxuICAgICAgICBjb3Vyc2VJRDogdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJycsXG4gICAgICAgIGNvbnRleHRPcmdJZDogdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IgJiYgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IubGVuZ3RoID4gMCA/XG4gICAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3JbMF0gOiAnJ1xuICAgICAgfVxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb21wbGV0aW9uU3VydmV5Rm9ybUNvbXBvbmVudCwge1xuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgIHdpZHRoOiAnNzUwcHgnLFxuICAgICAgICBtYXhXaWR0aDogJzkwdncnLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aGlzLm9wZW5Db25maXJtYXRpb25EaWFsb2coKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5Db25maXJtYXRpb25EaWFsb2coKSB7XG4gICAgY29uc3QgZGlhbG9nRGF0YSA9IHtcbiAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2Muc3VydmV5U3VibWl0dGVkJyksXG4gICAgICAgICAgY2xhc3NlczogJ2RpYWxvZy10aXRsZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FwcHRvYy5zdXJ2ZXlDb21wbGV0ZWRDZXJ0aWZpY2F0ZUdlbmVyYXRpbmcnKSxcbiAgICAgICAgICBjbGFzc2VzOiAnZGlhbG9nLWRlc2NyaXB0aW9uIG1iLTInXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBpY29uTmFtZTogJ2NoZWNrX2NpcmNsZScsXG4gICAgICB0eXBlOiAncHJpbWFyeScsXG4gICAgICBidXR0b25zUG9zaXRpb25DbGFzczogJ2p1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlcicsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiAnc3VjY2VzLWJ1dHRvbiB3aWR0aC1mdWxsJyxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2MucmV0dXJuVG9Qcm9ncmFtUGFnZScpLFxuICAgICAgICAgIHJlc3BvbnNlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dydcbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTGFuZ3VhZ2VEYXRhKCkge1xuICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRBbGxDb250ZW50TGFuZ3VhZ2VzKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGVudFByZXZpZXdPckVucm9sbG1lbnQoKSB7XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkQ29udGVudEZvclByZXZpZXcoKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAvLyBJZiB3ZSdyZSB3b3JraW5nIHdpdGggbXVsdGlsaW5ndWFsIGNvbnRlbnQsIG1ha2Ugc3VyZSB0byBmZXRjaCBpdHMgaGllcmFyY2h5XG4gICAgICAvLyBpZiAodGhpcy5xdWVyeVBhcmFtc0RhdGEubWxJZCAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJlxuICAgICAgLy8gICAgIHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgPT09IHRoaXMucXVlcnlQYXJhbXNEYXRhLm1sSWQpIHtcbiAgICAgIC8vICAgLy8gRmV0Y2ggY29udGVudCBoaWVyYXJjaHkgZm9yIHRoZSBtdWx0aWxpbmd1YWwgY29udGVudFxuICAgICAgLy8gICB0cnkge1xuICAgICAgLy8gICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIpO1xuICAgICAgLy8gICAgIC8vIEFmdGVyIGZldGNoaW5nIGhpZXJhcmNoeSwgdXBkYXRlIFVJIGNvbXBvbmVudHNcbiAgICAgIC8vICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpO1xuICAgICAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBmZXRjaGluZyBoaWVyYXJjaHkgZm9yIG11bHRpbGluZ3VhbCBjb250ZW50OicsIGVycm9yKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuXG4gICAgICAvLyBDb250aW51ZSB3aXRoIHJlZ3VsYXIgZW5yb2xsbWVudCBmbG93XG4gICAgICB0aGlzLmZldGNoVXNlckVucm9sbG1lbnREYXRhVjIoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZENvbnRlbnRGb3JQcmV2aWV3KCkge1xuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJhbm5lckFuZFRvY0NvbmZpZyhkYXRhOiBEYXRhKSB7XG4gICAgdGhpcy5iYW5uZXJzID0gZGF0YT8ucGFnZURhdGE/LmRhdGE/LmJhbm5lcnMgfHwgW11cbiAgICB0aGlzLnRvY1N2Yy5zdWJ0aXRsZU9uQmFubmVycyA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhPy5zdWJ0aXRsZU9uQmFubmVycyB8fCBmYWxzZVxuICAgIHRoaXMudG9jU3ZjLnNob3dEZXNjcmlwdGlvbiA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhPy5zaG93RGVzY3JpcHRpb24gfHwgZmFsc2VcbiAgICB0aGlzLnRvY0NvbmZpZyA9IGRhdGE/LnBhZ2VEYXRhPy5kYXRhIHx8IHt9XG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5MRUFSTklOR19QQVRIV0FZKSB7XG4gICAgICB0aGlzLmtwYXJyYXkgPSB0aGlzLnRvY0NvbmZpZy5rYXJtYVBvaW50c0xQIHx8IFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZGlzcGxheUJ1dHRvblwiOiBcIlJlc3VtZVwiLFxuICAgICAgICAgIFwidGV4dEJlZm9yZUljb25cIjogXCJlYXJuXCIsXG4gICAgICAgICAgXCJwb2ludHNcIjogXCIyNVwiLFxuICAgICAgICAgIFwidGV4dEFmdGVyUG9pbnRzXCI6IFwia2FybWFQb2ludHNcIixcbiAgICAgICAgICBcInRleHRBZnRlckljb25cIjogXCJieUNvbXBsZXRpbmdMUFwiLFxuICAgICAgICAgIFwidG9vbFRpcFRleHRcIjogXCJscENvbXBsZXRlVGlwXCJcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtwYXJyYXkgPSB0aGlzLnRvY0NvbmZpZy5rYXJtYVBvaW50cyB8fCBbXVxuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFBvc3RBc3Nlc3NtZW50U3RhdHVzSWZOZWVkZWQoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmlzUG9zdEFzc2Vzc21lbnQpIHtcbiAgICAgIHRoaXMudG9jU3ZjLmZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXModGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBjb25zdCBhc3Nlc3NtZW50RGF0YSA9IHJlcy5yZXN1bHRcbiAgICAgICAgZm9yIChjb25zdCBvIG9mIGFzc2Vzc21lbnREYXRhKSB7XG4gICAgICAgICAgaWYgKG8uY29udGVudElkID09PSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VGFrZUFzc2Vzc21lbnQgPSBvXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwRnJhZ21lbnRTdWJzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5jdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gICAgdGhpcy5yb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoKGZyYWdtZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudEZyYWdtZW50ID0gZnJhZ21lbnQgfHwgJ292ZXJ2aWV3J1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldHVwQmF0Y2hTdWJzY3JpcHRpb25zKCkge1xuICAgIHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5iYXRjaFJlcGxheVN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgKCkgPT4gdGhpcy5oYW5kbGVCYXRjaFVwZGF0ZSgpLFxuICAgICAgKCkgPT4gdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ2Vycm9yIG9uIGJhdGNoU3Vic2NyaXB0aW9uJylcbiAgICApXG5cbiAgICB0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YVN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgKCkgPT4gdGhpcy5oYW5kbGVCbGVuZGVkUHJvZ3JhbVVwZGF0ZSgpLFxuICAgICAgKCkgPT4gdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ2Vycm9yIG9uIGJhdGNoRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCYXRjaFVwZGF0ZSgpIHtcbiAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgICBpZiAodGhpcy5jb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQmxlbmRlZFByb2dyYW1VcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgICAgIHRoaXMuZmV0Y2hVc2VyV0ZGb3JCbGVuZGVkKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZURlZmF1bHRMb2dvKCkge1xuICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcbiAgICBpZiAoaW5zdGFuY2VDb25maWc/LmxvZ29zPy5kZWZhdWx0U291cmNlTG9nbykge1xuICAgICAgdGhpcy5kZWZhdWx0U0xvZ28gPSBpbnN0YW5jZUNvbmZpZy5sb2dvcy5kZWZhdWx0U291cmNlTG9nb1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRmVhdHVyZUZsYWdzKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMpIHtcbiAgICAgIHRoaXMuaXNHb2Fsc0VuYWJsZWQgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygnZ29hbHMnKVxuICAgICAgdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCA9IHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3JlZ2lzdHJhdGlvbkV4dGVybmFsJylcbiAgICAgIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZSA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdzaG93SW50cmFuZXRNZXNzYWdlRGVza3RvcCcpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJvdXRlckV2ZW50U3Vic2NyaXB0aW9uKCkge1xuICAgIHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChyb3V0ZXJFdmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmIChyb3V0ZXJFdmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5hc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHJvdXRlckV2ZW50LnVybClcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvbiB0aGUgVE9DL292ZXJ2aWV3IHBhZ2UgZm9yIGEgTGVhcm5pbmcgUGF0aHdheVxuICAgICAgICBjb25zdCBpc1RvY1BhZ2UgPSByb3V0ZXJFdmVudC51cmwuaW5jbHVkZXMoJy9hcHAvdG9jJykgfHxcbiAgICAgICAgICByb3V0ZXJFdmVudC51cmwuaW5jbHVkZXMoJy9vdmVydmlldycpIHx8XG4gICAgICAgICAgcm91dGVyRXZlbnQudXJsLmluY2x1ZGVzKCcvY29udGVudCcpXG5cblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBoYXNobWFwIHVwZGF0ZXMgdG8gcmVjb21wdXRlIG1pbGVzdG9uZSBsb2NrIHN0YXR1cyBpbiByZWFsLXRpbWVcbiAgICogVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBwcm9ncmVzcyBjaGFuZ2VzLCBtaWxlc3RvbmUgbG9ja3MgdXBkYXRlIGltbWVkaWF0ZWx5IHdpdGhvdXQgcGFnZSByZWZyZXNoXG4gICAqL1xuICBwcml2YXRlIHNldHVwSGFzaG1hcFVwZGF0ZVN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuaGFzaG1hcFVwZGF0ZWQkLnN1YnNjcmliZSgodXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgICBjb25zdCBpc0Vucm9sbGVkID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMFxuICAgICAgICAvLyBTeW5jIGNvbnRlbnQgdHJlZSdzIGlzTG9ja2VkIHdpdGggdGhlIHVwZGF0ZWQgaGFzaG1hcCB2YWx1ZXNcbiAgICAgICAgdGhpcy5zeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cbiAgZmV0Y2hVc2VyRW5yb2xsbWVudERhdGFWMigpIHtcblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJydcbiAgICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDYW5ub3QgZmV0Y2ggZW5yb2xsbWVudCBkYXRhOiBjb250ZW50IGlkZW50aWZpZXIgaXMgbWlzc2luZycpXG4gICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IFtdXG4gICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgcmV0aXJlZENvdXJzZXNFbmFibGVkOiB0cnVlLFxuICAgICAgICBjb3Vyc2VJZDogW2lkZW50aWZpZXJdXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnJvbGxTdmMuZmV0Y2hFbnJvbGxDb250ZW50RGF0YShyZXF1ZXN0KS5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSxcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8ucmVzdWx0Py5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IHJlcy5yZXN1bHQuY291cnNlc1xuICAgICAgICAgIC8vIENoZWNrIGZvciBjb21wbGV0ZWQgY29udGVudFxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvbnRlbnREYXRhID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZChcbiAgICAgICAgICAgIChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICBlbC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmIChjb21wbGV0ZWRDb250ZW50RGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZSgnY29tcGxldGUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlclN2Yy5zZXRFbnJvbGxEYXRhKHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlsaW5ndWFsKSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGJhY2sgZnJvbSBwbGF5ZXIgd2UgbmVlZCB0byBjaGVjayByZWNlbnQgbGFuZ3VhZ2UgYW5kIGxvYWRcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50TGliU3ZjPy5vbmVTdGVwUmVzdW1lRW5hYmxlICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciA9PT0gdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgbGV0IGxhbmcgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lmxhbmd1YWdlPy5sZW5ndGggPyB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lmxhbmd1YWdlWzBdIDogJydcbiAgICAgICAgICAgICAgbGV0IGJhc2VDb250ZW50RnJvbUVucm9sbERhdGEgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgaWYgKGxhbmcgJiYgYmFzZUNvbnRlbnRGcm9tRW5yb2xsRGF0YSAmJiBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhPy5yZWNlbnRfbGFuZ3VhZ2U/LnRvTG93ZXJDYXNlKCkgIT09IGxhbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxMYW5nID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRSZXF1aXJlZExhbmd1YWdlRGV0YWlscyh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGE/LnJlY2VudF9sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxMYW5nICYmIE9iamVjdC5rZXlzKGxvY2FsTGFuZykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbih0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFJlcXVpcmVkTGFuZ3VhZ2VEZXRhaWxzKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSwgYmFzZUNvbnRlbnRGcm9tRW5yb2xsRGF0YT8ucmVjZW50X2xhbmd1YWdlKSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24odGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRTZWxlY3RlZExhbmd1YWdlKHRoaXMuY29udGVudFJlYWREYXRhKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgZmV0Y2hDb250ZW50SGllcmFyY2h5IGZpcnN0XG4gICAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgZmV0Y2hDb250ZW50SGllcmFyY2h5IGZpcnN0XG4gICAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSBbXVxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgY29udGVudCBJRCBmcm9tIGVpdGhlciBjb250ZW50IG9yIGNvbnRlbnRSZWFkRGF0YVxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRJZCA9IHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGlmICghY29udGVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ2Fubm90IGZldGNoIGhpZXJhcmNoeTogY29udGVudCBpZGVudGlmaWVyIGlzIG1pc3NpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGZXRjaCBoaWVyYXJjaHkgY29udGVudCBmb3IgYWRkaXRpb25hbCBkYXRhXG4gICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5mZXRjaENvbnRlbnRIaWVyYXJjaHkoY29udGVudElkKSlcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyBBZGQgY2F0Y2hFcnJvciBoZXJlIHRvIGhhbmRsZSBlcnJvcnMgZnJvbSBmZXRjaENvbnRlbnRIaWVyYXJjaHlcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gZW5yb2xsbWVudCBkYXRhIHByb2Nlc3NpbmcnLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdD8ubGVuZ3RoICYmIHRoaXMuY29udGVudExpYlN2Yz8ub25lU3RlcFJlc3VtZUVuYWJsZSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlT25lU3RlcFJlc3VtZSgpXG4gICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXIgZW5yb2xsbWVudCBkYXRhJywgZXJyb3IpXG4gICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAvLyBPcHRpb25hbCBjb21wbGV0aW9uIGhhbmRsZXIgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlT25lU3RlcFJlc3VtZSgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NvbnRlbnQgbm90IGF2YWlsYWJsZSBmb3Igb25lLXN0ZXAgcmVzdW1lJylcblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKFxuICAgICAgICAoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXJcbiAgICAgIClcblxuICAgICAgaWYgKCFmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignTm8gbWF0Y2hpbmcgZW5yb2xsZWQgY29udGVudCBmb3VuZCBmb3Igb25lLXN0ZXAgcmVzdW1lJylcblxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmxEYXRhID0gYXdhaXQgdGhpcy5jb250ZW50TGliU3ZjLmdldFJlc291cnNlTGluayhcbiAgICAgICAgdGhpcy5jb250ZW50LFxuICAgICAgICBbZm91bmRDb250ZW50XSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJyxcbiAgICAgIClcblxuICAgICAgaWYgKCF1cmxEYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ05vIFVSTCBkYXRhIHJldHVybmVkIGZvciBvbmUtc3RlcCByZXN1bWUnKVxuXG4gICAgICB9XG5cbiAgICAgIGlmICh1cmxEYXRhPy51cmwpIHtcbiAgICAgICAgaWYgKHVybERhdGEudXJsLmluY2x1ZGVzKCdhcHAvdG9jJykpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgICAgICAgIC8vIFdoZW4gY29taW5nIGZyb20gc2VhcmNoIHBhZ2UgZm9yIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgY29udGVudCwgY29uZmlybSBmaXJzdCB0byBvbmUgc3RlcCByZXN1bWUgb3IgbG9hZCB0aGUgc2VhcmNoZWQgbGFuZ3VhZ2VcbiAgICAgICAgICBpZiAodXJsRGF0YT8ucXVlcnlQYXJhbXM/Lk1MICYmICh1cmxEYXRhPy5xdWVyeVBhcmFtcz8uTUwgIT09IHRoaXMucXVlcnlQYXJhbXNEYXRhWydNTCddKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T25lU3RlcFJlc3VtZUNvbmZpcm0odXJsRGF0YSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgIFt1cmxEYXRhLnVybF0sXG4gICAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXMgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gaGFuZGxlT25lU3RlcFJlc3VtZScsIGVycm9yKVxuICAgICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGZldGNoQ29udGVudEhpZXJhcmNoeShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVxuXG5cbiAgICAgICAgLy8gU1RFUCAxOiBDb25zdHJ1Y3QgaGllcmFyY2h5IHN0cnVjdHVyZVxuICAgICAgICBsZXQgY29udGVudEhlaXJhcmNoeURhdGEgPSB0aGlzLmFwcFRvY1YyU3ZjLmNvbnN0cnVjdEhlaXJhcmNoeURhdGEoY29udGVudClcblxuICAgICAgICAvLyBTVEVQIDI6IFVwZGF0ZSBwcm9ncmVzcyB3aXRoIGxhdGVzdCBlbnJvbGxtZW50IGRhdGFcbiAgICAgICAgdGhpcy5hcHBUb2NWMlN2Yy5tYXBDb250ZW50SGllcmFyY2h5UHJvZ3Jlc3NVcGRhdGUoY29udGVudEhlaXJhcmNoeURhdGEsIHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuXG4gICAgICAgIC8vIFNURVAgMzogQ3JlYXRlIGhhc2htYXAgZnJvbSB1cGRhdGVkIGhpZXJhcmNoeSAodGhpcyBzaG91bGQgcHJlc2VydmUgY29tcGxldGlvbiBzdGF0dXMpXG4gICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChjb250ZW50SGVpcmFyY2h5RGF0YSlcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudEhlaXJhcmNoeURhdGFcbiAgICAgICAgLy8gQ2hlY2sgaWYgdXNlciBpcyBlbnJvbGxlZFxuICAgICAgICBjb25zdCBpc0Vucm9sbGVkID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMFxuXG4gICAgICAgIC8vIFNURVAgNDogQ29tcHV0ZSBtaWxlc3RvbmUgbG9ja2luZyBzdGF0dXMgd2l0aCBlbnJvbGxtZW50IHN0YXR1cyBhbmQgdXBkYXRlZCBwcm9ncmVzcyBkYXRhXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKGlzRW5yb2xsZWQpXG5cbiAgICAgICAgLy8gU1RFUCA1OiBTeW5jIGNvbnRlbnQgdHJlZSdzIGlzTG9ja2VkIHdpdGggY29tcHV0ZWQgdmFsdWVzXG4gICAgICAgIHRoaXMuc3luY01pbGVzdG9uZUxvY2tTdGF0dXMoKVxuXG4gICAgICAgIHRoaXMuZ2V0T3JnSWRGb3JTaGFyZSgpXG4gICAgICAgIHRoaXMuZ2V0VG9jU3RydWN0dXJlKClcbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgZmV0Y2hIaWVyYXJjaHlDb250ZW50IHJldHVybnMgYW4gT2JzZXJ2YWJsZVxuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gdGhpcy5jb250ZW50U3ZjLmZldGNoSGllcmFyY2h5Q29udGVudChpZGVudGlmaWVyLCAnZGV0YWlsJylcblxuICAgICAgICBpZiAoIW9ic2VydmFibGUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZmV0Y2hIaWVyYXJjaHlDb250ZW50IGRpZCBub3QgcmV0dXJuIGFuIE9ic2VydmFibGUnKVxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZT8ucmVzdWx0Py5jb250ZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3JnSWRGb3JTaGFyZSgpXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VG9jU3RydWN0dXJlKClcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJSYXRpbmcgPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJSYXRpbmcoZmFsc2UpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggaGllcmFyY2h5IGNvbnRlbnQnLCBlcnJvcilcbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXRUb2NTdHJ1Y3R1cmUoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplVG9jU3RydWN0dXJlKClcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICB0aGlzLmhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5sZWFybmluZ01vZHVsZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHRoaXMudG9jU3ZjLmdldFRvY1N0cnVjdHVyZSh0aGlzLmNvbnRlbnQsIHRoaXMudG9jU3RydWN0dXJlKVxuICAgICAgZm9yIChjb25zdCBwcm9nVHlwZSBpbiB0aGlzLnRvY1N0cnVjdHVyZSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdHJ1Y3R1cmVbcHJvZ1R5cGVdID4gMCkge1xuICAgICAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZnJvbSBuZ09uQ2hhbmdlc1xuICAgICAgdGhpcy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2VzcygpXG4gICAgICB0aGlzLm1vZGlmeVNlbnNpYmxlQ29udGVudFJhdGluZygpXG4gICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodGhpcy5yb3V0ZXIudXJsKVxuICAgICAgdGhpcy5nZXRMZWFybmluZ1VybHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIG1pbGVzdG9uZSBpc0xvY2tlZCBwcm9wZXJ0eSB3aXRoIGNvbXB1dGVkIGxvY2tpbmcgc3RhdHVzIGZyb20gaGFzaG1hcFxuICAgKiBUaGlzIGVuc3VyZXMgdGhlIGNvbnRlbnQgdHJlZSByZWZsZWN0cyB0aGUgYWN0dWFsIGxvY2sgc3RhdHVzXG4gICAqL1xuICBzeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCB8fCAhdGhpcy5jb250ZW50LmNoaWxkcmVuKSByZXR1cm5cblxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2VcbiAgICB0aGlzLmNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgJiYgY2hpbGQuaWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBoYXNoRGF0YSA9IHRoaXMudG9jU3ZjLmhhc2htYXBbY2hpbGQuaWRlbnRpZmllcl1cbiAgICAgICAgaWYgKGhhc2hEYXRhICYmIGhhc2hEYXRhLmNvbXB1dGVkSXNMb2NrZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9sZExvY2tlZCA9IGNoaWxkLmlzTG9ja2VkXG4gICAgICAgICAgY2hpbGQuaXNMb2NrZWQgPSBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkXG4gICAgICAgICAgaWYgKG9sZExvY2tlZCAhPT0gY2hpbGQuaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIG1pbGVzdG9uZSBsb2NraW5nIHN0YXR1cyBmcm9tIHRoZSBhbHJlYWR5LXVwZGF0ZWQgaGFzaG1hcFxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHByb2dyZXNzIHVwZGF0ZXMgdG8gc3luYyBVSSB3aXRoIGNvbXB1dGVkIGxvY2sgc3RhdHVzXG4gICAqIE5vdGU6IERvZXMgTk9UIGZldGNoIGVucm9sbG1lbnQgZGF0YSAtIHVzZXMgZXhpc3RpbmcgaGFzaG1hcCB3aGljaCBpcyBhbHJlYWR5IHVwZGF0ZWRcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaEVucm9sbG1lbnRBbmRQcm9ncmVzcygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcblxuICAgICAgLy8gQ2hlY2sgaWYgdXNlciBpcyBlbnJvbGxlZFxuICAgICAgY29uc3QgaXNFbnJvbGxlZCA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCA+IDBcblxuICAgICAgLy8gUmVjb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIHN0YXR1cyBmcm9tIGV4aXN0aW5nIGhhc2htYXBcbiAgICAgIC8vIFRoZSBoYXNobWFwIGlzIGFscmVhZHkgdXBkYXRlZCB3aXRoIGxhdGVzdCBwcm9ncmVzcyB2aWEgaGFzaG1hcCB1cGRhdGUgc3Vic2NyaXB0aW9uXG4gICAgICB0aGlzLnRvY1N2Yy5jb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyhpc0Vucm9sbGVkKVxuXG4gICAgICAvLyBTeW5jIGxvY2sgc3RhdHVzIGZyb20gaGFzaG1hcCB0byBjb250ZW50IHRyZWVcbiAgICAgIHRoaXMuc3luY01pbGVzdG9uZUxvY2tTdGF0dXMoKVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFcnJvciBpbiByZWZyZXNoRW5yb2xsbWVudEFuZFByb2dyZXNzOicsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIG9uTGFuZ3VhZ2VTZWxlY3QobGFuZzogYW55KSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIGxhbmd1YWdlIGlzIGFscmVhZHkgc2V0XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSAmJiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UuaWRlbnRpZmllciA9PT0gbGFuZy5pZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4gLy8gRXhpdCB0aGUgZnVuY3Rpb24gaWYgdGhlIGxhbmd1YWdlIGlzIHRoZSBzYW1lXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgbGV0IGRhdGEgPSB7fVxuICAgICAgLy8gVE9ETzogUmVtb3ZlIGhhcmRjb2RlIHN0cmluZ3NcbiAgICAgIGNvbnN0IGVucm9sbGVkQ291cnNlID0gdGhpcy50b2NTdmMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKHRoaXMudXNlckVucm9sbG1lbnRMaXN0LCAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKSlcbiAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24obGFuZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIHByb2dyZXNzIGluIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSxcbiAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzcyAmJiB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3NbbGFuZy5sYW5nSWRdID4gMCkge1xuICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBmcm9tOiAnbGFuZ3VhZ2VTd2l0Y2gnLFxuICAgICAgICAgICAgICBpY29uOiAndHJhbnNsYXRlJyxcbiAgICAgICAgICAgICAgaGVhZGVyOiBgQ29udGludWUgd2hlcmUgeW91IGxlZnQgb2ZmIGluICR7bGFuZy5uYW1lfT9gLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgWW91J3ZlIGFscmVhZHkgbWFkZSBzb21lIHByb2dyZXNzIGluIHRoaXMgbGFuZ3VhZ2UuXFxuIElmIHlvdSBjb250aW51ZSBpdCB3aWxsIHJlc3VtZSBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZi5gLFxuICAgICAgICAgICAgICBjYW5jZWxCdXR0b246ICdCYWNrJyxcbiAgICAgICAgICAgICAgYWNjZXB0QnV0dG9uOiAnUmVzdW1lJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gcHJvZ3Jlc3MgaW4gdGhlIHNlbGVjdGVkIGxhbmd1YWdlLCBvciBmaXJzdCB0aW1lIHNlbGVjdGlvblxuICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBmcm9tOiAnbGFuZ3VhZ2VTd2l0Y2gnLFxuICAgICAgICAgICAgICBpY29uOiAndHJhbnNsYXRlJyxcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgbGFuZ3VhZ2U/JyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1N3aXRjaGluZyB0aGUgbGFuZ3VhZ2Ugd2lsbCByZXNldCB5b3VyIHByb2dyZXNzLiBcXG4gVGhlIGNvdXJzZSB3aWxsIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGluIHRoZSBzZWxlY3RlZCBsYW5ndWFnZS4nLFxuICAgICAgICAgICAgICBjYW5jZWxCdXR0b246ICdCYWNrJyxcbiAgICAgICAgICAgICAgYWNjZXB0QnV0dG9uOiAnQ2hhbmdlIGxhbmd1YWdlJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93TGFuZ1N3aXRjaFBvcHVwKGxhbmcsIGRhdGEpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgfVxuICB9XG5cbiAgc2hvd0xhbmdTd2l0Y2hQb3B1cChsYW5nOiBhbnksIGRhdGE/OiBhbnkpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRPQ011bHRpTGluZ3VhbERpYWxvZ0NvbXBvbmVudCwgZGF0YSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzaG93T25lU3RlcFJlc3VtZUNvbmZpcm0odXJsRGF0YTogYW55KSB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZyb206ICdsYW5ndWFnZVN3aXRjaCcsXG4gICAgICAgIGljb246ICd0cmFuc2xhdGUnLFxuICAgICAgICBoZWFkZXI6IGBZb3UndmUgYWxyZWFkeSBzdGFydGVkIHRoaXMgY291cnNlYCxcbiAgICAgICAgbWVzc2FnZTogYFlvdeKAmXZlIG1hZGUgc29tZSA8Yj5wcm9ncmVzczwvYj4gaW4gYW5vdGhlciBsYW5ndWFnZSBvZiB0aGlzIGNvdXJzZS4gXFxuV291bGQgeW91IGxpa2UgdG8gPGI+cmVzdW1lIHdoZXJlIHlvdSBsZWZ0IG9mZjwvYj4sIG9yIGNvbnRpbnVlIHdpdGggdGhpcyB2ZXJzaW9uIGluc3RlYWQ/YCxcbiAgICAgICAgY2FuY2VsQnV0dG9uOiAnQ29udGludWUgSGVyZScsXG4gICAgICAgIGFjY2VwdEJ1dHRvbjogJ1Jlc3VtZScsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVE9DTXVsdGlMaW5ndWFsRGlhbG9nQ29tcG9uZW50LCBkYXRhKVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoY29uZmlybWVkKSA9PiB7XG4gICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgIFt1cmxEYXRhLnVybF0sXG4gICAgICAgICAgeyBxdWVyeVBhcmFtczogdXJsRGF0YS5xdWVyeVBhcmFtcyB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0UmVxdWlyZWRMYW5ndWFnZURldGFpbHModGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCB0aGlzLnF1ZXJ5UGFyYW1zRGF0YVsnTUwnXSlcbiAgICAgICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24obGFuZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmc6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IGxhbmdcblxuICAgIC8vIFNldCBza2VsZXRvbiBsb2FkZXIgdG8gc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IHRydWVcbiAgICAvLyBDaGVjayBpZiBsYW5ndWFnZSBvYmplY3QgaGFzIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAgICBpZiAobGFuZyAmJiBsYW5nLmlkZW50aWZpZXIpIHtcbiAgICAgIC8vIENyZWF0ZSBhIHByb21pc2UgY2hhaW4gdG8gZmV0Y2ggY29udGVudCBkYXRhIGFuZCBoaWVyYXJjaHkgc2VxdWVudGlhbGx5XG4gICAgICB0aGlzLmZldGNoQ29udGVudFJlYWQobGFuZy5pZGVudGlmaWVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gQWZ0ZXIgY29udGVudCByZWFkIGlzIHN1Y2Nlc3NmdWwsIGZldGNoIHRoZSBoaWVyYXJjaHlcbiAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbnRlbnRIaWVyYXJjaHkobGFuZy5pZGVudGlmaWVyKVxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gQm90aCBvcGVyYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bFxuICAgICAgICAgIC8vIFVwZGF0ZSBVSSBhcyBuZWVkZWQgd2l0aCBuZXcgY29udGVudFxuICAgICAgICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcih0cnVlKVxuICAgICAgICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0TGVhcm5pbmdVcmxzKClcbiAgICAgICAgICAgIC8vIFJlc2V0IHVzZXIgcHJvZ3Jlc3MgYW5kIGZldGNoIGVucm9sbG1lbnQgZGF0YSBpZiBub3QgaW4gcHJldmlldyBtb2RlXG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc3ViamVjdCB0byBub3RpZnkgcmF0aW5nIHN1bW1yeSBjb21wb25lbnQgYW5kIGxvYWQgdGhlIHN1bWFtcnkgb2Ygc2VsZWN0ZWQgbGFuZ3VhZ2VcbiAgICAgICAgICB0aGlzLnJlc2V0UmF0aW5nc1NlcnZpY2Uuc2V0UmF0aW5nU2VydmljZVVwZGF0ZSh0cnVlKVxuICAgICAgICAgIC8vIEZpbmFsbHkgc2V0IGxvYWRpbmcgc3RhdGUgdG8gZmFsc2VcbiAgICAgICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3JzIGluIHRoZSBwcm9taXNlIGNoYWluXG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Vycm9yIGR1cmluZyBsYW5ndWFnZSBjaGFuZ2U6JywgZXJyb3IpXG4gICAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gbG9hZCBjb250ZW50IGluIHNlbGVjdGVkIGxhbmd1YWdlJywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignSW52YWxpZCBsYW5ndWFnZSBzZWxlY3Rpb24nLCBsYW5nKVxuICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ludmFsaWQgbGFuZ3VhZ2Ugc2VsZWN0aW9uJywgJ1gnLCB7XG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjb250ZW50IGRhdGEgZm9yIGEgZ2l2ZW4gaWRlbnRpZmllciBhbmQgdXBkYXRlcyB0aGUgY29udGVudFJlYWREYXRhIHByb3BlcnR5XG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBjb250ZW50IGlkZW50aWZpZXIgdG8gZmV0Y2hcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgY29udGVudCB3YXMgZmV0Y2hlZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENvbnRlbnRSZWFkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Nhbm5vdCBmZXRjaCBjb250ZW50OiBpZGVudGlmaWVyIGlzIG1pc3NpbmcnKVxuICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IHRoaXMuY29udGVudFN2Yy5mZXRjaENvbnRlbnREYXRhKGlkZW50aWZpZXIpXG5cbiAgICAgIGlmICghb2JzZXJ2YWJsZSkge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZmV0Y2hDb250ZW50RGF0YSBkaWQgbm90IHJldHVybiBhbiBPYnNlcnZhYmxlJylcbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnJlc3VsdD8uY29udGVudCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRlbnRSZWFkRGF0YSB3aXRoIHRoZSBmZXRjaGVkIGNvbnRlbnRcbiAgICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGxhbmd1YWdlIGxpc3QgYWZ0ZXIgY29udGVudCBpcyBmZXRjaGVkXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZUxpc3QgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldEFsbENvbnRlbnRMYW5ndWFnZXModGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy53YXJuKCdDb250ZW50IGRhdGEgbm90IGZvdW5kIGluIHJlc3BvbnNlJywgcmVzcG9uc2UpXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQgZGF0YScsIGVycm9yKVxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByb3V0ZXJDaGFuZ2VIYW5kbGVyKGFwcGVuZEJhdGNoSWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtczogYW55ID0ge31cblxuICAgIC8vIEFkZCBiYXRjaCBJRCBpZiBuZWVkZWRcbiAgICBpZiAoYXBwZW5kQmF0Y2hJZCAmJiB0aGlzLmdldEJhdGNoSWQoKSkge1xuICAgICAgcXVlcnlQYXJhbXMuYmF0Y2hJZCA9IHRoaXMuZ2V0QmF0Y2hJZCgpXG4gICAgfVxuXG4gICAgLy8gQWRkIG11bHRpbGluZ3VhbCBJRCBhbmQgbGFuZ3VhZ2UgdG8gcXVlcnkgcGFyYW1zIGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyKSB7XG4gICAgICBsZXQgbGFuZ3VhZ2UgPSAnJ1xuXG4gICAgICAvLyBIYW5kbGUgYm90aCBzdHJpbmcgYW5kIGFycmF5IGxhbmd1YWdlIGZvcm1hdHNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29udGVudFJlYWREYXRhLmxhbmd1YWdlKSkge1xuICAgICAgICBsYW5ndWFnZSA9IHRoaXMuY29udGVudFJlYWREYXRhLmxhbmd1YWdlWzBdLnRvTG93ZXJDYXNlKClcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZW50UmVhZERhdGEubGFuZ3VhZ2UpIHtcbiAgICAgICAgbGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpXG4gICAgICB9XG4gICAgICBpZiAoISh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgJiYgT2JqZWN0LmtleXModGhpcy5zZWxlY3RlZExhbmd1YWdlKS5sZW5ndGgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHtcbiAgICAgICAgICBsYW5nSWQ6IGxhbmd1YWdlLFxuICAgICAgICAgIG5hbWU6IHRoaXMuY29udGVudFJlYWREYXRhLmxhbmd1YWdlWzBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgYWRkIHBhcmFtZXRlcnMgaWYgd2UgaGF2ZSB2YWxpZCBkYXRhXG4gICAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMuTUwgPSBsYW5ndWFnZVxuICAgICAgfVxuXG4gICAgICBxdWVyeVBhcmFtcy5NTElkID0gdGhpcy5jb250ZW50UmVhZERhdGEuaWRlbnRpZmllclxuICAgIH1cblxuICAgIC8vIE9ubHkgbmF2aWdhdGUgaWYgd2UgaGF2ZSBiYXRjaCBJRCBvciBvdGhlciBwYXJhbWV0ZXJzXG4gICAgaWYgKE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgW10sXG4gICAgICAgIHtcbiAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyxcbiAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250aW51ZUxlYXJuaW5nRGF0YShjb250ZW50SWQ6IHN0cmluZywgYmF0Y2hJZD86IHN0cmluZywgbGFuZz86IHN0cmluZykge1xuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIHRoaXMucmVzdW1lRGF0YSA9IG51bGxcbiAgICBsZXQgdXNlcklkXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgICB9XG5cbiAgICBjb25zdCByZXE6IE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGFSZXEgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGJhdGNoSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgY291cnNlSWQ6IGNvbnRlbnRJZCB8fCAnJyxcbiAgICAgICAgY29udGVudElkczogW10sXG4gICAgICAgIGZpZWxkczogWydwcm9ncmVzc2RldGFpbHMnXSxcbiAgICAgICAgLi4uKGxhbmcgPyB7IGxhbmd1YWdlOiBsYW5nIH0gOiBudWxsKSxcbiAgICAgIH0sXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UpIHtcbiAgICAgIHRoaXMuY29udGVudFN2Yy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGVtcFJlc3VtZURhdGEgPSBfLmdldChkYXRhLCAncmVzdWx0LmNvbnRlbnRMaXN0JylcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzcyA9IF8uZ2V0KGRhdGEsICdyZXN1bHQubGFuZ3VhZ2VQcm9ncmVzcycpIHx8IHt9XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSBfLm1hcCh0ZW1wUmVzdW1lRGF0YSwgcnIgPT4ge1xuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBfLmZpbHRlcihmbGF0dGVuSXRlbXMoXy5nZXQodGhpcy5jb250ZW50LCAnY2hpbGRyZW4nKSB8fCBbXSwgJ2NoaWxkcmVuJyksIHsgJ2lkZW50aWZpZXInOiByci5jb250ZW50SWQsIHByaW1hcnlDYXRlZ29yeTogJ0xlYXJuaW5nIFJlc291cmNlJyB9KVxuICAgICAgICAgICAgICBfLnNldChyciwgJ3Byb2dyZXNzZGV0YWlscy5taW1lVHlwZScsIF8uZ2V0KF8uZmlyc3QoaXRlbXMpLCAnbWltZVR5cGUnKSlcbiAgICAgICAgICAgICAgaWYgKCFfLmdldChyciwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5nZXQocnIsICdzdGF0dXMnKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgXy5zZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScsIDEwMClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgXy5zZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScsIDApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gXy5tYXAodGhpcy5yZXN1bWVEYXRhLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnKVxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IF8udG9JbnRlZ2VyKF8uZ2V0KHRoaXMuY29udGVudCwgJ2xlYWZOb2Rlc0NvdW50JykpIHx8IDFcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5sZW5ndGggPCB0b3RhbENvdW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0b3RhbENvdW50IC0gcHJvZ3Jlc3MubGVuZ3RoXG4gICAgICAgICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgXy5lYWNoKG5ldyBBcnJheShkaWZmKSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MucHVzaCgwKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy51cGRhdGVSZXN1bWFEYXRhKHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3ModGhpcy5jb250ZW50LCB0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSAhPT0gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKHRoaXMuY29udGVudCwgdGhpcy5yZXN1bWVEYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY2FsbEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKHRoaXMuY29udGVudClcbiAgICAgICAgICAgIC8vIFJlY29tcHV0ZSBtaWxlc3RvbmUgbG9ja2luZyBzdGF0dXMgYWZ0ZXIgcHJvZ3Jlc3MgdXBkYXRlXG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRW5yb2xsZWQgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKGlzRW5yb2xsZWQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY01pbGVzdG9uZUxvY2tTdGF0dXMoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgLy8gUmVjb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIHN0YXR1cyBldmVuIHdpdGggbm8gcHJvZ3Jlc3MgZGF0YVxuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgICAgICAgICBjb25zdCBpc0Vucm9sbGVkID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMFxuICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyhpc0Vucm9sbGVkKVxuICAgICAgICAgICAgICB0aGlzLnN5bmNNaWxlc3RvbmVMb2NrU3RhdHVzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbnRlbnRTdmMuc2V0UHJvZ3JhbUNoaWxkUmVzdW1lRGF0YSh0aGlzLnJlc3VtZURhdGEsIGNvbnRlbnRJZClcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSAhPT0gMTAwKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRDb21wbGV0aW9uUGVyY2VudGFnZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDT05URU5UIEhJU1RPUlkgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKSB7XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGxldCByZXN1bWVEYXRhVjI6IGFueVxuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG4gICAgICBpZiAoIXJlc3VtZURhdGFWMi5taW1lVHlwZSkge1xuICAgICAgICByZXN1bWVEYXRhVjIubWltZVR5cGUgPSB0aGlzLnRvY1N2Yy5nZXRNaW1lVHlwZSh0aGlzLmNvbnRlbnQsIHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgICAgdGhpcy5yZXN1bWVEYXRhTGluayA9IHRoaXMuZ2V0UmVzdW1lVXJsKHJlc3VtZURhdGFWMilcbiAgICAgIHRoaXMuYWN0aW9uU1ZDLnNldFVwZGF0ZUNvbXBHcm91cE8gPSB0aGlzLnJlc3VtZURhdGFMaW5rXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICB9XG4gIH1cbiAgaXNTZWxlY3RlZEluTW9yZURyb3Bkb3duKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyIHx8ICF0aGlzLmxhbmd1YWdlTGlzdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxhbmd1YWdlTGlzdC5zbGljZSg1KS5zb21lKChsYW5nOiBhbnkpID0+XG4gICAgICBsYW5nPy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXJcbiAgICApXG4gIH1cblxuICBhc3luYyBnZXRRdWVyeVBhcmFtcygpIHtcbiAgICBjb25zdCB0ZW1wUXVlcnlQYXJhbXNEYXRhOiBhbnkgPSB7fVxuICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAuc3Vic2NyaWJlKGFzeW5jIHFQYXJhbXNNYXAgPT4ge1xuXG4gICAgICAvLyBFeHRyYWN0IGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIFBhcmFtTWFwXG4gICAgICBxUGFyYW1zTWFwLmtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICB0ZW1wUXVlcnlQYXJhbXNEYXRhW2tleV0gPSBxUGFyYW1zTWFwLmdldChrZXkpID8/ICcnXG4gICAgICB9KVxuICAgICAgdGVtcFF1ZXJ5UGFyYW1zRGF0YVxuXG4gICAgICAvLyBQcm9jZXNzIHNwZWNpZmljIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGNvbnRleHRJZCA9IHRlbXBRdWVyeVBhcmFtc0RhdGFbJ2NvbnRleHRJZCddXG4gICAgICBjb25zdCBjb250ZXh0UGF0aCA9IHRlbXBRdWVyeVBhcmFtc0RhdGFbJ2NvbnRleHRQYXRoJ11cbiAgICAgIGNvbnN0IHJlY29tbWVuZGVkQ291cnNlc0lkID0gdGVtcFF1ZXJ5UGFyYW1zRGF0YVsncmVjb21tZW5kYXRpb25JZCddXG5cbiAgICAgIGlmIChjb250ZXh0SWQgJiYgY29udGV4dFBhdGgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0SWQgPSBjb250ZXh0SWRcbiAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoXG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJlY29tbWVuZGVkQ291cnNlc0lkID0gcmVjb21tZW5kZWRDb3Vyc2VzSWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2VMaWIuZ2V0UmVjb21tZW5kZWRDb3Vyc2VzU2Frc2hhbUFJKHJlY29tbWVuZGVkQ291cnNlc0lkKS50b1Byb21pc2UoKVxuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5mZWVkYmFja3MgJiYgcmVzcG9uc2UuZmVlZGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mZWVkYmFja0dpdmVuID0gcmVzcG9uc2UuZmVlZGJhY2tzLmZpbmQoKGZlZWRiYWNrOiBhbnkpID0+IGZlZWRiYWNrPy5jb3Vyc2VfaWQgPT09IHRoaXMuY291cnNlSUQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBmZXRjaGluZyByZWNvbW1lbmRlZCBjb3Vyc2VzOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGVtcFF1ZXJ5UGFyYW1zRGF0YVxuICB9XG5cbiAgZ2V0T3JnSWRGb3JTaGFyZSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmICFbXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9DT1VSU0UsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9BU1NFU1NFTUVOVCxcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LklOVklURV9PTkxZX1BST0dSQU0sXG4gICAgXS5pbmNsdWRlcyh0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkpKSB7XG4gICAgICB0aGlzLmNhblNoYXJlID0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMucm9vdE9yZ0lkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHByb2Nlc3NlcyBjb250ZW50IGNyZWF0b3IgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGNvbnRlbnRcbiAgICogLSBTZXRzIGNvbnRlbnRDcmVhdG9yRGF0YSBmcm9tIHBhcnNlZCBjcmVhdG9yIGNvbnRhY3RzXG4gICAqIC0gRGV0ZXJtaW5lcyBpZiBcInNob3cgYnV0dG9uXCIgZmxhZyBzaG91bGQgYmUgZW5hYmxlZCBiYXNlZCBvbiBjb250ZW50IG5hbWVcbiAgICogLSBJbmNsdWRlcyBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgZm9yIG51bGwgdmFsdWVzIGFuZCBwYXJzaW5nXG4gICAqL1xuICBnZXRDb250ZW50Q3JlYXRvckRhdGEoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9ubHkgcHJvY2VlZCBpZiB3ZSBoYXZlIHZhbGlkIGNvbnRlbnQgZGF0YVxuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRSZWFkRGF0YSkge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy53YXJuKCdDYW5ub3QgZ2V0IGNyZWF0b3IgZGF0YTogY29udGVudFJlYWREYXRhIGlzIG5vdCBhdmFpbGFibGUnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBjb250ZW50IG5hbWUgZm9yIGNvbXBhcmlzb24gKHNhZmVseSBoYW5kbGUgbnVsbC91bmRlZmluZWQpXG4gICAgICBjb25zdCBjb250ZW50TmFtZSA9IHRoaXMuY29udGVudFJlYWREYXRhLm5hbWU/LnRyaW0oKSB8fCAnJ1xuXG4gICAgICAvLyBQYXJzZSBhbmQgc2V0IGNyZWF0b3IgY29udGFjdHMgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEuY3JlYXRvckNvbnRhY3RzKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgZXhpc3RpbmcgcGFyc2luZyBtZXRob2QgdG8gaGFuZGxlIGNyZWF0b3IgY29udGFjdHNcbiAgICAgICAgdGhpcy5jb250ZW50Q3JlYXRvckRhdGEgPSB0aGlzLmhhbmRsZVBhcnNlSnNvbkRhdGEodGhpcy5jb250ZW50UmVhZERhdGEuY3JlYXRvckNvbnRhY3RzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzZXQgdG8gZW1wdHkgYXJyYXkgaWYgbm8gY3JlYXRvciBjb250YWN0c1xuICAgICAgICB0aGlzLmNvbnRlbnRDcmVhdG9yRGF0YSA9IFtdXG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBzaG93QnRuIGZsYWcgYmFzZWQgb24gZGFrc2h0YSBuYW1lIGNvbXBhcmlzb24gKGNhc2UgaW5zZW5zaXRpdmUpXG4gICAgICAvLyBUaGlzIGRldGVybWluZXMgaWYgdGhlIHNwZWNpYWwgYnV0dG9uIGZvciBkYWtzaHRhIGNvbnRlbnQgaXMgc2hvd25cbiAgICAgIHRoaXMuc2hvd0J0biA9IGNvbnRlbnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuZGFrc2h0YU5hbWUudG9Mb3dlckNhc2UoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgYW55IHVuZXhwZWN0ZWQgZXJyb3JzXG4gICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBjb250ZW50IGNyZWF0b3IgZGF0YTonLCBlcnJvcilcbiAgICAgIHRoaXMuY29udGVudENyZWF0b3JEYXRhID0gW11cbiAgICAgIHRoaXMuc2hvd0J0biA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZ2V0STE4TlRyYW5zbGF0aW9ucygpIHtcbiAgICAvLyBTdWJzY3JpYmUgdG8gbGFuZ3VhZ2UgdHJhbnNsYXRpb24gZmxhZyBjaGFuZ2VzXG4gICAgY29uc3QgdHJhbnNsYXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLmNvbmZpZ1N2Yy5sYW5ndWFnZVRyYW5zbGF0aW9uRmxhZ1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSkgLy8gRW5zdXJlIHN1YnNjcmlwdGlvbiBpcyBjbGVhbmVkIHVwIG9uIGNvbXBvbmVudCBkZXN0cm95XG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIE9ubHkgcHJvY2VlZCBpZiB3ZSBoYXZlIHZhbGlkIGRhdGFcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2Vic2l0ZSBsYW5ndWFnZSBpcyBzZXQgaW4gbG9jYWxTdG9yYWdlXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRMYW5ndWFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKVxuICAgICAgICAgICAgaWYgKHN0b3JlZExhbmd1YWdlKSB7XG4gICAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IGxhbmd1YWdlIGFzIGZhbGxiYWNrXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCdlbicpXG5cbiAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzdG9yZWQgbGFuZ3VhZ2UgcHJlZmVyZW5jZVxuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2Uoc3RvcmVkTGFuZ3VhZ2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgLy8gTG9nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Vycm9yIGluIGxhbmd1YWdlIHRyYW5zbGF0aW9uIHN1YnNjcmlwdGlvbjonLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIC8vIFN0b3JlIHN1YnNjcmlwdGlvbiBmb3IgY2xlYW51cCAob3B0aW9uYWwgYWx0ZXJuYXRpdmUgdG8gdGFrZVVudGlsKVxuICAgIHRoaXMudHJhbnNsYXRpb25TdWJzY3JpcHRpb24gPSB0cmFuc2xhdGlvblN1YnNjcmlwdGlvblxuICB9XG5cbiAgZ2V0U2VydmVyRGF0ZVRpbWUoKSB7XG4gICAgLy8gRmV0Y2ggdGhlIHNlcnZlciBkYXRlIHRpbWUgYW5kIHByb2Nlc3MgdGhlIHJlc3BvbnNlXG4gICAgdGhpcy50b2NTdmMuZ2V0U2VydmVyRGF0ZSgpLnN1YnNjcmliZShcbiAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGNvbnRhaW5zIHZhbGlkIHN5c3RlbSBkYXRlXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zeXN0ZW1EYXRlKSB7XG4gICAgICAgICAgLy8gVXBkYXRlIHNlcnZpY2Ugd2l0aCBzZXJ2ZXIgZGF0ZSAocmVtb3ZlZCBkdXBsaWNhdGUgY2FsbClcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKHJlc3BvbnNlLnN5c3RlbURhdGUpXG4gICAgICAgICAgdGhpcy5zZXJ2ZXJEYXRlID0gcmVzcG9uc2Uuc3lzdGVtRGF0ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGNsaWVudCdzIHRpbWUgaWYgc2VydmVyIHRpbWUgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IGNsaWVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUoY2xpZW50VGltZSlcbiAgICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSBjbGllbnRUaW1lXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIGRlcGVuZGVudCBmdW5jdGlvbnMgdGhhdCBuZWVkIHNlcnZlciBkYXRlXG4gICAgICAgIHRoaXMuZmluZEFDUEIoKVxuICAgICAgICB0aGlzLmdldEthcm1hcG9pbnRzTGltaXQoKVxuICAgICAgfSxcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgZm9yIGRlYnVnZ2luZ1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRmFpbGVkIHRvIGdldCBzZXJ2ZXIgZGF0ZTonLCBlcnJvcilcblxuICAgICAgICAvLyBGYWxsYmFjayB0byBjbGllbnQncyB0aW1lIG9uIGVycm9yXG4gICAgICAgIGNvbnN0IGNsaWVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKGNsaWVudFRpbWUpXG4gICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IGNsaWVudFRpbWVcbiAgICAgIH1cbiAgICApXG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gc2VydmVyIGRhdGUgY2hhbmdlcyBmcm9tIHNlcnZpY2VcbiAgICB0aGlzLnNlcnZlckRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5zZXJ2ZXJEYXRlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpKSAvLyBFbnN1cmUgc3Vic2NyaXB0aW9uIGlzIGNsZWFuZWQgdXBcbiAgICAgIC5zdWJzY3JpYmUoc2VydmVyRGF0ZSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IHNlcnZlckRhdGVcbiAgICAgIH0pXG4gIH1cblxuICBnZXQgZ2V0QmFzZUNvbnRlbnRJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgdGhpcy5jb250ZW50Py5pZGVudGlmaWVyIHx8ICcnXG4gIH1cblxuICBnZXQgaXNNdWx0aWxpbmd1YWwoKSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEubGFuZ3VhZ2VNYXBWMSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VMaXN0Lmxlbmd0aCA+IDFcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBoYW5kbGVFbnJvbGxtZW50KGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICh0aGlzLmlzTXVsdGlsaW5ndWFsKSB7XG4gICAgICB0aGlzLm9wZW5MYW5nRGlhbG9nKGV2ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXG4gICAgfVxuICB9XG5cbiAgb3BlbkxhbmdEaWFsb2coX2V2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVucm9sbExhbmd1YWdlRGlhbG9ndWVDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJlU2VsZWN0OiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UsXG4gICAgICAgIGxhbmd1YWdlTGlzdDogdGhpcy5sYW5ndWFnZUxpc3QsXG4gICAgICB9XG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHNlbGVjdGVkTGFuZykgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkTGFuZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSBzZWxlY3RlZExhbmdcbiAgICAgICAgdGhpcy5oYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXRSZXN1bWVVcmwocmVzb3VyY2VEYXRhOiBhbnksIGJhdGNoSWQ/OiBhbnksIHByaW1hcnlDYXRlZ29yeT86IGFueSkge1xuICAgIGxldCBNTElkID0gdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyIHx8ICcnXG4gICAgbGV0IE1MID0gdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5sYW5nSWQgfHwgJydcbiAgICBsZXQgcmVzdW1lRGF0YVVybCA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgcmVzb3VyY2VEYXRhLmlkZW50aWZpZXIsXG4gICAgICByZXNvdXJjZURhdGEubWltZVR5cGUsXG4gICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnLFxuICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uY29udGVudFR5cGUgfHwgJycsXG4gICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICBwcmltYXJ5Q2F0ZWdvcnkgfHwgJ0xlYXJuaW5nIFJlc291cmNlJyxcbiAgICAgIGJhdGNoSWQgfHwgdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5uYW1lIHx8ICcnLFxuICAgICAgTUwsXG4gICAgICBNTElkLFxuICAgIClcbiAgICByZXR1cm4gcmVzdW1lRGF0YVVybFxuICB9XG5cbiAgZ2V0IGNvbnRlbnRDb21wbGV0aW9uUGVyY2VudCgpIHtcbiAgICBpZiAodGhpcy5iYXRjaERhdGE/LmVucm9sbGVkKSB7XG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJyAmJiB0aGlzLmlzTXVsdGlsaW5ndWFsKSB7XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgJiYgdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5sYW5nSWQgJiYgdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW3RoaXMuc2VsZWN0ZWRMYW5ndWFnZT8ubGFuZ0lkXSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3NbdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5sYW5nSWRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgMFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrRm9yQ29tcGxldGlvblN1cnZleVRyaWdnZXIoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YSkge1xuICAgICAgLy8gY2hlY2sgaWYgY29tcGxldGlvbiBzdXJ2ZXkgaXMgZW5hYmxlZCBhbmQgdXNlciBoYXMgY29tcGxldGVkIHRoZSBjb3Vyc2UgYmVmb3JlIDIzcmQgREVDIDIwMjMgKHJlbGVhc2UgZGF0ZSBvZiBjb21wbGV0aW9uIHN1cnZleSlcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy5jb21wbGV0aW9uU3VydmV5ICYmIHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLmNvbXBsZXRpb25TdXJ2ZXkuZW5hYmxlZCAmJlxuICAgICAgICB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSAmJiB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSAmJiB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5jb21wbGV0ZWRPbiA+PSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy5jb21wbGV0aW9uU3VydmV5LnN0YXJ0RGF0ZSkge1xuICAgICAgICBpZiAoKHRoaXMuY29udGVudC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jb21wbGV0aW9uU3VydmV5TGluaykge1xuICAgICAgICAgIGNvbnN0IHNJRCA9IHRoaXMuY29udGVudFJlYWREYXRhLmNvbXBsZXRpb25TdXJ2ZXlMaW5rLnNwbGl0KCdzdXJ2ZXlzLycpXG4gICAgICAgICAgY29uc3Qgc3VydmV5SWQgPSBzSURbMV1cbiAgICAgICAgICBjb25zdCBjb3Vyc2VJZCA9IHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICAgICAgICAvLyBDYWxsIEFQSSB0byBzZWUgaWYgc3VydmV5IGlzIHN1Ym1pdHRlZCBvciBub3RcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRBcGxsaWNhdGlvbnNCeUlkKHN1cnZleUlkLCBjb3Vyc2VJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMucmVzdWx0LnJlc3BvbnNlICYmIE9iamVjdC5rZXlzKHJlcy5yZXN1bHQucmVzcG9uc2UpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2NrQ2VydGlmaWNhdGUgPSBmYWxzZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2NrQ2VydGlmaWNhdGUgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMub3BlbkNvbXBsZXRpb25TdXJ2ZXlGb3JtUG9wdXAoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDbGVhciBleGlzdGluZyBzdXJ2ZXkgZGF0YSBmcm9tIGxvY2FsIHN0b3JhZ2UgYmVmb3JlIG9wZW5pbmcgcG9wdXBcbiAgY2xlYXJFeGlzdGluZ1B1YmxpY1N1cnZleURhdGEoc3VydmV5SWQ6IHN0cmluZywgY291cnNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgc3VydmV5XyR7c3VydmV5SWR9XyR7Y291cnNlSWR9YFxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSlcbiAgICB9XG4gIH1cblxuICBvcGVuUHVibGljU3VydmV5UG9wdXAobmF2aWdhdGlvblVybD86IHN0cmluZywgcXVlcnlQYXJhbXM/OiBhbnkpIHtcbiAgICAvLyBHZXQgc3VydmV5IElEIGFuZCBjb3Vyc2UgSUQgZnJvbSBlbnZpcm9ubWVudCBhbmQgY29udGVudCBkYXRhXG5cbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmF2aWdhdGlvblVybF0sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN1cnZleUlkID0gdGhpcy5lbnZpcm9ubWVudC5wdWJsaWNDb250ZW50U3VydmV5SWQgfHwgJydcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJydcbiAgICAgIGNvbnN0IGNvdXJzZU5hbWUgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8ubmFtZSB8fCAnJ1xuICAgICAgY29uc3QgY29udGV4dE9yZ0lkID0gdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IgJiYgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IubGVuZ3RoID4gMCA/XG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdIDogJydcblxuICAgICAgdGhpcy5jbGVhckV4aXN0aW5nUHVibGljU3VydmV5RGF0YShzdXJ2ZXlJZCwgY291cnNlSWQpXG5cbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHN1cnZleUlkOiBzdXJ2ZXlJZCxcbiAgICAgICAgY291cnNlSWQ6IGNvdXJzZUlkLFxuICAgICAgICBjb3Vyc2VOYW1lOiBjb3Vyc2VOYW1lLFxuICAgICAgICBjb250ZXh0T3JnSWQ6IGNvbnRleHRPcmdJZCxcbiAgICAgICAgZm9yUHJldmlldzogdGhpcy5mb3JQcmV2aWV3XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUHVibGljU3VydmV5Rm9ybUNvbXBvbmVudCwge1xuICAgICAgICAvLyBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgIHdpZHRoOiAnNzUwcHgnLFxuICAgICAgICBtYXhXaWR0aDogJzkwdncnLFxuICAgICAgICBoZWlnaHQ6ICc4MHZoJyxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGludGVuZGVkIFVSTCBvbmx5IHdoZW4gc3VydmV5IGlzIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICBpZiAobmF2aWdhdGlvblVybCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25hdmlnYXRpb25VcmxdLCB7IHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cblxuICB9XG5cbiAgcmVzdW1lQ29udGVudERhdGEoKSB7XG4gICAgY29uc3QgbmF2aWdhdGlvblVybCA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5yZXN1bWVEYXRhTGluaz8udXJsIDogdGhpcy5maXJzdFJlc291cmNlTGluaz8udXJsXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSAodGhpcy5yZXN1bWVEYXRhICYmICF0aGlzLmNlcnREYXRhKSA/IHRoaXMuZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiB0aGlzLmdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmF2aWdhdGlvblVybF0sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gZW5yb2xsIGluIHRoZSBjb3Vyc2VcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gZW5yb2xsbWVudCBpcyBhbGxvd2VkXG4gICAqL1xuXG5cbiAgbmF2aWdhdGVUb05ld1ZlcnNpb24oKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnL2FwcC90b2MnLCB7IHNraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZSB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgYXBwL3RvYy8ke3RoaXMuY29udGVudFJlYWREYXRhPy5jb250ZW50VmVyc2lvbkluZm8/LmlkZW50aWZpZXJ9L292ZXJ2aWV3YF0pXG4gICAgfSlcblxuICB9XG5cbiAgY2FuRW5yb2xsKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYXN0RW5yb2xsbWVudERhdGUpIHtcbiAgICAgIGNvbnN0IHNlcnZlclRpbWUgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICBjb25zdCBlRGF0ZSA9IGRheWpzKHRoaXMuY29udGVudFJlYWREYXRhLmxhc3RFbnJvbGxtZW50RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgIGlmIChkYXlqcyhzZXJ2ZXJUaW1lKS5pc1NhbWVPckJlZm9yZShlRGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLmxvY2F0aW9uLmJhY2soKVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY291cnNlSUQgZWxzZSBub0RhdGFGb3VuZFwiPlxuICA8bmctdGVtcGxhdGUgI2Vucm9sbEZ1bmN0aW9uYWxpdHk+XG4gICAgPGRpdiBbaGlkZGVuXT1cImlzUmVzb3VyY2UgJiYgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGhcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDwhLS0gQ291cnNlIGJsb2NrIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJiAhKGlzTW9iaWxlICYmIGNvbnRlbnQ/LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcIj5cbiAgICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50ICYmICFmb3JQcmV2aWV3XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCB8fCBjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICB7eyBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIiAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+e3sgJ2FwcHRvY2hvbWUudGFrZUFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zdEFzc2Vzc21lbnQgJiYgKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmVzdW1lJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwIHx8IGNlcnREYXRhKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQWNicENvdXJzZSAmJiBpc0FjYnBDbGFpbSAmJiAhaXNDbGFpbWVkXCI+XG4gICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0FDQlAgQ0xBSU0nXCIgW2RhdGFdPVwia3BhcnJheVwiIFtidG5DYXRlZ29yeV09XCInY2xhaW0nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0FjYnBDb3Vyc2UgJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiBtb250aGx5Q2FwRXhjZWVkICYmICFpc0NvbXBsZXRlZFRoaXNNb250aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidTdGFydCBhZ2FpbidcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCI+XG4gICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidUYWtlIEFzc2Vzc21lbnQnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiAoYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmICEoaXNNb2JpbGUgJiYgY29udGVudD8uaXNJbkludHJhbmV0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgISggY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVFbnJvbGxtZW50KClcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc3RhcnQtYnRuJzogIWNhbkVucm9sbCgpfVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FjYnBDb3Vyc2VcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmICFtb250aGx5Q2FwRXhjZWVkICYmIHVzZXJFbnJvbGxtZW50TGlzdCAmJiAhdXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDwhLS0gUFJvZ3JhbSAmIG1hbmRhdG9yeSBjb3Vyc2UgYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZTsgZWxzZSBhdXRoVmlld0J0blwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHwgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmIChjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSAgJiYgIWVucm9sbEJ0bkxvYWRpbmcpICYmICFjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7J2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ291cnNlXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZCAmJiB1c2VyRW5yb2xsbWVudExpc3QgJiYgIXVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIigoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiBjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgICAgKHByb2dyYW1FbnJvbGxDYWxsKT1cInByb2dyYW1FbnJvbGxDYWxsKCRldmVudClcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiKGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSkgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlcyAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgTm8gQmF0Y2hlc1xuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiY291cnNlQ2F0ZWdvcnk/Lk1PREVSQVRFRF9QUk9HUkFNICE9PSBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpICYmIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUueW91QXJlTm90SW52aXRlZCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmICEhY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlID09PSAnTkEnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JhdGNoSW5Qcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCBhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcIj5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwicmVzdW1lRGF0YSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygnc3RhcnQnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPlxuICAgICAgICAgICAgICAgIHt7IChyZXN1bWVEYXRhKSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gXCJTdGFydCBhZ2FpblwiIDogXCJTdGFydFwiIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCIhaXNQb3N0QXNzZXNzbWVudCAmJiAoIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSZXN1bWUnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNBY2JwQ291cnNlICYmIGlzQWNicENsYWltICYmICFpc0NsYWltZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQIENMQUlNJ1wiIFtjb25kaXRpb25dPVwie2lzUG9zdEFzc2Vzc21lbnQ6IGlzUG9zdEFzc2Vzc21lbnQsIGNvbnRlbnQ6IGNvbnRlbnQsIGlzQWNicENvdXJzZTogaXNBY2JwQ291cnNlLCBpc0NsYWltZWQ6IGlzQ2xhaW1lZCwgbW9udGhseUNhcEV4Y2VlZDogbW9udGhseUNhcEV4Y2VlZCwgaXNDb21wbGV0ZWRUaGlzTW9udGg6IGlzQ29tcGxldGVkVGhpc01vbnRoLCBzaG93VGFrZUFzc2Vzc21lbnQ6IHNob3dUYWtlQXNzZXNzbWVudCwgdXNlckVucm9sbG1lbnRMaXN0OiB1c2VyRW5yb2xsbWVudExpc3QsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZ31cIiBbZGF0YV09XCJrcGFycmF5XCIgW2J0bkNhdGVnb3J5XT1cIidjbGFpbSdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZFwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ1N0YXJ0IGFnYWluJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmIG1vbnRobHlDYXBFeGNlZWQgJiYgIWlzQ29tcGxldGVkVGhpc01vbnRoXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInVGFrZSBBc3Nlc3NtZW50J1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImlzQmF0Y2hJblByb2dyZXNzICYmIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LmVucm9sbGVkKSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJlc3VtZURhdGEgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInJlc3VtZURhdGEgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+XG4gICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkIGgtOCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDdXJhdGVkIHByb2dyYW0gYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBibGFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIElOVklURSBPTkxZIFNUQU5EQUxPTkUgQVNTRVNTTUVOVCBibG9jay0tPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWRGb3JBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiBiYXRjaERhdGE/LmVucm9sbGVkICYmIGlzQmF0Y2hJblByb2dyZXNzICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUuYmF0Y2hXaWxsU3RhcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTVEFOREFMT05FX0FTU0VTU01FTlQgZW5yb2xsZWQgYmxhY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0QWdhaW4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIEJMRU5ERURfUFJPR1JBTSBibG9jayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fFxuICAgICAgICAgICAgICAgICAgICAgIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtYWNjZW50LXRleHQgd3MtbWF0LWFjY2VudC1saWdodC1iZyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzdGF0dXNNc2dcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9udC1ib2xkXCI+XG4gICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnJlcXVlc3RVbmRlclJldmlldycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRURcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXNCYXRjaEluUHJvZ3Jlc3M/IChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybCA6ICcnIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiaXNCYXRjaEluUHJvZ3Jlc3MgPyAocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpIDogJycgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1zdGFydC1idG4nOiAhaXNCYXRjaEluUHJvZ3Jlc3N9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID9cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gdHJhbnNsYXRlTGFiZWxzKCdTdGFydCBhZ2FpbicsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQnRuU3RhdHVzID09ICdyZWplY3QnICYmIGNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiPlxuICAgICAgICA8YSBbaHJlZl09XCJjb250ZW50Py5yZWdpc3RyYXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPnt7XG4gICAgICAgICAgJ2FwcHRvY2hvbWUucmVnaXN0ZXInIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI3Byb2dyZXNzRnVuY3Rpb25hbGl0eT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IHRleHQtc21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC14c1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm92ZXJhbGxQcm9ncmVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDBcIj4ge3sgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfX0gJTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyAqbmdJZj1cImNvbnRlbnQ/LmlkZW50aWZpZXJcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcbiAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtwcm9ncmVzc109XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZVwiIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCJcbiAgICAgICAgICAgIFtjdXN0b21DbGFzc05hbWVdPVwiJ2NvbnRlbnQtcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRDb21wbGV0aW9uUGVyY2VudCA+PSA1MFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJhdGUtYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c3Rhcl9wdXJwbGU1MDA8L21hdC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5yYXRlTm93JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLmVkaXRSYXRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiBjbGFzcz1cInRvYy1iYW5uZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1kZXRhaWxzIHRvYy1jb250ZW50XCIgI2Jhbm5lckRldGFpbHM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1iYWNrLWJ0blwiIChjbGljayk9XCJnb0JhY2soKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidGV4dC13aGl0ZVwiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEzMnB4J1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzE0MHB4J1wiIFtoZWlnaHRdPVwiJzI0cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dCBub2R0cmFuc2xhdGVcIj52aWRlb19saWJyYXJ5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnaUdPVCBTcGVjaWFsaXphdGlvbicpXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiYXBwcm92ZWQtaWNvblwiIHNyYz1cIi4vYXNzZXRzL2ljb25zL2FwcHJvdmVkLnN2Z1wiIGFsdD1cImFwcHJvdmVkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTMgbm9kdHJhbnNsYXRlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmRjb250ZW50djIuaUdPVFNwZWNpYWxpemF0aW9uUHJvZ3JhbScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIEtub3dsZWRnZSBsZXZlbCBibG9jayBmb3Igc2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICA8IS0tIHt7Y29udGVudD8uZGlmZmljdWx0eUxldmVsfX0gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsXCIgY2xhc3M9XCJrbm93bGVkZ2UtbGV2ZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsPy50b0xvd2VyQ2FzZSgpID09PSAnYmVnaW5uZXInXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsZXZlbC1iYWRnZSBiZWdpbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiZmFsc2VcIiBjbGFzcz1cImxldmVsLWJhZGdlIGJlZ2lubmVyXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjREJGNERDXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY3IDVDNy42NzkyNyA0LjU1NTU1IDguMzIwNzcgNC41NTU1NiA4LjU3NzM3IDVMMTIuMDQxNSAxMUMxMi4yOTgxIDExLjQ0NDQgMTEuOTc3MyAxMiAxMS40NjQxIDEySDQuNTM1OTJDNC4wMjI3MiAxMiAzLjcwMTk3IDExLjQ0NDQgMy45NTg1NyAxMUw3LjQyMjY3IDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDlDOTUxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2ludGVybWVkaWF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGludGVybWVkaWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwidHJ1ZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgaW50ZXJtZWRpYXRlXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjRDFEQkVDXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY3IDIuNjY2NjZDNy42NzkyNyAyLjIyMjIxIDguMzIwNzcgMi4yMjIyMSA4LjU3NzM3IDIuNjY2NjZMMTIuMDQxNSA4LjY2NjY2QzEyLjI5ODEgOS4xMTExIDExLjk3NzMgOS42NjY2NiAxMS40NjQxIDkuNjY2NjZINC41MzU5MkM0LjAyMjcyIDkuNjY2NjYgMy43MDE5NyA5LjExMTEgMy45NTg1NyA4LjY2NjY2TDcuNDIyNjcgMi42NjY2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxQjRDQTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgNS42NjY2NkM3LjY3OTI3IDUuMjIyMjEgOC4zMjA3NyA1LjIyMjIxIDguNTc3MzcgNS42NjY2NkwxMi4wNDE1IDExLjY2NjdDMTIuMjk4MSAxMi4xMTExIDExLjk3NzMgMTIuNjY2NyAxMS40NjQxIDEyLjY2NjdINC41MzU5MkM0LjAyMjcyIDEyLjY2NjcgMy43MDE5NyAxMi4xMTExIDMuOTU4NTcgMTEuNjY2N0w3LjQyMjY3IDUuNjY2NjZaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMUI0Q0ExXCIgc3Ryb2tlPVwiI0QxREJFQ1wiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWw/LnRvTG93ZXJDYXNlKCkgPT09ICdhZHZhbmNlZCdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGFkdmFuY2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJmYWxzZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgYWR2YW5jZWRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjRkZFNkUxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NCAyLjMzMzM0QzcuNjc5MjQgMS44ODg5IDguMzIwNzQgMS44ODg5IDguNTc3MzQgMi4zMzMzNEwxMi4wNDE0IDguMzMzMzRDMTIuMjk4IDguNzc3NzkgMTEuOTc3MyA5LjMzMzM0IDExLjQ2NDEgOS4zMzMzNEg0LjUzNTg5QzQuMDIyNjkgOS4zMzMzNCAzLjcwMTk0IDguNzc3NzkgMy45NTg1NCA4LjMzMzM0TDcuNDIyNjQgMi4zMzMzNFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZGODI2OFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNUM3LjY3OTI0IDQuNTU1NTUgOC4zMjA3NCA0LjU1NTU2IDguNTc3MzQgNUwxMi4wNDE0IDExQzEyLjI5OCAxMS40NDQ0IDExLjk3NzMgMTIgMTEuNDY0MSAxMkg0LjUzNTg5QzQuMDIyNjkgMTIgMy43MDE5NCAxMS40NDQ0IDMuOTU4NTQgMTFMNy40MjI2NCA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgc3Ryb2tlPVwiI0ZGRTZFMVwiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjQgNy42NjY2OUM3LjY3OTI0IDcuMjIyMjQgOC4zMjA3NCA3LjIyMjI0IDguNTc3MzQgNy42NjY2OUwxMi4wNDE0IDEzLjY2NjdDMTIuMjk4IDE0LjExMTEgMTEuOTc3MyAxNC42NjY3IDExLjQ2NDEgMTQuNjY2N0g0LjUzNTg5QzQuMDIyNjkgMTQuNjY2NyAzLjcwMTk0IDE0LjExMTEgMy45NTg1NCAxMy42NjY3TDcuNDIyNjQgNy42NjY2OVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZGODI2OFwiIHN0cm9rZT1cIiNGRkU2RTFcIiBzdHJva2Utd2lkdGg9XCIwLjVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjYlBsYW5FbmREYXRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZHVlLXRhZyB0ZXh0LXhzIGxlYWRpbmctM1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZHVlLXdhcm5pbmcnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuVVBDT01JTkcsICdkdWUtb3ZlcmR1ZSc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5PVkVSRFVFLCAnZHVlLXN1Y2Nlc3MnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuU1VDQ0VTU31cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbi5kdWVCeScgfCB0cmFuc2xhdGUgfX0gLSAmbmJzcDs8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGNiUGxhbkVuZERhdGUgfCBkYXRlOiAnZFxuICAgICAgICAgICAgICAgICAgICAgIE1NTSx5J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudFZlcnNpb25JbmZvPy5pZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctdmVyc2lvbi1jaGlwIHJvdW5kZWQtMnhsXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5ldy12ZXJzaW9uLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvYy5uZXdWZXJzaW9uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXdoaXRlIG1vYi1zaGFyZVwiICpuZ0lmPVwiY2FuU2hhcmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLXRleHQgdGV4dC1iYXNlIHNtOnRleHQtNHhsIGxlYWRpbmctNiBzbTpsZWFkaW5nLTEwIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgIGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzbTp0ZXh0LWJhc2Ugc291cmNlLXRleHQgZm9udC1zZW1pYm9sZCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIiAjY29udGVudFNvdXJjZVxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc291cmNlRWxsaXBzaXMnOiBzb3VyY2VFbGxpcHNpc31cIiB0aXRsZT1cInt7Y29udGVudFJlYWREYXRhPy5zb3VyY2V9fVwiPnt7ICdjYXJkY29udGVudHYyLmJ5J1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnRSZWFkRGF0YT8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjBweCdcIiBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzg4cHgnXCIgW2hlaWdodF09XCInMjRweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyByYXRpbmctY2hpcCBweS0yIGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKClcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBtYXJnaW4tbGVmdC1zIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+Z3JhZGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTRcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00IG1hcmdpbi1yaWdodC1tXCI+e3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3N0LWVucm9sbGVkLWNoaXAgdGV4dC14cyBsZWFkaW5nLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdtb3N0VHJlbmRpbmcnKVwiPnt7ICdjYXJkY29udGVudHYyLm1vc3RUcmVuZGluZycgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5pbmNsdWRlcygnbW9zdEVucm9sbGVkJylcIj57eyAnY2FyZGNvbnRlbnR2Mi5tb3N0RW5yb2xsZWQnIHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnJldGlyZW1lbnREYXRlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy12ZXJzaW9uLXBpbGwgdGV4dC14cyBsZWFkaW5nLTNcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnUmV0aXJlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdhcHB0b2MucGVuZGluZ1JldGlyZW1lbnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctdmVyc2lvbi1yZXRpcmUtcGlsbCB0ZXh0LXhzIGxlYWRpbmctM1wiICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zdGF0dXMgPT09ICdSZXRpcmVkJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgJ2FwcHRvYy5yZXRpcmVkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTgwcHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgY29udGVudFJlYWREYXRhPy5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgc291cmNlLXRleHQgbm9kdHJhbnNsYXRlXCI+KHt7ICdhcHB0b2MubGFzdFVwZGF0ZWRPbicgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgY29udGVudFJlYWREYXRhPy5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OIHwgZGF0ZTogJ01NTSBkLCB5JyB9fSk8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTJcIiAqbmdJZj1cImxhbmd1YWdlTGlzdD8ubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCBjbGFzcz1cImxhbmctY2hpcHNcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFNob3cgdXAgdG8gNiBjaGlwcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmd1YWdlTGlzdCB8IHNsaWNlOjA6NTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwibWF0Y2hpcC1jdXN0b21cIiBzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJsYW5nPy5pZGVudGlmaWVyID09PSBzZWxlY3RlZExhbmd1YWdlPy5pZGVudGlmaWVyXCIgKGNsaWNrKT1cIm9uTGFuZ3VhZ2VTZWxlY3QobGFuZylcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbGFuZy5uYW1lIHx8IGxhbmcudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFwiTW9yZVwiIGNoaXAgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiA2IGxhbmd1YWdlcyAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFuZ3VhZ2VMaXN0Lmxlbmd0aCA+IDVcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCBbbWF0TWVudVRyaWdnZXJGb3JdPVwibW9yZUxhbmd1YWdlc01lbnVcIiBzZWxlY3RhYmxlPVwiZmFsc2VcIiBjbGFzcz1cIm1vcmUtY2hpcCBtYXRjaGlwLWN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkSW5Nb3JlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICBNb3JlIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGlwPlxuICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtb3JlTGFuZ3VhZ2VzTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cIm1hdC1yYWRpby1ncm91cCBmbGV4IGZsZXgtY29sIGdhcC0yIHAtM1wiIFt2YWx1ZV09XCJzZWxlY3RlZExhbmd1YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VMaXN0IHwgc2xpY2U6NVwiIFt2YWx1ZV09XCJsYW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImxhbmc/LmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXJcIiAoY2hhbmdlKT1cIm9uTGFuZ3VhZ2VTZWxlY3QobGFuZylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbmcuZGlzcGxheU5hbWUgfHwgbGFuZy5uYW1lIHx8IGxhbmcgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC02IGZpeGVkLXdpZHRoXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvYy1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgICAgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHMgJiZcbiAgICAgICAgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmVucm9sbG1lbnRFbmREYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1kZXRhaWxzIG10LTZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgcGItM1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibG9jYXRpb24taWNvbiBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgbG9jYXRpb25fb25cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImV2ZW50LWljb24gbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIGV2ZW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2MtZGVzY1wiPlxuICAgICAgICAgICAgICBMYXN0IGRhdGUgb2YgZW5yb2xsbWVudCAtIHt7c2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmVucm9sbG1lbnRFbmREYXRlIHwgZGF0ZTogJ2RkL01NL3l5eXknfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY29tbWVuZGVkQ291cnNlc0lkICYmICFmZWVkYmFja0dpdmVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC00IHB5LTMgbXQtNiByZWxldmVudC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyIGZsZXgtd3JhcCBmbGV4IGp1c3RpZnktY2VudGVyIG1kOmp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL2xhZHktZ3JlZXQuc3ZnXCIgYWx0PVwiZ3JlZXRcIiB3aWR0aD1cIjU2Ljg5XCIgaGVpZ2h0PVwiNjRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmVudC1pbmZvXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkZXIgdGV4dC1zbSByZWxldmVudC1oZWFkaW5nIGJsb2NrIG1iLTFcIj57eyAnaG9tZS50b2NSZWxldmVudEhlYWRpbmcnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVsZXZlbnQtc3ViaW5mbyBmb250LW5vcm1hbCB0ZXh0LXNtIGJsb2NrXCI+e3sgJ2hvbWUudG9jUmVsZXZlbnRTdWJIZWFkaW5nJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSByZWxldmFudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgcmVsZXZlbnQtbm9ybWFsIHJlbGV2ZW50LWJ0biBweS0yIHB4LTQgcmVsZXZhbnQtYm94XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWNjZXB0UmVsZXZlbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCAmJiAhaXNSZWxldmVudCA/IFNBS1NIQU1BSV9JQ09OX0xPQURFUiA6IFNBS1NIQU1BSV9JQ09OX05PUk1BTFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJsb2FkZXJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBjbGFzcz1cIm1yLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcmVsZXZlbnQgZmYtbGF0byB0ZXh0LXNtIGZvbnQtYm9sZFwiPnt7ICdob21lLnJlbGV2ZW50JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgbm8tYnV0dG9uIG1sLThcIiAoY2xpY2spPVwiaGFuZGxlRGVjbGluZVJlbGV2ZW50KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbiB0ZXh0LW5vIG1yLTEgbm9kdHJhbnNsYXRlXCI+dGh1bWJfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW5vIGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5ubycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGItNCBsZzpweS00XCJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBiYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyXCI+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtdG9jIFtjb250ZW50XT1cImNvbnRlbnRcIiBbY29tcG9uZW50TmFtZV09XCIndG9jJ1wiIFtwYXRoU2V0XT1cInBhdGhTZXRcIlxuICAgICAgICAgIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtpc0Vucm9sbGVkXT1cImJhdGNoRGF0YT8uZW5yb2xsZWRcIlxuICAgICAgICAgIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW3NrZWxldG9uTG9hZGVyXT1cInNrZWxldG9uTG9hZGVyXCJcbiAgICAgICAgICBbY2hhbmdlVGFiXT1cImNoYW5nZVRhYlwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cInRvY1N2Yz8uaGFzaG1hcFwiIFtzZWxlY3RlZEJhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiXG4gICAgICAgICAgW2NvbmRpdGlvbl09XCJ7aXNQb3N0QXNzZXNzbWVudDogaXNQb3N0QXNzZXNzbWVudCwgY29udGVudDogY29udGVudCwgaXNBY2JwQ291cnNlOiBpc0FjYnBDb3Vyc2UsIGlzQ2xhaW1lZDogaXNDbGFpbWVkLCBtb250aGx5Q2FwRXhjZWVkOiBtb250aGx5Q2FwRXhjZWVkLCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHNob3dUYWtlQXNzZXNzbWVudDogc2hvd1Rha2VBc3Nlc3NtZW50LCB1c2VyRW5yb2xsbWVudExpc3Q6IHVzZXJFbnJvbGxtZW50TGlzdCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZywgZW5yb2xsQnRuTG9hZGluZzogZW5yb2xsQnRuTG9hZGluZywgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnksIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBjdXJyZW50Q291cnNlQmF0Y2hJZCwgaXNBY2JwQ2xhaW06IGlzQWNicENsYWltfVwiXG4gICAgICAgICAgW2twYXJyYXldPVwia3BhcnJheVwiIChwbGF5UmVzdW1lRm9yQUkpPVwicGxheVJlc3VtZUZvckFJKClcIiAoZW5yb2xsVXNlclRvQUkpPVwiZW5yb2xsVXNlclRvQUkoKVwiXG4gICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCIgW2xhbmd1YWdlTGlzdF09XCJsYW5ndWFnZUxpc3RcIlxuICAgICAgICAgIFtsb2NrQ2VydGlmaWNhdGVdPVwibG9ja0NlcnRpZmljYXRlXCIgKHRyaWdlckNvbXBsZXRpb25TdXJ2ZXlGb3JtKT1cIm9wZW5TdXJ2ZXlGb3JtUG9wdXAoJGV2ZW50KVwiXG4gICAgICAgICAgKHJlc3VtZUNvbnRlbnQpPVwicmVzdW1lQ29udGVudERhdGEoKVwiPjwvd3Mtd2lkZ2V0LWNvbnRlbnQtdG9jPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRpcC1mb3ItbGVhcm5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJsZWFybkFkdmlzb3J5RGF0YSAmJiBsZWFybkFkdmlzb3J5RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250YWluZXJcIj5cblxuICAgICAgPCEtLSBpZiBuZWVkZWQgc3RpY2t5IG9mIHJpZ2h0IGNvbnRhaW5lciBhZGQgdGhpcyB0byBiZWxvdyBkaXYgPT4gI3JpZ2h0Q29udGFpbmVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnQtaW5uZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzg0cHgnXCIgW2hlaWdodF09XCInMjI0cHgnXCJcbiAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaW1hZ2UtZGl2XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIGNvbnRlbnRSZWFkRGF0YT8ucG9zdGVySW1hZ2UgKyAnKScsICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLCAnYmFja2dyb3VuZC1zaXplJzogJ2NvdmVyJ31cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ltYWdlLWJhY2tkcm9wJzogc2Nyb2xsZWR9XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydqdXN0aWZ5LWJldHdlZW4nOiBzY3JvbGxlZCwgJ2p1c3RpZnktZW5kJzogIXNjcm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdGFnLWRpdiByb3VuZGVkLTJ4bCBnYXAtMSBpdGVtcy1jZW50ZXIgcC0yXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtb3JhbmdlLXRleHQgbm9kdHJhbnNsYXRlXCI+dmlkZW9fbGlicmFyeTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctM1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTIgc2hhcmUtdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYW5TaGFyZSAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc2hhcmUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiICpuZ0lmPVwic2Nyb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGxlYWRpbmctNiB0ZXh0LXdoaXRlIGZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5uYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50UmVhZERhdGE/LnNvdXJjZX19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2NhcmRjb250ZW50djIuYnknIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnRSZWFkRGF0YT8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHAtNSBib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSAgY3Vyc29yLXBvaW50ZXIgc3dpdGNoLXZlcnNpb25cIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50UmVhZERhdGE/LmNvbnRlbnRWZXJzaW9uSW5mbz8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvTmV3VmVyc2lvbigpXCIgKGtleWRvd24pPVwibmF2aWdhdGVUb05ld1ZlcnNpb24oKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1zd2l0Y2hcIj57eyAnYXBwdG9jLnN3aXRjaFRvTmV3VmVyc2lvbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YSAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBqdXN0aWZ5LWFyb3VuZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmN1cnJlbnRCYXRjaFNpemVcbiAgICAgICAgICAgICAgICAgICAgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLmJhdGNoU2l6ZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py50b3RhbEFwcGxpZWQgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MudG90YWxFbnJvbGxlZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmICFwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGVucm9sbC1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aFwiIChjbGljayk9XCJyb3V0ZVRvUHJlQXNzZXNzZW50KClcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnByZUVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IHByZWVucm9sbGRvbmUtYnRuIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucHJlRW5yb2xsRG9uZScgfCB0cmFuc2xhdGUgfX08aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvQWNjZXB0X2ljb24ucG5nXCIgYWx0PVwidGlja1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWljb25cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInRpbWVyICYmIHRpbWVyLmRheXMgPj0gMCAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02IGJhdGNoLXRpbWVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIuZGF5cyB8fCAwIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5kYXlzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5ob3VycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb3VudGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTEgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLm1pbiA9PT0gNjAgPyAwMCA6IHRpbWVyLm1pbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUxMjAwICYmIChcbiAgICAgICAgICFjb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoIHx8XG4gICAgICAgICAoY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCAmJiAocHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgfHwgICFwcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnKSlcbiAgICAgICApXCI+XG5cbiAgICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgW3VzZXJFbnJvbGxtZW50TGlzdF09XCJ1c2VyRW5yb2xsbWVudExpc3RcIiAod2l0aGRyYXdPckVucm9sbCk9XCJ3aXRoZHJhd09yRW5yb2xsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYW5hbHl0aWNzXT1cImFuYWx5dGljc1wiIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzMzNnB4J1wiIFtoZWlnaHRdPVwiJzQwcHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic2OHB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwiY29udGVudD8uaXNJbkludHJhbmV0ICYmIHNob3dJbnRyYW5ldE1zZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnZpZXdlZEluSW50cmFuZXQnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJzaG93SW5zdHJ1Y3RvckxlZE1zZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLm5vdEF2YWlsYWJsZU9ubGluZScgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dTdGFydC5tc2cgPT09ICd5b3V0dWJlRm9yYmlkZGVuJ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnlvdXR1YmVDb250ZW50QmxvY2tlZCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0J0blwiPlxuICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGNzY21zVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUuYXBwbHlGb3JQaHlzaWNhbFRyYWluaW5nJyB8IHRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uU3RhdHVzIDw9IDIgJiYgaXNCYXRjaEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJvZ3Jlc3NGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXN1bWVEYXRhICYmICF1c2VyUmF0aW5nXCI+IC0tPlxuICAgICAgICAgICAgICAgIDwhLS0gPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmF0ZSB0aGlzIGNvdXJzZSdcIiBbZGF0YV09XCJrcGFycmF5XCJcbiAgICAgICAgICAgICAgICAgIFtwQ2F0ZWdvcnldPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJyZXN1bWVEYXRhICYmIHVzZXJSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFZGl0IHJhdGluZydcIiBbZGF0YV09XCJrcGFycmF5XCJcbiAgICAgICAgICAgICAgICAgIFtwQ2F0ZWdvcnldPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJiBjb250ZW50UmVhZERhdGE/LnN0YXR1cyAhPT0gJ0RlbGV0ZWQnICYmIGNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnRXhwaXJlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW5yb2xsRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FybWEtcG9pbnRzLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQta2FybWEtcG9pbnRzIFtkYXRhXT1cImtwYXJyYXlcIiAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIj48L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0MHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC10b2Mta3BpLXZhbHVlcyBbY29udGVudF09XCJjb250ZW50XCIgW3RvY1N0cnVjdHVyZV09XCJ0b2NTdHJ1Y3R1cmVcIlxuICAgICAgICAgICAgICAgIFtzaG93SW5zdHJ1Y3RvckxlZE1zZ109XCJzaG93SW5zdHJ1Y3RvckxlZE1zZ1wiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCJcbiAgICAgICAgICAgICAgICBbbGFuZ3VhZ2VMaXN0XT1cImxhbmd1YWdlTGlzdFwiPjwvd3Mtd2lkZ2V0LXRvYy1rcGktdmFsdWVzPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtOCBwLTVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzJweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczNnB4J1wiIFtoZWlnaHRdPVwiJzM2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZC1mdWxsJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTI0cHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCIgKm5nSWY9XCJoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRob3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImF1dGhvcj8ucGhvdG8gfHwgJydcIiBbbmFtZV09XCJhdXRob3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9yJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JDb250YWN0cyk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3JlYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjcmVlYXRvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckNvbnRhY3RzKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImNyZWVhdG9yPy5waG90byB8fCAnJ1wiIFtuYW1lXT1cImNyZWVhdG9yPy5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlZWF0b3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3JlYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zb3VyY2UgICYmIChjb250ZW50Q3JlYXRvckRhdGEgJiYgY29udGVudENyZWF0b3JEYXRhPy5sZW5ndGgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBjb250ZW50Q3JlYXRvckRhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHByb3ZpZGVyLWxvZ28tZGl2XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50UmVhZERhdGE/LmNyZWF0b3JMb2dvXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckxvZ29cIiBjbGFzcz1cIm1hdC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIvYXNzZXRzL2luc3RhbmNlcy9lYWdsZS9hcHBfbG9nb3MvS2FybWF5b2dpQmhhcmF0X0xvZ28uc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB3b3JkLWJyZWFrIGN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3I/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyYWlzZVRlbGVtZXRlcnlGb3JQcm92aWRlcihjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdKVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXInLCBjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yWzBdLCAnbWljcm8tc2l0ZXMnXVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnRSZWFkRGF0YT8uc291cmNlLCAnc291cmNlJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gd29yZC1icmVha1wiICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY3JlYXRlZEZvcj8ubGVuZ3RoXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50UmVhZERhdGE/LnNvdXJjZSwgJ3NvdXJjZScpIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxlYXJuQWR2aXNvcnlEYXRhICYmIGxlYXJuQWR2aXNvcnlEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cblxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWVucm9sbC1kaXZcIlxuICAgIFtuZ0NsYXNzXT1cInsnYmctd2hpdGUnOiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSB9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQgJiYgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwibW9iaWxlMTIwMCAmJiAhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiXG4gICAgICAgICAgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJlbnJvbGxGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDx3cy1hcHAtc2hhcmUtdG9jICpuZ0lmPVwiZW5hYmxlU2hhcmVcIiBbcm9vdE9yZ0lkXT1cInJvb3RPcmdJZFwiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgIChyZXNldEVuYWJsZVNoYXJlKT1cInJlc2V0RW5hYmxlU2hhcmUoJGV2ZW50KVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIj48L3dzLWFwcC1zaGFyZS10b2M+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhRm91bmQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cImVycm9yLW5vdC1mb3VuZCBmbGV4IGZsZXgtd3JhcHBlZCBtYXJnaW4tbGVmdC1tIG1hcmdpbi10b3AteGwgbWFyZ2luLXJpZ2h0LW0gZmxleC1jb2wganVzdGlmeS1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHRleHQtY2VudGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVycm9yLWxvZ29cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlIHdzLW1hdC1wcmltYXJ5LXRleHQgZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICBUaGUgcGFnZSB5b3UgcmVxdWVzdGVkIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwiZXJyb3Itc3VwcG9ydFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN1cHBvcnQtbWVzc2FnZVwiID5XZSBoYXZlIHVwZGF0ZWQgb3VyIHdlYiBzaXRlIGFuZCBtYW55IFVSTHMgaGF2ZSBjaGFuZ2VkLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN1cHBvcnQtbWVzc2FnZVwiID5Zb3UgbWlnaHQgd2FudCB0bzo8L2Rpdj5cbiAgICA8L2Rpdj4gLS0+XG4gIDwvZGl2PlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Pnt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXdCdG4gaTE4bj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlWaWV3QnRuXCI+XG4gICAgPGEgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKCRldmVudClcIlxuICAgIFtyb3V0ZXJMaW5rXT1cInNob3VsZFNob3dTdXJ2ZXlQb3B1cCgpID8gbnVsbCA6ICgocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmwpXCJcbiAgICBbcXVlcnlQYXJhbXNdPVwic2hvdWxkU2hvd1N1cnZleVBvcHVwKCkgPyBudWxsIDogKChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJykpXCJcbiAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIHt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fVxuICA8L2E+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXdGb3JJbnZpdGVPbmx5QXNzZXNzbWVudD5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvclByZXZpZXcgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lcj57eyAnYXBwdG9jaG9tZS50YWtlVGVzdCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICA8L2E+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT4iXX0=