@sunbird-cb/toc 0.0.2 → 0.0.3-ang-17-20

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 (496) hide show
  1. package/fesm2022/sunbird-cb-toc.mjs +16472 -13311
  2. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  3. package/index.d.ts +5883 -4
  4. package/package.json +13 -14
  5. package/sunbird-cb-toc-0.0.3-ang-17-20.tgz +0 -0
  6. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +0 -55
  7. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +0 -126
  8. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +0 -32
  9. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +0 -85
  10. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +0 -100
  11. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +0 -48
  12. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +0 -120
  13. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +0 -92
  14. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +0 -48
  15. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +0 -25
  16. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +0 -41
  17. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +0 -89
  18. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +0 -42
  19. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +0 -41
  20. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +0 -78
  21. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +0 -45
  22. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +0 -2
  23. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +0 -70
  24. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +0 -28
  25. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +0 -187
  26. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +0 -86
  27. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +0 -31
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +0 -941
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +0 -183
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +0 -327
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +0 -297
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +0 -223
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +0 -887
  34. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +0 -16
  35. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +0 -43
  36. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +0 -133
  37. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +0 -66
  38. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +0 -278
  39. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +0 -21
  40. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +0 -21
  41. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +0 -847
  42. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +0 -219
  43. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +0 -209
  44. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +0 -26
  45. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +0 -19
  46. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +0 -23
  47. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +0 -113
  48. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +0 -110
  49. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +0 -26
  50. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +0 -19
  51. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +0 -67
  52. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +0 -28
  53. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +0 -77
  54. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +0 -2
  55. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +0 -61
  56. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +0 -20
  57. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +0 -73
  58. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +0 -139
  59. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +0 -71
  60. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +0 -34
  61. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +0 -56
  62. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +0 -25
  63. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +0 -37
  64. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +0 -32
  65. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +0 -30
  66. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +0 -38
  67. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +0 -51
  68. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +0 -115
  69. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +0 -12
  70. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +0 -51
  71. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +0 -61
  72. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +0 -87
  73. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +0 -36
  74. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +0 -62
  75. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +0 -24
  76. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +0 -192
  77. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +0 -44
  78. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +0 -99
  79. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +0 -58
  80. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +0 -67
  81. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +0 -112
  82. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +0 -2
  83. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +0 -69
  84. package/esm2022/lib/_collection-api.mjs +0 -57
  85. package/esm2022/lib/_constants/widget-content.constants.mjs +0 -19
  86. package/esm2022/lib/_directives/tooltip.directive.mjs +0 -68
  87. package/esm2022/lib/_models/common.model.mjs +0 -2
  88. package/esm2022/lib/_models/error.model.mjs +0 -2
  89. package/esm2022/lib/_pipes/highlight.pipe.mjs +0 -24
  90. package/esm2022/lib/_services/rating.service.mjs +0 -89
  91. package/esm2022/lib/_services/samuhik-charcha.service.mjs +0 -29
  92. package/esm2022/lib/_services/viewer-route-util.mjs +0 -103
  93. package/esm2022/lib/_services/widget-content.model.mjs +0 -247
  94. package/esm2022/lib/_services/widget-content.service.mjs +0 -594
  95. package/esm2022/lib/_shared/translate-loader.factory.mjs +0 -9
  96. package/esm2022/lib/app-toc-lib.module.mjs +0 -499
  97. package/esm2022/lib/collection.config.mjs +0 -161
  98. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +0 -37
  99. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +0 -1436
  100. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +0 -475
  101. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +0 -119
  102. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +0 -80
  103. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +0 -249
  104. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +0 -39
  105. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +0 -58
  106. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +0 -2229
  107. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +0 -2836
  108. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +0 -157
  109. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +0 -48
  110. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +0 -47
  111. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +0 -766
  112. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +0 -243
  113. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +0 -116
  114. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +0 -44
  115. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +0 -1838
  116. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +0 -236
  117. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +0 -213
  118. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +0 -36
  119. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +0 -256
  120. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +0 -133
  121. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +0 -36
  122. package/esm2022/lib/models/app-toc-analytics.model.mjs +0 -2
  123. package/esm2022/lib/models/app-toc.model.mjs +0 -38
  124. package/esm2022/lib/models/auto-complete.model.mjs +0 -2
  125. package/esm2022/lib/models/card-content.model.mjs +0 -13
  126. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +0 -2
  127. package/esm2022/lib/models/discussion-forum.model.mjs +0 -14
  128. package/esm2022/lib/models/goal.model.mjs +0 -2
  129. package/esm2022/lib/models/meta-tag.model.mjs +0 -8
  130. package/esm2022/lib/models/playlist.model.mjs +0 -2
  131. package/esm2022/lib/models/profile-revamp.model.mjs +0 -2
  132. package/esm2022/lib/models/rating.model.mjs +0 -2
  133. package/esm2022/lib/models/user-profile.model.mjs +0 -21
  134. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +0 -24
  135. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +0 -24
  136. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +0 -60
  137. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +0 -25
  138. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +0 -106
  139. package/esm2022/lib/resolvers/config-resolver.service.mjs +0 -25
  140. package/esm2022/lib/resolvers/profile-resolver.service.mjs +0 -25
  141. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +0 -25
  142. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +0 -51
  143. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +0 -16
  144. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +0 -18
  145. package/esm2022/lib/services/access-control.service.mjs +0 -56
  146. package/esm2022/lib/services/action.service.mjs +0 -23
  147. package/esm2022/lib/services/app-toc-v2.service.mjs +0 -230
  148. package/esm2022/lib/services/app-toc.service.mjs +0 -1300
  149. package/esm2022/lib/services/certificate.service.mjs +0 -69
  150. package/esm2022/lib/services/discuss-utils.service.mjs +0 -58
  151. package/esm2022/lib/services/editor.service.mjs +0 -34
  152. package/esm2022/lib/services/load-check.service.mjs +0 -21
  153. package/esm2022/lib/services/loader.service.mjs +0 -33
  154. package/esm2022/lib/services/mobile-apps.service.mjs +0 -67
  155. package/esm2022/lib/services/netcore.service.mjs +0 -56
  156. package/esm2022/lib/services/nps-grid.service.mjs +0 -31
  157. package/esm2022/lib/services/otp.service.mjs +0 -43
  158. package/esm2022/lib/services/profile-v2.service.mjs +0 -43
  159. package/esm2022/lib/services/reset-ratings.service.mjs +0 -19
  160. package/esm2022/lib/services/resource-download-helper.service.mjs +0 -64
  161. package/esm2022/lib/services/timer.service.mjs +0 -23
  162. package/esm2022/lib/services/title-tag.service.mjs +0 -71
  163. package/esm2022/lib/services/user-profile.service.mjs +0 -55
  164. package/esm2022/lib/services/viewer-data.service.mjs +0 -64
  165. package/esm2022/lib/services/viewer-util.service.mjs +0 -500
  166. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +0 -291
  167. package/esm2022/lib/share-toc/share-toc.module.mjs +0 -119
  168. package/esm2022/public-api.mjs +0 -70
  169. package/esm2022/sunbird-cb-toc.mjs +0 -5
  170. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +0 -17
  171. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +0 -1
  172. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +0 -32
  173. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +0 -1
  174. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +0 -16
  175. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +0 -1
  176. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +0 -21
  177. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +0 -1
  178. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +0 -23
  179. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +0 -1
  180. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +0 -16
  181. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +0 -1
  182. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +0 -23
  183. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +0 -1
  184. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +0 -23
  185. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +0 -1
  186. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +0 -10
  187. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +0 -1
  188. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +0 -12
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +0 -1
  190. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +0 -13
  191. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +0 -1
  192. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +0 -19
  193. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +0 -1
  194. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +0 -15
  195. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +0 -1
  196. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +0 -12
  197. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +0 -1
  198. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +0 -18
  199. package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +0 -1
  200. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +0 -15
  201. package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +0 -1
  202. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +0 -200
  203. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +0 -1
  204. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +0 -17
  205. package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +0 -1
  206. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +0 -11
  207. package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +0 -1
  208. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +0 -39
  209. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +0 -1
  210. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +0 -20
  211. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +0 -1
  212. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +0 -12
  213. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +0 -1
  214. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +0 -184
  215. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +0 -1
  216. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +0 -42
  217. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +0 -1
  218. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +0 -55
  219. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +0 -1
  220. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +0 -48
  221. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +0 -1
  222. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +0 -49
  223. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +0 -1
  224. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +0 -136
  225. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +0 -1
  226. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +0 -9
  227. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +0 -1
  228. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +0 -17
  229. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +0 -1
  230. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +0 -41
  231. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +0 -1
  232. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +0 -22
  233. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +0 -1
  234. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +0 -46
  235. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +0 -1
  236. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +0 -11
  237. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +0 -1
  238. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +0 -11
  239. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +0 -1
  240. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +0 -129
  241. package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +0 -1
  242. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +0 -52
  243. package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +0 -1
  244. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +0 -30
  245. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +0 -1
  246. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +0 -10
  247. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +0 -1
  248. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +0 -8
  249. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +0 -1
  250. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +0 -8
  251. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +0 -1
  252. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +0 -29
  253. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +0 -1
  254. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +0 -25
  255. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +0 -1
  256. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +0 -15
  257. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +0 -1
  258. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +0 -10
  259. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +0 -1
  260. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +0 -13
  261. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +0 -1
  262. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +0 -11
  263. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +0 -1
  264. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +0 -23
  265. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +0 -1
  266. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +0 -9
  267. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +0 -1
  268. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +0 -19
  269. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +0 -1
  270. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +0 -9
  271. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +0 -1
  272. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +0 -17
  273. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +0 -1
  274. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +0 -36
  275. package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +0 -1
  276. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +0 -20
  277. package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +0 -1
  278. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +0 -15
  279. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +0 -1
  280. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +0 -14
  281. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +0 -1
  282. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +0 -12
  283. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +0 -1
  284. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +0 -12
  285. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +0 -1
  286. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +0 -16
  287. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +0 -1
  288. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +0 -11
  289. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +0 -1
  290. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +0 -17
  291. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +0 -1
  292. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +0 -12
  293. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +0 -1
  294. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +0 -35
  295. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +0 -1
  296. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +0 -18
  297. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +0 -1
  298. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +0 -16
  299. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +0 -1
  300. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +0 -16
  301. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +0 -1
  302. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +0 -22
  303. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +0 -1
  304. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +0 -13
  305. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +0 -1
  306. package/lib/_collection/_common/user-image/user-image.component.d.ts +0 -22
  307. package/lib/_collection/_common/user-image/user-image.component.d.ts.map +0 -1
  308. package/lib/_collection/_common/user-image/user-image.module.d.ts +0 -10
  309. package/lib/_collection/_common/user-image/user-image.module.d.ts.map +0 -1
  310. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +0 -48
  311. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +0 -1
  312. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +0 -15
  313. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +0 -1
  314. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +0 -23
  315. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +0 -1
  316. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +0 -20
  317. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +0 -1
  318. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +0 -16
  319. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +0 -1
  320. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +0 -26
  321. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +0 -1
  322. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +0 -22
  323. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +0 -1
  324. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +0 -19
  325. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +0 -1
  326. package/lib/_collection-api.d.ts +0 -35
  327. package/lib/_collection-api.d.ts.map +0 -1
  328. package/lib/_constants/widget-content.constants.d.ts +0 -8
  329. package/lib/_constants/widget-content.constants.d.ts.map +0 -1
  330. package/lib/_directives/tooltip.directive.d.ts +0 -18
  331. package/lib/_directives/tooltip.directive.d.ts.map +0 -1
  332. package/lib/_models/common.model.d.ts +0 -4
  333. package/lib/_models/common.model.d.ts.map +0 -1
  334. package/lib/_models/error.model.d.ts +0 -6
  335. package/lib/_models/error.model.d.ts.map +0 -1
  336. package/lib/_pipes/highlight.pipe.d.ts +0 -11
  337. package/lib/_pipes/highlight.pipe.d.ts.map +0 -1
  338. package/lib/_services/rating.service.d.ts +0 -19
  339. package/lib/_services/rating.service.d.ts.map +0 -1
  340. package/lib/_services/samuhik-charcha.service.d.ts +0 -14
  341. package/lib/_services/samuhik-charcha.service.d.ts.map +0 -1
  342. package/lib/_services/viewer-route-util.d.ts +0 -9
  343. package/lib/_services/viewer-route-util.d.ts.map +0 -1
  344. package/lib/_services/widget-content.model.d.ts +0 -516
  345. package/lib/_services/widget-content.model.d.ts.map +0 -1
  346. package/lib/_services/widget-content.service.d.ts +0 -102
  347. package/lib/_services/widget-content.service.d.ts.map +0 -1
  348. package/lib/_shared/translate-loader.factory.d.ts +0 -8
  349. package/lib/_shared/translate-loader.factory.d.ts.map +0 -1
  350. package/lib/app-toc-lib.module.d.ts +0 -89
  351. package/lib/app-toc-lib.module.d.ts.map +0 -1
  352. package/lib/collection.config.d.ts +0 -160
  353. package/lib/collection.config.d.ts.map +0 -1
  354. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +0 -18
  355. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +0 -1
  356. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +0 -226
  357. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +0 -1
  358. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +0 -79
  359. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +0 -1
  360. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +0 -23
  361. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +0 -1
  362. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +0 -32
  363. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +0 -1
  364. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +0 -48
  365. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +0 -1
  366. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +0 -15
  367. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +0 -1
  368. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +0 -22
  369. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +0 -1
  370. package/lib/components/app-toc-home/app-toc-home.component.d.ts +0 -315
  371. package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +0 -1
  372. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +0 -392
  373. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +0 -1
  374. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +0 -48
  375. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +0 -1
  376. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +0 -23
  377. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +0 -1
  378. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +0 -15
  379. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +0 -1
  380. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +0 -150
  381. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +0 -1
  382. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +0 -43
  383. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +0 -1
  384. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +0 -28
  385. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +0 -1
  386. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +0 -16
  387. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +0 -1
  388. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +0 -196
  389. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +0 -1
  390. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +0 -45
  391. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +0 -1
  392. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +0 -55
  393. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +0 -1
  394. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +0 -19
  395. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +0 -1
  396. package/lib/components/public-survey-form/public-survey-form.component.d.ts +0 -44
  397. package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +0 -1
  398. package/lib/components/survey-form-question/survey-form-question.component.d.ts +0 -21
  399. package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +0 -1
  400. package/lib/components/survey-form-section/survey-form-section.component.d.ts +0 -14
  401. package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +0 -1
  402. package/lib/models/app-toc-analytics.model.d.ts +0 -153
  403. package/lib/models/app-toc-analytics.model.d.ts.map +0 -1
  404. package/lib/models/app-toc.model.d.ts +0 -85
  405. package/lib/models/app-toc.model.d.ts.map +0 -1
  406. package/lib/models/auto-complete.model.d.ts +0 -28
  407. package/lib/models/auto-complete.model.d.ts.map +0 -1
  408. package/lib/models/card-content.model.d.ts +0 -20
  409. package/lib/models/card-content.model.d.ts.map +0 -1
  410. package/lib/models/content-strip-with-tabs.model.d.ts +0 -45
  411. package/lib/models/content-strip-with-tabs.model.d.ts.map +0 -1
  412. package/lib/models/discussion-forum.model.d.ts +0 -41
  413. package/lib/models/discussion-forum.model.d.ts.map +0 -1
  414. package/lib/models/goal.model.d.ts +0 -23
  415. package/lib/models/goal.model.d.ts.map +0 -1
  416. package/lib/models/meta-tag.model.d.ts +0 -7
  417. package/lib/models/meta-tag.model.d.ts.map +0 -1
  418. package/lib/models/playlist.model.d.ts +0 -24
  419. package/lib/models/playlist.model.d.ts.map +0 -1
  420. package/lib/models/profile-revamp.model.d.ts +0 -15
  421. package/lib/models/profile-revamp.model.d.ts.map +0 -1
  422. package/lib/models/rating.model.d.ts +0 -18
  423. package/lib/models/rating.model.d.ts.map +0 -1
  424. package/lib/models/user-profile.model.d.ts +0 -38
  425. package/lib/models/user-profile.model.d.ts.map +0 -1
  426. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +0 -13
  427. package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +0 -1
  428. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +0 -13
  429. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +0 -1
  430. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +0 -17
  431. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +0 -1
  432. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +0 -13
  433. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +0 -1
  434. package/lib/resolvers/app-toc-resolver.service.d.ts +0 -17
  435. package/lib/resolvers/app-toc-resolver.service.d.ts.map +0 -1
  436. package/lib/resolvers/config-resolver.service.d.ts +0 -12
  437. package/lib/resolvers/config-resolver.service.d.ts.map +0 -1
  438. package/lib/resolvers/profile-resolver.service.d.ts +0 -12
  439. package/lib/resolvers/profile-resolver.service.d.ts.map +0 -1
  440. package/lib/resolvers/restricted-features-resolver.service.d.ts +0 -12
  441. package/lib/resolvers/restricted-features-resolver.service.d.ts.map +0 -1
  442. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +0 -20
  443. package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +0 -1
  444. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +0 -9
  445. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +0 -1
  446. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +0 -9
  447. package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +0 -1
  448. package/lib/services/access-control.service.d.ts +0 -30
  449. package/lib/services/access-control.service.d.ts.map +0 -1
  450. package/lib/services/action.service.d.ts +0 -10
  451. package/lib/services/action.service.d.ts.map +0 -1
  452. package/lib/services/app-toc-v2.service.d.ts +0 -15
  453. package/lib/services/app-toc-v2.service.d.ts.map +0 -1
  454. package/lib/services/app-toc.service.d.ts +0 -162
  455. package/lib/services/app-toc.service.d.ts.map +0 -1
  456. package/lib/services/certificate.service.d.ts +0 -43
  457. package/lib/services/certificate.service.d.ts.map +0 -1
  458. package/lib/services/discuss-utils.service.d.ts +0 -34
  459. package/lib/services/discuss-utils.service.d.ts.map +0 -1
  460. package/lib/services/editor.service.d.ts +0 -18
  461. package/lib/services/editor.service.d.ts.map +0 -1
  462. package/lib/services/load-check.service.d.ts +0 -9
  463. package/lib/services/load-check.service.d.ts.map +0 -1
  464. package/lib/services/loader.service.d.ts +0 -17
  465. package/lib/services/loader.service.d.ts.map +0 -1
  466. package/lib/services/mobile-apps.service.d.ts +0 -39
  467. package/lib/services/mobile-apps.service.d.ts.map +0 -1
  468. package/lib/services/netcore.service.d.ts +0 -34
  469. package/lib/services/netcore.service.d.ts.map +0 -1
  470. package/lib/services/nps-grid.service.d.ts +0 -16
  471. package/lib/services/nps-grid.service.d.ts.map +0 -1
  472. package/lib/services/otp.service.d.ts +0 -21
  473. package/lib/services/otp.service.d.ts.map +0 -1
  474. package/lib/services/profile-v2.service.d.ts +0 -21
  475. package/lib/services/profile-v2.service.d.ts.map +0 -1
  476. package/lib/services/reset-ratings.service.d.ts +0 -9
  477. package/lib/services/reset-ratings.service.d.ts.map +0 -1
  478. package/lib/services/resource-download-helper.service.d.ts +0 -30
  479. package/lib/services/resource-download-helper.service.d.ts.map +0 -1
  480. package/lib/services/timer.service.d.ts +0 -10
  481. package/lib/services/timer.service.d.ts.map +0 -1
  482. package/lib/services/title-tag.service.d.ts +0 -22
  483. package/lib/services/title-tag.service.d.ts.map +0 -1
  484. package/lib/services/user-profile.service.d.ts +0 -25
  485. package/lib/services/user-profile.service.d.ts.map +0 -1
  486. package/lib/services/viewer-data.service.d.ts +0 -59
  487. package/lib/services/viewer-data.service.d.ts.map +0 -1
  488. package/lib/services/viewer-util.service.d.ts +0 -63
  489. package/lib/services/viewer-util.service.d.ts.map +0 -1
  490. package/lib/share-toc/share-toc/share-toc.component.d.ts +0 -57
  491. package/lib/share-toc/share-toc/share-toc.component.d.ts.map +0 -1
  492. package/lib/share-toc/share-toc.module.d.ts +0 -33
  493. package/lib/share-toc/share-toc.module.d.ts.map +0 -1
  494. package/public-api.d.ts +0 -56
  495. package/public-api.d.ts.map +0 -1
  496. package/sunbird-cb-toc.d.ts.map +0 -1
