@sunbird-cb/toc 0.0.9 → 0.0.10-mauritius

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -55
  4. package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -126
  5. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -32
  6. package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -85
  7. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -100
  8. package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -48
  9. package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
  10. package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
  11. package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
  12. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +223 -120
  13. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +96 -92
  14. package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -48
  15. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -25
  16. package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -41
  17. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -89
  18. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -42
  19. package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -41
  20. package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -78
  21. package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -45
  22. package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -2
  23. package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -70
  24. package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -28
  25. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -187
  26. package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -86
  27. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -31
  28. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +961 -941
  29. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -183
  30. package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -327
  31. package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -297
  32. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +304 -248
  33. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1227 -1148
  34. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -16
  35. package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -43
  36. package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -133
  37. package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -66
  38. package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -278
  39. package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -21
  40. package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -21
  41. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +835 -847
  42. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +224 -219
  43. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +276 -209
  44. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -26
  45. package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -19
  46. package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -23
  47. package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -113
  48. package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -110
  49. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -26
  50. package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -19
  51. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -67
  52. package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -28
  53. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -77
  54. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -2
  55. package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -61
  56. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -20
  57. package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -67
  58. package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -139
  59. package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -71
  60. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -34
  61. package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -56
  62. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -25
  63. package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -37
  64. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -32
  65. package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -30
  66. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -38
  67. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -51
  68. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -115
  69. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -12
  70. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -51
  71. package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -61
  72. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -87
  73. package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -36
  74. package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -62
  75. package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -24
  76. package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -192
  77. package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -44
  78. package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -99
  79. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -58
  80. package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -67
  81. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +115 -112
  82. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -2
  83. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -69
  84. package/esm2022/lib/_collection-api.mjs +57 -57
  85. package/esm2022/lib/_constants/widget-content.constants.mjs +19 -19
  86. package/esm2022/lib/_directives/tooltip.directive.mjs +68 -68
  87. package/esm2022/lib/_models/common.model.mjs +2 -2
  88. package/esm2022/lib/_models/error.model.mjs +2 -2
  89. package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -24
  90. package/esm2022/lib/_services/rating.service.mjs +89 -89
  91. package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -29
  92. package/esm2022/lib/_services/viewer-route-util.mjs +103 -103
  93. package/esm2022/lib/_services/widget-content.model.mjs +254 -247
  94. package/esm2022/lib/_services/widget-content.service.mjs +594 -594
  95. package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -9
  96. package/esm2022/lib/app-toc-lib.module.mjs +508 -499
  97. package/esm2022/lib/collection.config.mjs +161 -161
  98. package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -37
  99. package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -1436
  100. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +522 -475
  101. package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -119
  102. package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -80
  103. package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -249
  104. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -39
  105. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -58
  106. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2230 -2229
  107. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +3017 -2907
  108. package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -157
  109. package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -48
  110. package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -47
  111. package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -766
  112. package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -243
  113. package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -116
  114. package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -44
  115. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1854 -1838
  116. package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -236
  117. package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -213
  118. package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -36
  119. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +258 -256
  120. package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -133
  121. package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -36
  122. package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -2
  123. package/esm2022/lib/models/app-toc.model.mjs +38 -38
  124. package/esm2022/lib/models/auto-complete.model.mjs +2 -2
  125. package/esm2022/lib/models/card-content.model.mjs +13 -13
  126. package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -2
  127. package/esm2022/lib/models/discussion-forum.model.mjs +14 -14
  128. package/esm2022/lib/models/goal.model.mjs +2 -2
  129. package/esm2022/lib/models/meta-tag.model.mjs +8 -8
  130. package/esm2022/lib/models/playlist.model.mjs +2 -2
  131. package/esm2022/lib/models/profile-revamp.model.mjs +2 -2
  132. package/esm2022/lib/models/rating.model.mjs +2 -2
  133. package/esm2022/lib/models/user-profile.model.mjs +21 -21
  134. package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
  135. package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -24
  136. package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -24
  137. package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -60
  138. package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -25
  139. package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -106
  140. package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -25
  141. package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -25
  142. package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -25
  143. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -51
  144. package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -16
  145. package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -18
  146. package/esm2022/lib/services/access-control.service.mjs +56 -56
  147. package/esm2022/lib/services/action.service.mjs +23 -23
  148. package/esm2022/lib/services/app-toc-v2.service.mjs +368 -313
  149. package/esm2022/lib/services/app-toc.service.mjs +1577 -1613
  150. package/esm2022/lib/services/certificate.service.mjs +114 -69
  151. package/esm2022/lib/services/discuss-utils.service.mjs +45 -58
  152. package/esm2022/lib/services/editor.service.mjs +34 -34
  153. package/esm2022/lib/services/load-check.service.mjs +21 -21
  154. package/esm2022/lib/services/loader.service.mjs +33 -33
  155. package/esm2022/lib/services/mobile-apps.service.mjs +67 -67
  156. package/esm2022/lib/services/netcore.service.mjs +126 -56
  157. package/esm2022/lib/services/nps-grid.service.mjs +43 -31
  158. package/esm2022/lib/services/otp.service.mjs +81 -43
  159. package/esm2022/lib/services/profile-v2.service.mjs +71 -43
  160. package/esm2022/lib/services/reset-ratings.service.mjs +19 -19
  161. package/esm2022/lib/services/resource-download-helper.service.mjs +64 -64
  162. package/esm2022/lib/services/root.service.mjs +106 -0
  163. package/esm2022/lib/services/timer.service.mjs +23 -23
  164. package/esm2022/lib/services/title-tag.service.mjs +71 -71
  165. package/esm2022/lib/services/user-profile.service.mjs +180 -55
  166. package/esm2022/lib/services/viewer-data.service.mjs +64 -64
  167. package/esm2022/lib/services/viewer-util.service.mjs +627 -590
  168. package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -291
  169. package/esm2022/lib/share-toc/share-toc.module.mjs +119 -119
  170. package/esm2022/public-api.mjs +81 -71
  171. package/esm2022/sunbird-cb-toc.mjs +4 -4
  172. package/fesm2022/sunbird-cb-toc.mjs +27145 -24836
  173. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  174. package/index.d.ts +5 -5
  175. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
  176. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
  177. package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -16
  178. package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -31
  179. package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -15
  180. package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -20
  181. package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -22
  182. package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -15
  183. package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
  184. package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
  185. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
  186. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +31 -22
  187. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +23 -22
  188. package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -9
  189. package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -11
  190. package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -12
  191. package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -18
  192. package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -14
  193. package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -11
  194. package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -17
  195. package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -14
  196. package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -199
  197. package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -16
  198. package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -10
  199. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -38
  200. package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -19
  201. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -11
  202. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +187 -183
  203. package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -41
  204. package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -54
  205. package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -47
  206. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +56 -49
  207. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +195 -171
  208. package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -8
  209. package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -16
  210. package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -40
  211. package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -21
  212. package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -45
  213. package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -10
  214. package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -10
  215. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +131 -128
  216. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +52 -51
  217. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +32 -29
  218. package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -9
  219. package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -7
  220. package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -7
  221. package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -28
  222. package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -24
  223. package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -14
  224. package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -9
  225. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -12
  226. package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -10
  227. package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -22
  228. package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -8
  229. package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -18
  230. package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -8
  231. package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -15
  232. package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -35
  233. package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -19
  234. package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -14
  235. package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -13
  236. package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -11
  237. package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -11
  238. package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -15
  239. package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -10
  240. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -16
  241. package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -11
  242. package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -34
  243. package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -17
  244. package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -15
  245. package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -15
  246. package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -21
  247. package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -12
  248. package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -21
  249. package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -9
  250. package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -47
  251. package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -14
  252. package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -22
  253. package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -19
  254. package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -15
  255. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +26 -25
  256. package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -21
  257. package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -18
  258. package/lib/_collection-api.d.ts +34 -34
  259. package/lib/_constants/widget-content.constants.d.ts +7 -7
  260. package/lib/_directives/tooltip.directive.d.ts +17 -17
  261. package/lib/_models/common.model.d.ts +3 -3
  262. package/lib/_models/error.model.d.ts +5 -5
  263. package/lib/_pipes/highlight.pipe.d.ts +10 -10
  264. package/lib/_services/rating.service.d.ts +18 -18
  265. package/lib/_services/samuhik-charcha.service.d.ts +13 -13
  266. package/lib/_services/viewer-route-util.d.ts +8 -8
  267. package/lib/_services/widget-content.model.d.ts +521 -515
  268. package/lib/_services/widget-content.service.d.ts +101 -101
  269. package/lib/_shared/translate-loader.factory.d.ts +7 -7
  270. package/lib/app-toc-lib.module.d.ts +89 -88
  271. package/lib/collection.config.d.ts +159 -159
  272. package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -17
  273. package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -225
  274. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +83 -78
  275. package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -22
  276. package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -31
  277. package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -47
  278. package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -14
  279. package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -21
  280. package/lib/components/app-toc-home/app-toc-home.component.d.ts +315 -314
  281. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +418 -408
  282. package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -47
  283. package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -22
  284. package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -14
  285. package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -149
  286. package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -42
  287. package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -27
  288. package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -15
  289. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +197 -195
  290. package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -44
  291. package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -54
  292. package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -18
  293. package/lib/components/public-survey-form/public-survey-form.component.d.ts +44 -43
  294. package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -20
  295. package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -13
  296. package/lib/models/app-toc-analytics.model.d.ts +152 -152
  297. package/lib/models/app-toc.model.d.ts +84 -84
  298. package/lib/models/auto-complete.model.d.ts +27 -27
  299. package/lib/models/card-content.model.d.ts +19 -19
  300. package/lib/models/content-strip-with-tabs.model.d.ts +44 -44
  301. package/lib/models/discussion-forum.model.d.ts +40 -40
  302. package/lib/models/goal.model.d.ts +22 -22
  303. package/lib/models/meta-tag.model.d.ts +6 -6
  304. package/lib/models/playlist.model.d.ts +23 -23
  305. package/lib/models/profile-revamp.model.d.ts +14 -14
  306. package/lib/models/rating.model.d.ts +17 -17
  307. package/lib/models/user-profile.model.d.ts +124 -37
  308. package/lib/registration-toc-lib.config.d.ts +4 -0
  309. package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -12
  310. package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -12
  311. package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -16
  312. package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -12
  313. package/lib/resolvers/app-toc-resolver.service.d.ts +16 -16
  314. package/lib/resolvers/config-resolver.service.d.ts +11 -11
  315. package/lib/resolvers/profile-resolver.service.d.ts +11 -11
  316. package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -11
  317. package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -19
  318. package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -8
  319. package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -8
  320. package/lib/services/access-control.service.d.ts +29 -29
  321. package/lib/services/action.service.d.ts +9 -9
  322. package/lib/services/app-toc-v2.service.d.ts +17 -16
  323. package/lib/services/app-toc.service.d.ts +190 -235
  324. package/lib/services/certificate.service.d.ts +41 -42
  325. package/lib/services/discuss-utils.service.d.ts +11 -33
  326. package/lib/services/editor.service.d.ts +17 -17
  327. package/lib/services/load-check.service.d.ts +8 -8
  328. package/lib/services/loader.service.d.ts +16 -16
  329. package/lib/services/mobile-apps.service.d.ts +38 -38
  330. package/lib/services/netcore.service.d.ts +21 -33
  331. package/lib/services/nps-grid.service.d.ts +16 -15
  332. package/lib/services/otp.service.d.ts +15 -20
  333. package/lib/services/profile-v2.service.d.ts +17 -20
  334. package/lib/services/reset-ratings.service.d.ts +8 -8
  335. package/lib/services/resource-download-helper.service.d.ts +29 -29
  336. package/lib/services/root.service.d.ts +26 -0
  337. package/lib/services/timer.service.d.ts +9 -9
  338. package/lib/services/title-tag.service.d.ts +21 -21
  339. package/lib/services/user-profile.service.d.ts +44 -24
  340. package/lib/services/viewer-data.service.d.ts +62 -58
  341. package/lib/services/viewer-util.service.d.ts +76 -76
  342. package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -56
  343. package/lib/share-toc/share-toc.module.d.ts +32 -32
  344. package/package.json +3 -3
  345. package/public-api.d.ts +65 -56
  346. package/sunbird-cb-toc-0.0.10-mauritius.tgz +0 -0
@@ -1,313 +1,368 @@
1
- import { Injectable } from '@angular/core';
2
- import { NsContent } from '@sunbird-cb/utils-v2';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./app-toc.service";
5
- export class AppTocV2Service {
6
- constructor(tocSvc) {
7
- this.tocSvc = tocSvc;
8
- }
9
- constructHeirarchyData(contentReadData) {
10
- let contentHeirarchy = { ...contentReadData };
11
- let leafNodes = [];
12
- if (contentHeirarchy['preliminaryAssessmentDetail'] && Object.keys(contentHeirarchy['preliminaryAssessmentDetail']).length > 0) {
13
- contentHeirarchy['children'] = [];
14
- // Set parent reference for preliminary assessment (pre-assessment)
15
- contentHeirarchy['preliminaryAssessmentDetail'].parent = contentHeirarchy.identifier;
16
- // Mark this as the pre-assessment for milestone locking logic
17
- contentHeirarchy['preliminaryAssessmentDetail'].isPreAssessment = true;
18
- contentHeirarchy['children'].push(contentHeirarchy['preliminaryAssessmentDetail']);
19
- leafNodes.push(contentReadData?.preliminaryAssessment || contentReadData?.preliminaryAssessmentDetail?.identifier);
20
- }
21
- // Track milestone index for proper locking logic
22
- // All milestones are locked by default - unlocking is computed based on progress
23
- let milestoneIndex = 0;
24
- contentHeirarchy['milestones_v1'].forEach((milestone) => {
25
- // All milestones are locked by default
26
- // M1 unlocks when pre-assessment is completed
27
- // M2+ unlock when previous milestone's mandatory content + assessment are completed
28
- const shouldBeLocked = true;
29
- let mileStoneData = {
30
- "identifier": milestone.id,
31
- "description": milestone.description,
32
- "mimeType": "application/vnd.ekstep.content-collection",
33
- "duration": "3600",
34
- "primaryCategory": "Milestone",
35
- "courseCategory": "Milestone",
36
- "createdBy": "25311a4f-fa42-4cf7-882a-5e79198edfcb",
37
- "name": milestone.name,
38
- "contentType": "Course",
39
- "isLocked": shouldBeLocked,
40
- "milestoneIndex": milestoneIndex,
41
- "status": "Live",
42
- "leafNodes": [],
43
- // Pre-computed flags for performance optimization
44
- "isMilestone": true,
45
- "isCollection": true,
46
- "isModule": false,
47
- "isResource": false,
48
- "isLearningPathway": false,
49
- "parent": contentHeirarchy.identifier
50
- };
51
- mileStoneData['children'] = [];
52
- if (milestone?.courses && milestone?.courses?.length) {
53
- milestone.courses.forEach((mileStoneCourse) => {
54
- // Set parent reference for courses inside milestone
55
- mileStoneCourse.parent = milestone.id;
56
- this.tocSvc.mapModuleCount(mileStoneCourse);
57
- if (mileStoneCourse && mileStoneCourse?.leafNodes && mileStoneCourse?.leafNodes?.length) {
58
- leafNodes = [...leafNodes, ...mileStoneCourse.leafNodes];
59
- mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, ...mileStoneCourse.leafNodes];
60
- }
61
- this.tocSvc.checkModuleWiseData(mileStoneCourse);
62
- });
63
- }
64
- if (milestone?.assessmentDetail) {
65
- // Set parent reference for assessment inside milestone
66
- milestone.assessmentDetail.parent = milestone.id;
67
- leafNodes.push(milestone?.assessmentDetail?.identifier);
68
- mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, milestone?.assessmentDetail?.identifier];
69
- mileStoneData['children'].push(milestone?.assessmentDetail);
70
- }
71
- mileStoneData['children'] = [...milestone['courses'], ...mileStoneData['children']];
72
- mileStoneData['leafNodesCount'] = mileStoneData['leafNodes'].length;
73
- this.mapModuleCount(mileStoneData);
74
- contentHeirarchy['children'] = contentHeirarchy['children'] ? [...contentHeirarchy['children'], mileStoneData] : [mileStoneData];
75
- milestoneIndex++;
76
- });
77
- contentHeirarchy['leafNodes'] = [...leafNodes];
78
- console.log('content Heirarchy', contentHeirarchy);
79
- return contentHeirarchy;
80
- }
81
- mapModuleCount(content) {
82
- if (content && content.children) {
83
- content.children.map(child => {
84
- if (child.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
85
- if (child?.moduleCount) {
86
- content['moduleCount'] = content['moduleCount'] ? content['moduleCount'] + child?.moduleCount :
87
- child?.moduleCount;
88
- }
89
- }
90
- });
91
- }
92
- }
93
- mapContentHierarchyProgressUpdate(contentHeirarchyData, enrollmentListData) {
94
- console.log('=== mapContentHierarchyProgressUpdate ===');
95
- console.log('Content hierarchy:', contentHeirarchyData?.name, contentHeirarchyData?.identifier);
96
- console.log('Enrollment list data:', enrollmentListData);
97
- if (contentHeirarchyData && contentHeirarchyData.children) {
98
- let totalLeafNodes = 0;
99
- let totalCompletedLeafNodes = 0;
100
- // First pass: Update progress for all content
101
- contentHeirarchyData.children.forEach((child) => {
102
- if (child.primaryCategory === 'Milestone') {
103
- this.updateMilestoneProgress(child, contentHeirarchyData?.identifier, enrollmentListData);
104
- totalLeafNodes += child.leafNodesCount || 0;
105
- totalCompletedLeafNodes += child.completedLeafNodesCount || 0;
106
- }
107
- else {
108
- // For pre-assessment and other root-level content
109
- // Try to find enrollment with parent identifier first, then with child's own identifier
110
- let enrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
111
- if (!enrollment) {
112
- enrollment = this.findEnrollment(enrollmentListData, child?.identifier);
113
- }
114
- this.updateNodeProgress(child, enrollment);
115
- const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
116
- totalLeafNodes += child.leafNodesCount || 1;
117
- totalCompletedLeafNodes += isCompleted ? (child.leafNodesCount || 1) : 0;
118
- }
119
- });
120
- if (totalLeafNodes > 0) {
121
- const calculatedPercentage = Math.round((Number(totalCompletedLeafNodes) / Number(totalLeafNodes)) * 100);
122
- contentHeirarchyData.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
123
- contentHeirarchyData.completionStatus = contentHeirarchyData.completionPercentage === 100 ? 2 : (contentHeirarchyData.completionPercentage > 0 ? 1 : 0);
124
- }
125
- // NOTE: Milestone locking is computed AFTER hashmap is built
126
- // See app-toc-home-v2.component.ts -> fetchContentHierarchy() flow:
127
- // 1. mapContentHierarchyProgressUpdate (this method) - updates progress on content tree
128
- // 2. callHirarchyProgressHashmap() - builds hashmap from content tree
129
- // 3. computeMilestoneLockingStatus() - computes locks using hashmap
130
- }
131
- return contentHeirarchyData;
132
- }
133
- updateMilestoneProgress(milestone, parentContentIdentifier, enrollmentListData) {
134
- let totalLeafNodes = 0;
135
- let totalCompletedLeafNodes = 0;
136
- let completedCourses = 0;
137
- let totalCourses = 0;
138
- if (milestone.children) {
139
- milestone.children.forEach((child) => {
140
- if (child.primaryCategory === 'Course') {
141
- totalCourses += 1;
142
- this.updateCourseProgress(child, parentContentIdentifier, enrollmentListData);
143
- // Check both status and completionStatus for completion
144
- if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100) {
145
- completedCourses += 1;
146
- }
147
- }
148
- else {
149
- // For assessments and other content, try multiple enrollment sources
150
- // First try parent Learning Pathway enrollment
151
- let enrollment = this.findEnrollment(enrollmentListData, parentContentIdentifier);
152
- if (!enrollment) {
153
- // Try milestone enrollment
154
- enrollment = this.findEnrollment(enrollmentListData, milestone?.identifier);
155
- }
156
- this.updateNodeProgress(child, enrollment);
157
- }
158
- const leafNodes = child.leafNodesCount || 1;
159
- totalLeafNodes += leafNodes;
160
- // Check both status and completionStatus for completion
161
- if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100) {
162
- totalCompletedLeafNodes += leafNodes;
163
- }
164
- });
165
- }
166
- milestone.leafNodesCount = totalLeafNodes;
167
- milestone.completedLeafNodesCount = totalCompletedLeafNodes;
168
- milestone.totalCourses = totalCourses;
169
- milestone.completedCourses = completedCourses;
170
- if (totalLeafNodes > 0) {
171
- const calculatedPercentage = Math.round((totalCompletedLeafNodes / totalLeafNodes) * 100);
172
- milestone.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
173
- milestone.completionStatus = milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0);
174
- milestone.status = milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0);
175
- }
176
- }
177
- updateNodeProgress(node, enrollment) {
178
- if (!enrollment) {
179
- // If no enrollment data, preserve existing completion data from content hierarchy
180
- // This is important for assessments that may have completion data but no enrollment entry
181
- if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
182
- node.completionPercentage = 0;
183
- node.completionStatus = 0;
184
- node.status = 0;
185
- }
186
- // Otherwise, keep the existing values from content hierarchy
187
- return;
188
- }
189
- // Check if the node itself is the enrolled content (direct enrollment)
190
- // This happens for pre-assessments and standalone content
191
- const isDirectEnrollment = enrollment.collectionId === node.identifier ||
192
- enrollment.contentId === node.identifier;
193
- if (isDirectEnrollment) {
194
- // Use enrollment's direct progress
195
- const progress = enrollment.completionPercentage || enrollment.progress || 0;
196
- const status = enrollment.status || 0;
197
- node.completionPercentage = progress;
198
- node.completionStatus = status;
199
- node.status = status;
200
- console.log(`Direct enrollment found for ${node.identifier}:`, {
201
- completionPercentage: progress,
202
- completionStatus: status,
203
- enrollmentData: {
204
- progress: enrollment.progress,
205
- completionPercentage: enrollment.completionPercentage,
206
- status: enrollment.status
207
- }
208
- });
209
- return;
210
- }
211
- // Try both contentId and collectionId as the API response may use either field
212
- const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier || ele?.collectionId === node.identifier);
213
- console.log(`Updating node progress for ${node.identifier} (${node.name}):`, {
214
- hasEnrollment: !!enrollment,
215
- hasNodeEnrollData: !!nodeEnrollData,
216
- nodeEnrollData,
217
- currentCompletionStatus: node.completionStatus,
218
- currentCompletionPercentage: node.completionPercentage
219
- });
220
- if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
221
- node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
222
- node.completionStatus = nodeEnrollData.status;
223
- node.status = nodeEnrollData.status;
224
- }
225
- else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
226
- node.completionPercentage = 100;
227
- node.completionStatus = 2;
228
- node.status = 2;
229
- }
230
- else if (enrollment && !nodeEnrollData) {
231
- // Enrollment exists but this node is not in contentList
232
- // This can happen for completed assessments - preserve their completion data from content hierarchy
233
- // Only reset to 0 if there's no completion data at all
234
- if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
235
- node.completionPercentage = 0;
236
- node.completionStatus = 0;
237
- node.status = 0;
238
- }
239
- // Otherwise keep existing values from content hierarchy
240
- }
241
- else {
242
- // No enrollment at all - reset to 0
243
- node.completionPercentage = 0;
244
- node.completionStatus = 0;
245
- node.status = 0;
246
- }
247
- console.log(`Updated node progress for ${node.identifier}:`, {
248
- completionStatus: node.completionStatus,
249
- completionPercentage: node.completionPercentage,
250
- status: node.status
251
- });
252
- }
253
- updateCourseProgress(course, parentContentIdentifier, enrollmentListData) {
254
- const enrollment = this.findEnrollment(enrollmentListData, course?.identifier);
255
- if (enrollment?.completionPercentage === 100) {
256
- // Enrollment shows 100% - mark course as complete
257
- course.completionPercentage = 100;
258
- course.completionStatus = 2;
259
- course.status = 2;
260
- this.tocSvc.mapCompletionChildPercentageProgram(course);
261
- }
262
- else if (enrollment && enrollment.completionPercentage > 0) {
263
- // Enrollment has partial progress
264
- course.completionPercentage = enrollment.completionPercentage || 0;
265
- course.completionStatus = 1;
266
- course.status = 1;
267
- // Also update children
268
- if (course.children && course.children.length > 0) {
269
- course.children.forEach((child) => {
270
- this.updateNodeProgress(child, enrollment);
271
- });
272
- }
273
- }
274
- else {
275
- if (course.children && course.children.length > 0) {
276
- let totalLeafNodes = course.leafNodesCount || 0;
277
- let totalCompleted = 0;
278
- course.children.forEach((child) => {
279
- this.updateNodeProgress(child, enrollment);
280
- if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage === 100) {
281
- totalCompleted += child.leafNodesCount || 1;
282
- }
283
- });
284
- // If it's a collection and doesn't have its own enrollment progress, calculate it
285
- if (!enrollment || !course.completionPercentage || course.completionPercentage === 0) {
286
- if (!totalLeafNodes) {
287
- totalLeafNodes = course.children.reduce((acc, curr) => acc + (curr.leafNodesCount || 1), 0);
288
- }
289
- if (totalLeafNodes > 0) {
290
- const calculatedPercentage = Math.round((totalCompleted / totalLeafNodes) * 100);
291
- course.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
292
- course.completionStatus = course.completionPercentage === 100 ? 2 : (course.completionPercentage > 0 ? 1 : 0);
293
- course.status = course.completionStatus;
294
- }
295
- }
296
- }
297
- }
298
- }
299
- findEnrollment(enrollmentList, identifier) {
300
- if (!enrollmentList || !enrollmentList.length)
301
- return null;
302
- return enrollmentList.find((el) => el.collectionId === identifier || el.contentId === identifier);
303
- }
304
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, deps: [{ token: i1.AppTocService }], target: i0.ɵɵFactoryTarget.Injectable }); }
305
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, providedIn: 'root' }); }
306
- }
307
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, decorators: [{
308
- type: Injectable,
309
- args: [{
310
- providedIn: 'root'
311
- }]
312
- }], ctorParameters: function () { return [{ type: i1.AppTocService }]; } });
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxlQUFlO0lBRTFCLFlBQW9CLE1BQXFCO1FBQXJCLFdBQU0sR0FBTixNQUFNLENBQWU7SUFBSSxDQUFDO0lBRTlDLHNCQUFzQixDQUFDLGVBQW9CO1FBQ3pDLElBQUksZ0JBQWdCLEdBQVEsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBQ2xELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5SCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsbUVBQW1FO1lBQ25FLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtZQUNwRiw4REFBOEQ7WUFDOUQsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBQ3RFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUE7WUFDbEYsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLElBQUksZUFBZSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FB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U0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFBO0lBQ3hHLENBQUM7K0dBcFVVLGVBQWU7bUhBQWYsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Mic7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFRvY1YyU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlKSB7IH1cclxuXHJcbiAgY29uc3RydWN0SGVpcmFyY2h5RGF0YShjb250ZW50UmVhZERhdGE6IGFueSk6IGFueSB7XHJcbiAgICBsZXQgY29udGVudEhlaXJhcmNoeTogYW55ID0geyAuLi5jb250ZW50UmVhZERhdGEgfVxyXG4gICAgbGV0IGxlYWZOb2Rlczogc3RyaW5nW10gPSBbXVxyXG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddICYmIE9iamVjdC5rZXlzKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBbXVxyXG4gICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgcHJlbGltaW5hcnkgYXNzZXNzbWVudCAocHJlLWFzc2Vzc21lbnQpXHJcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddLnBhcmVudCA9IGNvbnRlbnRIZWlyYXJjaHkuaWRlbnRpZmllclxyXG4gICAgICAvLyBNYXJrIHRoaXMgYXMgdGhlIHByZS1hc3Nlc3NtZW50IGZvciBtaWxlc3RvbmUgbG9ja2luZyBsb2dpY1xyXG4gICAgICBjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXS5pc1ByZUFzc2Vzc21lbnQgPSB0cnVlXHJcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10ucHVzaChjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXSlcclxuICAgICAgbGVhZk5vZGVzLnB1c2goY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnQgfHwgY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHJhY2sgbWlsZXN0b25lIGluZGV4IGZvciBwcm9wZXIgbG9ja2luZyBsb2dpY1xyXG4gICAgLy8gQWxsIG1pbGVzdG9uZXMgYXJlIGxvY2tlZCBieSBkZWZhdWx0IC0gdW5sb2NraW5nIGlzIGNvbXB1dGVkIGJhc2VkIG9uIHByb2dyZXNzXHJcbiAgICBsZXQgbWlsZXN0b25lSW5kZXggPSAwXHJcbiAgICBjb250ZW50SGVpcmFyY2h5WydtaWxlc3RvbmVzX3YxJ10uZm9yRWFjaCgobWlsZXN0b25lOiBhbnkpID0+IHtcclxuICAgICAgLy8gQWxsIG1pbGVzdG9uZXMgYXJlIGxvY2tlZCBieSBkZWZhdWx0XHJcbiAgICAgIC8vIE0xIHVubG9ja3Mgd2hlbiBwcmUtYXNzZXNzbWVudCBpcyBjb21wbGV0ZWRcclxuICAgICAgLy8gTTIrIHVubG9jayB3aGVuIHByZXZpb3VzIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50ICsgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkXHJcbiAgICAgIGNvbnN0IHNob3VsZEJlTG9ja2VkID0gdHJ1ZVxyXG5cclxuICAgICAgbGV0IG1pbGVTdG9uZURhdGE6IGFueSA9IHtcclxuICAgICAgICBcImlkZW50aWZpZXJcIjogbWlsZXN0b25lLmlkLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogbWlsZXN0b25lLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxyXG4gICAgICAgIFwiZHVyYXRpb25cIjogXCIzNjAwXCIsXHJcbiAgICAgICAgXCJwcmltYXJ5Q2F0ZWdvcnlcIjogXCJNaWxlc3RvbmVcIixcclxuICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXHJcbiAgICAgICAgXCJjcmVhdGVkQnlcIjogXCIyNTMxMWE0Zi1mYTQyLTRjZjctODgyYS01ZTc5MTk4ZWRmY2JcIixcclxuICAgICAgICBcIm5hbWVcIjogbWlsZXN0b25lLm5hbWUsXHJcbiAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxyXG4gICAgICAgIFwiaXNMb2NrZWRcIjogc2hvdWxkQmVMb2NrZWQsXHJcbiAgICAgICAgXCJtaWxlc3RvbmVJbmRleFwiOiBtaWxlc3RvbmVJbmRleCxcclxuICAgICAgICBcInN0YXR1c1wiOiBcIkxpdmVcIixcclxuICAgICAgICBcImxlYWZOb2Rlc1wiOiBbXSxcclxuICAgICAgICAvLyBQcmUtY29tcHV0ZWQgZmxhZ3MgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxyXG4gICAgICAgIFwiaXNNaWxlc3RvbmVcIjogdHJ1ZSxcclxuICAgICAgICBcImlzQ29sbGVjdGlvblwiOiB0cnVlLFxyXG4gICAgICAgIFwiaXNNb2R1bGVcIjogZmFsc2UsXHJcbiAgICAgICAgXCJpc1Jlc291cmNlXCI6IGZhbHNlLFxyXG4gICAgICAgIFwiaXNMZWFybmluZ1BhdGh3YXlcIjogZmFsc2UsXHJcbiAgICAgICAgXCJwYXJlbnRcIjogY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbXVxyXG4gICAgICBpZiAobWlsZXN0b25lPy5jb3Vyc2VzICYmIG1pbGVzdG9uZT8uY291cnNlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgbWlsZXN0b25lLmNvdXJzZXMuZm9yRWFjaCgobWlsZVN0b25lQ291cnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vIFNldCBwYXJlbnQgcmVmZXJlbmNlIGZvciBjb3Vyc2VzIGluc2lkZSBtaWxlc3RvbmVcclxuICAgICAgICAgIG1pbGVTdG9uZUNvdXJzZS5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcclxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KG1pbGVTdG9uZUNvdXJzZSlcclxuICAgICAgICAgIGlmIChtaWxlU3RvbmVDb3Vyc2UgJiYgbWlsZVN0b25lQ291cnNlPy5sZWFmTm9kZXMgJiYgbWlsZVN0b25lQ291cnNlPy5sZWFmTm9kZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZWFmTm9kZXMgPSBbLi4ubGVhZk5vZGVzLCAuLi5taWxlU3RvbmVDb3Vyc2UubGVhZk5vZGVzXVxyXG4gICAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbCkge1xyXG4gICAgICAgIC8vIFNldCBwYXJlbnQgcmVmZXJlbmNlIGZvciBhc3Nlc3NtZW50IGluc2lkZSBtaWxlc3RvbmVcclxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcclxuICAgICAgICBsZWFmTm9kZXMucHVzaChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXHJcbiAgICAgICAgbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10gPSBbLi4ubWlsZVN0b25lRGF0YT8ubGVhZk5vZGVzLCBtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXJdXHJcbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcclxuICAgICAgfVxyXG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gWy4uLm1pbGVzdG9uZVsnY291cnNlcyddLCAuLi5taWxlU3RvbmVEYXRhWydjaGlsZHJlbiddXVxyXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXHJcbiAgICAgICAgdGhpcy5tYXBNb2R1bGVDb3VudChtaWxlU3RvbmVEYXRhKVxyXG4gICAgICBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID0gY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXSA/IFsuLi5jb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddLCBtaWxlU3RvbmVEYXRhXSA6IFttaWxlU3RvbmVEYXRhXVxyXG5cclxuICAgICAgbWlsZXN0b25lSW5kZXgrK1xyXG4gICAgfSlcclxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2xlYWZOb2RlcyddID0gWy4uLmxlYWZOb2Rlc11cclxuICAgIGNvbnNvbGUubG9nKCdjb250ZW50IEhlaXJhcmNoeScsIGNvbnRlbnRIZWlyYXJjaHkpXHJcbiAgICByZXR1cm4gY29udGVudEhlaXJhcmNoeVxyXG4gIH1cclxuXHJcbiAgIG1hcE1vZHVsZUNvdW50KGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCkge1xyXG4gICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY29udGVudC5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XHJcbiAgICAgICAgICAgIGlmKGNoaWxkPy5tb2R1bGVDb3VudCkge1xyXG4gICAgICAgICAgICBjb250ZW50Wydtb2R1bGVDb3VudCddID0gY29udGVudFsnbW9kdWxlQ291bnQnXSA/IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gKyBjaGlsZD8ubW9kdWxlQ291bnQgOiBcclxuICAgICAgICAgICAgY2hpbGQ/Lm1vZHVsZUNvdW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICBtYXBDb250ZW50SGllcmFyY2h5UHJvZ3Jlc3NVcGRhdGUoY29udGVudEhlaXJhcmNoeURhdGE6IGFueSwgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKCc9PT0gbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlID09PScpXHJcbiAgICBjb25zb2xlLmxvZygnQ29udGVudCBoaWVyYXJjaHk6JywgY29udGVudEhlaXJhcmNoeURhdGE/Lm5hbWUsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxyXG4gICAgY29uc29sZS5sb2coJ0Vucm9sbG1lbnQgbGlzdCBkYXRhOicsIGVucm9sbG1lbnRMaXN0RGF0YSlcclxuICAgIFxyXG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XHJcbiAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IDBcclxuICAgICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxyXG5cclxuICAgICAgLy8gRmlyc3QgcGFzczogVXBkYXRlIHByb2dyZXNzIGZvciBhbGwgY29udGVudFxyXG4gICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlTWlsZXN0b25lUHJvZ3Jlc3MoY2hpbGQsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXHJcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAwXHJcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZC5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCB8fCAwXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEZvciBwcmUtYXNzZXNzbWVudCBhbmQgb3RoZXIgcm9vdC1sZXZlbCBjb250ZW50XHJcbiAgICAgICAgICAvLyBUcnkgdG8gZmluZCBlbnJvbGxtZW50IHdpdGggcGFyZW50IGlkZW50aWZpZXIgZmlyc3QsIHRoZW4gd2l0aCBjaGlsZCdzIG93biBpZGVudGlmaWVyXHJcbiAgICAgICAgICBsZXQgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjb250ZW50SGVpcmFyY2h5RGF0YT8uaWRlbnRpZmllcilcclxuICAgICAgICAgIGlmICghZW5yb2xsbWVudCkge1xyXG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNoaWxkPy5pZGVudGlmaWVyKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXHJcbiAgICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGNoaWxkLnN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxyXG4gICAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxyXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gaXNDb21wbGV0ZWQgPyAoY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgaWYgKHRvdGFsTGVhZk5vZGVzID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQZXJjZW50YWdlID0gTWF0aC5yb3VuZCgoTnVtYmVyKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzKSAvIE51bWJlcih0b3RhbExlYWZOb2RlcykpICogMTAwKVxyXG4gICAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXHJcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyA9IGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogKGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBOT1RFOiBNaWxlc3RvbmUgbG9ja2luZyBpcyBjb21wdXRlZCBBRlRFUiBoYXNobWFwIGlzIGJ1aWx0XHJcbiAgICAgIC8vIFNlZSBhcHAtdG9jLWhvbWUtdjIuY29tcG9uZW50LnRzIC0+IGZldGNoQ29udGVudEhpZXJhcmNoeSgpIGZsb3c6XHJcbiAgICAgIC8vIDEuIG1hcENvbnRlbnRIaWVyYXJjaHlQcm9ncmVzc1VwZGF0ZSAodGhpcyBtZXRob2QpIC0gdXBkYXRlcyBwcm9ncmVzcyBvbiBjb250ZW50IHRyZWVcclxuICAgICAgLy8gMi4gY2FsbEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKCkgLSBidWlsZHMgaGFzaG1hcCBmcm9tIGNvbnRlbnQgdHJlZVxyXG4gICAgICAvLyAzLiBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cygpIC0gY29tcHV0ZXMgbG9ja3MgdXNpbmcgaGFzaG1hcFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRlbnRIZWlyYXJjaHlEYXRhXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1pbGVzdG9uZVByb2dyZXNzKG1pbGVzdG9uZTogYW55LCBwYXJlbnRDb250ZW50SWRlbnRpZmllcjogc3RyaW5nLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xyXG4gICAgbGV0IHRvdGFsTGVhZk5vZGVzID0gMFxyXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxyXG4gICAgbGV0IGNvbXBsZXRlZENvdXJzZXMgPSAwXHJcbiAgICBsZXQgdG90YWxDb3Vyc2VzID0gMFxyXG5cclxuICAgIGlmIChtaWxlc3RvbmUuY2hpbGRyZW4pIHtcclxuICAgICAgbWlsZXN0b25lLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJykge1xyXG4gICAgICAgICAgdG90YWxDb3Vyc2VzICs9IDFcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXHJcbiAgICAgICAgICAvLyBDaGVjayBib3RoIHN0YXR1cyBhbmQgY29tcGxldGlvblN0YXR1cyBmb3IgY29tcGxldGlvblxyXG4gICAgICAgICAgaWYgKGNoaWxkLnN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkge1xyXG4gICAgICAgICAgICBjb21wbGV0ZWRDb3Vyc2VzICs9IDFcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gRm9yIGFzc2Vzc21lbnRzIGFuZCBvdGhlciBjb250ZW50LCB0cnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXHJcbiAgICAgICAgICAvLyBGaXJzdCB0cnkgcGFyZW50IExlYXJuaW5nIFBhdGh3YXkgZW5yb2xsbWVudFxyXG4gICAgICAgICAgbGV0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgcGFyZW50Q29udGVudElkZW50aWZpZXIpXHJcbiAgICAgICAgICBpZiAoIWVucm9sbG1lbnQpIHtcclxuICAgICAgICAgICAgLy8gVHJ5IG1pbGVzdG9uZSBlbnJvbGxtZW50XHJcbiAgICAgICAgICAgIGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgbWlsZXN0b25lPy5pZGVudGlmaWVyKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsZWFmTm9kZXMgPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXHJcbiAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXHJcbiAgICAgICAgLy8gQ2hlY2sgYm90aCBzdGF0dXMgYW5kIGNvbXBsZXRpb25TdGF0dXMgZm9yIGNvbXBsZXRpb25cclxuICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSB7XHJcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBsZWFmTm9kZXNcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbWlsZXN0b25lLmxlYWZOb2Rlc0NvdW50ID0gdG90YWxMZWFmTm9kZXNcclxuICAgIG1pbGVzdG9uZS5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCA9IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzXHJcbiAgICBtaWxlc3RvbmUudG90YWxDb3Vyc2VzID0gdG90YWxDb3Vyc2VzXHJcbiAgICBtaWxlc3RvbmUuY29tcGxldGVkQ291cnNlcyA9IGNvbXBsZXRlZENvdXJzZXNcclxuXHJcbiAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XHJcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQZXJjZW50YWdlID0gTWF0aC5yb3VuZCgodG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgLyB0b3RhbExlYWZOb2RlcykgKiAxMDApXHJcbiAgICAgIG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGlzTmFOKGNhbGN1bGF0ZWRQZXJjZW50YWdlKSA/IDAgOiBjYWxjdWxhdGVkUGVyY2VudGFnZVxyXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gMiA6IChtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwID8gMSA6IDApXHJcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVOb2RlUHJvZ3Jlc3Mobm9kZTogYW55LCBlbnJvbGxtZW50OiBhbnkpIHtcclxuICAgIGlmICghZW5yb2xsbWVudCkge1xyXG4gICAgICAvLyBJZiBubyBlbnJvbGxtZW50IGRhdGEsIHByZXNlcnZlIGV4aXN0aW5nIGNvbXBsZXRpb24gZGF0YSBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XHJcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhc3Nlc3NtZW50cyB0aGF0IG1heSBoYXZlIGNvbXBsZXRpb24gZGF0YSBidXQgbm8gZW5yb2xsbWVudCBlbnRyeVxyXG4gICAgICBpZiAobm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuY29tcGxldGlvblN0YXR1cyA9PT0gdW5kZWZpbmVkICYmIG5vZGUuc3RhdHVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxyXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcclxuICAgICAgICBub2RlLnN0YXR1cyA9IDBcclxuICAgICAgfVxyXG4gICAgICAvLyBPdGhlcndpc2UsIGtlZXAgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIGl0c2VsZiBpcyB0aGUgZW5yb2xsZWQgY29udGVudCAoZGlyZWN0IGVucm9sbG1lbnQpXHJcbiAgICAvLyBUaGlzIGhhcHBlbnMgZm9yIHByZS1hc3Nlc3NtZW50cyBhbmQgc3RhbmRhbG9uZSBjb250ZW50XHJcbiAgICBjb25zdCBpc0RpcmVjdEVucm9sbG1lbnQgPSBlbnJvbGxtZW50LmNvbGxlY3Rpb25JZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucm9sbG1lbnQuY29udGVudElkID09PSBub2RlLmlkZW50aWZpZXJcclxuICAgIFxyXG4gICAgaWYgKGlzRGlyZWN0RW5yb2xsbWVudCkge1xyXG4gICAgICAvLyBVc2UgZW5yb2xsbWVudCdzIGRpcmVjdCBwcm9ncmVzc1xyXG4gICAgICBjb25zdCBwcm9ncmVzcyA9IGVucm9sbG1lbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgZW5yb2xsbWVudC5wcm9ncmVzcyB8fCAwXHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGVucm9sbG1lbnQuc3RhdHVzIHx8IDBcclxuICAgICAgXHJcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwcm9ncmVzc1xyXG4gICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSBzdGF0dXNcclxuICAgICAgbm9kZS5zdGF0dXMgPSBzdGF0dXNcclxuICAgICAgXHJcbiAgICAgIGNvbnNvbGUubG9nKGBEaXJlY3QgZW5yb2xsbWVudCBmb3VuZCBmb3IgJHtub2RlLmlkZW50aWZpZXJ9OmAsIHtcclxuICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogcHJvZ3Jlc3MsXHJcbiAgICAgICAgY29tcGxldGlvblN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIGVucm9sbG1lbnREYXRhOiB7IFxyXG4gICAgICAgICAgcHJvZ3Jlc3M6IGVucm9sbG1lbnQucHJvZ3Jlc3MsIFxyXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGVucm9sbG1lbnQuY29tcGxldGlvblBlcmNlbnRhZ2UsXHJcbiAgICAgICAgICBzdGF0dXM6IGVucm9sbG1lbnQuc3RhdHVzIFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHJ5IGJvdGggY29udGVudElkIGFuZCBjb2xsZWN0aW9uSWQgYXMgdGhlIEFQSSByZXNwb25zZSBtYXkgdXNlIGVpdGhlciBmaWVsZFxyXG4gICAgY29uc3Qgbm9kZUVucm9sbERhdGEgPSBlbnJvbGxtZW50Py5jb250ZW50TGlzdD8uZmluZCgoZWxlOiBhbnkpID0+IFxyXG4gICAgICBlbGU/LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IGVsZT8uY29sbGVjdGlvbklkID09PSBub2RlLmlkZW50aWZpZXJcclxuICAgIClcclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coYFVwZGF0aW5nIG5vZGUgcHJvZ3Jlc3MgZm9yICR7bm9kZS5pZGVudGlmaWVyfSAoJHtub2RlLm5hbWV9KTpgLCB7XHJcbiAgICAgIGhhc0Vucm9sbG1lbnQ6ICEhZW5yb2xsbWVudCxcclxuICAgICAgaGFzTm9kZUVucm9sbERhdGE6ICEhbm9kZUVucm9sbERhdGEsXHJcbiAgICAgIG5vZGVFbnJvbGxEYXRhLFxyXG4gICAgICBjdXJyZW50Q29tcGxldGlvblN0YXR1czogbm9kZS5jb21wbGV0aW9uU3RhdHVzLFxyXG4gICAgICBjdXJyZW50Q29tcGxldGlvblBlcmNlbnRhZ2U6IG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgIH0pXHJcbiAgICBcclxuICAgIGlmIChlbnJvbGxtZW50ICYmIG5vZGVFbnJvbGxEYXRhICYmIG5vZGVFbnJvbGxEYXRhLnN0YXR1cyA8IDIpIHtcclxuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IG5vZGVFbnJvbGxEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IG5vZGVFbnJvbGxEYXRhLnByb2dyZXNzIHx8IDBcclxuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gbm9kZUVucm9sbERhdGEuc3RhdHVzXHJcbiAgICAgIG5vZGUuc3RhdHVzID0gbm9kZUVucm9sbERhdGEuc3RhdHVzXHJcbiAgICB9IGVsc2UgaWYgKGVucm9sbG1lbnQgJiYgbm9kZUVucm9sbERhdGEgJiYgbm9kZUVucm9sbERhdGEuc3RhdHVzID09PSAyKSB7XHJcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcclxuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gMlxyXG4gICAgICBub2RlLnN0YXR1cyA9IDJcclxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiAhbm9kZUVucm9sbERhdGEpIHtcclxuICAgICAgLy8gRW5yb2xsbWVudCBleGlzdHMgYnV0IHRoaXMgbm9kZSBpcyBub3QgaW4gY29udGVudExpc3RcclxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGZvciBjb21wbGV0ZWQgYXNzZXNzbWVudHMgLSBwcmVzZXJ2ZSB0aGVpciBjb21wbGV0aW9uIGRhdGEgZnJvbSBjb250ZW50IGhpZXJhcmNoeVxyXG4gICAgICAvLyBPbmx5IHJlc2V0IHRvIDAgaWYgdGhlcmUncyBubyBjb21wbGV0aW9uIGRhdGEgYXQgYWxsXHJcbiAgICAgIGlmIChub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSB1bmRlZmluZWQgJiYgbm9kZS5jb21wbGV0aW9uU3RhdHVzID09PSB1bmRlZmluZWQgJiYgbm9kZS5zdGF0dXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXHJcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gMFxyXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMFxyXG4gICAgICB9XHJcbiAgICAgIC8vIE90aGVyd2lzZSBrZWVwIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBObyBlbnJvbGxtZW50IGF0IGFsbCAtIHJlc2V0IHRvIDBcclxuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcclxuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gMFxyXG4gICAgICBub2RlLnN0YXR1cyA9IDBcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coYFVwZGF0ZWQgbm9kZSBwcm9ncmVzcyBmb3IgJHtub2RlLmlkZW50aWZpZXJ9OmAsIHtcclxuICAgICAgY29tcGxldGlvblN0YXR1czogbm9kZS5jb21wbGV0aW9uU3RhdHVzLFxyXG4gICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSxcclxuICAgICAgc3RhdHVzOiBub2RlLnN0YXR1c1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xyXG4gICAgY29uc3QgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjb3Vyc2U/LmlkZW50aWZpZXIpXHJcblxyXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcclxuICAgICAgLy8gRW5yb2xsbWVudCBzaG93cyAxMDAlIC0gbWFyayBjb3Vyc2UgYXMgY29tcGxldGVcclxuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMTAwXHJcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxyXG4gICAgICBjb3Vyc2Uuc3RhdHVzID0gMlxyXG4gICAgICB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbShjb3Vyc2UpXHJcbiAgICB9IGVsc2UgaWYgKGVucm9sbG1lbnQgJiYgZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDApIHtcclxuICAgICAgLy8gRW5yb2xsbWVudCBoYXMgcGFydGlhbCBwcm9ncmVzc1xyXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcclxuICAgICAgY291cnNlLmNvbXBsZXRpb25TdGF0dXMgPSAxXHJcbiAgICAgIGNvdXJzZS5zdGF0dXMgPSAxXHJcbiAgICAgIC8vIEFsc28gdXBkYXRlIGNoaWxkcmVuXHJcbiAgICAgIGlmIChjb3Vyc2UuY2hpbGRyZW4gJiYgY291cnNlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNvdXJzZS5jaGlsZHJlbiAmJiBjb3Vyc2UuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5sZWFmTm9kZXNDb3VudCB8fCAwXHJcbiAgICAgICAgbGV0IHRvdGFsQ29tcGxldGVkID0gMFxyXG5cclxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXHJcbiAgICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xyXG4gICAgICAgICAgICB0b3RhbENvbXBsZXRlZCArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gSWYgaXQncyBhIGNvbGxlY3Rpb24gYW5kIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGVucm9sbG1lbnQgcHJvZ3Jlc3MsIGNhbGN1bGF0ZSBpdFxyXG4gICAgICAgIGlmICghZW5yb2xsbWVudCB8fCAhY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMCkge1xyXG4gICAgICAgICAgaWYgKCF0b3RhbExlYWZOb2Rlcykge1xyXG4gICAgICAgICAgICB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5jaGlsZHJlbi5yZWR1Y2UoKGFjYzogbnVtYmVyLCBjdXJyOiBhbnkpID0+IGFjYyArIChjdXJyLmxlYWZOb2Rlc0NvdW50IHx8IDEpLCAwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRvdGFsTGVhZk5vZGVzID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxyXG4gICAgICAgICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBpc05hTihjYWxjdWxhdGVkUGVyY2VudGFnZSkgPyAwIDogY2FsY3VsYXRlZFBlcmNlbnRhZ2VcclxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25TdGF0dXMgPSBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKVxyXG4gICAgICAgICAgICBjb3Vyc2Uuc3RhdHVzID0gY291cnNlLmNvbXBsZXRpb25TdGF0dXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWVucm9sbG1lbnRMaXN0IHx8ICFlbnJvbGxtZW50TGlzdC5sZW5ndGgpIHJldHVybiBudWxsXHJcbiAgICByZXR1cm4gZW5yb2xsbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSBpZGVudGlmaWVyIHx8IGVsLmNvbnRlbnRJZCA9PT0gaWRlbnRpZmllcilcclxuICB9XHJcblxyXG5cclxuXHJcbn1cclxuXHJcbiJdfQ==
1
+ import { Injectable } from '@angular/core';
2
+ import { NsContent } from '@sunbird-cb/utils-v2';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./app-toc.service";
5
+ export class AppTocV2Service {
6
+ constructor(tocSvc) {
7
+ this.tocSvc = tocSvc;
8
+ }
9
+ constructHeirarchyData(contentReadData) {
10
+ let contentHeirarchy = { ...contentReadData };
11
+ let leafNodes = [];
12
+ if (contentHeirarchy['preliminaryAssessmentDetail'] && Object.keys(contentHeirarchy['preliminaryAssessmentDetail']).length > 0) {
13
+ contentHeirarchy['children'] = [];
14
+ // Set parent reference for preliminary assessment (pre-assessment)
15
+ contentHeirarchy['preliminaryAssessmentDetail'].parent = contentHeirarchy.identifier;
16
+ // Mark this as the pre-assessment for milestone locking logic
17
+ contentHeirarchy['preliminaryAssessmentDetail'].isPreAssessment = true;
18
+ contentHeirarchy['children'].push(contentHeirarchy['preliminaryAssessmentDetail']);
19
+ leafNodes.push(contentReadData?.preliminaryAssessment || contentReadData?.preliminaryAssessmentDetail?.identifier);
20
+ }
21
+ // Track milestone index for proper locking logic
22
+ // All milestones are locked by default - unlocking is computed based on progress
23
+ let milestoneIndex = 0;
24
+ contentHeirarchy['milestones_v1'].forEach((milestone) => {
25
+ // All milestones are locked by default
26
+ // M1 unlocks when pre-assessment is completed
27
+ // M2+ unlock when previous milestone's mandatory content + assessment are completed
28
+ const shouldBeLocked = true;
29
+ let mileStoneData = {
30
+ "identifier": milestone.id,
31
+ "description": milestone.description,
32
+ "mimeType": "application/vnd.ekstep.content-collection",
33
+ "duration": "0",
34
+ "primaryCategory": "Milestone",
35
+ "courseCategory": "Milestone",
36
+ "createdBy": "25311a4f-fa42-4cf7-882a-5e79198edfcb",
37
+ "name": milestone.name,
38
+ "contentType": "Course",
39
+ "isLocked": shouldBeLocked,
40
+ "milestoneIndex": milestoneIndex,
41
+ "status": 0,
42
+ "completionStatus": 0,
43
+ "completionPercentage": 0,
44
+ "leafNodes": [],
45
+ // Pre-computed flags for performance optimization
46
+ "isMilestone": true,
47
+ "isCollection": true,
48
+ "isModule": false,
49
+ "isResource": false,
50
+ "isLearningPathway": false,
51
+ "parent": contentHeirarchy.identifier
52
+ };
53
+ mileStoneData['children'] = [];
54
+ if (milestone?.courses && milestone?.courses?.length) {
55
+ milestone.courses.forEach((mileStoneCourse) => {
56
+ // Set parent reference for courses inside milestone
57
+ mileStoneCourse.parent = milestone.id;
58
+ mileStoneCourse['moduleCount'] = 0;
59
+ mileStoneData['duration'] = String(Number(mileStoneData['duration']) + Number(mileStoneCourse?.duration || 0));
60
+ this.tocSvc.mapModuleCount(mileStoneCourse);
61
+ if (mileStoneCourse && mileStoneCourse?.leafNodes && mileStoneCourse?.leafNodes?.length) {
62
+ leafNodes = [...leafNodes, ...mileStoneCourse.leafNodes];
63
+ mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, ...mileStoneCourse.leafNodes];
64
+ }
65
+ this.tocSvc.checkModuleWiseData(mileStoneCourse);
66
+ });
67
+ }
68
+ if (milestone?.assessmentDetail) {
69
+ // Set parent reference for assessment inside milestone
70
+ milestone.assessmentDetail.parent = milestone.id;
71
+ leafNodes.push(milestone?.assessmentDetail?.identifier);
72
+ mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, milestone?.assessmentDetail?.identifier];
73
+ mileStoneData['children'].push(milestone?.assessmentDetail);
74
+ }
75
+ mileStoneData['children'] = [...milestone['courses'], ...mileStoneData['children']];
76
+ mileStoneData['leafNodesCount'] = mileStoneData['leafNodes'].length;
77
+ this.mapModuleCount(mileStoneData);
78
+ contentHeirarchy['children'] = contentHeirarchy['children'] ? [...contentHeirarchy['children'], mileStoneData] : [mileStoneData];
79
+ milestoneIndex++;
80
+ });
81
+ contentHeirarchy['leafNodes'] = [...leafNodes];
82
+ contentHeirarchy['leafNodesCount'] = leafNodes.length;
83
+ return contentHeirarchy;
84
+ }
85
+ mapModuleCount(content) {
86
+ if (content && content.children) {
87
+ content.children.map(child => {
88
+ if (child.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
89
+ if (child?.moduleCount) {
90
+ content['moduleCount'] = content['moduleCount'] ? content['moduleCount'] + child?.moduleCount :
91
+ child?.moduleCount;
92
+ }
93
+ }
94
+ });
95
+ }
96
+ }
97
+ mapContentHierarchyProgressUpdate(contentHeirarchyData, enrollmentListData) {
98
+ if (contentHeirarchyData && contentHeirarchyData.children) {
99
+ let totalLeafNodes = 0;
100
+ let totalCompletedLeafNodes = 0;
101
+ let LPenrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
102
+ // First pass: Update progress for all content
103
+ contentHeirarchyData.children.forEach((child) => {
104
+ if (child.primaryCategory === 'Milestone') {
105
+ this.updateMilestoneProgress(child, contentHeirarchyData?.identifier, enrollmentListData);
106
+ // Only count mandatory course resources and milestone assessments
107
+ totalLeafNodes += child.mandatoryLeafNodesCount || 0;
108
+ totalCompletedLeafNodes += child.mandatoryCompletedLeafNodesCount || 0;
109
+ }
110
+ else {
111
+ // For pre-assessment and other root-level content (always count these)
112
+ // Try to find enrollment with parent identifier first, then with child's own identifier
113
+ let enrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
114
+ if (!enrollment) {
115
+ enrollment = this.findEnrollment(enrollmentListData, child?.identifier);
116
+ }
117
+ this.updateNodeProgress(child, enrollment);
118
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
119
+ totalLeafNodes += child.leafNodesCount || 1;
120
+ totalCompletedLeafNodes += isCompleted ? (child.leafNodesCount || 1) : 0;
121
+ }
122
+ });
123
+ if (LPenrollment && LPenrollment.completionPercentage === 100) {
124
+ contentHeirarchyData.completionPercentage = 100;
125
+ contentHeirarchyData.completionStatus = 2;
126
+ }
127
+ else {
128
+ if (totalLeafNodes > 0) {
129
+ const calculatedPercentage = Math.round((Number(totalCompletedLeafNodes) / Number(totalLeafNodes)) * 100);
130
+ contentHeirarchyData.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
131
+ contentHeirarchyData.completionStatus = Number(contentHeirarchyData.completionPercentage === 100 ? 2 : (contentHeirarchyData.completionPercentage > 0 ? 1 : 0));
132
+ }
133
+ }
134
+ }
135
+ return contentHeirarchyData;
136
+ }
137
+ updateMilestoneProgress(milestone, parentContentIdentifier, enrollmentListData) {
138
+ let totalLeafNodes = 0;
139
+ let totalCompletedLeafNodes = 0;
140
+ let mandatoryLeafNodes = 0;
141
+ let mandatoryCompletedLeafNodes = 0;
142
+ let completedCourses = 0;
143
+ let totalCourses = 0;
144
+ if (milestone.children) {
145
+ milestone.children.forEach((child) => {
146
+ if (child.primaryCategory === 'Course') {
147
+ totalCourses += 1;
148
+ this.updateCourseProgress(child, parentContentIdentifier, enrollmentListData);
149
+ const childLeafNodes = child.leafNodesCount || 1;
150
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
151
+ // Count all course leaf nodes for overall tracking
152
+ totalLeafNodes += childLeafNodes;
153
+ if (isCompleted) {
154
+ completedCourses += 1;
155
+ totalCompletedLeafNodes += childLeafNodes;
156
+ }
157
+ // Only count mandatory courses for LP completion percentage
158
+ if (child.isMandatory === true || child.mandatory === true) {
159
+ mandatoryLeafNodes += childLeafNodes;
160
+ // Count individual completed resources within mandatory courses
161
+ const completedCount = this.getCompletedLeafNodesCount(child);
162
+ mandatoryCompletedLeafNodes += completedCount;
163
+ }
164
+ }
165
+ else {
166
+ // For assessments - always count them as mandatory
167
+ // Try multiple enrollment sources
168
+ let enrollment = this.findEnrollment(enrollmentListData, parentContentIdentifier);
169
+ if (!enrollment) {
170
+ enrollment = this.findEnrollment(enrollmentListData, milestone?.identifier);
171
+ }
172
+ this.updateNodeProgress(child, enrollment);
173
+ const leafNodes = child.leafNodesCount || 1;
174
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
175
+ // Count assessments in both total and mandatory
176
+ totalLeafNodes += leafNodes;
177
+ mandatoryLeafNodes += leafNodes;
178
+ if (isCompleted) {
179
+ totalCompletedLeafNodes += leafNodes;
180
+ mandatoryCompletedLeafNodes += leafNodes;
181
+ }
182
+ }
183
+ });
184
+ }
185
+ milestone.leafNodesCount = totalLeafNodes;
186
+ milestone.completedLeafNodesCount = totalCompletedLeafNodes;
187
+ milestone.mandatoryLeafNodesCount = mandatoryLeafNodes;
188
+ milestone.mandatoryCompletedLeafNodesCount = mandatoryCompletedLeafNodes;
189
+ milestone.totalCourses = totalCourses;
190
+ milestone.completedCourses = completedCourses;
191
+ if (totalLeafNodes > 0) {
192
+ const calculatedPercentage = Math.round((totalCompletedLeafNodes / totalLeafNodes) * 100);
193
+ milestone.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
194
+ milestone.completionStatus = Number(milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0));
195
+ milestone.status = Number(milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0));
196
+ }
197
+ }
198
+ updateNodeProgress(node, enrollment) {
199
+ if (!enrollment) {
200
+ // If no enrollment data, preserve existing completion data from content hierarchy
201
+ // This is important for assessments that may have completion data but no enrollment entry
202
+ if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
203
+ node.completionPercentage = 0;
204
+ node.completionStatus = 0;
205
+ node.status = 0;
206
+ }
207
+ // Otherwise, keep the existing values from content hierarchy
208
+ return;
209
+ }
210
+ // Check if the node itself is the enrolled content (direct enrollment)
211
+ // This happens for pre-assessments and standalone content
212
+ const isDirectEnrollment = enrollment.collectionId === node.identifier ||
213
+ enrollment.contentId === node.identifier;
214
+ if (isDirectEnrollment) {
215
+ // Use enrollment's direct progress
216
+ const progress = enrollment.completionPercentage || enrollment.progress || 0;
217
+ const status = Number(enrollment.status) || 0;
218
+ node.completionPercentage = progress;
219
+ node.completionStatus = status;
220
+ node.status = status;
221
+ return;
222
+ }
223
+ if (enrollment?.status === 2) {
224
+ node.completionPercentage = 100;
225
+ node.completionStatus = 2;
226
+ node.status = 2;
227
+ }
228
+ else {
229
+ // Try both contentId and collectionId as the API response may use either field
230
+ const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier || ele?.collectionId === node.identifier);
231
+ if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
232
+ node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
233
+ node.completionStatus = Number(nodeEnrollData.status) || 0;
234
+ node.status = Number(nodeEnrollData.status) || 0;
235
+ }
236
+ else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
237
+ node.completionPercentage = 100;
238
+ node.completionStatus = 2;
239
+ node.status = 2;
240
+ }
241
+ else if (enrollment && !nodeEnrollData) {
242
+ // Enrollment exists but this node is not in contentList
243
+ // This can happen for completed assessments - preserve their completion data from content hierarchy
244
+ // Only reset to 0 if there's no completion data at all
245
+ if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
246
+ node.completionPercentage = 0;
247
+ node.completionStatus = 0;
248
+ node.status = 0;
249
+ }
250
+ // Otherwise keep existing values from content hierarchy
251
+ }
252
+ else {
253
+ // No enrollment at all - reset to 0
254
+ node.completionPercentage = 0;
255
+ node.completionStatus = 0;
256
+ node.status = 0;
257
+ }
258
+ }
259
+ }
260
+ updateCourseProgress(course, parentContentIdentifier, enrollmentListData) {
261
+ const enrollment = this.findEnrollment(enrollmentListData, course?.identifier);
262
+ if (enrollment?.completionPercentage === 100) {
263
+ // Enrollment shows 100% - mark course as complete
264
+ course.completionPercentage = 100;
265
+ course.completionStatus = 2;
266
+ if (enrollment.issuedCertificates.length > 0) {
267
+ const certificate = enrollment.issuedCertificates.sort((a, b) => new Date(a.lastIssuedOn).getTime() - new Date(b.lastIssuedOn).getTime());
268
+ const certId = certificate[0].identifier;
269
+ course.issuedCertificatesId = certId;
270
+ }
271
+ this.tocSvc.mapCompletionChildPercentageProgram(course);
272
+ }
273
+ else if (enrollment && enrollment.completionPercentage > 0) {
274
+ // Enrollment has partial progress
275
+ course.completionPercentage = enrollment.completionPercentage || 0;
276
+ course.completionStatus = 1;
277
+ // Also update children
278
+ if (course.children && course.children.length > 0) {
279
+ course.children.forEach((child) => {
280
+ // If child is a module, update its children (resources) as well
281
+ if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children && child.children.length > 0) {
282
+ child.children.forEach((resource) => {
283
+ this.updateNodeProgress(resource, enrollment);
284
+ });
285
+ }
286
+ else {
287
+ this.updateNodeProgress(child, enrollment);
288
+ }
289
+ });
290
+ }
291
+ }
292
+ else {
293
+ if (course.children && course.children.length > 0) {
294
+ let totalLeafNodes = course.leafNodesCount || 0;
295
+ let totalCompleted = 0;
296
+ course.children.forEach((child) => {
297
+ // If child is a module, update its children (resources) as well
298
+ if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children && child.children.length > 0) {
299
+ child.children.forEach((resource) => {
300
+ this.updateNodeProgress(resource, enrollment);
301
+ if (resource.completionStatus === 2 || resource.completionPercentage === 100) {
302
+ totalCompleted += resource.leafNodesCount || 1;
303
+ }
304
+ });
305
+ }
306
+ else {
307
+ this.updateNodeProgress(child, enrollment);
308
+ }
309
+ if (child.completionStatus === 2 || child.completionPercentage === 100) {
310
+ totalCompleted += child.leafNodesCount || 1;
311
+ }
312
+ });
313
+ // If it's a collection and doesn't have its own enrollment progress, calculate it
314
+ if (!enrollment || !course.completionPercentage || course.completionPercentage === 0) {
315
+ if (!totalLeafNodes) {
316
+ totalLeafNodes = course.children.reduce((acc, curr) => acc + (curr.leafNodesCount || 1), 0);
317
+ }
318
+ if (totalLeafNodes > 0) {
319
+ const calculatedPercentage = Math.round((totalCompleted / totalLeafNodes) * 100);
320
+ course.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
321
+ course.completionStatus = Number(course.completionPercentage === 100 ? 2 : (course.completionPercentage > 0 ? 1 : 0));
322
+ }
323
+ }
324
+ }
325
+ }
326
+ }
327
+ getCompletedLeafNodesCount(node) {
328
+ let completedCount = 0;
329
+ // If it's a leaf node (resource)
330
+ if (!node.children || node.children.length === 0) {
331
+ const isCompleted = node.status === 2 || node.completionStatus === 2 || node.completionPercentage >= 100;
332
+ return isCompleted ? (node.leafNodesCount || 1) : 0;
333
+ }
334
+ // If it has children, recursively count completed leaf nodes
335
+ node.children.forEach((child) => {
336
+ if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children) {
337
+ // Module - recurse through its children
338
+ completedCount += this.getCompletedLeafNodesCount(child);
339
+ }
340
+ else if (!child.children || child.children.length === 0) {
341
+ // Resource (leaf node)
342
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
343
+ if (isCompleted) {
344
+ completedCount += child.leafNodesCount || 1;
345
+ }
346
+ }
347
+ else {
348
+ // Other collection type - recurse
349
+ completedCount += this.getCompletedLeafNodesCount(child);
350
+ }
351
+ });
352
+ return completedCount;
353
+ }
354
+ findEnrollment(enrollmentList, identifier) {
355
+ if (!enrollmentList || !enrollmentList.length)
356
+ return null;
357
+ return enrollmentList.find((el) => el.collectionId === identifier || el.contentId === identifier);
358
+ }
359
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, deps: [{ token: i1.AppTocService }], target: i0.ɵɵFactoryTarget.Injectable }); }
360
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, providedIn: 'root' }); }
361
+ }
362
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, decorators: [{
363
+ type: Injectable,
364
+ args: [{
365
+ providedIn: 'root'
366
+ }]
367
+ }], ctorParameters: function () { return [{ type: i1.AppTocService }]; } });
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxlQUFlO0lBRTFCLFlBQW9CLE1BQXFCO1FBQXJCLFdBQU0sR0FBTixNQUFNLENBQWU7SUFBSSxDQUFDO0lBRTlDLHNCQUFzQixDQUFDLGVBQW9CO1FBQ3pDLElBQUksZ0JBQWdCLEdBQVEsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBQ2xELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5SCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsbUVBQW1FO1lBQ25FLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtZQUNwRiw4REFBOEQ7WUFDOUQsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBR3RFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUE7WUFDbEYsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLElBQUksZUFBZSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FB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QUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCx1QkFBdUI7Z0JBQ3ZCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQTtnQkFDM0csSUFBSSxXQUFXLEVBQUU7b0JBQ2YsY0FBYyxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFBO2lCQUM1QzthQUNGO2lCQUFNO2dCQUNMLGtDQUFrQztnQkFDbEMsY0FBYyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUN6RDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxjQUFtQixFQUFFLFVBQWtCO1FBQzVELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQTtJQUN4RyxDQUFDOytHQXBZVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuL2FwcC10b2Muc2VydmljZSc7XG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Mic7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NWMlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlKSB7IH1cblxuICBjb25zdHJ1Y3RIZWlyYXJjaHlEYXRhKGNvbnRlbnRSZWFkRGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgY29udGVudEhlaXJhcmNoeTogYW55ID0geyAuLi5jb250ZW50UmVhZERhdGEgfVxuICAgIGxldCBsZWFmTm9kZXM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10gJiYgT2JqZWN0LmtleXMoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10pLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIHByZWxpbWluYXJ5IGFzc2Vzc21lbnQgKHByZS1hc3Nlc3NtZW50KVxuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10ucGFyZW50ID0gY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICAvLyBNYXJrIHRoaXMgYXMgdGhlIHByZS1hc3Nlc3NtZW50IGZvciBtaWxlc3RvbmUgbG9ja2luZyBsb2dpY1xuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10uaXNQcmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgXG4gICAgIFxuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXS5wdXNoKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKVxuICAgICAgbGVhZk5vZGVzLnB1c2goY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnQgfHwgY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgLy8gVHJhY2sgbWlsZXN0b25lIGluZGV4IGZvciBwcm9wZXIgbG9ja2luZyBsb2dpY1xuICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdCAtIHVubG9ja2luZyBpcyBjb21wdXRlZCBiYXNlZCBvbiBwcm9ncmVzc1xuICAgIGxldCBtaWxlc3RvbmVJbmRleCA9IDBcbiAgICBjb250ZW50SGVpcmFyY2h5WydtaWxlc3RvbmVzX3YxJ10uZm9yRWFjaCgobWlsZXN0b25lOiBhbnkpID0+IHtcbiAgICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdFxuICAgICAgLy8gTTEgdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgLy8gTTIrIHVubG9jayB3aGVuIHByZXZpb3VzIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50ICsgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkXG4gICAgICBjb25zdCBzaG91bGRCZUxvY2tlZCA9IHRydWVcblxuICAgICAgbGV0IG1pbGVTdG9uZURhdGE6IGFueSA9IHtcbiAgICAgICAgXCJpZGVudGlmaWVyXCI6IG1pbGVzdG9uZS5pZCxcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBtaWxlc3RvbmUuZGVzY3JpcHRpb24sXG4gICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxuICAgICAgICBcImR1cmF0aW9uXCI6IFwiMFwiLFxuICAgICAgICBcInByaW1hcnlDYXRlZ29yeVwiOiBcIk1pbGVzdG9uZVwiLFxuICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXG4gICAgICAgIFwiY3JlYXRlZEJ5XCI6IFwiMjUzMTFhNGYtZmE0Mi00Y2Y3LTg4MmEtNWU3OTE5OGVkZmNiXCIsXG4gICAgICAgIFwibmFtZVwiOiBtaWxlc3RvbmUubmFtZSxcbiAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxuICAgICAgICBcImlzTG9ja2VkXCI6IHNob3VsZEJlTG9ja2VkLFxuICAgICAgICBcIm1pbGVzdG9uZUluZGV4XCI6IG1pbGVzdG9uZUluZGV4LFxuICAgICAgICBcInN0YXR1c1wiOiAwLFxuICAgICAgICBcImNvbXBsZXRpb25TdGF0dXNcIjogMCxcbiAgICAgICAgXCJjb21wbGV0aW9uUGVyY2VudGFnZVwiOiAwLFxuICAgICAgICBcImxlYWZOb2Rlc1wiOiBbXSxcbiAgICAgICAgLy8gUHJlLWNvbXB1dGVkIGZsYWdzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAgICAgXCJpc01pbGVzdG9uZVwiOiB0cnVlLFxuICAgICAgICBcImlzQ29sbGVjdGlvblwiOiB0cnVlLFxuICAgICAgICBcImlzTW9kdWxlXCI6IGZhbHNlLFxuICAgICAgICBcImlzUmVzb3VyY2VcIjogZmFsc2UsXG4gICAgICAgIFwiaXNMZWFybmluZ1BhdGh3YXlcIjogZmFsc2UsXG4gICAgICAgIFwicGFyZW50XCI6IGNvbnRlbnRIZWlyYXJjaHkuaWRlbnRpZmllclxuICAgICAgfVxuXG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gW11cbiAgICAgIGlmIChtaWxlc3RvbmU/LmNvdXJzZXMgJiYgbWlsZXN0b25lPy5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgbWlsZXN0b25lLmNvdXJzZXMuZm9yRWFjaCgobWlsZVN0b25lQ291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgY291cnNlcyBpbnNpZGUgbWlsZXN0b25lXG4gICAgICAgICAgbWlsZVN0b25lQ291cnNlLnBhcmVudCA9IG1pbGVzdG9uZS5pZFxuICAgICAgICAgIG1pbGVTdG9uZUNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IDBcbiAgICAgICAgICBtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddID0gU3RyaW5nKE51bWJlcihtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddKSArIE51bWJlcihtaWxlU3RvbmVDb3Vyc2U/LmR1cmF0aW9uIHx8IDApKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KG1pbGVTdG9uZUNvdXJzZSlcbiAgICAgICAgICBpZiAobWlsZVN0b25lQ291cnNlICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxlYWZOb2RlcyA9IFsuLi5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG4gICAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXG4gICAgICAgIH0pXG5cbiAgICAgIH1cbiAgICAgIGlmIChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpIHtcbiAgICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIGFzc2Vzc21lbnQgaW5zaWRlIG1pbGVzdG9uZVxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcbiAgICAgICAgbGVhZk5vZGVzLnB1c2gobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcl1cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbLi4ubWlsZXN0b25lWydjb3Vyc2VzJ10sIC4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ11dXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXG4gICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQobWlsZVN0b25lRGF0YSlcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID8gWy4uLmNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10sIG1pbGVTdG9uZURhdGFdIDogW21pbGVTdG9uZURhdGFdXG5cbiAgICAgIG1pbGVzdG9uZUluZGV4KytcbiAgICB9KVxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2xlYWZOb2RlcyddID0gWy4uLmxlYWZOb2Rlc11cbiAgICBjb250ZW50SGVpcmFyY2h5WydsZWFmTm9kZXNDb3VudCddID0gbGVhZk5vZGVzLmxlbmd0aFxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5XG4gIH1cblxuICAgbWFwTW9kdWxlQ291bnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIGlmKGNoaWxkPy5tb2R1bGVDb3VudCkge1xuICAgICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgY2hpbGQ/Lm1vZHVsZUNvdW50IDogXG4gICAgICAgICAgICBjaGlsZD8ubW9kdWxlQ291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5cbiAgbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKGNvbnRlbnRIZWlyYXJjaHlEYXRhOiBhbnksIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgTFBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBVcGRhdGUgcHJvZ3Jlc3MgZm9yIGFsbCBjb250ZW50XG4gICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhjaGlsZCwgY29udGVudEhlaXJhcmNoeURhdGE/LmlkZW50aWZpZXIsIGVucm9sbG1lbnRMaXN0RGF0YSlcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2UgcmVzb3VyY2VzIGFuZCBtaWxlc3RvbmUgYXNzZXNzbWVudHNcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5tYW5kYXRvcnlMZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gY2hpbGQubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBwcmUtYXNzZXNzbWVudCBhbmQgb3RoZXIgcm9vdC1sZXZlbCBjb250ZW50IChhbHdheXMgY291bnQgdGhlc2UpXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZW5yb2xsbWVudCB3aXRoIHBhcmVudCBpZGVudGlmaWVyIGZpcnN0LCB0aGVuIHdpdGggY2hpbGQncyBvd24gaWRlbnRpZmllclxuICAgICAgICAgIGxldCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuICAgICAgICAgIGlmICghZW5yb2xsbWVudCkge1xuICAgICAgICAgICAgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjaGlsZD8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gaXNDb21wbGV0ZWQgPyAoY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZihMUGVucm9sbG1lbnQgJiYgTFBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKE51bWJlcih0b3RhbENvbXBsZXRlZExlYWZOb2RlcykgLyBOdW1iZXIodG90YWxMZWFmTm9kZXMpKSAqIDEwMClcbiAgICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGlzTmFOKGNhbGN1bGF0ZWRQZXJjZW50YWdlKSA/IDAgOiBjYWxjdWxhdGVkUGVyY2VudGFnZVxuICAgICAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMgPSBOdW1iZXIoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwID8gMSA6IDApKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5RGF0YVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhtaWxlc3RvbmU6IGFueSwgcGFyZW50Q29udGVudElkZW50aWZpZXI6IHN0cmluZywgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuICAgIGxldCBtYW5kYXRvcnlMZWFmTm9kZXMgPSAwXG4gICAgbGV0IG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyA9IDBcbiAgICBsZXQgY29tcGxldGVkQ291cnNlcyA9IDBcbiAgICBsZXQgdG90YWxDb3Vyc2VzID0gMFxuXG4gICAgaWYgKG1pbGVzdG9uZS5jaGlsZHJlbikge1xuICAgICAgbWlsZXN0b25lLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScpIHtcbiAgICAgICAgICB0b3RhbENvdXJzZXMgKz0gMVxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgY2hpbGRMZWFmTm9kZXMgPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3VudCBhbGwgY291cnNlIGxlYWYgbm9kZXMgZm9yIG92ZXJhbGwgdHJhY2tpbmdcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgY29tcGxldGVkQ291cnNlcyArPSAxXG4gICAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2VzIGZvciBMUCBjb21wbGV0aW9uIHBlcmNlbnRhZ2VcbiAgICAgICAgICBpZiAoY2hpbGQuaXNNYW5kYXRvcnkgPT09IHRydWUgfHwgY2hpbGQubWFuZGF0b3J5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtYW5kYXRvcnlMZWFmTm9kZXMgKz0gY2hpbGRMZWFmTm9kZXNcbiAgICAgICAgICAgIC8vIENvdW50IGluZGl2aWR1YWwgY29tcGxldGVkIHJlc291cmNlcyB3aXRoaW4gbWFuZGF0b3J5IGNvdXJzZXNcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gdGhpcy5nZXRDb21wbGV0ZWRMZWFmTm9kZXNDb3VudChjaGlsZClcbiAgICAgICAgICAgIG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyArPSBjb21wbGV0ZWRDb3VudFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNzZXNzbWVudHMgLSBhbHdheXMgY291bnQgdGhlbSBhcyBtYW5kYXRvcnlcbiAgICAgICAgICAvLyBUcnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXG4gICAgICAgICAgbGV0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgcGFyZW50Q29udGVudElkZW50aWZpZXIpXG4gICAgICAgICAgaWYgKCFlbnJvbGxtZW50KSB7XG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIG1pbGVzdG9uZT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbGVhZk5vZGVzID0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ291bnQgYXNzZXNzbWVudHMgaW4gYm90aCB0b3RhbCBhbmQgbWFuZGF0b3J5XG4gICAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgbWFuZGF0b3J5TGVhZk5vZGVzICs9IGxlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgICBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIG1pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCA9IHRvdGFsTGVhZk5vZGVzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50ID0gdG90YWxDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5TGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUudG90YWxDb3Vyc2VzID0gdG90YWxDb3Vyc2VzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZENvdXJzZXMgPSBjb21wbGV0ZWRDb3Vyc2VzXG5cbiAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBOdW1iZXIobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogKG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMCkpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb2RlUHJvZ3Jlc3Mobm9kZTogYW55LCBlbnJvbGxtZW50OiBhbnkpIHtcbiAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgIC8vIElmIG5vIGVucm9sbG1lbnQgZGF0YSwgcHJlc2VydmUgZXhpc3RpbmcgY29tcGxldGlvbiBkYXRhIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhc3Nlc3NtZW50cyB0aGF0IG1heSBoYXZlIGNvbXBsZXRpb24gZGF0YSBidXQgbm8gZW5yb2xsbWVudCBlbnRyeVxuICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGtlZXAgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBpdHNlbGYgaXMgdGhlIGVucm9sbGVkIGNvbnRlbnQgKGRpcmVjdCBlbnJvbGxtZW50KVxuICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgcHJlLWFzc2Vzc21lbnRzIGFuZCBzdGFuZGFsb25lIGNvbnRlbnRcbiAgICBjb25zdCBpc0RpcmVjdEVucm9sbG1lbnQgPSBlbnJvbGxtZW50LmNvbGxlY3Rpb25JZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxtZW50LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyXG4gICAgXG4gICAgaWYgKGlzRGlyZWN0RW5yb2xsbWVudCkge1xuICAgICAgXG4gICAgICAvLyBVc2UgZW5yb2xsbWVudCdzIGRpcmVjdCBwcm9ncmVzc1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGVucm9sbG1lbnQucHJvZ3Jlc3MgfHwgMFxuICAgICAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKGVucm9sbG1lbnQuc3RhdHVzKSB8fCAwXG4gICAgICBcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwcm9ncmVzc1xuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gc3RhdHVzXG4gICAgICBub2RlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZihlbnJvbGxtZW50Py5zdGF0dXMgPT09IDIpIHtcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcnkgYm90aCBjb250ZW50SWQgYW5kIGNvbGxlY3Rpb25JZCBhcyB0aGUgQVBJIHJlc3BvbnNlIG1heSB1c2UgZWl0aGVyIGZpZWxkXG4gICAgICBjb25zdCBub2RlRW5yb2xsRGF0YSA9IGVucm9sbG1lbnQ/LmNvbnRlbnRMaXN0Py5maW5kKChlbGU6IGFueSkgPT4gXG4gICAgICAgIGVsZT8uY29udGVudElkID09PSBub2RlLmlkZW50aWZpZXIgfHwgZWxlPy5jb2xsZWN0aW9uSWQgPT09IG5vZGUuaWRlbnRpZmllclxuICAgICAgKVxuICAgICAgXG4gICAgICBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPCAyKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBub2RlRW5yb2xsRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBub2RlRW5yb2xsRGF0YS5wcm9ncmVzcyB8fCAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihub2RlRW5yb2xsRGF0YS5zdGF0dXMpIHx8IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSBOdW1iZXIobm9kZUVucm9sbERhdGEuc3RhdHVzKSB8fCAwXG4gICAgICB9ZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDEwMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAyXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgICAgfSBlbHNlIGlmIChlbnJvbGxtZW50ICYmICFub2RlRW5yb2xsRGF0YSkge1xuICAgICAgICAvLyBFbnJvbGxtZW50IGV4aXN0cyBidXQgdGhpcyBub2RlIGlzIG5vdCBpbiBjb250ZW50TGlzdFxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIGNvbXBsZXRlZCBhc3Nlc3NtZW50cyAtIHByZXNlcnZlIHRoZWlyIGNvbXBsZXRpb24gZGF0YSBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICAgIC8vIE9ubHkgcmVzZXQgdG8gMCBpZiB0aGVyZSdzIG5vIGNvbXBsZXRpb24gZGF0YSBhdCBhbGxcbiAgICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGtlZXAgZXhpc3RpbmcgdmFsdWVzIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGVucm9sbG1lbnQgYXQgYWxsIC0gcmVzZXQgdG8gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMFxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBcbiAgICBcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY291cnNlPy5pZGVudGlmaWVyKVxuXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgc2hvd3MgMTAwJSAtIG1hcmsgY291cnNlIGFzIGNvbXBsZXRlXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgaWYgKGVucm9sbG1lbnQuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBlbnJvbGxtZW50Lmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgICAgICBjb25zdCBjZXJ0SWQ6IGFueSA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgIGNvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlKVxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCkge1xuICAgICAgLy8gRW5yb2xsbWVudCBoYXMgcGFydGlhbCBwcm9ncmVzc1xuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IDFcbiAgICAgIC8vIEFsc28gdXBkYXRlIGNoaWxkcmVuXG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvdXJzZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgXG5cbiAgICAgICAgICAvLyBJZiBjaGlsZCBpcyBhIG1vZHVsZSwgdXBkYXRlIGl0cyBjaGlsZHJlbiAocmVzb3VyY2VzKSBhcyB3ZWxsXG4gICAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFICYmIGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MocmVzb3VyY2UsIGVucm9sbG1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5sZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIGxldCB0b3RhbENvbXBsZXRlZCA9IDBcblxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIGNoaWxkIGlzIGEgbW9kdWxlLCB1cGRhdGUgaXRzIGNoaWxkcmVuIChyZXNvdXJjZXMpIGFzIHdlbGxcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUgJiYgY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaCgocmVzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhyZXNvdXJjZSwgZW5yb2xsbWVudClcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgcmVzb3VyY2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IHJlc291cmNlLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSWYgaXQncyBhIGNvbGxlY3Rpb24gYW5kIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGVucm9sbG1lbnQgcHJvZ3Jlc3MsIGNhbGN1bGF0ZSBpdFxuICAgICAgICBpZiAoIWVucm9sbG1lbnQgfHwgIWNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDApIHtcbiAgICAgICAgICBpZiAoIXRvdGFsTGVhZk5vZGVzKSB7XG4gICAgICAgICAgICB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5jaGlsZHJlbi5yZWR1Y2UoKGFjYzogbnVtYmVyLCBjdXJyOiBhbnkpID0+IGFjYyArIChjdXJyLmxlYWZOb2Rlc0NvdW50IHx8IDEpLCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICAgICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQobm9kZTogYW55KTogbnVtYmVyIHtcbiAgICBsZXQgY29tcGxldGVkQ291bnQgPSAwXG4gICAgXG4gICAgLy8gSWYgaXQncyBhIGxlYWYgbm9kZSAocmVzb3VyY2UpXG4gICAgaWYgKCFub2RlLmNoaWxkcmVuIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IG5vZGUuc3RhdHVzID09PSAyIHx8IG5vZGUuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxuICAgICAgcmV0dXJuIGlzQ29tcGxldGVkID8gKG5vZGUubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgfVxuICAgIFxuICAgIC8vIElmIGl0IGhhcyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkgY291bnQgY29tcGxldGVkIGxlYWYgbm9kZXNcbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSAmJiBjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAvLyBNb2R1bGUgLSByZWN1cnNlIHRocm91Z2ggaXRzIGNoaWxkcmVuXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9IGVsc2UgaWYgKCFjaGlsZC5jaGlsZHJlbiB8fCBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmVzb3VyY2UgKGxlYWYgbm9kZSlcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgICAgY29tcGxldGVkQ291bnQgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlciBjb2xsZWN0aW9uIHR5cGUgLSByZWN1cnNlXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9XG4gICAgfSlcbiAgICBcbiAgICByZXR1cm4gY29tcGxldGVkQ291bnRcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFlbnJvbGxtZW50TGlzdCB8fCAhZW5yb2xsbWVudExpc3QubGVuZ3RoKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBlbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGlkZW50aWZpZXIgfHwgZWwuY29udGVudElkID09PSBpZGVudGlmaWVyKVxuICB9XG5cblxuXG59XG5cbiJdfQ==