@@ -1,500 +0,0 @@
1
- import { NsContent } from '../_services/widget-content.model';
2
- import { Inject, Injectable } from '@angular/core';
3
- import { noop, Subject } from 'rxjs';
4
- import dayjs from 'dayjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- import * as i2 from "@sunbird-cb/utils-v2";
8
- import * as i3 from "../_collection-api";
9
- import * as i4 from "./app-toc.service";
10
- import * as i5 from "@sunbird-cb/consumption";
11
- export class ViewerUtilService {
12
- constructor(http, configservice, contentSvc, tocSvc, userSvc, contentLangSvc, domainConfSvc, environment) {
13
- this.http = http;
14
- this.configservice = configservice;
15
- this.contentSvc = contentSvc;
16
- this.tocSvc = tocSvc;
17
- this.userSvc = userSvc;
18
- this.contentLangSvc = contentLangSvc;
19
- this.domainConfSvc = domainConfSvc;
20
- this.environment = environment;
21
- this.API_ENDPOINTS = {
22
- setS3Cookie: `/apis/v8/protected/content/setCookie`,
23
- // PROGRESS_UPDATE: `/apis/protected/v8/user/realTimeProgress/update`,
24
- PROGRESS_UPDATE: `/apis/proxies/v8/content-progres`,
25
- ASSESSMENT_SECTION: `/apis/proxies/v8/assessment/v5/read`,
26
- GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
27
- SUBMIT_FORM: `/apis/proxies/v8/forms/v2/saveFormSubmit`,
28
- // GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
29
- // SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
30
- PRE_ASSESSMENT_STATE_UPDATE: `/apis/proxies/v8/content/v2/state/update`
31
- };
32
- this.downloadRegex = new RegExp(`(/content-store/.*?)(\\\)?\\\\?['"])`, 'gm');
33
- this.authoringBase = '/apis/authContent/';
34
- this.markAsCompleteSubject = new Subject();
35
- this.autoPlayNextVideo = new Subject();
36
- this.autoPlayNextAudio = new Subject();
37
- this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
38
- this.publicUserDetails = {};
39
- this.regexDownloadReplace = (_str = '', group1, group2) => {
40
- return `${this.authoringBase}${encodeURIComponent(group1)}${group2}`;
41
- };
42
- }
43
- async fetchManifestFile(url) {
44
- this.setS3Cookie(url);
45
- const manifestFile = await this.http
46
- .get(url)
47
- .toPromise()
48
- .catch((_err) => { });
49
- return manifestFile;
50
- }
51
- async setS3Cookie(_contentId) {
52
- // await this.http
53
- // .post(this.API_ENDPOINTS.setS3Cookie, { contentId })
54
- // .toPromise()
55
- // .catch((_err: any) => { })
56
- return;
57
- }
58
- calculatePercent(current, max, mimeType) {
59
- try {
60
- const temp = [...current];
61
- if (temp && temp.length && max) {
62
- const latest = parseFloat(temp.pop() || '0');
63
- const percentMilis = (latest / max) * 100;
64
- let percent = parseFloat(percentMilis.toFixed(2));
65
- if (mimeType === NsContent.EMimeTypes.MP4 ||
66
- mimeType === NsContent.EMimeTypes.M3U8 ||
67
- mimeType === NsContent.EMimeTypes.MP3 ||
68
- mimeType === NsContent.EMimeTypes.M4A ||
69
- mimeType === NsContent.EMimeTypes.YOUTUBE ||
70
- mimeType === NsContent.EMimeTypes.SURVEY) {
71
- if (percent <= 5) {
72
- // if percentage is less than 5% make it 0
73
- percent = 0;
74
- }
75
- else if (percent >= 95) {
76
- // if percentage is greater than 95% make it 100
77
- percent = 100;
78
- }
79
- }
80
- return percent;
81
- }
82
- return 0;
83
- }
84
- catch (e) {
85
- // tslint:disable-next-line: no-console
86
- console.log('Error in calculating percentage', e);
87
- return 0;
88
- }
89
- }
90
- getStatus(current, max, mimeType) {
91
- try {
92
- const percentage = this.calculatePercent(current, max, mimeType);
93
- // for videos and audios
94
- if (mimeType === NsContent.EMimeTypes.MP4 ||
95
- mimeType === NsContent.EMimeTypes.M3U8 ||
96
- mimeType === NsContent.EMimeTypes.MP3 ||
97
- mimeType === NsContent.EMimeTypes.M4A ||
98
- mimeType === NsContent.EMimeTypes.SURVEY ||
99
- mimeType === NsContent.EMimeTypes.PDF) {
100
- // if percentage is less than 5% then make status started
101
- if (Math.ceil(percentage) <= 5) {
102
- return 1;
103
- }
104
- // if percentage is greater than 95% then make status complete
105
- if (Math.ceil(percentage) >= 95) {
106
- return 2;
107
- }
108
- }
109
- else {
110
- if (Math.ceil(percentage) >= 100) {
111
- return 2;
112
- }
113
- }
114
- return 1;
115
- }
116
- catch (e) {
117
- // tslint:disable-next-line: no-console
118
- console.log('Error in getting completion status', e);
119
- return 1;
120
- }
121
- }
122
- realTimeProgressUpdate(contentId, request, collectionId, batchId) {
123
- let req;
124
- if (this.configservice.userProfile) {
125
- const language = this.getResourceContentLanguage(contentId);
126
- req = {
127
- request: {
128
- userId: this.configservice.userProfile.userId || '',
129
- contents: [
130
- {
131
- contentId,
132
- batchId,
133
- language,
134
- status: this.getStatus(request.current, request.max_size, request.mime_type),
135
- courseId: collectionId,
136
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
137
- progressdetails: {
138
- max_size: request.max_size,
139
- current: request.current,
140
- mimeType: request.mime_type,
141
- },
142
- completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
143
- },
144
- ],
145
- },
146
- };
147
- // if (this.configservice.cstoken !== '') {
148
- // const headers = new HttpHeaders()
149
- // .set('cstoken', this.configservice.cstoken)
150
- // this.http
151
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
152
- // .subscribe(noop, noop)
153
- // } else {
154
- // this.http
155
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
156
- // .subscribe(noop, noop)
157
- // }
158
- this.http
159
- .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
160
- .subscribe(noop, noop);
161
- if (this.tocSvc.hashmap[contentId] &&
162
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
163
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
164
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
165
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
166
- }
167
- }
168
- else {
169
- req = {};
170
- // do nothing
171
- }
172
- }
173
- getBatchIdAndCourseId(courseId, batchId, resourceId) {
174
- const tempData = {
175
- courseId,
176
- batchId,
177
- };
178
- const tempContentData = this.contentSvc.currentMetaData;
179
- const tempContentReadData = this.contentSvc.currentContentReadMetaData;
180
- const enrollmentList = this.contentSvc.currentBatchEnrollmentList;
181
- if (!this.forPreview) {
182
- if (tempContentData && tempContentReadData.cumulativeTracking &&
183
- (tempContentData.primaryCategory === NsContent.EPrimaryCategory.PROGRAM ||
184
- tempContentData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM
185
- || tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM)) {
186
- tempContentData.children.forEach(async (childList) => {
187
- if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
188
- // tslint:disable-next-line: max-line-length
189
- const courseEnrollmentList = enrollmentList && enrollmentList.filter((v) => v.contentId === childList.identifier);
190
- if (childList.childNodes && childList.childNodes.indexOf(resourceId) !== -1) {
191
- if (courseEnrollmentList && courseEnrollmentList.length > 0) {
192
- tempData.batchId = courseEnrollmentList[courseEnrollmentList.length - 1].batch.batchId;
193
- tempData.courseId = childList.identifier;
194
- }
195
- else {
196
- const data = await this.checkForCourseEnrollment(childList, resourceId, enrollmentList, tempData);
197
- tempData.courseId = data.courseId;
198
- tempData.batchId = data.batchId;
199
- }
200
- }
201
- }
202
- else if (tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
203
- if (tempData.courseId === courseId) {
204
- const bPEnrollmentList = enrollmentList.filter((v) => v.contentId === tempContentData.identifier);
205
- if (tempContentData.childNodes && tempContentData.childNodes.indexOf(resourceId) !== -1) {
206
- if (bPEnrollmentList.length > 0) {
207
- tempData.batchId = bPEnrollmentList[bPEnrollmentList.length - 1].batch.batchId;
208
- tempData.courseId = tempContentData.identifier;
209
- }
210
- }
211
- }
212
- }
213
- });
214
- }
215
- }
216
- return tempData;
217
- }
218
- getResourceContentLanguage(resourceId) {
219
- let tempLanguage = 'english';
220
- let languageFound = false;
221
- const tempContentData = this.contentSvc.currentMetaData;
222
- if (!this.forPreview) {
223
- tempContentData.children?.forEach(async (childList) => {
224
- if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
225
- // tslint:disable-next-line: max-line-length
226
- if (childList.leafNodes && childList.leafNodes.indexOf(resourceId) !== -1) {
227
- tempLanguage = this.contentLangSvc.getContentLanguage(childList);
228
- languageFound = true;
229
- }
230
- }
231
- });
232
- if (!languageFound) {
233
- if (tempContentData.leafNodes && tempContentData.leafNodes.indexOf(resourceId) !== -1) {
234
- tempLanguage = this.contentLangSvc.getContentLanguage(tempContentData);
235
- }
236
- }
237
- }
238
- return tempLanguage;
239
- }
240
- async checkForCourseEnrollment(childList, _resourceId, _enrollmentList, _tempData) {
241
- // tslint:disable-next-line: max-line-length
242
- const courseData = await this.contentSvc.autoAssignBatchApi(childList.identifier).toPromise().then(async (data) => {
243
- if (data) {
244
- // tslint:disable-next-line: max-line-length
245
- const responseData = await this.userSvc.fetchEnrollmentDataByContentId(this.configservice.userProfile?.userId, childList.identifier).toPromise().then(async (res) => {
246
- if (res && res.courses && res.courses.length) {
247
- return res.courses;
248
- }
249
- return [{ courseId: childList.identifier, batchId: '' }];
250
- }).catch((_err) => {
251
- return [{ courseId: childList.identifier, batchId: '' }];
252
- });
253
- this.contentSvc.currentBatchEnrollmentList = [...this.contentSvc.currentBatchEnrollmentList, ...responseData];
254
- return { courseId: childList.identifier, batchId: responseData[0].batchId };
255
- }
256
- }).catch((_err) => {
257
- return [{ courseId: childList.identifier, batchId: '' }];
258
- });
259
- return courseData;
260
- }
261
- realTimeProgressUpdateQuiz(contentId, collectionId, batchId, status) {
262
- let req;
263
- if (this.configservice.userProfile) {
264
- const language = this.getResourceContentLanguage(contentId);
265
- req = {
266
- request: {
267
- userId: this.configservice.userProfile.userId || '',
268
- contents: [
269
- {
270
- contentId,
271
- batchId,
272
- language,
273
- status: status || 2,
274
- courseId: collectionId,
275
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
276
- completionPercentage: status === 2 ? 100 : 0,
277
- },
278
- ],
279
- },
280
- };
281
- this.http
282
- .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
283
- .subscribe(noop, noop);
284
- if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
285
- if (this.tocSvc.hashmap[contentId] &&
286
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
287
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
288
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
289
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
290
- }
291
- }
292
- }
293
- else {
294
- req = {};
295
- // do nothing
296
- }
297
- }
298
- getContent(contentId) {
299
- const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
300
- let url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
301
- if (!forPreview) {
302
- url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
303
- }
304
- else {
305
- if (window.location.href.includes('editMode=true') && window.location.href.includes('_rc')) {
306
- url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
307
- }
308
- else {
309
- url = `/api/content/v1/read/${contentId}`;
310
- }
311
- }
312
- return this.http.get(
313
- // tslint:disable-next-line:max-line-length
314
- // `/apis/authApi/action/content/hierarchy/${contentId}?rootOrg=${this.configservice.rootOrg || 'igot'}&org=${this.configservice.activeOrg || 'dopt'}`,
315
- url);
316
- }
317
- getAuthoringUrl(url) {
318
- return url
319
- // tslint:disable-next-line:max-line-length
320
- ? `/apis/authContent/${url.includes('/content-store/') ? new URL(url).pathname.slice(1) : encodeURIComponent(url)}`
321
- : '';
322
- }
323
- replaceToAuthUrl(data) {
324
- return JSON.parse(JSON.stringify(data).replace(this.downloadRegex, this.regexDownloadReplace));
325
- }
326
- readSections(assessmentId) {
327
- return `${this.API_ENDPOINTS}/${assessmentId}`;
328
- }
329
- getPublicUrl(url) {
330
- const mainUrl = url.split('/content').pop() || '';
331
- return `${this.environment.contentHost}/${this.environment.contentBucket}/content${mainUrl}`;
332
- }
333
- getCdnUrl(url) {
334
- const mainUrl = url.split('/content').pop() || '';
335
- return `${this.domainConfSvc.getDomainCDNHost()}/${this.environment.cdnContentBucket}/content${mainUrl}`;
336
- }
337
- // fetchContent(
338
- // contentId: string,
339
- // hierarchyType: 'all' | 'minimal' | 'detail' = 'detail'
340
- // ): Observable<NsContent.IContent> {
341
- // let url = ''
342
- // const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true')
343
- // if (!forPreview) {
344
- // url = `/apis/proxies/v8/action/content/v3/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
345
- // } else {
346
- // url = `/api/course/v1/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
347
- // }
348
- // return this.http.get<NsContent.IContent>(url)
349
- // }
350
- fetchContent(id, type) {
351
- return this.http.get(`/apis/proxies/v8/action/content/v3/hierarchy/${id}?mode=${type}`);
352
- }
353
- updateContentHashMapForAssesstent(contentId, contentProgress) {
354
- if (this.tocSvc.hashmap[contentId] &&
355
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
356
- this.tocSvc.hashmap[contentId]['completionPercentage'] = contentProgress.completionPercentage;
357
- this.tocSvc.hashmap[contentId]['completionStatus'] = contentProgress.status;
358
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
359
- }
360
- }
361
- getFormById(formId) {
362
- return this.http.get(this.API_ENDPOINTS.GET_FORM_BYID(formId));
363
- }
364
- submitForm(formData) {
365
- return this.http.post(this.API_ENDPOINTS.SUBMIT_FORM, formData);
366
- }
367
- realTimeProgressUpdateForPreAssessment(contentId, request) {
368
- let req;
369
- if (this.configservice.userProfile) {
370
- req = {
371
- request: {
372
- userId: this.configservice.userProfile.userId || '',
373
- contents: [
374
- {
375
- contentId,
376
- // batchId,
377
- status: this.getStatus(request.current, request.max_size, request.mime_type),
378
- // courseId: collectionId,
379
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
380
- progressdetails: {
381
- max_size: request.max_size,
382
- current: request.current,
383
- mimeType: request.mime_type,
384
- },
385
- completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
386
- },
387
- ],
388
- },
389
- };
390
- // if (this.configservice.cstoken !== '') {
391
- // const headers = new HttpHeaders()
392
- // .set('cstoken', this.configservice.cstoken)
393
- // this.http
394
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
395
- // .subscribe(noop, noop)
396
- // } else {
397
- // this.http
398
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
399
- // .subscribe(noop, noop)
400
- // }
401
- // this.http
402
- // .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
403
- // .subscribe(noop, noop)
404
- //const contentIdNew= req.request.contents[0].contentId
405
- // const updatedCompletionPercentage = req.request.contents[0].completionPercentage
406
- // const updatedStatus = req.request.contents[0].status
407
- // // Clone the inner object and update
408
- // const existingContent = this.tocSvc.hashmap[contentIdNew] || {}
409
- // this.tocSvc.hashmap = {
410
- // ...this.tocSvc.hashmap,
411
- // [contentIdNew]: {
412
- // ...existingContent,
413
- // completionPercentage: updatedCompletionPercentage,
414
- // completionStatus: updatedStatus
415
- // }
416
- // }
417
- // console.log('req', JSON.stringify(req))
418
- // console.log('req', req)
419
- const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
420
- if (resourceStatus < 2) {
421
- this.http
422
- .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
423
- .subscribe(noop, noop);
424
- }
425
- if (this.tocSvc.hashmap[contentId] &&
426
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
427
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
428
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
429
- this.tocSvc.hashmap[contentId]['parent'] = req.request.contents[0].courseId;
430
- this.tocSvc.hashmap[contentId]['progress'] = req.request.contents[0].progressdetails;
431
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
432
- }
433
- // console.log('Updated hashmap:', this.tocSvc.hashmap)
434
- // console.log('this.tocSvc.hashmap---', this.tocSvc.hashmap)
435
- }
436
- else {
437
- req = {};
438
- // do nothing
439
- }
440
- }
441
- realTimeProgressUpdateForPreAssessmentQuiz(contentId, status, mimeType) {
442
- let req;
443
- if (this.configservice.userProfile) {
444
- req = {
445
- request: {
446
- //userId: this.configservice.userProfile.userId || '',
447
- contents: [
448
- {
449
- contentId,
450
- // batchId,
451
- status: status || 2,
452
- // courseId: collectionId,
453
- lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
454
- completionPercentage: status === 2 ? 100.0 : 0,
455
- progressdetails: {
456
- "mimeType": mimeType || "application/vnd.sunbird.questionset"
457
- },
458
- },
459
- ],
460
- },
461
- };
462
- const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
463
- if (resourceStatus < 2) {
464
- this.http
465
- .patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
466
- .subscribe(noop, noop);
467
- }
468
- if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
469
- if (this.tocSvc.hashmap[contentId] &&
470
- (!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
471
- this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
472
- this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
473
- this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
474
- }
475
- }
476
- }
477
- else {
478
- req = {};
479
- // do nothing
480
- }
481
- }
482
- getPreAssessmentResourceStatus(resourceId) {
483
- if (this.tocSvc && this.tocSvc.hashmap && this.tocSvc.hashmap[resourceId]) {
484
- return this.tocSvc.hashmap[resourceId]['completionStatus'] || 1;
485
- }
486
- return 1;
487
- }
488
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigurationsService }, { token: i3.WidgetContentService }, { token: i4.AppTocService }, { token: i5.WidgetUserServiceLib }, { token: i5.ContentLanguageService }, { token: i2.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable }); }
489
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, providedIn: 'root' }); }
490
- }
491
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, decorators: [{
492
- type: Injectable,
493
- args: [{
494
- providedIn: 'root',
495
- }]
496
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigurationsService }, { type: i3.WidgetContentService }, { type: i4.AppTocService }, { type: i5.WidgetUserServiceLib }, { type: i5.ContentLanguageService }, { type: i2.DomainConfService }, { type: undefined, decorators: [{
497
- type: Inject,
498
- args: ['environment']
499
- }] }]; } });
500
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDVSxJQUFnQixFQUNoQixhQUFvQyxFQUNwQyxVQUFnQyxFQUNoQyxNQUFxQixFQUNyQixPQUE2QixFQUM3QixjQUFzQyxFQUN0QyxhQUFnQyxFQUNULFdBQWdCO1FBUHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBM0JqRCxrQkFBYSxHQUFHO1lBQ2QsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxzRUFBc0U7WUFDdEUsZUFBZSxFQUFFLGtDQUFrQztZQUNuRCxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsYUFBYSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFO1lBQzFGLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsdUZBQXVGO1lBQ3ZG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QUFTLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFBO29CQUNyRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtvQkFDbkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7aUJBQ2pEO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsR0FBRyxHQUFHLEVBQUUsQ0FBQTtZQUNSLGFBQWE7U0FDZDtJQUNILENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxVQUFrQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDekUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNoRTtRQUNELE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQzsrR0EvZlUsaUJBQWlCLDZQQTRCbEIsYUFBYTttSEE1QlosaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQTZCSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIERvbWFpbkNvbmZTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgbm9vcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9fY29sbGVjdGlvbi1hcGknXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWaWV3ZXJVdGlsU2VydmljZSB7XG4gIEFQSV9FTkRQT0lOVFMgPSB7XG4gICAgc2V0UzNDb29raWU6IGAvYXBpcy92OC9wcm90ZWN0ZWQvY29udGVudC9zZXRDb29raWVgLFxuICAgIC8vIFBST0dSRVNTX1VQREFURTogYC9hcGlzL3Byb3RlY3RlZC92OC91c2VyL3JlYWxUaW1lUHJvZ3Jlc3MvdXBkYXRlYCxcbiAgICBQUk9HUkVTU19VUERBVEU6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQtcHJvZ3Jlc2AsXG4gICAgQVNTRVNTTUVOVF9TRUNUSU9OOiBgL2FwaXMvcHJveGllcy92OC9hc3Nlc3NtZW50L3Y1L3JlYWRgLFxuICAgIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy92Mi9nZXRGb3JtQnlJZD9mb3JtSWQ9JHtmb3JtSWR9YCxcbiAgICBTVUJNSVRfRk9STTogYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvc2F2ZUZvcm1TdWJtaXRgLFxuICAgIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxuICAgIC8vIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdGAsXG4gICAgUFJFX0FTU0VTU01FTlRfU1RBVEVfVVBEQVRFOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50L3YyL3N0YXRlL3VwZGF0ZWBcblxuICB9XG4gIGRvd25sb2FkUmVnZXggPSBuZXcgUmVnRXhwKGAoL2NvbnRlbnQtc3RvcmUvLio/KShcXFxcXFwpP1xcXFxcXFxcP1snXCJdKWAsICdnbScpXG4gIGF1dGhvcmluZ0Jhc2UgPSAnL2FwaXMvYXV0aENvbnRlbnQvJ1xuICBtYXJrQXNDb21wbGV0ZVN1YmplY3QgPSBuZXcgU3ViamVjdCgpXG4gIGF1dG9QbGF5TmV4dFZpZGVvID0gbmV3IFN1YmplY3QoKVxuICBhdXRvUGxheU5leHRBdWRpbyA9IG5ldyBTdWJqZWN0KClcbiAgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgcHVibGljVXNlckRldGFpbHM6IGFueSA9IHt9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGNvbmZpZ3NlcnZpY2U6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclN2YzogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGRvbWFpbkNvbmZTdmM6IERvbWFpbkNvbmZTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudDogYW55XG4gICkgeyB9XG5cbiAgYXN5bmMgZmV0Y2hNYW5pZmVzdEZpbGUodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFMzQ29va2llKHVybClcbiAgICBjb25zdCBtYW5pZmVzdEZpbGUgPSBhd2FpdCB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8YW55Pih1cmwpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC5jYXRjaCgoX2VycjogYW55KSA9PiB7IH0pXG4gICAgcmV0dXJuIG1hbmlmZXN0RmlsZVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRTM0Nvb2tpZShfY29udGVudElkOiBzdHJpbmcpIHtcbiAgICAvLyBhd2FpdCB0aGlzLmh0dHBcbiAgICAvLyAgIC5wb3N0KHRoaXMuQVBJX0VORFBPSU5UUy5zZXRTM0Nvb2tpZSwgeyBjb250ZW50SWQgfSlcbiAgICAvLyAgIC50b1Byb21pc2UoKVxuICAgIC8vICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNhbGN1bGF0ZVBlcmNlbnQoY3VycmVudDogc3RyaW5nW10sIG1heDogbnVtYmVyLCBtaW1lVHlwZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXAgPSBbLi4uY3VycmVudF1cbiAgICAgIGlmICh0ZW1wICYmIHRlbXAubGVuZ3RoICYmIG1heCkge1xuICAgICAgICBjb25zdCBsYXRlc3QgPSBwYXJzZUZsb2F0KHRlbXAucG9wKCkgfHwgJzAnKVxuICAgICAgICBjb25zdCBwZXJjZW50TWlsaXMgPSAobGF0ZXN0IC8gbWF4KSAqIDEwMFxuICAgICAgICBsZXQgcGVyY2VudCA9IHBhcnNlRmxvYXQocGVyY2VudE1pbGlzLnRvRml4ZWQoMikpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTggfHxcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5ZT1VUVUJFIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLlNVUlZFWVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocGVyY2VudCA8PSA1KSB7XG4gICAgICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiA1JSBtYWtlIGl0IDBcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwXG4gICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID49IDk1KSB7XG4gICAgICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGdyZWF0ZXIgdGhhbiA5NSUgbWFrZSBpdCAxMDBcbiAgICAgICAgICAgIHBlcmNlbnQgPSAxMDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcmNlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiAwXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gY2FsY3VsYXRpbmcgcGVyY2VudGFnZScsIGUpXG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1cyhjdXJyZW50OiBzdHJpbmdbXSwgbWF4OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLmNhbGN1bGF0ZVBlcmNlbnQoY3VycmVudCwgbWF4LCBtaW1lVHlwZSlcbiAgICAgIC8vIGZvciB2aWRlb3MgYW5kIGF1ZGlvc1xuICAgICAgaWYgKFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NM1U4IHx8XG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDMgfHxcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuU1VSVkVZIHx8XG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5QREZcbiAgICAgICkge1xuICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiA1JSB0aGVuIG1ha2Ugc3RhdHVzIHN0YXJ0ZWRcbiAgICAgICAgaWYgKE1hdGguY2VpbChwZXJjZW50YWdlKSA8PSA1KSB7XG4gICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGdyZWF0ZXIgdGhhbiA5NSUgdGhlbiBtYWtlIHN0YXR1cyBjb21wbGV0ZVxuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpID49IDk1KSB7XG4gICAgICAgICAgcmV0dXJuIDJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKE1hdGguY2VpbChwZXJjZW50YWdlKSA+PSAxMDApIHtcbiAgICAgICAgICByZXR1cm4gMlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIGdldHRpbmcgY29tcGxldGlvbiBzdGF0dXMnLCBlKVxuICAgICAgcmV0dXJuIDFcbiAgICB9XG4gIH1cblxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlKGNvbnRlbnRJZDogc3RyaW5nLCByZXF1ZXN0OiBhbnksIGNvbGxlY3Rpb25JZD86IHN0cmluZywgYmF0Y2hJZD86IHN0cmluZykge1xuICAgIGxldCByZXE6IGFueVxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRSZXNvdXJjZUNvbnRlbnRMYW5ndWFnZShjb250ZW50SWQpXG4gICAgICByZXEgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB1c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXG4gICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICBiYXRjaElkLFxuICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiB0aGlzLmdldFN0YXR1cyhyZXF1ZXN0LmN1cnJlbnQsIHJlcXVlc3QubWF4X3NpemUsIHJlcXVlc3QubWltZV90eXBlKSxcbiAgICAgICAgICAgICAgY291cnNlSWQ6IGNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgICAgbGFzdEFjY2Vzc1RpbWU6IGRheWpzKG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzczpTU1NaWicpLFxuICAgICAgICAgICAgICBwcm9ncmVzc2RldGFpbHM6IHtcbiAgICAgICAgICAgICAgICBtYXhfc2l6ZTogcmVxdWVzdC5tYXhfc2l6ZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50OiByZXF1ZXN0LmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IHJlcXVlc3QubWltZV90eXBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdGhpcy5jYWxjdWxhdGVQZXJjZW50KHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgLy8gaWYgKHRoaXMuY29uZmlnc2VydmljZS5jc3Rva2VuICE9PSAnJykge1xuICAgICAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcbiAgICAgIC8vICAgLnNldCgnY3N0b2tlbicsIHRoaXMuY29uZmlnc2VydmljZS5jc3Rva2VuKVxuXG4gICAgICAvLyAgIHRoaXMuaHR0cFxuICAgICAgLy8gICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgeyBoZWFkZXJzIH0gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIHRoaXMuaHR0cFxuICAgICAgLy8gICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICAvLyB9XG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcbiAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxuICAgICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcCA9IHsgLi4udGhpcy50b2NTdmMuaGFzaG1hcCB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0QmF0Y2hJZEFuZENvdXJzZUlkKGNvdXJzZUlkOiBzdHJpbmcsIGJhdGNoSWQ6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdGVtcERhdGEgPSB7XG4gICAgICBjb3Vyc2VJZCxcbiAgICAgIGJhdGNoSWQsXG4gICAgfVxuICAgIGNvbnN0IHRlbXBDb250ZW50RGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50TWV0YURhdGFcbiAgICBjb25zdCB0ZW1wQ29udGVudFJlYWREYXRhID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRDb250ZW50UmVhZE1ldGFEYXRhXG4gICAgY29uc3QgZW5yb2xsbWVudExpc3QgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudEJhdGNoRW5yb2xsbWVudExpc3RcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRlbXBDb250ZW50RGF0YSAmJiB0ZW1wQ29udGVudFJlYWREYXRhLmN1bXVsYXRpdmVUcmFja2luZyAmJlxuICAgICAgICAodGVtcENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSB8fFxuICAgICAgICAgIHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgIHx8IHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGVtcENvbnRlbnREYXRhLmNoaWxkcmVuLmZvckVhY2goYXN5bmMgKGNoaWxkTGlzdDogTnNDb250ZW50LklDb250ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkTGlzdC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgIGNvbnN0IGNvdXJzZUVucm9sbG1lbnRMaXN0ID0gZW5yb2xsbWVudExpc3QgJiYgZW5yb2xsbWVudExpc3QuZmlsdGVyKCh2OiBOc0NvbnRlbnQuSUNvdXJzZSkgPT4gdi5jb250ZW50SWQgPT09IGNoaWxkTGlzdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgaWYgKGNoaWxkTGlzdC5jaGlsZE5vZGVzICYmIGNoaWxkTGlzdC5jaGlsZE5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgIGlmIChjb3Vyc2VFbnJvbGxtZW50TGlzdCAmJiBjb3Vyc2VFbnJvbGxtZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGVtcERhdGEuYmF0Y2hJZCA9IGNvdXJzZUVucm9sbG1lbnRMaXN0W2NvdXJzZUVucm9sbG1lbnRMaXN0Lmxlbmd0aCAtIDFdLmJhdGNoLmJhdGNoSWRcbiAgICAgICAgICAgICAgICB0ZW1wRGF0YS5jb3Vyc2VJZCA9IGNoaWxkTGlzdC5pZGVudGlmaWVyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YTogYW55ID0gYXdhaXQgdGhpcy5jaGVja0ZvckNvdXJzZUVucm9sbG1lbnQoY2hpbGRMaXN0LCByZXNvdXJjZUlkLCBlbnJvbGxtZW50TGlzdCwgdGVtcERhdGEpXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBkYXRhLmNvdXJzZUlkXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuYmF0Y2hJZCA9IGRhdGEuYmF0Y2hJZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgICAgICAgICAgIGlmICh0ZW1wRGF0YS5jb3Vyc2VJZCA9PT0gY291cnNlSWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgYlBFbnJvbGxtZW50TGlzdCA9IGVucm9sbG1lbnRMaXN0LmZpbHRlcigodjogTnNDb250ZW50LklDb3Vyc2UpID0+IHYuY29udGVudElkID09PSB0ZW1wQ29udGVudERhdGEuaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgaWYgKHRlbXBDb250ZW50RGF0YS5jaGlsZE5vZGVzICYmIHRlbXBDb250ZW50RGF0YS5jaGlsZE5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJQRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGVtcERhdGEuYmF0Y2hJZCA9IGJQRW5yb2xsbWVudExpc3RbYlBFbnJvbGxtZW50TGlzdC5sZW5ndGggLSAxXS5iYXRjaC5iYXRjaElkXG4gICAgICAgICAgICAgICAgICB0ZW1wRGF0YS5jb3Vyc2VJZCA9IHRlbXBDb250ZW50RGF0YS5pZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGVtcERhdGFcbiAgfVxuXG4gIGdldFJlc291cmNlQ29udGVudExhbmd1YWdlKHJlc291cmNlSWQ6IHN0cmluZykge1xuXG4gICAgbGV0IHRlbXBMYW5ndWFnZTogYW55ID0gJ2VuZ2xpc2gnXG4gICAgbGV0IGxhbmd1YWdlRm91bmQgPSBmYWxzZVxuICAgIGNvbnN0IHRlbXBDb250ZW50RGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50TWV0YURhdGFcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGVtcENvbnRlbnREYXRhLmNoaWxkcmVuPy5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGRMaXN0LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICBpZiAoY2hpbGRMaXN0LmxlYWZOb2RlcyAmJiBjaGlsZExpc3QubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XG4gICAgICAgICAgICB0ZW1wTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZShjaGlsZExpc3QpXG4gICAgICAgICAgICBsYW5ndWFnZUZvdW5kID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKVxuICAgICAgaWYgKCFsYW5ndWFnZUZvdW5kKSB7XG4gICAgICAgIGlmICh0ZW1wQ29udGVudERhdGEubGVhZk5vZGVzICYmIHRlbXBDb250ZW50RGF0YS5sZWFmTm9kZXMuaW5kZXhPZihyZXNvdXJjZUlkKSAhPT0gLTEpIHtcbiAgICAgICAgICB0ZW1wTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0ZW1wQ29udGVudERhdGEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXBMYW5ndWFnZVxuICB9XG5cbiAgYXN5bmMgY2hlY2tGb3JDb3Vyc2VFbnJvbGxtZW50KGNoaWxkTGlzdDogTnNDb250ZW50LklDb250ZW50LCBfcmVzb3VyY2VJZDogc3RyaW5nLCBfZW5yb2xsbWVudExpc3Q6IGFueSwgX3RlbXBEYXRhOiBhbnkpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIGNvbnN0IGNvdXJzZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQmF0Y2hBcGkoY2hpbGRMaXN0LmlkZW50aWZpZXIpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMudXNlclN2Yy5mZXRjaEVucm9sbG1lbnREYXRhQnlDb250ZW50SWQodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlPy51c2VySWQsIGNoaWxkTGlzdC5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvdXJzZXMgJiYgcmVzLmNvdXJzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLmNvdXJzZXNcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogJycgfV1cblxuICAgICAgICB9KS5jYXRjaCgoX2VycjogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFt7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogJycgfV1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRCYXRjaEVucm9sbG1lbnRMaXN0ID0gWy4uLnRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCwgLi4ucmVzcG9uc2VEYXRhXVxuICAgICAgICByZXR1cm4geyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6IHJlc3BvbnNlRGF0YVswXS5iYXRjaElkIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoX2VycjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gW3sgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiAnJyB9XVxuICAgIH0pXG4gICAgcmV0dXJuIGNvdXJzZURhdGFcbiAgfVxuXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGVRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ/OiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcsIHN0YXR1cz86IG51bWJlcikge1xuICAgIGxldCByZXE6IGFueVxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRSZXNvdXJjZUNvbnRlbnRMYW5ndWFnZShjb250ZW50SWQpXG4gICAgICByZXEgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICB1c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXG4gICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICBiYXRjaElkLFxuICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgfHwgMixcbiAgICAgICAgICAgICAgY291cnNlSWQ6IGNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgICAgbGFzdEFjY2Vzc1RpbWU6IGRheWpzKG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzczpTU1NaWicpLFxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogc3RhdHVzID09PSAyID8gMTAwIDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cblxuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICAgKCF0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSB8fCB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA8IDIpKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XG4gICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgICBsZXQgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdlZGl0TW9kZT10cnVlJykgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ19yYycpKSB7XG4gICAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gYC9hcGkvY29udGVudC92MS9yZWFkLyR7Y29udGVudElkfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50PihcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIC8vIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3RoaXMuY29uZmlnc2VydmljZS5yb290T3JnIHx8ICdpZ290J30mb3JnPSR7dGhpcy5jb25maWdzZXJ2aWNlLmFjdGl2ZU9yZyB8fCAnZG9wdCd9YCxcbiAgICAgIHVybFxuICAgIClcbiAgfVxuXG4gIGdldEF1dGhvcmluZ1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgPyBgL2FwaXMvYXV0aENvbnRlbnQvJHt1cmwuaW5jbHVkZXMoJy9jb250ZW50LXN0b3JlLycpID8gbmV3IFVSTCh1cmwpLnBhdGhuYW1lLnNsaWNlKDEpIDogZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YFxuICAgICAgOiAnJ1xuICB9XG5cbiAgcmVnZXhEb3dubG9hZFJlcGxhY2UgPSAoX3N0ciA9ICcnLCBncm91cDE6IHN0cmluZywgZ3JvdXAyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBgJHt0aGlzLmF1dGhvcmluZ0Jhc2V9JHtlbmNvZGVVUklDb21wb25lbnQoZ3JvdXAxKX0ke2dyb3VwMn1gXG4gIH1cblxuICByZXBsYWNlVG9BdXRoVXJsKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKS5yZXBsYWNlKFxuICAgICAgICB0aGlzLmRvd25sb2FkUmVnZXgsXG4gICAgICAgIHRoaXMucmVnZXhEb3dubG9hZFJlcGxhY2UsXG4gICAgICApLFxuICAgIClcbiAgfVxuICByZWFkU2VjdGlvbnMoYXNzZXNzbWVudElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5BUElfRU5EUE9JTlRTfS8ke2Fzc2Vzc21lbnRJZH1gXG4gIH1cblxuICBnZXRQdWJsaWNVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1haW5VcmwgPSB1cmwuc3BsaXQoJy9jb250ZW50JykucG9wKCkgfHwgJydcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZpcm9ubWVudC5jb250ZW50SG9zdH0vJHt0aGlzLmVudmlyb25tZW50LmNvbnRlbnRCdWNrZXR9L2NvbnRlbnQke21haW5Vcmx9YFxuICB9XG5cbiAgZ2V0Q2RuVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYWluVXJsID0gdXJsLnNwbGl0KCcvY29udGVudCcpLnBvcCgpIHx8ICcnXG4gICAgcmV0dXJuIGAke3RoaXMuZG9tYWluQ29uZlN2Yy5nZXREb21haW5DRE5Ib3N0KCl9LyR7dGhpcy5lbnZpcm9ubWVudC5jZG5Db250ZW50QnVja2V0fS9jb250ZW50JHttYWluVXJsfWBcbiAgfVxuXG4gIC8vICBmZXRjaENvbnRlbnQoXG4gIC8vICAgY29udGVudElkOiBzdHJpbmcsXG4gIC8vICAgaGllcmFyY2h5VHlwZTogJ2FsbCcgfCAnbWluaW1hbCcgfCAnZGV0YWlsJyA9ICdkZXRhaWwnXG4gIC8vICAgKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnQ+IHtcbiAgLy8gICAgIGxldCB1cmwgPSAnJ1xuICAvLyAgICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgLy8gICAgICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gIC8vICAgICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPSR7aGllcmFyY2h5VHlwZX1gXG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgdXJsID0gYC9hcGkvY291cnNlL3YxL2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/aGllcmFyY2h5VHlwZT0ke2hpZXJhcmNoeVR5cGV9YFxuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4odXJsKVxuICAvLyAgIH1cblxuICBmZXRjaENvbnRlbnQoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50PihgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9oaWVyYXJjaHkvJHtpZH0/bW9kZT0ke3R5cGV9YClcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRIYXNoTWFwRm9yQXNzZXNzdGVudChjb250ZW50SWQ6IHN0cmluZywgY29udGVudFByb2dyZXNzOiBhbnkpIHtcbiAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IGNvbnRlbnRQcm9ncmVzcy5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBjb250ZW50UHJvZ3Jlc3Muc3RhdHVzXG4gICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICB9XG4gIH1cblxuICBnZXRGb3JtQnlJZChmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuQVBJX0VORFBPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLkFQSV9FTkRQT0lOVFMuU1VCTUlUX0ZPUk0sIGZvcm1EYXRhKVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnQoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSkge1xuICAgIGxldCByZXE6IGFueVxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIC8vIGJhdGNoSWQsXG4gICAgICAgICAgICAgIHN0YXR1czogdGhpcy5nZXRTdGF0dXMocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgcHJvZ3Jlc3NkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcmVxdWVzdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIG1pbWVUeXBlOiByZXF1ZXN0Lm1pbWVfdHlwZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHRoaXMuY2FsY3VsYXRlUGVyY2VudChyZXF1ZXN0LmN1cnJlbnQsIHJlcXVlc3QubWF4X3NpemUsIHJlcXVlc3QubWltZV90eXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcbiAgICAgIC8vICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXG4gICAgICAvLyAgIC5zZXQoJ2NzdG9rZW4nLCB0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbilcblxuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHsgaGVhZGVycyB9ICwgcmVxKVxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfVxuICAgICAgLy8gdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vY29uc3QgY29udGVudElkTmV3PSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb250ZW50SWRcbiAgICAgIC8vIGNvbnN0IHVwZGF0ZWRDb21wbGV0aW9uUGVyY2VudGFnZSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAvLyBjb25zdCB1cGRhdGVkU3RhdHVzID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXG5cbiAgICAgIC8vIC8vIENsb25lIHRoZSBpbm5lciBvYmplY3QgYW5kIHVwZGF0ZVxuICAgICAgLy8gY29uc3QgZXhpc3RpbmdDb250ZW50ID0gdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWROZXddIHx8IHt9XG5cbiAgICAgIC8vIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7XG4gICAgICAvLyAgIC4uLnRoaXMudG9jU3ZjLmhhc2htYXAsXG4gICAgICAvLyAgIFtjb250ZW50SWROZXddOiB7XG4gICAgICAvLyAgICAgLi4uZXhpc3RpbmdDb250ZW50LFxuICAgICAgLy8gICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB1cGRhdGVkQ29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAvLyAgICAgY29tcGxldGlvblN0YXR1czogdXBkYXRlZFN0YXR1c1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVxJywgSlNPTi5zdHJpbmdpZnkocmVxKSlcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXEnLCByZXEpXG5cbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxuICAgICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydwYXJlbnQnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvdXJzZUlkXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsncHJvZ3Jlc3MnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnByb2dyZXNzZGV0YWlsc1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coJ1VwZGF0ZWQgaGFzaG1hcDonLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy50b2NTdmMuaGFzaG1hcC0tLScsIHRoaXMudG9jU3ZjLmhhc2htYXApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKSB7XG4gICAgbGV0IHJlcTogYW55XG4gICAgaWYgKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZSkge1xuICAgICAgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgLy91c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXG4gICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICAvLyBiYXRjaElkLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyB8fCAyLFxuICAgICAgICAgICAgICAvLyBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXG4gICAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBzdGF0dXMgPT09IDIgPyAxMDAuMCA6IDAsXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xuICAgICAgICAgICAgICAgIFwibWltZVR5cGVcIjogbWltZVR5cGUgfHwgXCJhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldFwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKGNvbnRlbnRJZClcbiAgICAgIGlmIChyZXNvdXJjZVN0YXR1cyA8IDIpIHtcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUkVfQVNTRVNTTUVOVF9TVEFURV9VUERBVEV9YCwgcmVxKVxuICAgICAgICAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICAgKCF0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSB8fCB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA8IDIpKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnRvY1N2YyAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbcmVzb3VyY2VJZF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgMVxuICAgIH1cbiAgICByZXR1cm4gMVxuICB9XG5cblxufVxuIl19