@clickview/exchange 0.60.0 → 0.61.0

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 (192) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/en.json +1 -1
  3. package/dist/scripts/{DQWSGmPO.chunk.js → 2GC-PPDy.chunk.js} +2 -2
  4. package/dist/scripts/{DQWSGmPO.chunk.js.map → 2GC-PPDy.chunk.js.map} +1 -1
  5. package/dist/scripts/{C_vLRfti.chunk.js → 5yUbuX8U.chunk.js} +2 -2
  6. package/dist/scripts/{C_vLRfti.chunk.js.map → 5yUbuX8U.chunk.js.map} +1 -1
  7. package/dist/scripts/{DfR8N6KN.chunk.js → B1cVJr0t.chunk.js} +2 -2
  8. package/dist/scripts/{DfR8N6KN.chunk.js.map → B1cVJr0t.chunk.js.map} +1 -1
  9. package/dist/scripts/B4AGq_K6.chunk.js +2 -0
  10. package/dist/scripts/{u96pPes-.chunk.js.map → B4AGq_K6.chunk.js.map} +1 -1
  11. package/dist/scripts/{Ej7a07_u.chunk.js → B57luw20.chunk.js} +2 -2
  12. package/dist/scripts/{Ej7a07_u.chunk.js.map → B57luw20.chunk.js.map} +1 -1
  13. package/dist/scripts/{Csq5lSfL.chunk.js → B5VX0-05.chunk.js} +2 -2
  14. package/dist/scripts/{Csq5lSfL.chunk.js.map → B5VX0-05.chunk.js.map} +1 -1
  15. package/dist/scripts/{B1FXQpYQ.chunk.js → B5yQ-o2c.chunk.js} +2 -2
  16. package/dist/scripts/{B1FXQpYQ.chunk.js.map → B5yQ-o2c.chunk.js.map} +1 -1
  17. package/dist/scripts/{CfHe4kqG.chunk.js → BAaMmtA5.chunk.js} +2 -2
  18. package/dist/scripts/{CfHe4kqG.chunk.js.map → BAaMmtA5.chunk.js.map} +1 -1
  19. package/dist/scripts/{Ien9POMb.chunk.js → BJB2pvo-.chunk.js} +2 -2
  20. package/dist/scripts/{Ien9POMb.chunk.js.map → BJB2pvo-.chunk.js.map} +1 -1
  21. package/dist/scripts/{CXQ4Otim.chunk.js → BJmQsLgH.chunk.js} +2 -2
  22. package/dist/scripts/{CXQ4Otim.chunk.js.map → BJmQsLgH.chunk.js.map} +1 -1
  23. package/dist/scripts/{zD1LoHGd.chunk.js → BKtt7r9I.chunk.js} +2 -2
  24. package/dist/scripts/{zD1LoHGd.chunk.js.map → BKtt7r9I.chunk.js.map} +1 -1
  25. package/dist/scripts/{CLS2QNAc.chunk.js → BQ7D2X0o.chunk.js} +2 -2
  26. package/dist/scripts/{CLS2QNAc.chunk.js.map → BQ7D2X0o.chunk.js.map} +1 -1
  27. package/dist/scripts/{Bv-rZ1ws.chunk.js → BQTdalXA.chunk.js} +2 -2
  28. package/dist/scripts/{Bv-rZ1ws.chunk.js.map → BQTdalXA.chunk.js.map} +1 -1
  29. package/dist/scripts/{C52tRwVm.chunk.js → BR_C7b5M.chunk.js} +2 -2
  30. package/dist/scripts/{C52tRwVm.chunk.js.map → BR_C7b5M.chunk.js.map} +1 -1
  31. package/dist/scripts/{DxRcVeDA.chunk.js → BVViiWF8.chunk.js} +2 -2
  32. package/dist/scripts/{DxRcVeDA.chunk.js.map → BVViiWF8.chunk.js.map} +1 -1
  33. package/dist/scripts/{BwA4-wPQ.chunk.js → BWoESSLv.chunk.js} +2 -2
  34. package/dist/scripts/{BwA4-wPQ.chunk.js.map → BWoESSLv.chunk.js.map} +1 -1
  35. package/dist/scripts/{DhSjZ3FD.chunk.js → BZXmaOzt.chunk.js} +2 -2
  36. package/dist/scripts/{DhSjZ3FD.chunk.js.map → BZXmaOzt.chunk.js.map} +1 -1
  37. package/dist/scripts/{CkxEvxLE.chunk.js → Bcaq2QKq.chunk.js} +2 -2
  38. package/dist/scripts/{CkxEvxLE.chunk.js.map → Bcaq2QKq.chunk.js.map} +1 -1
  39. package/dist/scripts/{BuwaCenI.chunk.js → BdMXRcT3.chunk.js} +2 -2
  40. package/dist/scripts/{BuwaCenI.chunk.js.map → BdMXRcT3.chunk.js.map} +1 -1
  41. package/dist/scripts/{C0I1ovgn.chunk.js → BlabCH8N.chunk.js} +2 -2
  42. package/dist/scripts/{C0I1ovgn.chunk.js.map → BlabCH8N.chunk.js.map} +1 -1
  43. package/dist/scripts/{2NsO29qP.chunk.js → Bo-iDjSh.chunk.js} +2 -2
  44. package/dist/scripts/{2NsO29qP.chunk.js.map → Bo-iDjSh.chunk.js.map} +1 -1
  45. package/dist/scripts/{Cjy2K1zH.chunk.js → BqRzwJ-J.chunk.js} +2 -2
  46. package/dist/scripts/{Cjy2K1zH.chunk.js.map → BqRzwJ-J.chunk.js.map} +1 -1
  47. package/dist/scripts/BrdU6Hc2.chunk.js +2 -0
  48. package/dist/scripts/{WarFtyTw.chunk.js.map → BrdU6Hc2.chunk.js.map} +1 -1
  49. package/dist/scripts/{Cca7nDsG.chunk.js → Bt07VepM.chunk.js} +2 -2
  50. package/dist/scripts/{Cca7nDsG.chunk.js.map → Bt07VepM.chunk.js.map} +1 -1
  51. package/dist/scripts/{3hd9Wq4c.chunk.js → BtbirQej.chunk.js} +2 -2
  52. package/dist/scripts/{3hd9Wq4c.chunk.js.map → BtbirQej.chunk.js.map} +1 -1
  53. package/dist/scripts/{DCLePavE.chunk.js → Byh4RoGO.chunk.js} +2 -2
  54. package/dist/scripts/{DCLePavE.chunk.js.map → Byh4RoGO.chunk.js.map} +1 -1
  55. package/dist/scripts/{DTHb9InD.chunk.js → Bz3eAWKb.chunk.js} +2 -2
  56. package/dist/scripts/{DTHb9InD.chunk.js.map → Bz3eAWKb.chunk.js.map} +1 -1
  57. package/dist/scripts/{Cu0qnVi5.chunk.js → BzzIpmJj.chunk.js} +2 -2
  58. package/dist/scripts/{Cu0qnVi5.chunk.js.map → BzzIpmJj.chunk.js.map} +1 -1
  59. package/dist/scripts/{C7un82WP.chunk.js → C3LmB7vs.chunk.js} +2 -2
  60. package/dist/scripts/{C7un82WP.chunk.js.map → C3LmB7vs.chunk.js.map} +1 -1
  61. package/dist/scripts/C42aTLRq.chunk.js +2 -0
  62. package/dist/scripts/{C2TRBWPd.chunk.js.map → C42aTLRq.chunk.js.map} +1 -1
  63. package/dist/scripts/C4BzCmwg.chunk.js +2 -0
  64. package/dist/scripts/{BwdSbre5.chunk.js.map → C4BzCmwg.chunk.js.map} +1 -1
  65. package/dist/scripts/{B5mlcFJg.chunk.js → CFRAo5Sd.chunk.js} +2 -2
  66. package/dist/scripts/{B5mlcFJg.chunk.js.map → CFRAo5Sd.chunk.js.map} +1 -1
  67. package/dist/scripts/{C-Dd1wEr.chunk.js → CKGW3m2X.chunk.js} +3 -3
  68. package/dist/scripts/{C-Dd1wEr.chunk.js.map → CKGW3m2X.chunk.js.map} +1 -1
  69. package/dist/scripts/{D0Tp9Z65.chunk.js → CL6ZWANl.chunk.js} +2 -2
  70. package/dist/scripts/{D0Tp9Z65.chunk.js.map → CL6ZWANl.chunk.js.map} +1 -1
  71. package/dist/scripts/CLgSNdF3.chunk.js +2 -0
  72. package/dist/scripts/{BxcHYWuR.chunk.js.map → CLgSNdF3.chunk.js.map} +1 -1
  73. package/dist/scripts/{XOHWRN-E.chunk.js → CMfzHyZ-.chunk.js} +2 -2
  74. package/dist/scripts/{XOHWRN-E.chunk.js.map → CMfzHyZ-.chunk.js.map} +1 -1
  75. package/dist/scripts/{Vk3DDGeP.chunk.js → CPvN_Soe.chunk.js} +2 -2
  76. package/dist/scripts/{Vk3DDGeP.chunk.js.map → CPvN_Soe.chunk.js.map} +1 -1
  77. package/dist/scripts/{LLCJ2-mR.chunk.js → CYISpSfn.chunk.js} +2 -2
  78. package/dist/scripts/{LLCJ2-mR.chunk.js.map → CYISpSfn.chunk.js.map} +1 -1
  79. package/dist/scripts/{DfcdtoXp.chunk.js → CZQS_NPT.chunk.js} +2 -2
  80. package/dist/scripts/{DfcdtoXp.chunk.js.map → CZQS_NPT.chunk.js.map} +1 -1
  81. package/dist/scripts/{DeW1mjFb.chunk.js → CcHhPXQX.chunk.js} +2 -2
  82. package/dist/scripts/{DeW1mjFb.chunk.js.map → CcHhPXQX.chunk.js.map} +1 -1
  83. package/dist/scripts/{DLsA7vPe.chunk.js → CjgcuP3Q.chunk.js} +2 -2
  84. package/dist/scripts/{DLsA7vPe.chunk.js.map → CjgcuP3Q.chunk.js.map} +1 -1
  85. package/dist/scripts/{itWDNVl_.chunk.js → CmVJO7VI.chunk.js} +2 -2
  86. package/dist/scripts/{itWDNVl_.chunk.js.map → CmVJO7VI.chunk.js.map} +1 -1
  87. package/dist/scripts/{DBtiEa66.chunk.js → CpMkRd2a.chunk.js} +2 -2
  88. package/dist/scripts/{DBtiEa66.chunk.js.map → CpMkRd2a.chunk.js.map} +1 -1
  89. package/dist/scripts/{Y2rXSgTV.chunk.js → CqWvHKP5.chunk.js} +2 -2
  90. package/dist/scripts/{Y2rXSgTV.chunk.js.map → CqWvHKP5.chunk.js.map} +1 -1
  91. package/dist/scripts/{zO2QdKtt.chunk.js → CvgQRmjv.chunk.js} +2 -2
  92. package/dist/scripts/{zO2QdKtt.chunk.js.map → CvgQRmjv.chunk.js.map} +1 -1
  93. package/dist/scripts/{B9W1QLWn.chunk.js → CwexEXsi.chunk.js} +2 -2
  94. package/dist/scripts/{B9W1QLWn.chunk.js.map → CwexEXsi.chunk.js.map} +1 -1
  95. package/dist/scripts/{BpwHr0J0.chunk.js → CyQDGNI3.chunk.js} +2 -2
  96. package/dist/scripts/{BpwHr0J0.chunk.js.map → CyQDGNI3.chunk.js.map} +1 -1
  97. package/dist/scripts/{CHAwVVRw.chunk.js → D21QHirZ.chunk.js} +2 -2
  98. package/dist/scripts/{CHAwVVRw.chunk.js.map → D21QHirZ.chunk.js.map} +1 -1
  99. package/dist/scripts/{DxJfmOeq.chunk.js → D30qaGvM.chunk.js} +2 -2
  100. package/dist/scripts/{DxJfmOeq.chunk.js.map → D30qaGvM.chunk.js.map} +1 -1
  101. package/dist/scripts/{CJIYSOTb.chunk.js → D3juPk5Y.chunk.js} +2 -2
  102. package/dist/scripts/{CJIYSOTb.chunk.js.map → D3juPk5Y.chunk.js.map} +1 -1
  103. package/dist/scripts/{B-IgnxzS.chunk.js → D5FAzio3.chunk.js} +2 -2
  104. package/dist/scripts/{B-IgnxzS.chunk.js.map → D5FAzio3.chunk.js.map} +1 -1
  105. package/dist/scripts/{DIBfWWih.chunk.js → D7NOMVC8.chunk.js} +2 -2
  106. package/dist/scripts/{DIBfWWih.chunk.js.map → D7NOMVC8.chunk.js.map} +1 -1
  107. package/dist/scripts/{bogFjz2G.chunk.js → D7QRJrh2.chunk.js} +2 -2
  108. package/dist/scripts/{bogFjz2G.chunk.js.map → D7QRJrh2.chunk.js.map} +1 -1
  109. package/dist/scripts/{BZb44_Lh.chunk.js → D9df4Id7.chunk.js} +2 -2
  110. package/dist/scripts/{BZb44_Lh.chunk.js.map → D9df4Id7.chunk.js.map} +1 -1
  111. package/dist/scripts/{BYLKD39d.chunk.js → DFEBv1_O.chunk.js} +2 -2
  112. package/dist/scripts/{BYLKD39d.chunk.js.map → DFEBv1_O.chunk.js.map} +1 -1
  113. package/dist/scripts/{ChXJhYla.chunk.js → DGvEmnsP.chunk.js} +2 -2
  114. package/dist/scripts/{ChXJhYla.chunk.js.map → DGvEmnsP.chunk.js.map} +1 -1
  115. package/dist/scripts/DIkrkJAo.chunk.js +2 -0
  116. package/dist/scripts/{CD1TqwcB.chunk.js.map → DIkrkJAo.chunk.js.map} +1 -1
  117. package/dist/scripts/{BrjepIq5.chunk.js → DMAci3S_.chunk.js} +2 -2
  118. package/dist/scripts/{BrjepIq5.chunk.js.map → DMAci3S_.chunk.js.map} +1 -1
  119. package/dist/scripts/{COBKg5HM.chunk.js → DOsWx99L.chunk.js} +2 -2
  120. package/dist/scripts/{COBKg5HM.chunk.js.map → DOsWx99L.chunk.js.map} +1 -1
  121. package/dist/scripts/{Bh_0dfl8.chunk.js → DYRoLttd.chunk.js} +2 -2
  122. package/dist/scripts/{Bh_0dfl8.chunk.js.map → DYRoLttd.chunk.js.map} +1 -1
  123. package/dist/scripts/{DiR8Ds2K.chunk.js → DbNPwlCF.chunk.js} +2 -2
  124. package/dist/scripts/{DiR8Ds2K.chunk.js.map → DbNPwlCF.chunk.js.map} +1 -1
  125. package/dist/scripts/{BCd9ozXx.chunk.js → DeSk2YFH.chunk.js} +2 -2
  126. package/dist/scripts/{BCd9ozXx.chunk.js.map → DeSk2YFH.chunk.js.map} +1 -1
  127. package/dist/scripts/{CgplGqf6.chunk.js → DgYE66Vs.chunk.js} +2 -2
  128. package/dist/scripts/{CgplGqf6.chunk.js.map → DgYE66Vs.chunk.js.map} +1 -1
  129. package/dist/scripts/{DsPW-ne8.chunk.js → DigjAeMR.chunk.js} +2 -2
  130. package/dist/scripts/{DsPW-ne8.chunk.js.map → DigjAeMR.chunk.js.map} +1 -1
  131. package/dist/scripts/{Bu06fyx_.chunk.js → Dj7sCTJQ.chunk.js} +2 -2
  132. package/dist/scripts/{Bu06fyx_.chunk.js.map → Dj7sCTJQ.chunk.js.map} +1 -1
  133. package/dist/scripts/{B2OzXphM.chunk.js → Dk7tKls8.chunk.js} +2 -2
  134. package/dist/scripts/{B2OzXphM.chunk.js.map → Dk7tKls8.chunk.js.map} +1 -1
  135. package/dist/scripts/{CJ1ig2Kx.chunk.js → DmTetbor.chunk.js} +2 -2
  136. package/dist/scripts/{CJ1ig2Kx.chunk.js.map → DmTetbor.chunk.js.map} +1 -1
  137. package/dist/scripts/{USTuMLcb.chunk.js → Ds3SQeo1.chunk.js} +2 -2
  138. package/dist/scripts/{USTuMLcb.chunk.js.map → Ds3SQeo1.chunk.js.map} +1 -1
  139. package/dist/scripts/{B696AbD2.chunk.js → Dw-3sJ6z.chunk.js} +2 -2
  140. package/dist/scripts/{B696AbD2.chunk.js.map → Dw-3sJ6z.chunk.js.map} +1 -1
  141. package/dist/scripts/{DjT7A1F0.chunk.js → DzUywVIn.chunk.js} +2 -2
  142. package/dist/scripts/{DjT7A1F0.chunk.js.map → DzUywVIn.chunk.js.map} +1 -1
  143. package/dist/scripts/{BX_8MApq.chunk.js → FqMxoz-g.chunk.js} +2 -2
  144. package/dist/scripts/{BX_8MApq.chunk.js.map → FqMxoz-g.chunk.js.map} +1 -1
  145. package/dist/scripts/{CtovEsFz.chunk.js → M8-7wL03.chunk.js} +2 -2
  146. package/dist/scripts/{CtovEsFz.chunk.js.map → M8-7wL03.chunk.js.map} +1 -1
  147. package/dist/scripts/{BF2PCV8G.chunk.js → O3KYJlt8.chunk.js} +2 -2
  148. package/dist/scripts/{BF2PCV8G.chunk.js.map → O3KYJlt8.chunk.js.map} +1 -1
  149. package/dist/scripts/{-wh0Q1Mk.chunk.js → P1w98jqc.chunk.js} +2 -2
  150. package/dist/scripts/{-wh0Q1Mk.chunk.js.map → P1w98jqc.chunk.js.map} +1 -1
  151. package/dist/scripts/{Q3oue8AK.chunk.js → PLxejfSI.chunk.js} +2 -2
  152. package/dist/scripts/{Q3oue8AK.chunk.js.map → PLxejfSI.chunk.js.map} +1 -1
  153. package/dist/scripts/{D_O3OU5_.chunk.js → Q9FeiQkl.chunk.js} +2 -2
  154. package/dist/scripts/{D_O3OU5_.chunk.js.map → Q9FeiQkl.chunk.js.map} +1 -1
  155. package/dist/scripts/{dn7SonjL.chunk.js → TYfK47yR.chunk.js} +2 -2
  156. package/dist/scripts/{dn7SonjL.chunk.js.map → TYfK47yR.chunk.js.map} +1 -1
  157. package/dist/scripts/{CuGgxXq6.chunk.js → X5emuMm3.chunk.js} +2 -2
  158. package/dist/scripts/{CuGgxXq6.chunk.js.map → X5emuMm3.chunk.js.map} +1 -1
  159. package/dist/scripts/{CQoqpuSN.chunk.js → YuqHkk0a.chunk.js} +2 -2
  160. package/dist/scripts/{CQoqpuSN.chunk.js.map → YuqHkk0a.chunk.js.map} +1 -1
  161. package/dist/scripts/{BM3jzDzF.chunk.js → ZFLNGNny.chunk.js} +2 -2
  162. package/dist/scripts/{BM3jzDzF.chunk.js.map → ZFLNGNny.chunk.js.map} +1 -1
  163. package/dist/scripts/{DcWRg8v3.chunk.js → aou-5sJI.chunk.js} +2 -2
  164. package/dist/scripts/{DcWRg8v3.chunk.js.map → aou-5sJI.chunk.js.map} +1 -1
  165. package/dist/scripts/{app-7svuou3-.js → app-CShb1Dgt.js} +3 -3
  166. package/dist/scripts/{app-7svuou3-.js.map → app-CShb1Dgt.js.map} +1 -1
  167. package/dist/scripts/baur_fn0.chunk.js +2 -0
  168. package/dist/scripts/{zDrAtVBw.chunk.js.map → baur_fn0.chunk.js.map} +1 -1
  169. package/dist/scripts/{BrdxuhDZ.chunk.js → cDgsKsmM.chunk.js} +2 -2
  170. package/dist/scripts/{BrdxuhDZ.chunk.js.map → cDgsKsmM.chunk.js.map} +1 -1
  171. package/dist/scripts/{Di0ieRgB.chunk.js → d6bZeQ7u.chunk.js} +2 -2
  172. package/dist/scripts/{Di0ieRgB.chunk.js.map → d6bZeQ7u.chunk.js.map} +1 -1
  173. package/dist/scripts/{BqAavbCw.chunk.js → dP41rDFl.chunk.js} +2 -2
  174. package/dist/scripts/{BqAavbCw.chunk.js.map → dP41rDFl.chunk.js.map} +1 -1
  175. package/dist/scripts/{BcDguH17.chunk.js → jH3hqwI2.chunk.js} +2 -2
  176. package/dist/scripts/{BcDguH17.chunk.js.map → jH3hqwI2.chunk.js.map} +1 -1
  177. package/dist/scripts/{DL-oEZtF.chunk.js → kUTnu8Iq.chunk.js} +2 -2
  178. package/dist/scripts/{DL-oEZtF.chunk.js.map → kUTnu8Iq.chunk.js.map} +1 -1
  179. package/dist/scripts/{cyDp1kQU.chunk.js → nbVa2u9N.chunk.js} +2 -2
  180. package/dist/scripts/{cyDp1kQU.chunk.js.map → nbVa2u9N.chunk.js.map} +1 -1
  181. package/dist/scripts/{CtTd6EE8.chunk.js → vbpGTzKU.chunk.js} +2 -2
  182. package/dist/scripts/{CtTd6EE8.chunk.js.map → vbpGTzKU.chunk.js.map} +1 -1
  183. package/dist/scripts/{Co_YIZXn.chunk.js → zr54fY9l.chunk.js} +2 -2
  184. package/dist/scripts/{Co_YIZXn.chunk.js.map → zr54fY9l.chunk.js.map} +1 -1
  185. package/package.json +1 -1
  186. package/dist/scripts/BwdSbre5.chunk.js +0 -2
  187. package/dist/scripts/BxcHYWuR.chunk.js +0 -2
  188. package/dist/scripts/C2TRBWPd.chunk.js +0 -2
  189. package/dist/scripts/CD1TqwcB.chunk.js +0 -2
  190. package/dist/scripts/WarFtyTw.chunk.js +0 -2
  191. package/dist/scripts/u96pPes-.chunk.js +0 -2
  192. package/dist/scripts/zDrAtVBw.chunk.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Q3oue8AK.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/interactive/InteractionTypeId.ts","../../../../libs/shared/src/context/VideoActionsContext.tsx","../../src/apps/exchange/hooks/useCommonVideoProps.ts","../../../../libs/shared/src/components/pagination/Pagination.tsx","../../../../../node_modules/@dnd-kit/sortable/dist/sortable.esm.js","../../../../libs/shared/src/components/sortable/SortableItemWrapper.tsx","../../../../libs/shared/src/images/svg/objects/HeartOutlineSvg.tsx","../../../../libs/shared/src/images/svg/objects/HeartSvg.tsx","../../../../libs/shared/src/utils/FavouriteHelpers.ts","../../../../libs/shared/src/components/favourite-button/FavouriteButton.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/videos/VideoWatchProgressBar.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/VideoThumbnailBottomBar.tsx","../../../../libs/shared/src/components/svg-container/SvgContainer2.tsx","../../../../libs/shared/src/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar.tsx","../../../../libs/shared/src/components/thumbnails/plugin-hover/PluginHover.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo.tsx","../../../../libs/shared/src/components/video-type-badge/VideoTypeBadge.tsx","../../../../libs/shared/src/context/player-context/components/GlobalPlayerConsumer.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleSvg.tsx","../../../../libs/shared/src/components/thumbnails/video/expandable/ExpandableVideoThumbnail.tsx","../../../../libs/shared/src/context/VideoPreviewContext.tsx","../../../../libs/shared/src/hooks/UseHoverLogger.ts","../../../../libs/shared/src/components/hover-to-portal-container/hoverToPortalContainerUtil.ts","../../../../libs/shared/src/components/hover-to-portal-container/HoverToPortalContainer.tsx","../../../../libs/shared/src/components/audience-label/AudienceLabel.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-badges/VideoThumbnailBadges.tsx","../../../../libs/shared/src/components/video-list/components/restriction-padlock/RestrictionPadlock.tsx","../../../../libs/shared/src/components/video-title/VideoTitle.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-text/ThumbnailText.tsx","../../../../libs/shared/src/components/video-guidance/tag/VideoGuidanceTag.tsx","../../../../libs/shared/src/components/video-guidance/classroom-guide/ClassroomGuideTag.tsx","../../../../libs/shared/src/components/video-guidance/interactives/InteractivesTag.tsx","../../../../libs/shared/src/components/video-guidance/resources/ResourcesTag.tsx","../../../../libs/shared/src/components/video-list/components/video-guidance/VideoItemGuidance.tsx","../../../../libs/shared/src/components/thumbnails/remove-button/RemoveVideoButton.tsx","../../../../libs/shared/src/components/thumbnails/video/popout/PopoutVideoThumbnail.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleFilledSvg.tsx","../../../../libs/shared/src/components/mask/Mask.tsx","../../../../libs/shared/src/images/svg/status/TickSvg.tsx","../../../../libs/shared/src/components/check-mark-button/CheckMarkButton.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/VideoThumbnailActions.tsx","../../../../libs/shared/src/enums/ThumbnailTextPosition.ts","../../../../libs/shared/src/components/thumbnails/video/static/StaticVideoThumbnail.tsx","../../../../libs/shared/src/components/thumbnails/video/VideoThumbnail.tsx","../../../../libs/shared/src/components/video-list/components/video-item-description/VideoItemDescription.tsx","../../../../libs/shared/src/images/svg/objects/HandleSvg.tsx","../../../../libs/shared/src/components/video-list/components/video-item-left-content/VideoItemLeftContent.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/RestrictionBadge.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge.tsx","../../../../libs/shared/src/components/video-list/components/video-item-title/VideoItemTitle.tsx","../../../../libs/shared/src/components/sign-in-to-watch/SignInToWatch.tsx","../../../../libs/shared/src/components/video-list/components/video-item-actions/VideoItemActions.tsx","../../../../libs/shared/src/components/video-list/components/video-item-top-right/VideoItemTopRight.tsx","../../../../libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","../../../../libs/shared/src/utils/audience-helper/AudienceHelper.ts","../../../../libs/shared/src/hooks/UseMergeAudiences.ts","../../../../libs/shared/src/components/video-list/clip-item/ClipItem.tsx","../../../../libs/shared/src/components/svgs/interaction-types/InteractionTypes.tsx","../../../../libs/shared/src/utils/interaction-type-helper/InteractionTypeHelper.tsx","../../../../libs/shared/src/utils/StripTagsHelper.ts","../../../../libs/shared/src/components/interactive-questions/formatAnnotationText.ts","../../../../libs/shared/src/components/interactive-questions/InteractionLabel.tsx","../../../../libs/shared/src/components/video-list/interactive-item/InteractiveItemQuestions.tsx","../../../../libs/shared/src/components/video-list/interactive-item/InteractiveItem.tsx","../../../../libs/shared/src/components/video-list/video-item/VideoItem.tsx","../../../../libs/shared/src/components/video-list/VideoList.tsx"],"sourcesContent":["export enum InteractionTypeId {\n MultipleChoice = 1,\n ShortAnswer = 2,\n TrueOrFalse = 3,\n Annotation = 4,\n Image = 5,\n MissingWord = 6,\n Illustration = 7\n}\n\nexport const ExperimentalInteractionTypes: Partial<Record<InteractionTypeId, boolean>> = {\n};","import * as React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface VideoActionsOptions {\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\ntype GetVideoActions = (video: VideoTypes, options: VideoActionsOptions) => ActionOptions[];\ntype FetchMoreActions = (video: VideoTypes) => void;\n\ninterface VideoActionsContextData {\n getVideoActions: GetVideoActions;\n fetchMoreActions?: FetchMoreActions;\n}\n\nexport const VideoActionsContext = React.createContext<VideoActionsContextData>(null);","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { Config, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { getSeriesAppLink } from 'apps/exchange/utils/ExchangeUtils';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nfunction getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n return getSeriesAppLink(video.series);\n}\n\nexport function useCommonVideoProps(): UseCommonVideoPropsResult {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasCommonVideoPropsCompleted = (\n config.hasCompleted\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin: false,\n canFavourite: null,\n setFavourite: null,\n yearGroups: null,\n imageCdnUrl: config.data?.imageCdnUrl,\n getClassroomGuideAppLink: null,\n getInteractiveGuidanceAppLink: null,\n getResourceGuidanceAppLink: null,\n showNewVideoIndicator: false,\n getCompanyLogoFallbackUrl: () => null,\n hasStudentExperience: false,\n hasGuestExperience: false,\n features: {\n showClassroomGuide: () => false\n }\n }\n };\n}","import * as React from 'react';\nimport { Button, ButtonProps } from 'react-bootstrap';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nfunction buildCursor(appLink: Core.AppLink, cursorParam: string, prevHack?: boolean): Core.AppLink {\n if (!cursorParam)\n return null;\n\n const currentParams = appLink.params as HashObject ?? {};\n /* \n Currently the pagination for My Videos shows the previous cursor in the first page cursor,\n so instead of using the previous cursor from the response, the current cursor is being passed\n as the previous cursor in the app link\n */\n\n if (prevHack) {\n if (!currentParams?.previous) {\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: null,\n previous: null\n }\n };\n }\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: currentParams?.previous,\n previous: null\n }\n };\n }\n\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: cursorParam,\n previous: currentParams.cursor\n }\n };\n}\n\ninterface CursorPaginationProps {\n cursors: Cursors;\n appLink?: Core.AppLink;\n className?: string;\n buttonVariant?: ButtonProps['variant'];\n prevHack?: boolean;\n scrollTop?: boolean;\n onClick?: (cursor: string) => void;\n}\n\nPagination.defaultProps = {\n className: 'py-2',\n buttonVariant: 'secondary'\n};\n\nexport function Pagination(\n { appLink, cursors, className, buttonVariant, prevHack, scrollTop, onClick }: CursorPaginationProps\n): JSX.Element {\n function onClickButton(page: 'next' | 'previous'): void {\n if (appLink && scrollTop === false)\n ScrollHelper.preventScrollTop();\n\n AnalyticsHelper.logUserAction({ page }, {\n location: LocationContext.Pagination,\n entity: EntityType.Pagination,\n actionType: UserAction.Navigate\n });\n\n if (onClick)\n onClick(cursors[page]);\n }\n\n if (appLink) {\n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <AppLink\n appLink={buildCursor(appLink, cursors.previous, prevHack)}\n className={`btn btn-${buttonVariant} me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='previous' />\n </AppLink>\n \n <AppLink\n appLink={buildCursor(appLink, cursors.next)}\n className={`btn btn-${buttonVariant} ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='next' />\n </AppLink>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n }\n \n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <Button\n variant={buttonVariant}\n className={`me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n >\n <Text phrase='previous' />\n </Button>\n <Button\n variant={buttonVariant}\n className={`btn ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n >\n <Text phrase='next' />\n </Button>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React, { useMemo, useRef, useEffect, useState, useContext } from 'react';\nimport { useDndContext, getClientRect, useDroppable, useDraggable, closestCorners, getFirstCollision, getScrollableAncestors, KeyboardCode } from '@dnd-kit/core';\nimport { useUniqueId, useIsomorphicLayoutEffect, CSS, useCombinedRefs, isKeyboardEvent, subtract } from '@dnd-kit/utilities';\n\n/**\r\n * Move an array item to a different position. Returns a new array with the item moved to the new position.\r\n */\nfunction arrayMove(array, from, to) {\n const newArray = array.slice();\n newArray.splice(to < 0 ? newArray.length + to : to, 0, newArray.splice(from, 1)[0]);\n return newArray;\n}\n\n/**\r\n * Swap an array item to a different position. Returns a new array with the item swapped to the new position.\r\n */\nfunction arraySwap(array, from, to) {\n const newArray = array.slice();\n newArray[from] = array[to];\n newArray[to] = array[from];\n return newArray;\n}\n\nfunction getSortedRects(items, rects) {\n return items.reduce((accumulator, id, index) => {\n const rect = rects.get(id);\n\n if (rect) {\n accumulator[index] = rect;\n }\n\n return accumulator;\n }, Array(items.length));\n}\n\nfunction isValidIndex(index) {\n return index !== null && index >= 0;\n}\n\nfunction itemsEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeDisabled(disabled) {\n if (typeof disabled === 'boolean') {\n return {\n draggable: disabled,\n droppable: disabled\n };\n }\n\n return disabled;\n}\n\n// To-do: We should be calculating scale transformation\nconst defaultScale = {\n scaleX: 1,\n scaleY: 1\n};\nconst horizontalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n rects,\n activeNodeRect: fallbackActiveRect,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n const itemGap = getItemGap(rects, index, activeIndex);\n\n if (index === activeIndex) {\n const newIndexRect = rects[overIndex];\n\n if (!newIndexRect) {\n return null;\n }\n\n return {\n x: activeIndex < overIndex ? newIndexRect.left + newIndexRect.width - (activeNodeRect.left + activeNodeRect.width) : newIndexRect.left - activeNodeRect.left,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: -activeNodeRect.width - itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: activeNodeRect.width + itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale\n };\n};\n\nfunction getItemGap(rects, index, activeIndex) {\n const currentRect = rects[index];\n const previousRect = rects[index - 1];\n const nextRect = rects[index + 1];\n\n if (!currentRect || !previousRect && !nextRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.left - (previousRect.left + previousRect.width) : nextRect.left - (currentRect.left + currentRect.width);\n }\n\n return nextRect ? nextRect.left - (currentRect.left + currentRect.width) : currentRect.left - (previousRect.left + previousRect.width);\n}\n\nconst rectSortingStrategy = _ref => {\n let {\n rects,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const newRects = arrayMove(rects, overIndex, activeIndex);\n const oldRect = rects[index];\n const newRect = newRects[index];\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\nconst rectSwappingStrategy = _ref => {\n let {\n activeIndex,\n index,\n rects,\n overIndex\n } = _ref;\n let oldRect;\n let newRect;\n\n if (index === activeIndex) {\n oldRect = rects[index];\n newRect = rects[overIndex];\n }\n\n if (index === overIndex) {\n oldRect = rects[index];\n newRect = rects[activeIndex];\n }\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\n// To-do: We should be calculating scale transformation\nconst defaultScale$1 = {\n scaleX: 1,\n scaleY: 1\n};\nconst verticalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n activeIndex,\n activeNodeRect: fallbackActiveRect,\n index,\n rects,\n overIndex\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n if (index === activeIndex) {\n const overIndexRect = rects[overIndex];\n\n if (!overIndexRect) {\n return null;\n }\n\n return {\n x: 0,\n y: activeIndex < overIndex ? overIndexRect.top + overIndexRect.height - (activeNodeRect.top + activeNodeRect.height) : overIndexRect.top - activeNodeRect.top,\n ...defaultScale$1\n };\n }\n\n const itemGap = getItemGap$1(rects, index, activeIndex);\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: 0,\n y: -activeNodeRect.height - itemGap,\n ...defaultScale$1\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: 0,\n y: activeNodeRect.height + itemGap,\n ...defaultScale$1\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale$1\n };\n};\n\nfunction getItemGap$1(clientRects, index, activeIndex) {\n const currentRect = clientRects[index];\n const previousRect = clientRects[index - 1];\n const nextRect = clientRects[index + 1];\n\n if (!currentRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.top - (previousRect.top + previousRect.height) : nextRect ? nextRect.top - (currentRect.top + currentRect.height) : 0;\n }\n\n return nextRect ? nextRect.top - (currentRect.top + currentRect.height) : previousRect ? currentRect.top - (previousRect.top + previousRect.height) : 0;\n}\n\nconst ID_PREFIX = 'Sortable';\nconst Context = /*#__PURE__*/React.createContext({\n activeIndex: -1,\n containerId: ID_PREFIX,\n disableTransforms: false,\n items: [],\n overIndex: -1,\n useDragOverlay: false,\n sortedRects: [],\n strategy: rectSortingStrategy,\n disabled: {\n draggable: false,\n droppable: false\n }\n});\nfunction SortableContext(_ref) {\n let {\n children,\n id,\n items: userDefinedItems,\n strategy = rectSortingStrategy,\n disabled: disabledProp = false\n } = _ref;\n const {\n active,\n dragOverlay,\n droppableRects,\n over,\n measureDroppableContainers,\n measuringScheduled\n } = useDndContext();\n const containerId = useUniqueId(ID_PREFIX, id);\n const useDragOverlay = Boolean(dragOverlay.rect !== null);\n const items = useMemo(() => userDefinedItems.map(item => typeof item === 'object' && 'id' in item ? item.id : item), [userDefinedItems]);\n const isDragging = active != null;\n const activeIndex = active ? items.indexOf(active.id) : -1;\n const overIndex = over ? items.indexOf(over.id) : -1;\n const previousItemsRef = useRef(items);\n const itemsHaveChanged = !itemsEqual(items, previousItemsRef.current);\n const disableTransforms = overIndex !== -1 && activeIndex === -1 || itemsHaveChanged;\n const disabled = normalizeDisabled(disabledProp);\n useIsomorphicLayoutEffect(() => {\n if (itemsHaveChanged && isDragging && !measuringScheduled) {\n measureDroppableContainers(items);\n }\n }, [itemsHaveChanged, items, isDragging, measureDroppableContainers, measuringScheduled]);\n useEffect(() => {\n previousItemsRef.current = items;\n }, [items]);\n const contextValue = useMemo(() => ({\n activeIndex,\n containerId,\n disabled,\n disableTransforms,\n items,\n overIndex,\n useDragOverlay,\n sortedRects: getSortedRects(items, droppableRects),\n strategy\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [activeIndex, containerId, disabled.draggable, disabled.droppable, disableTransforms, items, overIndex, droppableRects, useDragOverlay, strategy]);\n return React.createElement(Context.Provider, {\n value: contextValue\n }, children);\n}\n\nconst defaultNewIndexGetter = _ref => {\n let {\n id,\n items,\n activeIndex,\n overIndex\n } = _ref;\n return arrayMove(items, activeIndex, overIndex).indexOf(id);\n};\nconst defaultAnimateLayoutChanges = _ref2 => {\n let {\n containerId,\n isSorting,\n wasDragging,\n index,\n items,\n newIndex,\n previousItems,\n previousContainerId,\n transition\n } = _ref2;\n\n if (!transition || !wasDragging) {\n return false;\n }\n\n if (previousItems !== items && index === newIndex) {\n return false;\n }\n\n if (isSorting) {\n return true;\n }\n\n return newIndex !== index && containerId === previousContainerId;\n};\nconst defaultTransition = {\n duration: 200,\n easing: 'ease'\n};\nconst transitionProperty = 'transform';\nconst disabledTransition = /*#__PURE__*/CSS.Transition.toString({\n property: transitionProperty,\n duration: 0,\n easing: 'linear'\n});\nconst defaultAttributes = {\n roleDescription: 'sortable'\n};\n\n/*\r\n * When the index of an item changes while sorting,\r\n * we need to temporarily disable the transforms\r\n */\n\nfunction useDerivedTransform(_ref) {\n let {\n disabled,\n index,\n node,\n rect\n } = _ref;\n const [derivedTransform, setDerivedtransform] = useState(null);\n const previousIndex = useRef(index);\n useIsomorphicLayoutEffect(() => {\n if (!disabled && index !== previousIndex.current && node.current) {\n const initial = rect.current;\n\n if (initial) {\n const current = getClientRect(node.current, {\n ignoreTransform: true\n });\n const delta = {\n x: initial.left - current.left,\n y: initial.top - current.top,\n scaleX: initial.width / current.width,\n scaleY: initial.height / current.height\n };\n\n if (delta.x || delta.y) {\n setDerivedtransform(delta);\n }\n }\n }\n\n if (index !== previousIndex.current) {\n previousIndex.current = index;\n }\n }, [disabled, index, node, rect]);\n useEffect(() => {\n if (derivedTransform) {\n requestAnimationFrame(() => {\n setDerivedtransform(null);\n });\n }\n }, [derivedTransform]);\n return derivedTransform;\n}\n\nfunction useSortable(_ref) {\n let {\n animateLayoutChanges = defaultAnimateLayoutChanges,\n attributes: userDefinedAttributes,\n disabled: localDisabled,\n data: customData,\n getNewIndex = defaultNewIndexGetter,\n id,\n strategy: localStrategy,\n resizeObserverConfig,\n transition = defaultTransition\n } = _ref;\n const {\n items,\n containerId,\n activeIndex,\n disabled: globalDisabled,\n disableTransforms,\n sortedRects,\n overIndex,\n useDragOverlay,\n strategy: globalStrategy\n } = useContext(Context);\n const disabled = normalizeLocalDisabled(localDisabled, globalDisabled);\n const index = items.indexOf(id);\n const data = useMemo(() => ({\n sortable: {\n containerId,\n index,\n items\n },\n ...customData\n }), [containerId, customData, index, items]);\n const itemsAfterCurrentSortable = useMemo(() => items.slice(items.indexOf(id)), [items, id]);\n const {\n rect,\n node,\n isOver,\n setNodeRef: setDroppableNodeRef\n } = useDroppable({\n id,\n data,\n disabled: disabled.droppable,\n resizeObserverConfig: {\n updateMeasurementsFor: itemsAfterCurrentSortable,\n ...resizeObserverConfig\n }\n });\n const {\n active,\n activatorEvent,\n activeNodeRect,\n attributes,\n setNodeRef: setDraggableNodeRef,\n listeners,\n isDragging,\n over,\n setActivatorNodeRef,\n transform\n } = useDraggable({\n id,\n data,\n attributes: { ...defaultAttributes,\n ...userDefinedAttributes\n },\n disabled: disabled.draggable\n });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const isSorting = Boolean(active);\n const displaceItem = isSorting && !disableTransforms && isValidIndex(activeIndex) && isValidIndex(overIndex);\n const shouldDisplaceDragSource = !useDragOverlay && isDragging;\n const dragSourceDisplacement = shouldDisplaceDragSource && displaceItem ? transform : null;\n const strategy = localStrategy != null ? localStrategy : globalStrategy;\n const finalTransform = displaceItem ? dragSourceDisplacement != null ? dragSourceDisplacement : strategy({\n rects: sortedRects,\n activeNodeRect,\n activeIndex,\n overIndex,\n index\n }) : null;\n const newIndex = isValidIndex(activeIndex) && isValidIndex(overIndex) ? getNewIndex({\n id,\n items,\n activeIndex,\n overIndex\n }) : index;\n const activeId = active == null ? void 0 : active.id;\n const previous = useRef({\n activeId,\n items,\n newIndex,\n containerId\n });\n const itemsHaveChanged = items !== previous.current.items;\n const shouldAnimateLayoutChanges = animateLayoutChanges({\n active,\n containerId,\n isDragging,\n isSorting,\n id,\n index,\n items,\n newIndex: previous.current.newIndex,\n previousItems: previous.current.items,\n previousContainerId: previous.current.containerId,\n transition,\n wasDragging: previous.current.activeId != null\n });\n const derivedTransform = useDerivedTransform({\n disabled: !shouldAnimateLayoutChanges,\n index,\n node,\n rect\n });\n useEffect(() => {\n if (isSorting && previous.current.newIndex !== newIndex) {\n previous.current.newIndex = newIndex;\n }\n\n if (containerId !== previous.current.containerId) {\n previous.current.containerId = containerId;\n }\n\n if (items !== previous.current.items) {\n previous.current.items = items;\n }\n }, [isSorting, newIndex, containerId, items]);\n useEffect(() => {\n if (activeId === previous.current.activeId) {\n return;\n }\n\n if (activeId && !previous.current.activeId) {\n previous.current.activeId = activeId;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n previous.current.activeId = activeId;\n }, 50);\n return () => clearTimeout(timeoutId);\n }, [activeId]);\n return {\n active,\n activeIndex,\n attributes,\n data,\n rect,\n index,\n newIndex,\n items,\n isOver,\n isSorting,\n isDragging,\n listeners,\n node,\n overIndex,\n over,\n setNodeRef,\n setActivatorNodeRef,\n setDroppableNodeRef,\n setDraggableNodeRef,\n transform: derivedTransform != null ? derivedTransform : finalTransform,\n transition: getTransition()\n };\n\n function getTransition() {\n if ( // Temporarily disable transitions for a single frame to set up derived transforms\n derivedTransform || // Or to prevent items jumping to back to their \"new\" position when items change\n itemsHaveChanged && previous.current.newIndex === index) {\n return disabledTransition;\n }\n\n if (shouldDisplaceDragSource && !isKeyboardEvent(activatorEvent) || !transition) {\n return undefined;\n }\n\n if (isSorting || shouldAnimateLayoutChanges) {\n return CSS.Transition.toString({ ...transition,\n property: transitionProperty\n });\n }\n\n return undefined;\n }\n}\n\nfunction normalizeLocalDisabled(localDisabled, globalDisabled) {\n var _localDisabled$dragga, _localDisabled$droppa;\n\n if (typeof localDisabled === 'boolean') {\n return {\n draggable: localDisabled,\n // Backwards compatibility\n droppable: false\n };\n }\n\n return {\n draggable: (_localDisabled$dragga = localDisabled == null ? void 0 : localDisabled.draggable) != null ? _localDisabled$dragga : globalDisabled.draggable,\n droppable: (_localDisabled$droppa = localDisabled == null ? void 0 : localDisabled.droppable) != null ? _localDisabled$droppa : globalDisabled.droppable\n };\n}\n\nfunction hasSortableData(entry) {\n if (!entry) {\n return false;\n }\n\n const data = entry.data.current;\n\n if (data && 'sortable' in data && typeof data.sortable === 'object' && 'containerId' in data.sortable && 'items' in data.sortable && 'index' in data.sortable) {\n return true;\n }\n\n return false;\n}\n\nconst directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];\nconst sortableKeyboardCoordinates = (event, _ref) => {\n let {\n context: {\n active,\n collisionRect,\n droppableRects,\n droppableContainers,\n over,\n scrollableAncestors\n }\n } = _ref;\n\n if (directions.includes(event.code)) {\n event.preventDefault();\n\n if (!active || !collisionRect) {\n return;\n }\n\n const filteredContainers = [];\n droppableContainers.getEnabled().forEach(entry => {\n if (!entry || entry != null && entry.disabled) {\n return;\n }\n\n const rect = droppableRects.get(entry.id);\n\n if (!rect) {\n return;\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Left:\n if (collisionRect.left > rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Right:\n if (collisionRect.left < rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n }\n });\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null\n });\n let closestId = getFirstCollision(collisions, 'id');\n\n if (closestId === (over == null ? void 0 : over.id) && collisions.length > 1) {\n closestId = collisions[1].id;\n }\n\n if (closestId != null) {\n const activeDroppable = droppableContainers.get(active.id);\n const newDroppable = droppableContainers.get(closestId);\n const newRect = newDroppable ? droppableRects.get(newDroppable.id) : null;\n const newNode = newDroppable == null ? void 0 : newDroppable.node.current;\n\n if (newNode && newRect && activeDroppable && newDroppable) {\n const newScrollAncestors = getScrollableAncestors(newNode);\n const hasDifferentScrollAncestors = newScrollAncestors.some((element, index) => scrollableAncestors[index] !== element);\n const hasSameContainer = isSameContainer(activeDroppable, newDroppable);\n const isAfterActive = isAfter(activeDroppable, newDroppable);\n const offset = hasDifferentScrollAncestors || !hasSameContainer ? {\n x: 0,\n y: 0\n } : {\n x: isAfterActive ? collisionRect.width - newRect.width : 0,\n y: isAfterActive ? collisionRect.height - newRect.height : 0\n };\n const rectCoordinates = {\n x: newRect.left,\n y: newRect.top\n };\n const newCoordinates = offset.x && offset.y ? rectCoordinates : subtract(rectCoordinates, offset);\n return newCoordinates;\n }\n }\n }\n\n return undefined;\n};\n\nfunction isSameContainer(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n return a.data.current.sortable.containerId === b.data.current.sortable.containerId;\n}\n\nfunction isAfter(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n if (!isSameContainer(a, b)) {\n return false;\n }\n\n return a.data.current.sortable.index < b.data.current.sortable.index;\n}\n\nexport { SortableContext, arrayMove, arraySwap, defaultAnimateLayoutChanges, defaultNewIndexGetter, hasSortableData, horizontalListSortingStrategy, rectSortingStrategy, rectSwappingStrategy, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy };\n//# sourceMappingURL=sortable.esm.js.map\n","import React from 'react';\nimport { DraggableAttributes } from '@dnd-kit/core';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ntype DragDirection = 'up' | 'down';\n\nexport type PropsWithSortableItemProps<T> = T & {\n dragAttributes?: DraggableAttributes;\n dragListeners?: HashObject;\n dragDirection?: DragDirection;\n};\n\ninterface SortableItemWrapperProps<TProps> {\n id: string;\n disabled?: boolean;\n childProps: TProps;\n childComponent: (props: PropsWithSortableItemProps<TProps>) => JSX.Element;\n}\n\nfunction getDragDirection(index: number, activeIndex: number, overIndex: number): DragDirection {\n if (activeIndex !== index)\n return null;\n\n if (overIndex > activeIndex)\n return 'down';\n\n if (overIndex < activeIndex)\n return 'up';\n\n return null;\n}\n\nexport function SortableItemWrapper<TProps>(props: SortableItemWrapperProps<TProps>): JSX.Element {\n const {\n setNodeRef,\n transform,\n transition,\n isSorting,\n listeners,\n attributes,\n activeIndex,\n overIndex,\n index\n } = useSortable({ id: props.id, disabled: props.disabled });\n\n const style: HashObject = {\n transform: CSS.Transform.toString(transform),\n transition,\n touchAction: 'none',\n position: 'relative'\n };\n\n if (isSorting && index === activeIndex) {\n style.visibility = 'hidden';\n }\n\n const Children = props.childComponent;\n const dragDirection = getDragDirection(index, activeIndex, overIndex);\n\n return (\n <Children\n {...props.childProps}\n ref={setNodeRef}\n style={style}\n dragListeners={listeners}\n dragAttributes={attributes}\n dragDirection={dragDirection}\n />\n );\n}","import React from 'react';\n\nexport function HeartOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805m.812-10.7.001-.004.007-.022.03-.097a5.83 5.83 0 0 1 .744-1.463c.565-.798 1.428-1.532 2.72-1.532 2.03 0 3.516 1.72 3.516 3.866 0 1.445-.713 2.686-2.089 4.119-.944.984-2.151 2.01-3.579 3.224-.575.49-1.187 1.01-1.832 1.57-.645-.56-1.257-1.08-1.832-1.57-1.428-1.214-2.635-2.24-3.58-3.224C5.214 12.11 4.5 10.869 4.5 9.423c0-2.146 1.487-3.865 3.517-3.865 1.29 0 2.154.734 2.719 1.532a5.8 5.8 0 0 1 .774 1.56l.007.022v.004a.5.5 0 0 0 .965 0'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function HeartSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillOpacity={0.9}\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805'\n />\n </svg>\n );\n}\n","import { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CurrentUser, User, Video, VideoTypes } from 'libs/shared/interfaces';\n\nimport { VideoHelper } from './VideoHelper';\n\nexport const FavouriteHelper = {\n\n /**\n * This helper is based on a *critical* assumption that the with statement\n * retrieving the favouritedBy collection uses a filter for the current user's id.\n * \n * The reason we're not passing the current user as an arg is that we would need to \n * drill the user object all the way down to low level componenets.\n * \n * @param object \n */\n isFavouritedByCurrentUser(object: HashObject): boolean {\n return !!(object?.favouritedBy?.data.length === 1);\n },\n\n /**\n * Determine whether the user has favourited the object\n * \n * @param object \n */\n isFavouritedByUser(object: HashObject, user: User): boolean {\n return !!(ArrayHelper.findWhere(object?.favouritedBy?.data, { id: user?.id }));\n },\n\n updateVideoState(video: VideoTypes, user: CurrentUser | User, shouldFavourite: boolean): VideoTypes {\n return {\n id: video.id,\n favouritedBy: {\n data: shouldFavourite ? [{ id: user.id } as User] : [],\n pagination: { limit: 25, cursors: { next: '', previous: '' } }\n }\n };\n },\n\n showFavouriteButton(video: Video, isHovering: boolean): boolean {\n if (!VideoHelper.getCanBeConsumed(video)?.canConsume)\n return false;\n\n if (isHovering)\n return true;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n if (FavouriteHelper.isFavouritedByCurrentUser(video))\n return true;\n\n return false;\n }\n};\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { HeartOutlineSvg } from 'libs/shared/images/svg/objects/HeartOutlineSvg';\nimport { HeartSvg } from 'libs/shared/images/svg/objects/HeartSvg';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './favourite-button.module.scss';\n\nconst namespace = 'shared.favouriteButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FavouriteButtonProps {\n video: VideoTypes;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n className?: string;\n analyticsData?: HashObject,\n analyticsOptions?: AnalyticsOptions\n preventFocus?: boolean;\n}\n\nexport function FavouriteButton(props: FavouriteButtonProps): JSX.Element {\n const alerts = useAlerts();\n\n const initialState = FavouriteHelper.isFavouritedByCurrentUser(props.video);\n\n // Use local state so that changes are reflected immediately.\n const [ isFavourite, setIsFavourite ] = React.useState(initialState);\n\n React.useEffect(() => {\n setIsFavourite(initialState);\n }, [initialState]);\n\n const flexClasses = 'd-flex align-items-center justify-content-center';\n let className = `${flexClasses} cursor-pointer ${styles.favouriteButton} ${isFavourite ? styles.favourited : ''}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n function onClick(): void {\n const shouldFavourite = !isFavourite;\n\n function onError(): void {\n function getErrorPhraseKey(): string {\n if (VideoHelper.isClip(props.video))\n return shouldFavourite ? 'favouriteClipError' : 'unfavouriteClipError';\n\n if (VideoHelper.isInteractive(props.video))\n return shouldFavourite ? 'favouriteInteractiveError' : 'unfavouriteInteractiveError';\n\n return shouldFavourite ? 'favouriteVideoError' : 'unfavouriteVideoError';\n }\n\n alerts.error(getPhrase(getErrorPhraseKey()));\n setIsFavourite(!shouldFavourite);\n }\n\n setIsFavourite(shouldFavourite);\n props.setFavourite(props.video, shouldFavourite, null, onError, props.analyticsData, props.analyticsOptions);\n }\n\n if (!FunctionHelper.isFunction(props.setFavourite) || !FunctionHelper.isFunction(props.canFavourite))\n return <></>;\n\n // Don't render until we know the state of isFavourite\n if (!props.canFavourite(props.video))\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} tabIndex={props.preventFocus ? -1 : undefined}>\n {/* We have the two svgs because they get swapped out on hover by the styles */}\n <SvgContainer\n svg={HeartSvg}\n className={`svg-container ${styles.heart}`}\n />\n <SvgContainer\n svg={HeartOutlineSvg}\n className={`svg-container ${styles.heartOutline}`}\n />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoWatchProgressBarProps {\n video: Video;\n}\n\nexport function VideoWatchProgressBar(props: VideoWatchProgressBarProps): JSX.Element {\n const progress = VideoHelper.getVideoProgress(props.video);\n\n const watchPercentage = progress && props.video.duration\n && progress / props.video.duration * 100000;\n\n if (!watchPercentage)\n return <></>;\n\n return <div className='bg-primary h-100' style={{ width: `${watchPercentage}%` }} />;\n}","import React from 'react';\n\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { VideoWatchProgressBar } from './videos/VideoWatchProgressBar';\n\nimport styles from './video-thumbnail-bottom-bar.module.scss';\n\ninterface VideoThumbnailBottomBarProps {\n video: VideoTypes;\n}\n\nexport function VideoThumbnailBottomBar(props: VideoThumbnailBottomBarProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video)) {\n return <></>;\n }\n\n return (\n <div className={styles.bottomBar}>\n <VideoWatchProgressBar video={props.video} />\n </div>\n );\n}","import * as React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { SvgContainerSize } from './SvgContainer'; // TODO: Move this enum in here\n\nconst DEFAULT_CLASS_NAME = 'd-inline-block svg-container';\nconst DEFAULT_TAG_NAME = 'span';\n\ninterface SvgContainerProps2 {\n size?: SvgContainerSize;\n className?: string;\n tagName?: React.ElementType;\n onClick?: (...args: any[]) => void;\n title?: string;\n tooltipPlacement?: Placement;\n}\n\n/**\n * @deprecated please use SvgContainer instead. This component will be removed in the future\n * whenever someone gets around to it (that could be you!)\n */\nexport function SvgContainer2(props: React.PropsWithChildren<SvgContainerProps2>): React.ReactElement {\n const {\n children,\n className = DEFAULT_CLASS_NAME,\n tagName = DEFAULT_TAG_NAME,\n size = SvgContainerSize.Standard,\n onClick,\n title,\n tooltipPlacement = 'right'\n } = props;\n\n const Container = tagName;\n\n const containerProps = {\n className: `${className} svg-container ${size}`,\n onClick: FunctionHelper.isFunction(onClick) ? onClick : null\n };\n\n if (!title)\n return <Container {...containerProps}>{children}</Container>;\n\n return (\n <Tooltip title={title} placement={tooltipPlacement}>\n <Container {...containerProps}>\n {children}\n </Container>\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './lite-owner-avatar.module.scss';\n\ninterface LiteOwnerAvatarProps {\n video: VideoTypes;\n imageCdnUrl: string;\n size?: VideoItemSize;\n}\n\nexport function LiteOwnerAvatar(props: LiteOwnerAvatarProps): JSX.Element {\n if (!VideoHelper.isInteractive(props.video) && !VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._liteOwner && !props.video._isClickViewCurated?.value)\n return <></>;\n\n if (props.video._isClickViewCurated?.value) {\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1 rounded-circle position-relative bg-white`}>\n <SvgContainer2 className={props.size === 'sm' ? styles.smIcon : styles.stdIcon}>\n <ClickViewLogoMark />\n </SvgContainer2>\n </div>\n );\n }\n\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.video._liteOwner.name, props.video._liteOwner.surname)}\n imageUrl={props.video._liteOwner.avatar?.url}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './plugin-hover.module.scss';\n\nconst namespace = 'shared.pluginHover';\n\ninterface PluginHoverProps {\n isPlugin: boolean;\n isPluginPopup: boolean;\n className?: string;\n onClick?: () => void;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function PluginHover(props: PluginHoverProps): JSX.Element {\n if (!props.isPlugin || props.isPluginPopup)\n return <></>;\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n onClick={props.onClick}\n className={`\n position-absolute top-0 start-0 end-0 bottom-0 opacity-0 cursor-pointer\n ${styles.pluginHover}\n ${props.className ? props.className : ''}\n `}\n >\n <span className='position-absolute top-50 start-50 translate-middle text-nowrap h4 text-white'>\n <Text namespace={namespace} phrase='embed' />\n </span>\n </AppLink>\n );\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\n\nimport styles from './thumbnail-padlock.module.scss';\n\ninterface ThumbnailPadlockProps {\n size?: VideoItemSize;\n}\n\nexport function ThumbnailPadlock(props: ThumbnailPadlockProps): JSX.Element {\n const svgSize = props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard;\n\n return (\n <div className={`${styles.padlock} ${props.size === 'sm' ? styles.sm : ''} bg-white cursor-default d-flex align-items-center justify-content-center`}>\n <SvgContainer svg={LockSvg} size={svgSize} />\n </div>\n );\n}","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './thumbnail-company-logo.module.scss';\n\ninterface ThumbnailCompanyLogoProps {\n companyLogoFallbackUrl: string;\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nThumbnailCompanyLogo.defaultProps = {\n size: 'md'\n};\n\nexport function ThumbnailCompanyLogo(props: ThumbnailCompanyLogoProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video) || !props.companyLogoFallbackUrl)\n return <></>;\n\n const company = props.video.productionCompanies?.data?.[0];\n const url = ImageHelper.createUrl(company?.logo?.url ?? props.companyLogoFallbackUrl, { size: ImageSize.Small });\n const logoFallbackBgClassName = getBgColorClass(company.name, BG_COLOUR_CLASS_NAMES);\n \n if (!url)\n return <></>;\n\n return (\n <div>\n <Tooltip\n title={company?.name}\n spanHack\n >\n <div\n className={`${styles.logo} ${props.size === 'sm' ? styles.sm : ''} ${!company?.metadata?.colour && logoFallbackBgClassName}`}\n style={{\n backgroundImage: `url(${url})`,\n backgroundColor: company?.metadata?.colour\n }}\n />\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces/VideoTypes';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TypeBadge } from '../type-badge/TypeBadge';\n\ninterface VideoTypeBadgeProps {\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nVideoTypeBadge.default = {\n size: 'md'\n};\n\nexport function VideoTypeBadge(props: VideoTypeBadgeProps): JSX.Element {\n if (VideoHelper.isClip(props.video))\n return <TypeBadge typeId={MasterType.Clip} size={props.size} inContainer />;\n\n if (VideoHelper.isInteractive(props.video))\n return (\n <TypeBadge\n typeId={MasterType.Interactive}\n status={props.video.status}\n size={props.size}\n inContainer\n />\n );\n\n return <></>;\n}","import React from 'react';\nimport { OutPortal } from 'react-reverse-portal';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './global-player-consumer.module.scss';\n\ninterface GlobalPlayerConsumerOptions extends PlayerInitializationData {\n location?: 'popout-video' | 'play-page';\n}\n\nexport function GlobalPlayerConsumer(props: GlobalPlayerConsumerOptions): JSX.Element {\n const playerContext = usePlayerContext();\n\n playerContext.useInitialize?.(props);\n\n if (!playerContext.hasProvider)\n return <></>;\n\n if (playerContext.mode === 'picture-in-picture')\n return <></>;\n\n if (props.mode === 'hover' && playerContext.isOnPlayPage)\n return <></>;\n \n if (props.location === 'play-page') {\n // we don't want to add theatreModeOn style for interactive preview\n const theatreMode = playerContext.defaultDisplayMode === 'theatre' && props.objectTypeId !== MasterType.Interactive;\n return (\n <div className={theatreMode ? `w-100 h-100 ${styles.theatreModeOn}` : ''}>\n <OutPortal node={playerContext.portalNode} />\n </div>\n );\n }\n\n if (playerContext.mode !== 'hover')\n return <></>;\n\n /**\n * When hovering, we don't want to show the player until the video has started playing.\n */\n const shouldShow = playerContext.started;\n\n let rounding = 'rounded-3';\n if (props.location === 'popout-video')\n rounding = 'rounded-top-3';\n\n const className = `${styles.hoverContainer} ${shouldShow ? styles.hovering : ''} ${rounding} overflow-hidden`;\n\n /**\n * If the user clicks before GlobalPlayerView calls setPlayerMode('hover') to bind the click handler,\n * we still need to persist the player reference in the PlayerContext. Otherwise it will be set to null. - Sha\n */\n function onClick(): void {\n if (!props.appLink)\n return;\n\n playerContext.setPersist();\n }\n\n return (\n <AppLink className={className} onClick={onClick} appLink={props.appLink}>\n <OutPortal node={playerContext.portalNode} />\n </AppLink>\n );\n}","import React from 'react';\n\nexport function PlayCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { ExpandableVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { CloseCaptionBadgeSvg } from 'libs/shared/images/svg/status/CloseCaptionBadgeSvg';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './expandable-video-thumbnail.module.scss';\n\nfunction getTitleClass(hovering: boolean): string {\n let className = 'mb-1';\n\n if (hovering) {\n className += styles.downScale;\n }\n \n return className;\n}\n\nexport function ExpandableVideoThumbnail(props: ExpandableVideoThumbnailProps): JSX.Element {\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(props.video);\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(props.appLink?.params) ? props.appLink?.params as HashObject : {};\n\n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n };\n\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, props.hovering);\n const isVideo = VideoHelper.isVideo(props.video);\n\n const rating = VideoHelper.getRating(props.video);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n\n const showThumbnailPreviewVideo = isThumbnailHovering && canConsume && hoverToPlay;\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <div className='position-relative rounded-3 overflow-hidden' ref={thumbnailHoverRef}>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className='rounded-3'\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n\n {showFavouriteButton &&\n <div className={styles.topRightContainer}>\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n />\n </div>\n }\n {/* top right */}\n {!canNavigate && (\n <div className={styles.topRightContainer}>\n <ThumbnailPadlock />\n </div>\n )}\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={props.video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n\n <VideoTypeBadge video={props.video} />\n\n <ThumbnailCompanyLogo\n video={props.video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(props.video)}\n />\n </div>\n\n <BaseImage\n data={VideoHelper.getThumbnail(props.video)}\n appLink={canNavigate ? props.appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={props.imageOptions}\n preload={props.preload}\n className={styles.gradient}\n alt={('series' in props.video && props.video.series?.name ? `${props.video.series.name}: ` : '') + props.video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n >\n {!!(props.hovering && canNavigate) && (\n <SvgContainer className={styles.playIcon} svg={PlayCircleSvg} />\n )}\n\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n <div className={styles.overlay}>\n <div className={`${getTitleClass(props.hovering)} ${styles.title}`}>\n {isVideo && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-shadow clamp-1'\n video={props.video}\n appLink={null}\n analyticsOptions={null}\n />\n )}\n\n <span className='h6 text-reset text-shadow clamp-1'>\n {VideoHelper.getTitle(props.video)}\n </span>\n </div>\n\n <VideoThumbnailBottomBar video={props.video} />\n\n {props.hovering && (\n <BadgeListContainer className='mt-1'>\n {VideoHelper.isVideo(props.video) && (\n <>\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n {props.video.hasSubtitle && (\n <span className='badge p-0'>\n <SvgContainer svg={CloseCaptionBadgeSvg} />\n </span>\n )}\n <Badge\n type={BadgeType.Interactive}\n data={props.video.hasInteractives}\n />\n <Badge\n type={BadgeType.DurationExact}\n data={VideoHelper.getDuration(props.video)}\n />\n </>\n )}\n </BadgeListContainer>\n )}\n </div>\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={canNavigate ? props.appLink : null}\n />\n }\n </div>\n </Tooltip>\n );\n}","import React from 'react';\nimport { HtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\ninterface VideoPreviewContext {\n setPreviewContentNode?: (node: HtmlPortalNode) => void;\n}\n\nexport const VideoPreviewContext = React.createContext<VideoPreviewContext>({});\n\nexport const VideoPreviewContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ node, setNode ] = React.useState<HtmlPortalNode>(null);\n\n return (\n <VideoPreviewContext.Provider value={{ setPreviewContentNode: setNode }}>\n {node && (\n <OutPortal node={node}/>\n )}\n {props.children}\n </VideoPreviewContext.Provider>\n );\n};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nexport function useHoverLogger(\n isHovering: boolean,\n analyticsData: HashObject,\n analyticsOptions: AnalyticsOptions\n): void {\n const [ hasHovered, setHasHovered ] = React.useState(isHovering);\n const timeStartedHovering = React.useRef<Date>(isHovering ? new Date() : null);\n\n React.useEffect(() => {\n if (!analyticsData || !analyticsOptions)\n return;\n\n if (!analyticsOptions.entity || !analyticsData.location)\n return;\n\n if (isHovering) {\n if (!hasHovered)\n setHasHovered(true);\n\n timeStartedHovering.current = new Date();\n\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Hover\n });\n } else {\n if (!hasHovered)\n return;\n\n const timeHoveredInMilliseconds = new Date().getTime() - timeStartedHovering.current.getTime();\n timeStartedHovering.current = null;\n\n AnalyticsHelper.logUserAction({\n ...analyticsData,\n timeHoveredInMilliseconds,\n timeHoveredInSeconds: timeHoveredInMilliseconds / 1000\n }, {\n ...analyticsOptions,\n actionType: UserAction.Unhover\n });\n }\n }, [isHovering]);\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nconst EDGE_THRESHOLD = 8; // in px\nconst DEFAULT_SCALE = 1.2; // if no fixedWidth provided\n\nenum TransformOrigin {\n Left='8px',\n Right='calc(100% - 8px)',\n Center='center'\n}\n\ninterface ParentRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type HoverPositionConfig={\n width: number;\n height: number;\n top: number;\n left: number;\n transformOrigin: TransformOrigin;\n position: string;\n originalWidth: number;\n originalHeight: number;\n}\n\nexport const calculatePosition = (\n parentDOMRect: ParentRect,\n fixedWith?: number,\n minWidth?: number,\n scale: number = DEFAULT_SCALE\n): HoverPositionConfig | HashObject => {\n const { x, y, width, height } = parentDOMRect;\n \n const contentReferenceEle = document.getElementById('content-width-reference');\n if (!contentReferenceEle) return {};\n\n let newX: number;\n\n let previewWidth = fixedWith || width * scale;\n let previewHeight = fixedWith ? fixedWith * (height / width) : height * scale;\n\n let realScale = fixedWith ? previewWidth / width : scale;\n newX = x - (previewWidth - width) / 2 ;\n\n if (previewWidth < minWidth) {\n newX = newX - (minWidth - previewWidth) / 2;\n previewWidth = minWidth;\n realScale = previewWidth / width;\n previewHeight = height * realScale;\n }\n\n const newY = y - (previewHeight - height) / 2 + window.scrollY;\n let left = newX;\n let transformOrigin = TransformOrigin.Center;\n // too close to the left\n if (newX - contentReferenceEle.offsetLeft < EDGE_THRESHOLD) {\n left = x - EDGE_THRESHOLD / 2;\n transformOrigin = TransformOrigin.Left;\n }\n // too close to the right\n if (contentReferenceEle.offsetWidth + contentReferenceEle.offsetLeft - (newX + previewWidth) < EDGE_THRESHOLD) {\n left = fixedWith ? x + width - fixedWith : x - width * (realScale - 1) + EDGE_THRESHOLD;\n transformOrigin = TransformOrigin.Right;\n }\n\n return { left, top: newY, height: previewHeight, width: previewWidth, transformOrigin, position: 'absolute', originalWidth: width, originalHeight: height };\n};","import React from 'react';\nimport { createHtmlPortalNode, InPortal } from 'react-reverse-portal';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { VideoPreviewContext } from 'libs/shared/context/VideoPreviewContext';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useHoverLogger } from 'libs/shared/hooks/UseHoverLogger';\n\nimport { calculatePosition, HoverPositionConfig } from './hoverToPortalContainerUtil';\n\nimport styles from './hover-to-portal-container.module.scss';\n\nexport interface HoverableProps {\n isHovering: boolean;\n thumbnailHoverRef?: any;\n hoverPositionConfig?: HoverPositionConfig | HashObject;\n cleanPortalNode?: () => void;\n}\n\ninterface HoverToPortalContainerProps<T=any> {\n hoverableComponent: (props: HoverableProps) => JSX.Element;\n componentProps: T;\n fixedHoverWidth?: number;\n minHoverWidth?: number;\n hoverScale?: number\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function HoverToPortalContainer<T=any>(props: HoverToPortalContainerProps<T>): JSX.Element {\n const { hoverableComponent, componentProps, minHoverWidth, fixedHoverWidth, hoverScale } = props;\n const { setPreviewContentNode } = React.useContext(VideoPreviewContext);\n if (setPreviewContentNode === undefined) {\n Core.ErrorHelper.throw(new DevError(`Please use VideoPreviewContext inside a VideoPreviewContextProvider`));\n }\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const [ hoverCardRef, isHoverCardHovering ] = useHover<HTMLDivElement>();\n\n // eslint-disable-next-line\n const [ debugShow, setDebugShow ] = React.useState(false);\n\n const videoPositionRef = React.useRef<HTMLDivElement>(null);\n const prevStatus = React.useRef<boolean>(false);\n const currentIsHovering = isThumbnailHovering || isHoverCardHovering;\n\n useHoverLogger(currentIsHovering, props.analyticsData, props.analyticsOptions);\n\n React.useEffect(() => {\n if (prevStatus.current === currentIsHovering)\n return;\n if (currentIsHovering || debugShow) {\n setPreviewContentNode(portalNode);\n } else {\n setPreviewContentNode(null);\n }\n prevStatus.current = currentIsHovering;\n }, [currentIsHovering]);\n\n /**\n * Uncomment this if you want the hover to portal container to persist after a single hover\n * so you can inspect it's html - Sha\n */\n // React.useEffect(() => {\n // if (currentIsHovering)\n // setDebugShow(true);\n // }, [currentIsHovering]);\n\n const { x, y, width, height } = videoPositionRef.current?.getBoundingClientRect?.() || {};\n\n const hoverPositionConfig = React.useMemo(\n () => calculatePosition({ x, y, width, height }, fixedHoverWidth, minHoverWidth, hoverScale),\n [ x, y, width, height, hoverScale ]\n );\n const scale = hoverPositionConfig ? hoverPositionConfig.originalWidth / hoverPositionConfig.width : 1;\n\n const HoverableComponent = hoverableComponent;\n\n return (\n <div ref={videoPositionRef} >\n <div ref={thumbnailHoverRef}>\n <HoverableComponent isHovering={false} {...componentProps}/>\n </div>\n\n {(currentIsHovering || debugShow) && (\n <InPortal node={portalNode}>\n <div\n className={`${styles.positionWrapper} ${styles.animationWrapper}`}\n style={{\n '--scale': scale,\n ...hoverPositionConfig\n } as unknown as React.CSSProperties}\n ref={hoverCardRef}\n >\n <HoverableComponent\n isHovering={true}\n hoverPositionConfig={hoverPositionConfig}\n cleanPortalNode={() => setPreviewContentNode(null)}\n {...componentProps}/>\n </div>\n </InPortal>\n )}\n </div>\n );\n}\n\nHoverToPortalContainer.ReferenceContainer = (props: React.PropsWithChildren) => {\n return (\n <div id='content-width-reference' className='flex-grow-1'>\n {props.children}\n </div>\n );\n};\n","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.module.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { Audience, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-thumbnail-badges.module.scss';\n\ninterface VideoThumbnailBadgesProps {\n video?: Video;\n audience?: Audience;\n hideRating?: boolean;\n hideDuration?: boolean;\n newDurationStyle?: boolean;\n size?: VideoItemSize;\n duration?: number;\n}\n\nVideoThumbnailBadges.defaultProps = {\n newDurationStyle: true,\n size: 'md'\n};\n\nexport function VideoThumbnailBadges(props: VideoThumbnailBadgesProps): JSX.Element {\n const rating = VideoHelper.getRating(props.video);\n\n const showAudience = !!props.audience && props.size !== 'sm';\n const showRating = !showAudience && !props.hideRating && !!rating && props.size !== 'sm';\n\n if (props.hideDuration && !showAudience && !showRating)\n return <></>;\n\n return (\n <BadgeListContainer className={`${styles.badgeContainer} ${props.size === 'sm' ? styles.sm : ''}`}>\n {showAudience && (\n <AudienceLabel\n audience={props.audience}\n className='bg-white text-dark'\n border='dark'\n />\n )}\n {showRating && (\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n )}\n {!props.hideDuration && (\n <Badge\n type={props.newDurationStyle ? BadgeType.DurationApproximate : BadgeType.DurationExact}\n data={props.duration || VideoHelper.getDuration(props.video)}\n />\n )}\n </BadgeListContainer>\n );\n}","import React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface RestrictionPadlockProps {\n tooltip?: string;\n className?: string;\n tooltipPlacement?: Placement\n size?: VideoItemSize;\n video: VideoTypes;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionPadlock(props: RestrictionPadlockProps): JSX.Element {\n if (!props.yearGroups)\n return <></>;\n\n const title = RestrictionHelper.mapRestrictionToText(props.video._restrictions, props.yearGroups);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canConsume || !title)\n return <></>;\n\n return (\n <Tooltip\n spanHack\n spanHackClassName={props.className || 'd-inline-block ps-1'}\n title={title}\n placement={props.tooltipPlacement || 'top'}\n >\n <SvgContainer\n svg={LockSvg}\n size={props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard}\n />\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './video-title.module.scss';\n\nconst namespace = 'shared.videoTitle';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst TODAY = new Date();\n\nexport type VideoTitleSizes = 'h4' | 'h5' | 'h6';\n\ninterface VideoTitleProps {\n video: Video;\n yearGroups?: YearGroup[];\n showNewVideoIndicator?: boolean;\n title?: string;\n showPadlock: boolean;\n\n lockSize?: 'sm' | 'md';\n titleSize?: VideoTitleSizes;\n className?: string;\n}\n\nfunction isDateInCurrentMonth(target: string) {\n return DateHelper.isSame(target, TODAY, 'year') && DateHelper.isSame(target, TODAY, 'month');\n}\n\nVideoTitle.defaultProps = {\n titleSize: 'h6',\n className: ''\n};\n\nexport function VideoTitle(props: VideoTitleProps): JSX.Element {\n const dateRelease = props.video.dateReleased;\n const isCurrentMonth = dateRelease && isDateInCurrentMonth(dateRelease);\n\n const shouldShowNewVideoIndicator = props.showNewVideoIndicator\n && isCurrentMonth\n && props.video._isClickViewCurated?.value;\n\n return (\n <>\n <Tooltip\n title={`${shouldShowNewVideoIndicator ? getPhrase('newVideo') : ''}`}\n spanHack\n spanHackClassName='d-inline-block'\n >\n {shouldShowNewVideoIndicator && (\n <span className={`rounded-circle bg-green d-inline-block me-1 ${styles.dot} ${props.titleSize === 'h6' ? styles.smallText : ''}`} />\n )}\n </Tooltip>\n\n <h2 className={`${props.titleSize} ${styles.title} ${props.className} d-inline`}>\n {props.title || props.video.name}\n </h2>\n\n {props.showPadlock && (\n <RestrictionPadlock\n video={props.video}\n yearGroups={props.yearGroups}\n size={props.lockSize}\n />\n )}\n </>\n );\n}\n\n","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopoutVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './thumbnail-text.module.scss';\n\ntype VideoThumbnailTextProps = Pick<PopoutVideoThumbnailProps, 'video'|'appLink'|'commonVideoProps'>\n\nexport function ThumbnailText(props: VideoThumbnailTextProps): JSX.Element {\n const { video, appLink } = props;\n const { canNavigate } = VideoHelper.getCanBeConsumed(video);\n\n return (\n <div className={`mt-2 ${styles.container}`}>\n <div className={`d-flex flex-column ${styles.titleContainer}`}>\n {VideoHelper.isVideo(video) && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-truncate'\n video={video}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n )}\n <AppLink className='text-reset clamp-2 align-middle' appLink={canNavigate ? appLink : null}>\n <VideoTitle\n video={props.video}\n yearGroups={props.commonVideoProps.yearGroups}\n lockSize='sm'\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { AppLink } from '../../app-link/AppLink';\n\nimport styles from './video-guidance-tag.module.scss';\n\ninterface VideoGuidanceTagProps {\n text: string;\n svg: SvgIcon;\n iconVariant: string;\n active?: boolean;\n appLink?: Core.AppLink;\n appLinkAnalyticsData?: HashObject;\n appLinkAnalyticsOptions?: AnalyticsOptions;\n theme?: {\n tabLabel?: string;\n container?: string;\n }\n}\n\nfunction ContainerWrapper(props: VideoGuidanceTagProps): JSX.Element {\n if (props.appLink) {\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.appLinkAnalyticsData}\n analyticsOptions={props.appLinkAnalyticsOptions}\n className={`\n p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer\n text-decoration-none ${props.theme?.container} ${styles.tag} ${props.active ? styles.active : ''}\n `}\n >\n <VideoGuidanceTag {...props} />\n </AppLink>\n );\n }\n\n return (\n <div\n className={`p-1 pe-2 rounded-pill d-inline-flex align-items-center ${props.theme?.container} ${styles.tag} ${styles.disabled}`}\n >\n <VideoGuidanceTag {...props} />\n </div>\n );\n}\n\nfunction VideoGuidanceTag(props: VideoGuidanceTagProps): JSX.Element {\n return (\n <>\n <SvgContainer\n className={`${styles.icon} rounded-circle bg-${props.iconVariant} text-white`}\n svg={props.svg}\n />\n\n <span className={`ps-1 text-nowrap user-select-none ${props.theme?.tabLabel}`}>\n {props.text}\n </span>\n </>\n );\n}\n\nexport { ContainerWrapper as VideoGuidanceTag };","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.classroomGuideTag';\n\ninterface ClassroomGuideTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ClassroomGuideTag(props: ClassroomGuideTagProps): JSX.Element {\n if (!props.video || VideoHelper.isInteractive(props.video) || VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._hasCurriculumLinks?.value)\n return <></>;\n\n return (\n <VideoGuidanceTag\n theme={{\n container: 'classroom-guide-tag',\n tabLabel: 'classroom-guide-tag-label'\n }}\n svg={GraduationCapSvg}\n iconVariant='navy'\n text={LanguageService.getPhrase(namespace, 'curriculum')}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'curriculum',\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { InteractiveSvg } from 'libs/shared/images/svg/objects/InteractiveSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.interactivesTag';\n\ninterface InteractivesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function InteractivesTag(props: InteractivesTagProps): JSX.Element {\n if (!VideoHelper.showInteractivesGuidance(props.video))\n return <></>;\n \n const interactiveCount = !VideoHelper.isInteractive(props.video) && (props.video.interactives?.data.length || 0);\n\n return (\n <VideoGuidanceTag\n svg={InteractiveSvg}\n iconVariant='green'\n text={LanguageService.getPhrase(namespace, 'interactives', { smartCount: interactiveCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'interactive',\n videoGuidanceTotalItems: interactiveCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { ResourcesSvg } from 'libs/shared/images/svg/objects/ResourcesSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.resourcesTag';\n\nfunction getResourceCount(video: VideoTypes): number {\n if (VideoHelper.isInteractive(video))\n return 0;\n\n return (\n (video.resources?.data.length || 0) +\n (video.links?.data.length || 0)\n );\n}\n\ninterface ResourcesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ResourcesTag(props: ResourcesTagProps): JSX.Element {\n if (!VideoHelper.showResourcesGuidance(props.video))\n return <></>;\n\n const resourceCount = getResourceCount(props.video);\n\n return (\n <VideoGuidanceTag\n svg={ResourcesSvg}\n iconVariant='indigo'\n text={LanguageService.getPhrase(namespace, 'resources', { smartCount: resourceCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'resource',\n videoGuidanceTotalItems: resourceCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { ClassroomGuideTag } from 'libs/shared/components/video-guidance/classroom-guide/ClassroomGuideTag';\nimport { InteractivesTag } from 'libs/shared/components/video-guidance/interactives/InteractivesTag';\nimport { ResourcesTag } from 'libs/shared/components/video-guidance/resources/ResourcesTag';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemGuidanceProps {\n video: VideoTypes;\n getVideoAppLink?: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n containerClassName: string;\n responsiveClassName?: string;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function VideoItemGuidance(props: VideoItemGuidanceProps): JSX.Element {\n const showingResourcesAndInteractives = (\n VideoHelper.showInteractivesGuidance(props.video) &&\n VideoHelper.showResourcesGuidance(props.video)\n );\n\n const showClassroomGuide = props.commonVideoProps.features.showClassroomGuide(props.video);\n\n return (\n <div className={`${props.containerClassName} ${showingResourcesAndInteractives ? props.responsiveClassName : ''}`}>\n {showClassroomGuide && (\n <ClassroomGuideTag\n appLink={props.commonVideoProps.getClassroomGuideAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n )}\n <ResourcesTag\n appLink={props.commonVideoProps.getResourceGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n <InteractivesTag\n appLink={props.commonVideoProps.getInteractiveGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\n\nimport { DivButton } from '../../div-button/DivButton';\nimport { SvgContainer } from '../../svg-container/SvgContainer';\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './remove-video-button.module.scss';\n\nconst namespace = 'shared.removeVideoButton';\n\ninterface RemoveVideoButtonProps {\n onClickRemove: (e: React.MouseEvent<HTMLButtonElement>) => void;\n removeButtonTooltip?: string;\n preventFocus?: boolean;\n}\n\nexport function RemoveVideoButton(props: RemoveVideoButtonProps): JSX.Element {\n const tooltip = props.removeButtonTooltip || LanguageService.getPhrase(namespace, 'removeFromRow');\n\n return (\n <div className='me-2'>\n <Tooltip title={tooltip} spanHack>\n <DivButton\n onClick={props.onClickRemove}\n className={`d-flex align-items-center justify-content-center ${styles.button}`}\n tabIndex={props.preventFocus ? -1 : undefined}\n >\n <SvgContainer\n svg={CloseSvg}\n className={`svg-container ${styles.heart}`}\n />\n </DivButton>\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { HoverableProps, HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { RemoveVideoButton } from '../../remove-button/RemoveVideoButton';\nimport { ThumbnailCompanyLogo } from '../../thumbnail-company/ThumbnailCompanyLogo';\nimport { PopoutVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './popout-video-thumbnail.module.scss';\n\ntype PopoutVideoProps = HoverableProps & PopoutVideoThumbnailProps;\n\nconst PopoutVideo = (props: PopoutVideoProps): JSX.Element => {\n const {\n video, appLink, imageOptions, preload, isHovering\n } = props;\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(appLink?.params) ? appLink?.params as HashObject : {};\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n React.useEffect(() => {\n return () => {\n props.cleanPortalNode?.();\n };\n }, []);\n\n function onClickRemove(e: React.MouseEvent<HTMLButtonElement>) {\n e.preventDefault();\n props.onClickRemove?.();\n }\n\n let className = 'position-relative bg-white';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n if (isHovering)\n className += ` rounded-3 shadow-lg`;\n \n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n };\n\n const showThumbnailPreviewVideo = props.isHovering && canConsume && hoverToPlay;\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, isHovering);\n\n function showRemoveButton() {\n if (!FunctionHelper.isFunction(props.onClickRemove))\n return false;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n return isHovering;\n }\n\n const analyticsData = {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <div className={className}>\n <div className={styles.topRightContainer}>\n {showRemoveButton() && (\n <RemoveVideoButton\n onClickRemove={onClickRemove}\n removeButtonTooltip={props.removeButtonTooltip}\n preventFocus\n />\n )}\n\n {showFavouriteButton && (\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n preventFocus\n />\n )}\n\n {!canNavigate && (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <ThumbnailPadlock />\n </Tooltip>\n )}\n </div>\n\n <div className='position-relative'>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={isHovering ? 'rounded-top-3' : 'rounded-3'}\n onClick={() => props.cleanPortalNode?.()}\n appLink={canNavigate ? appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n <BaseImage\n onClick={() => props.cleanPortalNode?.()}\n data={VideoHelper.getThumbnail(video)}\n appLink={canNavigate ? appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus={!props.hideTitle}\n appLinkClassName={`position-absolute top-0 start-0 h-100 w-100 overflow-hidden ${isHovering ? 'rounded-top-3' : 'rounded-3'}`}\n imageClassName={isHovering ? 'rounded-top-3' : 'rounded-3'}\n >\n <ImageFallback type={ImageFallbackType.Video} />\n <div className='p-absolute w-100 h-100 text-white'>\n\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n \n <VideoTypeBadge video={video} />\n \n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n />\n </div>\n\n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n />\n\n {/* bottom */}\n <VideoThumbnailBottomBar video={props.video} />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n location='popout-video'\n onRemoveVideo={props.onClickRemove}\n appLink={canNavigate ? appLink : null}\n />\n }\n </div>\n\n {!isHovering && !props.hideTitle && (\n <ThumbnailText {...props}/>\n )}\n \n <div className={`${styles.details} ${isHovering ? `${styles.isHovering} box-shadow` : ''}`}>\n {isHovering && (\n <>\n <div className={`${isHovering ? styles.videoGuidanceTags : ''}`}>\n <ThumbnailText {...props}/>\n\n {(props.showVideoGuidance && isHovering) && (\n <VideoItemGuidance\n commonVideoProps={props.commonVideoProps}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n responsiveClassName={styles.responsiveGuidance}\n containerClassName={`d-flex justify-content-start align-items-center pt-2`}\n />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\n\nexport function PopoutVideoThumbnail(props: PopoutVideoThumbnailProps): JSX.Element {\n return (\n <>\n <HoverToPortalContainer<PopoutVideoThumbnailProps>\n hoverableComponent={PopoutVideo}\n componentProps={props}\n fixedHoverWidth={400}\n minHoverWidth={400}\n analyticsData={{\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n }}\n analyticsOptions={{\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n }}\n />\n </>\n );\n}","import React from 'react';\n\nexport function PlayCircleFilledSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PlayCircleFilledSvg } from 'libs/shared/images/svg/actions/PlayCircleFilledSvg';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\n\nimport styles from './mask.module.scss';\n\nexport enum MaskType {\n Video,\n Playlist,\n Series\n}\n\nfunction getClassByType(type: MaskType): string {\n if (type === MaskType.Video)\n return styles.video;\n\n if (type === MaskType.Playlist)\n return styles.playlist;\n\n return '';\n}\n\nfunction getSvg(type: MaskType, displayInverse: boolean = false) {\n if (type === MaskType.Video)\n return displayInverse ? PlayCircleFilledSvg : PlayCircleSvg;\n\n return null;\n}\n\ntype MaskSize = 'sm' | 'md';\n\ninterface MaskProps {\n type: MaskType;\n size?: MaskSize;\n alwaysShowIcon?: boolean;\n}\n\nMask.defaults = {\n size: 'md'\n};\n\nexport function Mask(props: MaskProps): JSX.Element {\n const { type, size, alwaysShowIcon } = props;\n\n const typeClass = getClassByType(type);\n const svg = getSvg(type, alwaysShowIcon);\n\n return (\n <div\n className={`${alwaysShowIcon ? styles.constantIconMaskContainer : styles.maskContainer} ${size === 'sm' ? styles.small : ''}`}\n >\n <div className={ styles.mask }></div>\n <SvgContainer svg={svg} className={ typeClass } />\n </div>\n );\n}","import React from 'react';\n\nexport function TickSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M18.783 5.192c.264.283.291.775.06 1.098l-8.91 12.444a.6.6 0 0 1-.457.266.58.58 0 0 1-.471-.228l-3.819-4.666a.905.905 0 0 1 0-1.1c.249-.304.652-.304.9 0l3.338 4.078 8.46-11.818c.232-.324.634-.356.899-.074'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TickSvg } from 'libs/shared/images/svg/status/TickSvg';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './check-mark-button.module.scss';\n\nexport enum CheckMarkStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n\nexport type SetCheckMarkStatusFunc = (status: CheckMarkStatus) => Promise<void>;\n\ninterface CheckMarkButtonProps {\n setStatus: SetCheckMarkStatusFunc;\n status: CheckMarkStatus;\n style?: 'outline' | 'filled';\n className?: string;\n disabled?: boolean;\n}\n\nCheckMarkButton.defaultProps = {\n style: 'filled'\n};\n\nexport function CheckMarkButton(props: CheckMarkButtonProps): JSX.Element {\n // Use local state so that changes are reflected immediately.\n const [ isComplete, setIsComplete ] = React.useState(props.status === CheckMarkStatus.Complete);\n\n React.useEffect(() => {\n setIsComplete(props.status === CheckMarkStatus.Complete);\n }, [props.status]);\n\n let className = `cursor-pointer rounded-circle ${isComplete ? styles.checked : styles.unchecked}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (props.style === 'outline')\n className += ` ${styles.outline}`;\n\n function shouldRender(): boolean {\n return (\n !!props.status &&\n props.status !== CheckMarkStatus.None &&\n FunctionHelper.isFunction(props.setStatus)\n );\n }\n\n function onClick(): void {\n const shouldComplete = !isComplete;\n\n setIsComplete(shouldComplete);\n\n const newStatus = shouldComplete ? CheckMarkStatus.Complete : CheckMarkStatus.Incomplete;\n\n props.setStatus(newStatus).catch(() => {\n setIsComplete(!shouldComplete);\n });\n }\n\n if (!shouldRender())\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} disabled={props.disabled}>\n <SvgContainer\n svg={TickSvg}\n className={`svg-container ${styles.checkMark}`}\n />\n </DivButton>\n );\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { CheckMarkButton, CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ThumbnailPadlock } from './padlock/ThumbnailPadlock';\n\nimport styles from './video-thumbnail-actions.module.scss';\n\nfunction hasActions(props: VideoThumbnailActionsProps): boolean {\n if (!VideoHelper.getCanBeConsumed(props.video)?.canConsume)\n return true;\n\n if (FunctionHelper.isFunction(props.setFavourite) && FunctionHelper.isFunction(props.canFavourite))\n return true;\n\n if (FunctionHelper.isFunction(props.setCheckMarkStatus))\n return true;\n\n return false;\n}\n\ninterface VideoThumbnailActionsProps {\n video: VideoTypes;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n checkMarkStatus?: CheckMarkStatus;\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n size?: VideoItemSize;\n}\n\nexport function VideoThumbnailActions(props: VideoThumbnailActionsProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canNavigate) {\n return (\n <div className={styles.container}>\n <ThumbnailPadlock size={props.size} />\n </div>\n );\n }\n \n if (!hasActions(props))\n return <></>;\n\n return (\n <div className={`${styles.container} d-flex align-items-center`}>\n <FavouriteButton\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n video={props.video}\n className={styles.action}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n preventFocus\n />\n\n <CheckMarkButton\n status={props.checkMarkStatus}\n setStatus={props.setCheckMarkStatus}\n className={styles.action}\n />\n </div>\n );\n}","export enum ThumbnailTextPosition {\n Below = 1,\n Overlay = 2,\n Independent = 3\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { VideoThumbnailActions } from 'libs/shared/components/thumbnails/thumbnail-actions/VideoThumbnailActions';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { CosmeticVideoThumbnailProps, StaticVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './static-video-thumbnail.module.scss';\n\nconst namespace = 'shared.staticVideoThumbnail';\n\ntype CombinedProps = StaticVideoThumbnailProps | CosmeticVideoThumbnailProps;\n\nfunction ThumbnailText(props: CombinedProps): JSX.Element {\n const { type, video, textPosition } = props;\n\n const isStatic = type === 'static';\n\n const textIsOverlayed = textPosition === ThumbnailTextPosition.Overlay;\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n let className = '';\n\n if (textIsOverlayed) {\n className = styles.titleOverlay;\n\n if (canNavigate) {\n if (VideoHelper.isClip(video))\n className += ' ' + styles.clip;\n if (VideoHelper.isInteractive(video))\n className += ' ' + styles.interactive;\n }\n } else {\n className = styles.titleBelow;\n }\n\n return (\n <div className={className}>\n {VideoHelper.isVideo(video) &&\n <VideoSubText\n type={isStatic ? props.commonVideoProps.subTextType : 'series'}\n className={textIsOverlayed ? 'text-shadow clamp-1' : 'clamp-2'}\n video={video}\n appLink={isStatic && !textIsOverlayed ? props.commonVideoProps.getSubTextAppLink?.(props.video) : null}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n }\n\n {(textIsOverlayed || !canNavigate || !isStatic)\n ? (\n <span className={`h6 text-reset clamp-1`}>\n <VideoTitle\n video={video}\n title={video.name ?? LanguageService.getPhrase(namespace, 'videoUnavailable')}\n showNewVideoIndicator={isStatic && props.commonVideoProps.showNewVideoIndicator}\n showPadlock={isStatic\n && !props.commonVideoProps.hasStudentExperience\n && !props.commonVideoProps.hasGuestExperience}\n />\n </span>\n ) : (\n <AppLink className='h6 text-reset clamp-2' appLink={props.appLink}>\n <VideoTitle\n video={video}\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n )\n }\n </div>\n );\n}\n\nexport function StaticVideoThumbnail(props: CombinedProps): JSX.Element {\n const { type, video, textPosition, imageOptions, preload, alwaysShowIcon } = props;\n const hoverToPlay = 'commonVideoProps' in props ? props.commonVideoProps?.hoverToPlay : false;\n\n const isStatic = type === 'static';\n\n const appLinkParams = isStatic && ObjectHelper.isObject(props.appLink?.params)\n ? props.appLink?.params as HashObject :\n {};\n\n const [ hoverRef, isHovering ] = useHover<HTMLDivElement>();\n const [ hoverIntentRef, isHoveringIntentionally ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n function setHoverRefs(r: HTMLDivElement) {\n hoverRef.current = r;\n hoverIntentRef.current = r;\n }\n\n const showThumbnailPreviewVideo = isStatic && isHoveringIntentionally && canConsume && hoverToPlay;\n\n function canFavourite(): boolean {\n if (!isStatic)\n return;\n\n return !props.disableFavourite &&\n props.commonVideoProps.canFavourite?.(props.video) &&\n FavouriteHelper.showFavouriteButton(video, isHovering);\n }\n\n function getContainerClass(): string {\n let className = 'position-relative';\n\n className += (isStatic && props.appLink && canNavigate) ? ' cursor-pointer' : '';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` rounded overflow-hidden`;\n\n return className;\n }\n\n function getThumbnailClass(): string {\n let className = `overflow-hidden ${props.size === 'sm' ? 'rounded' : 'rounded-3'}`;\n\n if (props.imageClassName)\n className += ` ${props.imageClassName}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` ${styles.gradient}`;\n \n return className;\n }\n\n const eventAnalyticsOptions = isStatic ? {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n } : {};\n\n const showMask = isStatic && !!props.appLink && !props.hideMask && canNavigate;\n const tooltip = isStatic\n ? VideoHelper.getPrivacyReasoning(props.video, props.showSignIn)\n : '';\n\n const analyticsData = isStatic ? {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n } : {};\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={tooltip} spanHack spanHackClassName=''>\n <div className={getContainerClass()} ref={setHoverRefs}>\n {isStatic &&\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={props.size === 'sm' ? 'rounded' : 'rounded-3'}\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n }\n\n <VideoThumbnailActions\n video={video}\n checkMarkStatus={!isStatic && props.checkMarkStatus}\n setCheckMarkStatus={!isStatic && props.setCheckMarkStatus}\n setFavourite={isStatic && props.commonVideoProps.setFavourite}\n canFavourite={canFavourite}\n analyticsData={isStatic && props.analyticsData}\n analyticsOptions={isStatic && eventAnalyticsOptions}\n size={props.size}\n />\n\n <BaseImage\n data={VideoHelper.getThumbnail(video)}\n appLink={isStatic && canNavigate ? props.appLink : null}\n onClick={isStatic && canNavigate ? props.onClick : undefined}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n className={getThumbnailClass()}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n openInNewTab={props.openInNewTab}\n forcePageLoad={props.forcePageLoad}\n >\n {showMask && (\n <Mask type={MaskType.Video} size={props.size} alwaysShowIcon={alwaysShowIcon}/>\n )}\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n {/* overlay */}\n {textPosition === ThumbnailTextPosition.Overlay && <ThumbnailText {...props} />}\n \n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {isStatic && props.showOwner &&\n <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />\n }\n \n {!props.hideVideoTypeBadge && <VideoTypeBadge video={video} size={props.size} />}\n\n {isStatic &&\n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n size={props.size}\n />\n }\n </div>\n\n {/* bottom */}\n {!props.hideBottomBar &&\n <VideoThumbnailBottomBar video={video} />\n }\n \n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n newDurationStyle={props.newDurationStyle}\n size={props.size}\n />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={isStatic && props.shareId }\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={isStatic && canNavigate ? props.appLink : null}\n />\n }\n\n {textPosition === ThumbnailTextPosition.Below && <ThumbnailText {...props} />}\n </div>\n </Tooltip>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Audience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport { ExpandableVideoThumbnail } from './expandable/ExpandableVideoThumbnail';\nimport { PopoutVideoThumbnail } from './popout/PopoutVideoThumbnail';\nimport { StaticVideoThumbnail } from './static/StaticVideoThumbnail';\n\ninterface BaseCommonVideoThumbnailProps {\n video: VideoTypes;\n imageOptions: ImageOptions;\n preload?: boolean;\n}\n\ninterface BasePlayableVideoThumbnailProps extends BaseCommonVideoThumbnailProps {\n appLink: Core.AppLink;\n onClick?: () => void;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Location context required\n\n /**\n * TODO: Fix whatever this used to do in playlists\n */\n canRemovePrivateVideos?: boolean;\n showSignIn?: boolean;\n\n showOwner?: boolean;\n\n shareId?: string;\n\n commonVideoProps: CommonVideoProps;\n}\n\nexport interface ExpandableVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'expandable'\n newDurationStyle?: boolean;\n hovering: boolean;\n}\n\nexport interface PopoutVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'popout'\n hideDuration: boolean;\n extraClasses?: string;\n hideRating?: boolean;\n hideTitle?: boolean;\n showVideoGuidance: boolean;\n onClickRemove: () => void;\n removeButtonTooltip?: string;\n audience: Audience;\n}\n\ninterface BaseStaticVideoThumbnailProps {\n textPosition?: ThumbnailTextPosition;\n extraClasses?: string;\n imageClassName?: string;\n size: 'sm' | 'md';\n hideMask?: boolean;\n videoTypeBadgeSize?: 'sm' | 'std';\n hideDuration?: boolean;\n audience?: Audience;\n newDurationStyle?: boolean;\n hideRating?: boolean;\n hideVideoTypeBadge?: boolean;\n hideBottomBar?: boolean;\n alwaysShowIcon?: boolean;\n openInNewTab?: boolean;\n forcePageLoad?: boolean;\n}\n\nexport interface StaticVideoThumbnailProps extends BaseStaticVideoThumbnailProps, BasePlayableVideoThumbnailProps {\n type: 'static'\n disableFavourite?: boolean;\n}\n\n/**\n * If you need any of the following, you should be using static:\n * - Favourite button\n * - Applink to link to the video\n * - Hover to play\n * - Analytics data\n * - Showing the owner\n * - Showing sign in\n * \n * Cosmetic should just be for displaying a thumbnail that is not interacted with, or the <AppLink />\n * is outside of the thumbnail like in shares.\n * \n * - Sha\n */\nexport interface CosmeticVideoThumbnailProps extends BaseCommonVideoThumbnailProps, BaseStaticVideoThumbnailProps{\n type: 'cosmetic';\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n checkMarkStatus?: CheckMarkStatus;\n}\n\nexport type VideoThumbnailProps =\n ExpandableVideoThumbnailProps |\n PopoutVideoThumbnailProps |\n StaticVideoThumbnailProps |\n CosmeticVideoThumbnailProps;\n\nVideoThumbnail.defaultProps = {\n hideRating: true,\n size: 'md',\n showOwner: true\n};\n\nexport function VideoThumbnail(props: VideoThumbnailProps): JSX.Element {\n switch (props.type) {\n case 'static':\n return <StaticVideoThumbnail {...props} />;\n case 'cosmetic':\n // No hover to play for cosmetic use of VideoThumbnail\n return <StaticVideoThumbnail {...props} />;\n case 'expandable':\n // Expandable thumbnails show metadata on hover. Static display the duration and don't expand on hover\n return <ExpandableVideoThumbnail {...props} />;\n case 'popout':\n return <PopoutVideoThumbnail {...props} />;\n default:\n return;\n }\n}\n","import * as React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Video } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-item-description.module.scss';\n\ninterface InnerContentProps {\n video: Video;\n showSignIn: boolean;\n}\n\nfunction InnerContent(props: InnerContentProps): JSX.Element {\n if (!props.video.description && !VideoHelper.getCanBeConsumed(props.video)?.canNavigate) {\n return (\n <em>{VideoHelper.getPrivacyReasoning(props.video, props.showSignIn)}</em>\n );\n }\n\n const hasCaptions = !!props.video?.subtitles?.data?.length;\n\n return (\n <>\n {hasCaptions && (\n <span className={`d-inline-block align-middle ${styles.captionsBadge}`}>\n <Badge type={BadgeType.Captions} data={props.video?.subtitles} />\n </span>\n )}\n {!!props.video?.productionYear && (\n <span className='fw-semibold align-middle'>\n {hasCaptions ? ' \\u2022 ' : ''}{props.video.productionYear}\n </span>\n )}\n {!!props.video.description && (\n <span\n className='align-middle'\n dangerouslySetInnerHTML={{\n __html: `${(props.video.productionYear || hasCaptions) ? ' \\u2022 ' : ''}${LinkifyHelper.linkifyText(props.video.description)}`\n }}\n />\n )}\n </>\n );\n}\n\ninterface VideoItemDescriptionProps {\n video: Video;\n showSignIn?: boolean;\n hasStudentExperience?: boolean;\n hasGuestExperience?: boolean;\n}\n\nexport function VideoItemDescription(props: VideoItemDescriptionProps): JSX.Element {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n const hasUserRestrictions = !!RestrictionHelper.getRestrictionByType(\n props.video?._restrictions,\n RestrictionType.User\n );\n\n if (isMobile)\n return <></>;\n\n if (hasUserRestrictions && !props.hasStudentExperience && !props.hasGuestExperience)\n return <></>;\n\n return (\n <div className={`position-relative overflow-hidden clamp-2`}>\n <p className='m-0'>\n <InnerContent\n video={props.video}\n showSignIn={props.showSignIn}\n />\n </p>\n </div>\n );\n}","import React from 'react';\n\nexport function HandleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props} viewBox='0 0 16 16'>\n <path\n d='M1 0h14a1 1 0 0 1 1 1v1.2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1m0 6.4h14a1 1 0 0 1 1 1v1.2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7.4a1 1 0 0 1 1-1m0 6.4h14a1 1 0 0 1 1 1V15a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-1.2a1 1 0 0 1 1-1'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { PropsWithSortableItemProps } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './video-item-left-content.module.scss';\n\ninterface VideoItemLeftContentProps {\n index: number;\n showDragHandle: boolean;\n showIndexes: boolean;\n dragHandleIcon: SvgIcon;\n dragHandleIconSize: SvgContainerSize;\n}\n\nfunction getClassName(showDragHandle: boolean): string {\n const baseClassName = 'd-flex justify-content-center align-items-center';\n if (!showDragHandle) return baseClassName;\n\n return `${baseClassName} cursor-pointer ${styles.dragHandleContainer}`;\n}\n\nexport function VideoItemLeftContent(props: PropsWithSortableItemProps<VideoItemLeftContentProps>): JSX.Element {\n const dragProps = props.showDragHandle ? { ...props.dragAttributes, ...props.dragListeners } : {};\n const className = getClassName(props.showDragHandle);\n\n if (!props.showDragHandle && !props.showIndexes) return <></>;\n\n return (\n <Col\n xs={2}\n className={className}\n {...dragProps}\n >\n {!!props.showDragHandle &&\n <SvgContainer svg={props.dragHandleIcon} size={props.dragHandleIconSize} />\n }\n {!!props.showIndexes &&\n <span className='fw-semibold'>{props.index + 1}</span>\n }\n </Col>\n );\n}\n\nVideoItemLeftContent.defaultProps = {\n dragHandleIcon: HandleSvg,\n dragHandleIconSize: SvgContainerSize.Small\n};","import React from 'react';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\n\ninterface RestrictionBadgeProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionBadge(props: RestrictionBadgeProps): JSX.Element {\n return (\n <Badge\n type={BadgeType.Restriction}\n data={{ restrictions: props.restrictions, yearGroups: props.yearGroups }}\n inline\n />\n );\n}","import React from 'react';\n\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { RestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/RestrictionBadge';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemRestrictionBadgeProps {\n video: VideoTypes;\n yearGroups: YearGroup[];\n className?: string;\n}\n\nexport function VideoItemRestrictionBadge(props: VideoItemRestrictionBadgeProps): JSX.Element {\n const hasRestrictions = RestrictionHelper.hasRestrictions(props.video?._restrictions);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!hasRestrictions || !props.yearGroups || !canConsume)\n return <></>;\n \n return (\n <BadgeListContainer className={props.className || 'pt-1'}>\n <RestrictionBadge restrictions={props.video._restrictions} yearGroups={props.yearGroups} />\n </BadgeListContainer>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTitle, VideoTitleSizes } from 'libs/shared/components/video-title/VideoTitle';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemTitleProps {\n video: Video;\n appLink: Core.AppLink;\n onClickAppLink?: () => void;\n size?: VideoItemSize;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions;\n yearGroups: YearGroup[];\n showNewVideoIndicator?: boolean;\n showPadlock: boolean;\n\n linkClassName?: string;\n titleSize?: VideoTitleSizes;\n titleClassName?: string;\n clampLevel?: number;\n}\n\nVideoItemTitle.defaultProps = {\n clampLevel: 1\n};\n\nexport function VideoItemTitle(props: VideoItemTitleProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n const title = VideoHelper.getTitle(props.video);\n\n const analyticsData: HashObject = {\n ...props.analyticsData,\n id: props.video?.id,\n name: props.video?.name\n };\n\n const analyticsOptions: AnalyticsOptions = {\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n function getTitleSize(): VideoTitleSizes {\n if (props.titleSize)\n return props.titleSize;\n\n if (props.size === 'md')\n return 'h4';\n\n return 'h5';\n }\n\n return (\n <AppLink\n className={props.linkClassName}\n appLink={canNavigate ? props.appLink : null}\n onClick={canNavigate ? props.onClickAppLink : null}\n analyticsOptions={analyticsOptions}\n analyticsData={analyticsData}\n >\n <div className={`clamp-${props.clampLevel} align-middle`} title={props.video.name ?? ''}>\n <VideoTitle\n video={props.video}\n title={title}\n yearGroups={props.yearGroups}\n lockSize={props.size}\n titleSize={getTitleSize()}\n className={props.titleClassName}\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={props.showPadlock}\n />\n </div>\n </AppLink>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.signInToWatch';\n\ninterface SignInToWatchProps {\n appLink: Core.AppLink\n className: string;\n}\n\nexport function SignInToWatch(props: SignInToWatchProps): React.ReactElement {\n return (\n <AppLink appLink={props.appLink} className={props.className}>\n <Text namespace={namespace} phrase='signInToWatch'></Text>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { Video } from 'libs/shared/interfaces';\n\ninterface VideoItemActionsProps {\n video: Video;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function VideoItemActions(props: VideoItemActionsProps): JSX.Element {\n const videoActions = React.useContext(VideoActionsContext);\n\n if (!FunctionHelper.isFunction(videoActions?.getVideoActions))\n return <></>;\n\n const actions = videoActions.getVideoActions(props.video, {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n });\n\n return (\n <Actions\n actions={actions}\n className='align-items-start gap-2'\n actionsDropdownClassName='btn btn-link py-0'\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n fetchMore={videoActions.fetchMoreActions ? () => videoActions.fetchMoreActions(props.video) : null}\n customSize\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { SignInToWatch } from 'libs/shared/components/sign-in-to-watch/SignInToWatch';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemTopRightProps {\n video: Video;\n showSignIn: boolean;\n signInAppLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function VideoItemTopRight(props: VideoItemTopRightProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n if (props.showSignIn && !canNavigate)\n return <SignInToWatch appLink={props.signInAppLink} className='btn btn-outline-dark align-self-start' />;\n\n return (\n <VideoItemActions\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n internationalSecondaryBuilder(audiences: PresentationAudience[]): string {\n return AudienceStringBuilders.englandSecondaryBuilder(audiences);\n },\n\n scotlandPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'First')\n firstAudienceLevel = '1st';\n\n if (lastAudienceLevel === 'First')\n lastAudienceLevel = '1st';\n\n if (firstAudienceLevel === 'Second')\n firstAudienceLevel = '2nd';\n\n if (lastAudienceLevel === 'Second')\n lastAudienceLevel = '2nd';\n\n if (firstAudienceLevel === lastAudienceLevel)\n return `${firstAudienceLevel} Level`;\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Level`;\n },\n\n internationalPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'Lower')\n firstAudienceLevel = 'Low';\n\n if (lastAudienceLevel === 'Lower')\n lastAudienceLevel = 'Low';\n\n if (firstAudienceLevel === 'Middle')\n firstAudienceLevel = 'Mid';\n\n if (lastAudienceLevel === 'Middle')\n lastAudienceLevel = 'Mid';\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Pri`;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scotlandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n englandPrimaryBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, AudienceFilterParams, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n \n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.NZ_PRIMARY:\n case HardCoded.PresentationIds.NZ_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.CA_ELEMENTARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INT_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n // TODO: Implement this properly\n mergedAudienceString = AudienceStringBuilders.internationalSecondaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INT_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.internationalPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.SCT_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.scotlandPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENG_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englandSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCT_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scotlandSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENG_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.englandPrimaryBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n case HardCoded.PresentationIds.CA_MIDDLE:\n case HardCoded.PresentationIds.CA_HIGH:\n case HardCoded.PresentationIds.AU_TERTIARY:\n case HardCoded.PresentationIds.UK_TERTIARY:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): AudienceFilterParams {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BaseVideoItemProps } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemDescription } from 'libs/shared/components/video-list/components/video-item-description/VideoItemDescription';\nimport { VideoItemLeftContent } from 'libs/shared/components/video-list/components/video-item-left-content/VideoItemLeftContent';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoItemTopRight } from 'libs/shared/components/video-list/components/video-item-top-right/VideoItemTopRight';\nimport { SortableVideoListContext } from 'libs/shared/components/video-list/VideoList';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './clip-item.module.scss';\n\nexport type ClipItemProps = BaseVideoItemProps<Clip>;\n\nexport const ClipItem = React.forwardRef((props: ClipItemProps, ref: React.LegacyRef<HTMLDivElement>) => {\n const breakpoints = useBreakpoints();\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n \n const size = VideoListHelper.getSize(breakpoints, props.size);\n const isSmall = size === 'sm';\n\n const { isSortable } = React.useContext(SortableVideoListContext);\n\n const mergedAudience = useMergeAudiences(props.video.subjectPresentationAudiences?.data, props.presentationAudiences);\n\n const showDragHandle = isSortable && !breakpoints.xs && (hovered || typeof props.index === 'undefined' || !props.showIndexes);\n const showIndexes = (props.showIndexes && !showDragHandle) && !breakpoints.xs;\n const hasIconOrIndex = (showDragHandle || props.showIndexes) && !breakpoints.xs;\n\n const appLink = props.getVideoAppLink(props.video, {});\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: {\n entity: EntityType.Clip,\n location: LocationContext.ClipListItem\n }\n };\n\n return (\n <div ref={hoverRef} className='w-100'>\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`} ref={ref} style={props.style}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <Row>\n <VideoItemLeftContent\n index={props.index}\n showDragHandle={showDragHandle}\n showIndexes={showIndexes}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n dragAttributes={props.dragAttributes}\n dragListeners={props.dragListeners}\n />\n \n <Col xs={VideoListHelper.getThumbnailColSize(hasIconOrIndex)}>\n <VideoThumbnail\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n shareId={props.shareId}\n audience={mergedAudience}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n commonVideoProps={{\n ...props.commonVideoProps,\n subTextType: 'none'\n }}\n />\n </Col>\n </Row>\n </Col>\n\n <Col\n {...VideoListHelper.getDetailsColumns()}\n className={`${isSmall ? 'pb-2' : 'px-2'} d-flex position-relative flex-column`}\n >\n <div className='d-flex justify-content-between'>\n <VideoItemTitle\n video={props.video}\n appLink={appLink}\n size={size}\n yearGroups={props.commonVideoProps.yearGroups}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n linkClassName='flex-grow-1'\n {...analyticsProps}\n />\n \n <VideoItemTopRight\n {...analyticsProps}\n video={props.video}\n showSignIn={props.showSignIn}\n signInAppLink={props.getSignInAppLink?.(appLink)}\n />\n </div>\n\n <div>\n {!isSmall && (\n <VideoItemDescription\n video={props.video}\n showSignIn={props.showSignIn}\n hasStudentExperience={props.commonVideoProps.hasStudentExperience}\n hasGuestExperience={props.commonVideoProps.hasGuestExperience}\n />\n )}\n {!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience && (\n <VideoItemRestrictionBadge video={props.video} yearGroups={props.commonVideoProps.yearGroups}/>\n )}\n </div>\n\n {VideoHelper.showVideoGuidance(props.hasPermissions) && (\n <VideoItemGuidance\n video={props.video}\n getVideoAppLink={props.getVideoAppLink}\n containerClassName={`d-flex justify-content-start align-items-center pt-sm-1 gap-1`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n {...analyticsProps}\n />\n )}\n </Col>\n </div>\n </div>\n );\n});\n\ntype SortableClipItemProps = ClipItemProps & {\n index: number;\n};\n\nexport const SortableClipItem = (props: SortableClipItemProps) => {\n return (\n <SortableItemWrapper id={props.video.id} childComponent={ClipItem} childProps={props} />\n );\n};","export function TrueOrFalseSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(1.000000, 1.000000)'>\n <g transform='translate(5.000000, 3.000000)'>\n <path d='M5.129,4.52970994e-14 C5.80434375,4.52970994e-14 6.35378125,0.5494375 6.35378125,1.22478125 L6.35378125,1.22478125 L6.35378125,4.12053125 C6.35378125,4.795875 5.80434375,5.3453125 5.129,5.3453125 L5.129,5.3453125 L5.01765625,5.3453125 L5.01765625,5.7625625 C5.14371875,5.7230625 5.2778125,5.70175 5.4166875,5.70175 C5.8579375,5.70175 6.24996875,5.9166875 6.4935,6.24740625 C6.6880625,6.13675 6.9129375,6.0735 7.15228125,6.0735 C7.61575,6.0735 8.024875,6.31059375 8.26471875,6.6699375 C8.450875,6.57140625 8.6629375,6.51559375 8.88784375,6.51559375 C9.6248125,6.51559375 10.2244688,7.11515625 10.2244688,7.85209375 L10.2244688,7.85209375 L10.2239688,11.0194063 C10.22375,12.719125 9.73003125,14.3683438 8.79625,15.7887188 C8.7095625,15.9205625 8.562375,15.9999688 8.4045625,15.9999688 L8.4045625,15.9999688 L3.1323125,15.9999688 C3.0124375,15.9999688 2.897125,15.9540625 2.8100625,15.8716563 C2.80745313,15.8691864 2.80274841,15.8647056 2.79608533,15.8582606 L2.73370254,15.7963915 C2.38498908,15.4434944 0.983540179,13.9211451 0.6698125,11.95725 L0.6698125,11.95725 L0.0538125,9.3209375 C-0.03209375,8.95328125 0.043625,8.5848125 0.261625,8.3100625 C0.46915625,8.04846875 0.78865625,7.89309375 1.14465625,7.8788125 C1.47575,7.8150625 1.81340625,7.8773125 2.10134375,8.0561875 C2.19071875,8.1116875 2.272125,8.17646875 2.34459375,8.24915625 L2.34459375,8.24915625 L2.34459375,5.34534375 L2.23325,5.34534375 C1.55790625,5.34534375 1.00846875,4.79590625 1.00846875,4.1205625 L1.00846875,4.1205625 L1.00846875,1.22478125 C1.00846875,0.5494375 1.55790625,4.52970994e-14 2.23325,4.52970994e-14 L2.23325,4.52970994e-14 Z M3.6810625,3.4381875 C3.46103125,3.4381875 3.282,3.61721875 3.282,3.83725 L3.282,3.83725 L3.282,11.2870938 C3.282,11.4215625 3.22428125,11.5495625 3.12346875,11.6385313 C3.02265625,11.7275 2.88853125,11.7689063 2.7550625,11.7522188 L2.7550625,11.7522188 L2.7175,11.7475313 C2.5228125,11.7231875 2.36390625,11.580125 2.31925,11.3890625 L2.31925,11.3890625 L1.78459375,9.10071875 C1.76034375,8.9969375 1.69715625,8.9088125 1.60659375,8.8525625 C1.51603125,8.7963125 1.407,8.78928125 1.30065625,8.79571875 C1.2585,8.79828125 1.23959375,8.8036875 1.194,8.80803125 C1.10340625,8.81665625 1.035625,8.84275 0.996,8.89271875 C0.956375,8.9426875 0.94596875,9.019 0.96665625,9.107625 L0.96665625,9.107625 L1.58653125,11.7605625 C1.5891875,11.7719063 1.59140625,11.7833438 1.59321875,11.794875 C1.83815625,13.3630313 2.95146875,14.6606563 3.32925,15.0625 L3.32925,15.0625 L8.1469375,15.0625 C8.893,13.8445 9.28625,12.4519688 9.2864375,11.0193125 L9.2864375,11.0193125 L9.2869375,7.85203125 C9.2869375,7.63209375 9.10790625,7.4530625 8.887875,7.4530625 C8.66784375,7.4530625 8.4888125,7.63209375 8.4888125,7.852125 L8.4888125,7.852125 L8.4888125,8.61359375 C8.4888125,8.87246875 8.2789375,9.08234375 8.0200625,9.08234375 C7.7611875,9.08234375 7.5513125,8.87246875 7.5513125,8.61359375 L7.5513125,8.61359375 L7.5513125,7.4100625 C7.5513125,7.19003125 7.3723125,7.011 7.15228125,7.011 C6.93225,7.011 6.75321875,7.19003125 6.75321875,7.4100625 L6.75321875,7.4100625 L6.75321875,8.28625 C6.75321875,8.545125 6.54334375,8.755 6.28446875,8.755 C6.02559375,8.755 5.81571875,8.545125 5.81571875,8.28625 L5.81571875,8.28625 L5.81571875,7.0383125 C5.81571875,6.81828125 5.6366875,6.63928125 5.41665625,6.63928125 C5.196625,6.63928125 5.017625,6.81828125 5.017625,7.0383125 L5.017625,7.0383125 L5.017625,8.232875 C5.017625,8.49175 4.80775,8.701625 4.548875,8.701625 C4.29,8.701625 4.080125,8.49175 4.080125,8.232875 L4.080125,8.232875 L4.080125,3.83725 C4.080125,3.61721875 3.90109375,3.4381875 3.6810625,3.4381875 Z M11.131,-1.59872116e-14 C11.8064063,-1.59872116e-14 12.3558125,0.5494375 12.3558125,1.22478125 L12.3558125,1.22478125 L12.3558125,4.1205625 C12.3558125,4.79590625 11.806375,5.34534375 11.131,5.34534375 L11.131,5.34534375 L8.23525,5.34534375 C7.55990625,5.34534375 7.01046875,4.79590625 7.01046875,4.1205625 L7.01046875,4.1205625 L7.01046875,1.22478125 C7.01046875,0.5494375 7.55990625,-1.59872116e-14 8.23525,-1.59872116e-14 L8.23525,-1.59872116e-14 Z M11.1310313,0.9375 L8.23528125,0.9375 C8.076875,0.9375 7.948,1.066375 7.948,1.22478125 L7.948,1.22478125 L7.948,4.1205625 C7.948,4.27896875 8.076875,4.40784375 8.23528125,4.40784375 L8.23528125,4.40784375 L11.1310313,4.40784375 C11.2894375,4.40784375 11.4183438,4.27896875 11.4183438,4.1205625 L11.4183438,4.1205625 L11.4183438,1.22478125 C11.4183438,1.066375 11.2894375,0.9375 11.1310313,0.9375 L11.1310313,0.9375 Z M5.129,0.9375 L2.23325,0.9375 C2.07484375,0.9375 1.94596875,1.066375 1.94596875,1.22478125 L1.94596875,1.22478125 L1.94596875,4.1205625 C1.94596875,4.27896875 2.07484375,4.40784375 2.2331875,4.40784375 L2.2331875,4.40784375 L2.34453125,4.40784375 L2.34453125,3.83721875 C2.34453125,3.10025 2.944125,2.50065625 3.68109375,2.50065625 C4.4180625,2.50065625 5.01765625,3.10025 5.01765625,3.83721875 L5.01765625,3.83721875 L5.01765625,4.40784375 L5.129,4.40784375 C5.28740625,4.40784375 5.41628125,4.27896875 5.41628125,4.1205625 L5.41628125,4.1205625 L5.41628125,1.22478125 C5.41628125,1.066375 5.28740625,0.9375 5.129,0.9375 L5.129,0.9375 Z'></path>\n </g>\n </g>\n </svg>\n `;\n}\n\nexport function ShortAnswerSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(1.000000, 1.000000)'>\n <path d='M16.5547082,3.66666667 C17.0307547,3.66666667 17.4166667,4.10561087 17.4166667,4.65176211 L17.4166667,17.3482379 C17.4166667,17.8922911 17.0325905,18.3333333 16.5547082,18.3333333 L5.44529184,18.3333333 C4.9692453,18.3333333 4.58333333,17.8943891 4.58333333,17.3482379 L4.58333333,4.65176211 C4.58333333,4.10770892 4.96740951,3.66666667 5.44529184,3.66666667 L16.5547082,3.66666667 Z M6.64149485,4.58362946 L5.39188119,4.58333333 L5.39188119,4.58333333 L5.39140886,4.63124366 C5.39133174,4.64701901 5.39125542,4.66659213 5.39117991,4.68981696 L5.39052172,4.99349248 C5.39045096,5.0373129 5.39038099,5.08434682 5.39031181,5.13444817 L5.38951907,5.87355262 C5.38945612,5.94585631 5.38939393,6.02064317 5.38933252,6.09776711 L5.38846857,7.41164942 C5.38841476,7.50849255 5.38836171,7.60694243 5.3883094,7.706853 L5.38744819,9.63144592 C5.38740476,9.7436262 5.38736207,9.85639075 5.3873201,9.96959351 L5.38636125,13.0260679 C5.38633211,13.1353268 5.38630366,13.2437094 5.38627591,13.3510694 L5.38541667,17.4092786 L5.38541667,17.4092786 C5.38541667,17.4094727 5.40139773,17.4096625 5.43215374,17.4098483 L5.66621602,17.410657 C5.70239956,17.4107438 5.74182455,17.4108296 5.78434021,17.4109144 L6.24635879,17.4116506 C6.30606164,17.4117294 6.36840286,17.4118072 6.43323171,17.411884 L7.07978636,17.412549 C7.15818403,17.4126199 7.23861702,17.4126899 7.32093458,17.4127589 L8.38955516,17.4135407 C8.48453695,17.413602 8.58080025,17.4136624 8.67819428,17.4137218 L10.2050643,17.4145426 C10.3099966,17.4145926 10.4153058,17.4146418 10.5208411,17.41469 L12.7186143,17.4155682 C12.8199282,17.4156037 12.9204129,17.4156383 13.0199177,17.4156721 L16.5962838,17.4166643 C16.6041235,17.4166659 16.6081188,17.4166667 16.6081188,17.4166667 L16.6083574,17.404543 L16.6083574,17.404543 L16.6092636,17.1281822 C16.609336,17.0909349 16.6094075,17.0503279 16.6094783,17.0065075 L16.6102897,16.3357629 C16.6103542,16.2685716 16.610418,16.1987511 16.6104809,16.1264474 L16.6111995,15.1489598 C16.6112564,15.059128 16.6113124,14.9673972 16.6113678,14.8739137 L16.6122825,13.0334559 C16.6123288,12.924197 16.6123745,12.8140617 16.6124193,12.703196 L16.6132553,10.3177583 C16.6132901,10.2038252 16.6133242,10.0901843 16.6133575,9.97698153 L16.6143069,6.10515513 C16.6143225,6.02803119 16.6143373,5.95324434 16.6143515,5.88094064 L16.6145833,4.59072136 L16.6145833,4.59072136 L16.6027483,4.59043343 L16.6027483,4.59043343 L16.5107818,4.58987601 C16.4881671,4.58978515 16.4620094,4.5896953 16.4324595,4.58960647 L16.0789915,4.58883422 C16.0304453,4.58875142 15.9789591,4.58866963 15.9246838,4.58858883 L15.1491499,4.58766678 C15.0749737,4.58759388 14.9986113,4.58752196 14.9202136,4.58745101 L14.1637515,4.58683864 C14.0744988,4.5867735 13.983663,4.58670932 13.891395,4.58664609 L12.4188002,4.58576887 C12.3159787,4.5857151 12.2124787,4.58566226 12.108451,4.58561036 L10.2115288,4.58477559 C10.1065966,4.58473469 10.0020412,4.58469469 9.89801354,4.5846556 L6.8573146,4.58368638 C6.78313834,4.58366655 6.71114817,4.58364758 6.64149485,4.58362946 Z M9.80280172,11.9166667 C10.0210177,11.9166667 10.1979167,12.1218695 10.1979167,12.375 C10.1979167,12.6281305 10.0210177,12.8333333 9.80280172,12.8333333 L9.80280172,12.8333333 L7.38469828,12.8333333 C7.16648232,12.8333333 6.98958333,12.6281305 6.98958333,12.375 C6.98958333,12.1218695 7.16648232,11.9166667 7.38469828,11.9166667 L7.38469828,11.9166667 Z M14.5678761,9.16666667 C14.8122845,9.16666667 15.0104167,9.37186949 15.0104167,9.625 C15.0104167,9.87813051 14.8122845,10.0833333 14.5678761,10.0833333 L14.5678761,10.0833333 L7.4321239,10.0833333 C7.18771549,10.0833333 6.98958333,9.87813051 6.98958333,9.625 C6.98958333,9.37186949 7.18771549,9.16666667 7.4321239,9.16666667 L7.4321239,9.16666667 Z M14.5678761,6.41666667 C14.8122845,6.41666667 15.0104167,6.62186949 15.0104167,6.875 C15.0104167,7.12813051 14.8122845,7.33333333 14.5678761,7.33333333 L14.5678761,7.33333333 L7.4321239,7.33333333 C7.18771549,7.33333333 6.98958333,7.12813051 6.98958333,6.875 C6.98958333,6.62186949 7.18771549,6.41666667 7.4321239,6.41666667 L7.4321239,6.41666667 Z'></path>\n </g>\n </svg>\n `;\n}\n\nexport function MissingWordSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(2.000000, 2.000000)'>\n <g transform='translate(3.500000, 2.000000)'>\n <path d='M10.78125,7.53125 C11.0285625,7.53125 11.2715937,7.59621875 11.4840312,7.71909375 C11.7963125,7.89971875 12.1875,7.6735625 12.1875,7.31334375 L12.1875,3.3125 C12.1875,3.053625 11.977625,2.84375 11.71875,2.84375 L8.38675,2.84375 C8.42015625,2.680125 8.4375,2.51184375 8.4375,2.34375 C8.4375,1.05140625 7.38609375,0 6.09375,0 C4.80140625,0 3.75,1.05140625 3.75,2.34375 C3.75,2.51184375 3.76734375,2.680125 3.80075,2.84375 L0.46875,2.84375 C0.209875,2.84375 0,3.053625 0,3.3125 L0,7.31334375 C0,7.674125 0.391625,7.899375 0.70346875,7.71909375 C0.91590625,7.59621875 1.1589375,7.53125 1.40625,7.53125 C2.18165625,7.53125 2.8125,8.16209375 2.8125,8.9375 C2.8125,9.71290625 2.18165625,10.34375 1.40625,10.34375 C1.1589375,10.34375 0.91590625,10.2787812 0.70346875,10.1559062 C0.3911875,9.9753125 0,10.2013437 0,10.5616563 L0,15.53125 C0,15.790125 0.209875,16 0.46875,16 L4.46959375,16 C4.8303125,16 5.05578125,15.608375 4.8753125,15.2965312 C4.7524375,15.0840937 4.6875,14.8410938 4.6875,14.59375 C4.6875,13.8183438 5.31834375,13.1875 6.09375,13.1875 C6.86915625,13.1875 7.5,13.8183438 7.5,14.59375 C7.5,14.8410938 7.4350625,15.0840937 7.31215625,15.2965312 C7.13146875,15.6087812 7.3576875,16 7.717875,16 L11.71875,16 C11.977625,16 12.1875,15.790125 12.1875,15.53125 L12.1875,10.5616563 C12.1875,10.2009375 11.7959375,9.97553125 11.4840312,10.1559063 C11.2715937,10.2787812 11.0285625,10.34375 10.78125,10.34375 C10.0058438,10.34375 9.375,9.71290625 9.375,8.9375 C9.375,8.16209375 10.0058438,7.53125 10.78125,7.53125 Z M10.78125,11.28125 C10.9393125,11.28125 11.096375,11.2652812 11.25,11.234 L11.25,15.0625 L8.39021875,15.0625 C8.42153125,14.9088438 8.4375,14.7518125 8.4375,14.59375 C8.4375,13.3014062 7.38609375,12.25 6.09375,12.25 C4.80140625,12.25 3.75,13.3014062 3.75,14.59375 C3.75,14.7518125 3.76596875,14.9088438 3.79728125,15.0625 L0.9375,15.0625 L0.9375,11.234 C1.091125,11.2652812 1.2481875,11.28125 1.40625,11.28125 C2.69859375,11.28125 3.75,10.2298438 3.75,8.9375 C3.75,7.64515625 2.69859375,6.59375 1.40625,6.59375 C1.2481875,6.59375 1.091125,6.60971875 0.9375,6.641 L0.9375,3.78125 L4.46959375,3.78125 C4.8303125,3.78125 5.05578125,3.389625 4.8753125,3.07778125 C4.75596875,2.87140625 4.6875,2.603875 4.6875,2.34375 C4.6875,1.56834375 5.31834375,0.9375 6.09375,0.9375 C6.86915625,0.9375 7.5,1.56834375 7.5,2.34375 C7.5,2.603875 7.43153125,2.87140625 7.31215625,3.07778125 C7.13146875,3.39003125 7.3576875,3.78125 7.717875,3.78125 L11.25,3.78125 L11.25,6.641 C11.096375,6.60971875 10.9393125,6.59375 10.78125,6.59375 C9.48890625,6.59375 8.4375,7.64515625 8.4375,8.9375 C8.4375,10.2298438 9.48890625,11.28125 10.78125,11.28125 Z'></path>\n </g>\n </g>\n </svg>\n `;\n}\n\nexport function MultipleChoiceSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(1.000000, 1.000000)'>\n <path d='M15.125,3.66666667 C16.8969136,3.66666667 18.3333333,5.10308643 18.3333333,6.875 L18.3333333,15.125 C18.3333333,16.8969136 16.8969136,18.3333333 15.125,18.3333333 L6.875,18.3333333 C5.10308643,18.3333333 3.66666667,16.8969136 3.66666667,15.125 L3.66666667,6.875 C3.66666667,5.10308643 5.10308643,3.66666667 6.875,3.66666667 L15.125,3.66666667 Z M15.125,4.58333333 L6.875,4.58333333 C5.60934745,4.58333333 4.58333333,5.60934745 4.58333333,6.875 L4.58333333,15.125 C4.58333333,16.3906526 5.60934745,17.4166667 6.875,17.4166667 L15.125,17.4166667 C16.3906526,17.4166667 17.4166667,16.3906526 17.4166667,15.125 L17.4166667,6.875 C17.4166667,5.60934745 16.3906526,4.58333333 15.125,4.58333333 Z M7.33333333,13.2916667 C7.83959435,13.2916667 8.25,13.7020723 8.25,14.2083333 C8.25,14.7145944 7.83959435,15.125 7.33333333,15.125 C6.82707231,15.125 6.41666667,14.7145944 6.41666667,14.2083333 C6.41666667,13.7020723 6.82707231,13.2916667 7.33333333,13.2916667 Z M15.0349223,13.75 C15.2880528,13.75 15.4932556,13.9552028 15.4932556,14.2083333 C15.4932556,14.4614638 15.2880528,14.6666667 15.0349223,14.6666667 L9.625,14.6666667 C9.37186949,14.6666667 9.16666667,14.4614638 9.16666667,14.2083333 C9.16666667,13.9552028 9.37186949,13.75 9.625,13.75 L15.0349223,13.75 Z M7.33333333,10.0833333 C7.83959435,10.0833333 8.25,10.493739 8.25,11 C8.25,11.506261 7.83959435,11.9166667 7.33333333,11.9166667 C6.82707231,11.9166667 6.41666667,11.506261 6.41666667,11 C6.41666667,10.493739 6.82707231,10.0833333 7.33333333,10.0833333 Z M15.125,10.5416667 C15.3781305,10.5416667 15.5833333,10.7468695 15.5833333,11 C15.5833333,11.2531305 15.3781305,11.4583333 15.125,11.4583333 L9.625,11.4583333 C9.37186949,11.4583333 9.16666667,11.2531305 9.16666667,11 C9.16666667,10.7468695 9.37186949,10.5416667 9.625,10.5416667 L15.125,10.5416667 Z M7.33333333,6.875 C7.83959435,6.875 8.25,7.28540565 8.25,7.79166667 C8.25,8.29792769 7.83959435,8.70833333 7.33333333,8.70833333 C6.82707231,8.70833333 6.41666667,8.29792769 6.41666667,7.79166667 C6.41666667,7.28540565 6.82707231,6.875 7.33333333,6.875 Z M15.125,7.33333333 C15.3781305,7.33333333 15.5833333,7.53853616 15.5833333,7.79166667 C15.5833333,8.04479718 15.3781305,8.25 15.125,8.25 L9.625,8.25 C9.37186949,8.25 9.16666667,8.04479718 9.16666667,7.79166667 C9.16666667,7.53853616 9.37186949,7.33333333 9.625,7.33333333 L15.125,7.33333333 Z'></path>\n </g>\n </svg>\n `;\n}\n\nexport function ImageSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <path d='M19,5 C19.5522847,5 20,5.44771525 20,6 L20,18 C20,18.5522847 19.5522847,19 19,19 L5,19 C4.44771525,19 4,18.5522847 4,18 L4,6 C4,5.44771525 4.44771525,5 5,5 L19,5 Z M19,6 L5,6 L5,18 L19,18 L19,6 Z M13.5270821,8.72788029 L17.419465,14.7278803 C17.5697525,14.9595444 17.5037838,15.2691774 17.2721197,15.419465 C17.0404556,15.5697525 16.7308226,15.5037838 16.580535,15.2721197 L13.0911139,9.89327406 L11.4091273,12.2874279 C11.2306031,12.5415408 10.866042,12.5731488 10.6464466,12.3535534 L10.0540971,11.7612039 L7.4,15.3 C7.23431458,15.5209139 6.9209139,15.5656854 6.7,15.4 C6.4790861,15.2343146 6.43431458,14.9209139 6.6,14.7 L9.6,10.7 C9.7825648,10.4565803 10.1383987,10.4312919 10.3535534,10.6464466 L10.9328729,11.2257661 L12.6984898,8.71257207 C12.9021272,8.42271292 13.3342903,8.43069712 13.5270821,8.72788029 Z M8,7.5 C8.82842712,7.5 9.5,8.17157288 9.5,9 C9.5,9.82842712 8.82842712,10.5 8,10.5 C7.17157288,10.5 6.5,9.82842712 6.5,9 C6.5,8.17157288 7.17157288,7.5 8,7.5 Z M8,8.5 C7.72385763,8.5 7.5,8.72385763 7.5,9 C7.5,9.27614237 7.72385763,9.5 8,9.5 C8.27614237,9.5 8.5,9.27614237 8.5,9 C8.5,8.72385763 8.27614237,8.5 8,8.5 Z'></path>\n </svg>\n `;\n}\n\nexport function AnnotationSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <path d='M16.8002 15.5516C16.5657 15.84 16.5105 16.2347 16.6569 16.5764L17.145 17.7153L15.6723 17.0841C15.4046 16.9694 15.1 16.9771 14.8384 17.1053L14.756 17.1457C13.9034 17.5634 12.9645 17.7835 11.9918 17.7835C8.51692 17.7835 5.7 14.9666 5.7 11.4918C5.7 8.01692 8.51692 5.2 11.9918 5.2C15.4666 5.2 18.2835 8.01692 18.2835 11.4918C18.2835 12.958 17.7819 14.3442 16.8765 15.4578L16.8002 15.5516ZM17.1319 19.0152C17.9616 19.3708 18.8005 18.5319 18.4449 17.7021L17.8075 16.2148C18.8554 14.926 19.4835 13.2823 19.4835 11.4918C19.4835 7.35418 16.1294 4 11.9918 4C7.85418 4 4.5 7.35418 4.5 11.4918C4.5 15.6294 7.85418 18.9835 11.9918 18.9835C13.173 18.9835 14.2903 18.7102 15.284 18.2233L17.1319 19.0152Z' />\n </svg>\n `;\n}\n\nexport function IllustrationSvg(): string {\n return `\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path fill-rule='evenodd' clip-rule='evenodd' d='M18.2411 13.7881C18.2887 13.5157 18.0395 13.2465 17.6953 13.3346C17.3344 13.4271 16.9508 13.4506 16.5627 13.3938C15.8185 14.404 15.232 15.0693 14.7556 15.4771C14.9397 15.8591 14.9223 16.3164 14.7953 16.7237C14.663 17.148 14.3965 17.5746 14.004 17.9197C13.1974 18.6288 11.9124 18.9538 10.252 18.3555L9.6361 18.1336L10.8248 16.4403C10.8536 16.3994 10.895 16.2797 10.948 15.9967C10.9568 15.9502 10.9658 15.8998 10.9752 15.8466L10.9753 15.846L10.9754 15.8459L10.9754 15.8459C11.0141 15.6287 11.0613 15.3639 11.1335 15.1223C11.2242 14.8188 11.3771 14.4637 11.6835 14.2095C11.9817 13.9622 12.3608 13.8619 12.8023 13.9024C13.0571 13.2864 13.5182 12.476 14.2494 11.3987L14.2357 11.357C14.2007 11.2488 14.1511 11.0868 14.119 10.8858C14.0536 10.4764 14.0643 9.9266 14.3604 9.29657C14.4494 9.10715 14.5146 8.91445 14.5573 8.72168C14.8536 7.38674 14.077 6.0484 12.7163 5.76998C12.6531 5.75701 12.5892 5.74486 12.5246 5.73347C8.70188 5.05944 5.05659 7.61193 4.38254 11.4346C3.70848 15.2574 6.26101 18.9027 10.0837 19.5768C13.9064 20.2508 17.5518 17.6983 18.2258 13.8756L18.2411 13.7881ZM15.8626 12.6572C15.8947 12.5723 15.9481 12.5005 16.0149 12.4463C16.091 12.34 16.1692 12.2296 16.2493 12.1152C17.2716 10.6552 18.1315 9.27136 18.6754 8.22122C18.8855 7.81559 19.042 7.47194 19.1431 7.19994C18.9065 7.38016 18.6161 7.63896 18.2839 7.97168C17.4465 8.81052 16.4034 10.0589 15.3866 11.5111C14.5179 12.7517 14.0214 13.6064 13.7659 14.1913L14.285 14.5548C14.6757 14.1827 15.1887 13.5831 15.8626 12.6572ZM17.4471 12.3659C17.3881 12.381 17.3282 12.3933 17.2674 12.4027C18.2189 11.0249 19.029 9.71286 19.5633 8.68114C19.8471 8.13334 20.0641 7.64372 20.1787 7.25589C20.2351 7.06519 20.2765 6.8674 20.2745 6.68479C20.2725 6.51587 20.2295 6.23216 19.9736 6.05296C19.7244 5.87848 19.4469 5.92652 19.2885 5.97523C19.1139 6.02893 18.9362 6.12717 18.7674 6.23956C18.4249 6.46764 18.0169 6.82379 17.5762 7.26518C16.8442 7.99842 15.9806 9.00929 15.1147 10.1778C15.1398 10.0455 15.1836 9.90125 15.2542 9.74611L15.2654 9.72185C16.2163 7.69819 15.1756 5.25268 12.9173 4.7904C12.8445 4.77544 12.7715 4.76158 12.6983 4.74868C8.33172 3.97872 4.16769 6.89438 3.39773 11.261C2.62777 15.6276 5.54347 19.7916 9.91006 20.5616C14.2767 21.3315 18.4407 18.4159 19.2106 14.0492L19.2262 13.9606C19.4123 12.8961 18.4178 12.1172 17.4471 12.3659ZM11.6433 17.0149C11.8176 16.7665 11.8855 16.4229 11.9309 16.1811C11.9432 16.1158 11.9545 16.0525 11.9655 15.9909C12.0033 15.7804 12.0374 15.5901 12.0916 15.4086C12.161 15.1765 12.2405 15.0468 12.3219 14.9792C12.3717 14.9379 12.4608 14.8871 12.649 14.894L13.8774 15.9774C13.9004 16.0738 13.9028 16.2267 13.8406 16.426C13.7637 16.6728 13.6001 16.9432 13.3438 17.1686C12.934 17.5288 12.2479 17.8037 11.2342 17.5976L11.6433 17.0149ZM7 14.5C7 14.7761 7.22386 15 7.5 15C7.77614 15 8 14.7761 8 14.5C8 14.2239 7.77614 14 7.5 14C7.22386 14 7 14.2239 7 14.5ZM9 14.5C9 15.3284 8.32843 16 7.5 16C6.67157 16 6 15.3284 6 14.5C6 13.6716 6.67157 13 7.5 13C8.32843 13 9 13.6716 9 14.5ZM11.6 8.5C11.6 8.77614 11.3761 9 11.1 9C10.8238 9 10.6 8.77614 10.6 8.5C10.6 8.22386 10.8238 8 11.1 8C11.3761 8 11.6 8.22386 11.6 8.5ZM9.59998 8.5C9.59998 9.32843 10.2715 10 11.1 10C11.9284 10 12.6 9.32843 12.6 8.5C12.6 7.67157 11.9284 7 11.1 7C10.2715 7 9.59998 7.67157 9.59998 8.5ZM7.70007 11C7.42393 11 7.20007 10.7761 7.20007 10.5C7.20007 10.2239 7.42393 10 7.70007 10C7.97622 10 8.20007 10.2239 8.20007 10.5C8.20007 10.7761 7.97622 11 7.70007 11ZM7.70007 12C8.5285 12 9.20007 11.3284 9.20007 10.5C9.20007 9.67157 8.5285 9 7.70007 9C6.87165 9 6.20007 9.67157 6.20007 10.5C6.20007 11.3284 6.87165 12 7.70007 12Z' />\n </svg>\n `;\n}","import React from 'react';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnnotationSvg, IllustrationSvg, ImageSvg, MissingWordSvg, MultipleChoiceSvg, ShortAnswerSvg, TrueOrFalseSvg } from 'libs/shared/components/svgs/interaction-types/InteractionTypes';\nimport { InteractionTypeId } from 'libs/shared/interfaces';\n\nconst internalGetPhrase = LanguageService.encloseNamespace('shared.interactionTypes');\nconst getPhrase = (phrase: string, fallback: string) => {\n if (!LanguageService.isInitialised())\n return fallback;\n return internalGetPhrase(phrase);\n};\n\ninterface InteractionTypeInfo {\n name: string;\n prompt?: string;\n bgClassName: string;\n Svg: React.FC;\n svgEl?: string\n /**\n * Used for anlaytics\n */\n typeName: string;\n}\n\n\nfunction parseSvgElement(svg: string): React.ReactElement {\n return (\n <div dangerouslySetInnerHTML={{ __html: svg }}></div>\n );\n}\n\nconst interactionTypeDefaults = {\n [InteractionTypeId.Annotation](): InteractionTypeInfo {\n return {\n name: getPhrase('annotationName', 'Annotation'),\n bgClassName: 'bg-pink',\n Svg: () => parseSvgElement(AnnotationSvg()),\n svgEl: AnnotationSvg(),\n typeName: 'annotation'\n };\n },\n [InteractionTypeId.Image](): InteractionTypeInfo {\n return {\n name: getPhrase('imageName', 'Image'),\n bgClassName: 'bg-orange',\n Svg: () => parseSvgElement(ImageSvg()),\n svgEl: ImageSvg(),\n typeName: 'image'\n };\n },\n [InteractionTypeId.MissingWord](): InteractionTypeInfo {\n return {\n name: getPhrase('missingWordName', 'Fill in the blank'),\n prompt: getPhrase('missingWordPrompt', 'Fill in the blank by typing the missing word(s)'),\n bgClassName: 'bg-teal',\n Svg: () => parseSvgElement(MissingWordSvg()),\n svgEl: MissingWordSvg(),\n typeName: 'missing-word'\n };\n },\n [InteractionTypeId.MultipleChoice](): InteractionTypeInfo {\n return {\n name: getPhrase('multipleChoiceName', 'Multiple choice'),\n prompt: getPhrase('multipleChoicePrompt', 'Choose the correct answer(s)'),\n bgClassName: 'bg-blue',\n Svg: () => parseSvgElement(MultipleChoiceSvg()),\n svgEl: MultipleChoiceSvg(),\n typeName: 'multiple-choice'\n };\n },\n [InteractionTypeId.ShortAnswer](): InteractionTypeInfo {\n return {\n name: getPhrase('shortAnswerName', 'Short answer'),\n prompt: getPhrase('shortAnswerPrompt', 'Type in your answer to the question'),\n bgClassName: 'bg-green',\n Svg: () => parseSvgElement(ShortAnswerSvg()),\n svgEl: ShortAnswerSvg(),\n typeName: 'short-answer'\n };\n },\n [InteractionTypeId.TrueOrFalse](): InteractionTypeInfo {\n return {\n name: getPhrase('trueOrFalseName', 'True or false'),\n prompt: getPhrase('trueOrFalsePrompt', 'Choose the correct answer'),\n bgClassName: 'bg-purple',\n Svg: () => parseSvgElement(TrueOrFalseSvg()),\n svgEl: TrueOrFalseSvg(),\n typeName: 'true-or-false'\n };\n },\n [InteractionTypeId.Illustration](): InteractionTypeInfo {\n return {\n name: getPhrase('illustrationName', 'Illustrate'),\n prompt: getPhrase('illustrationPrompt', 'Draw the answer'),\n bgClassName: 'bg-indigo',\n Svg: () => parseSvgElement(IllustrationSvg()),\n svgEl: IllustrationSvg(),\n typeName: 'illustration'\n };\n }\n};\n\nexport const InteractionTypeHelper = {\n getTypeInfo: (typeId: InteractionTypeId) => {\n const func = interactionTypeDefaults[typeId];\n\n if (!func) {\n Core.ErrorHelper.throw(new DevError(`No type info defined for typeId: ${typeId}`));\n return;\n }\n\n return func();\n }\n};","function stripTag(text: string, tag: string, newLine: boolean) {\n return text\n .replace(new RegExp(`<${tag}.*?>`, 'gi'), '')\n .replace(new RegExp(`</${tag}>`, 'gi'), newLine ? '<br>' : '');\n}\n\nfunction stripTags(text: string, tags: string[], newLine: boolean = false): string {\n if (!text || !tags.length)\n return text;\n\n return tags.reduce((text, tag) => stripTag(text, tag, newLine), text);\n}\n\ninterface StripTagsOptions {\n text: string;\n fallbackText?: string;\n}\n\nexport const StripTagsHelper = {\n /**\n * Light weight helper that strips common tags from a html string.\n * NOTE: Does not strip all tags, only ones commonly found in text content such as annotations\n */\n stripTags(options: StripTagsOptions): string {\n const { text, fallbackText } = options;\n\n if (!text) return;\n\n let result = text;\n result = stripTags(result, [ 'ul', 'ol', 'b', 'i', 'u', 'old', 'em', 'strong', 'sup', 'sub', 'a', 'span', 'svg', 'path' ]);\n result = stripTags(result, [ 'li', 'p', 'div' ], true);\n \n return result.split('<br>')?.filter(t => !!t)?.join('')?.trim() || fallbackText;\n }\n};","import { StripTagsHelper } from 'libs/shared/utils/StripTagsHelper';\n\n\nexport function formatAnnotationText(text: string): string {\n return StripTagsHelper.stripTags({ text, fallbackText: 'Annotation' });\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Interaction, InteractionTypeId } from 'libs/shared/interfaces';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport { formatAnnotationText } from './formatAnnotationText';\n\ninterface InteractionLabelProps {\n interaction: Interaction;\n smallIcon?: boolean;\n showIcon?: boolean;\n showTypeName?: boolean;\n showQuestion?: boolean;\n iconClassName?: string;\n typeNameClassName?: string;\n questionClassName?: string;\n containerClassName?: string;\n questionNumber?: string | number;\n appLink?: Core.AppLink;\n onClick?: () => void;\n}\n\nInteractionLabel.defaultProps = {\n showIcon: true,\n showQuestion: true\n};\n\nexport function InteractionLabel(props: InteractionLabelProps): JSX.Element {\n const { name, bgClassName, Svg } = InteractionTypeHelper.getTypeInfo(props.interaction.typeId);\n\n const questionNumber = props.questionNumber ? `${props.questionNumber}. ` : '';\n\n let iconClassName = `interaction-type-icon flex-shrink-0 ${bgClassName}`;\n\n if (props.smallIcon)\n iconClassName += ' sm';\n\n if (props.showQuestion || props.showTypeName)\n iconClassName += props.smallIcon\n ? ' me-1'\n : ' me-2';\n\n if (props.iconClassName)\n iconClassName += ` ${props.iconClassName}`;\n\n return (\n <span className={props.containerClassName}>\n {!!props.showIcon &&\n <span className={iconClassName}>\n <Svg />\n </span>\n }\n <AppLink appLink={props.appLink} onClick={props.onClick}>\n {!!props.showTypeName &&\n <span className={props.typeNameClassName}><strong>{questionNumber}{name}</strong></span>\n }\n {!!props.showQuestion &&\n <span className={props.questionClassName}>\n {props.interaction.typeId === InteractionTypeId.Annotation\n ? <span dangerouslySetInnerHTML={{\n __html: formatAnnotationText(props.interaction.data.annotation)\n }} />\n : props.interaction.name\n }\n </span>\n }\n </AppLink>\n </span>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { ExperimentalInteractionTypes, Interaction, InteractionTypeId, Timepoint } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveItem';\n\nfunction useGetQuestionDisplayLimit(totalToDisplay: number): number {\n const mediaQuery = useGetMediaQueryString();\n\n if (typeof totalToDisplay === 'number')\n return totalToDisplay;\n \n if (mediaQuery === MediaQueryStrings.XS)\n return 3;\n\n if (mediaQuery === MediaQueryStrings.SM)\n return 1;\n\n if (mediaQuery === MediaQueryStrings.MD || mediaQuery === MediaQueryStrings.LG)\n return 2;\n\n return 3;\n}\n\ninterface InteractiveItemQuestionsProps {\n timepoints: Timepoint[];\n appLink?: Core.AppLink;\n onClickAppLink?: () => void;\n previewAppLink: Core.AppLink;\n totalToDisplay?: number;\n}\n\nexport function InteractiveItemQuestions(props: InteractiveItemQuestionsProps): JSX.Element {\n const questionDisplayLimit = useGetQuestionDisplayLimit(props.totalToDisplay);\n\n if (!props.timepoints?.length)\n return <></>;\n\n const interactionsToShow: Interaction[] = [];\n let interactionCount: number = 0;\n\n props.timepoints.forEach(timepoint => {\n timepoint?.interactions.forEach(interaction => {\n if (ExperimentalInteractionTypes[interaction.typeId])\n return;\n\n if (interactionCount >= questionDisplayLimit)\n return;\n\n interactionCount++;\n\n // When displaying an annotation interaction, we display the \"data\" field, which may be a JSON string\n // For other interactions we display the \"name\" field, so we don't need to parse those.\n const interactionData = interaction.typeId === InteractionTypeId.Annotation && typeof(interaction.data) === 'string'\n ? JSON.parse(interaction.data)\n : interaction.data;\n\n const interactionToShow = {\n ...interaction,\n data: {\n ...interactionData,\n // Add interactive time to applink and convert to seconds\n appLink: props.appLink && { ...props.appLink, params: { t: Math.floor(timepoint.visibleAt / 1000) } }\n }\n };\n \n interactionsToShow.push(interactionToShow);\n });\n });\n \n const totalInteractions = props.timepoints.reduce((acc, timepoint) => {\n const totalInteractions = timepoint?.interactions?.length ?? 0;\n acc += totalInteractions;\n\n return acc;\n }, 0);\n\n if (!interactionsToShow.length)\n return <></>;\n\n return (\n <>\n {interactionsToShow.map((interaction, i) => {\n return (\n <div key={i} className='d-flex align-items-center mb-1'>\n <div className='clamp-1'>\n <InteractionLabel\n interaction={interaction}\n appLink={interaction.data?.appLink}\n onClick={interaction.data?.appLink ? props.onClickAppLink : null}\n smallIcon\n />\n </div>\n </div>\n );\n })}\n <div className='mb-1 text-link'>\n <AppLink\n className='cursor-pointer hover-text-underline'\n appLink={props.previewAppLink}\n onClick={props.onClickAppLink}\n >\n <Text\n namespace={namespace}\n phrase='previewQuestions'\n options={{\n questionsShown: interactionsToShow.length,\n smartCount: totalInteractions\n }}\n />\n </AppLink>\n </div>\n </>\n );\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BaseVideoItemProps } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoItemDescription } from 'libs/shared/components/video-list/components/video-item-description/VideoItemDescription';\nimport { VideoItemLeftContent } from 'libs/shared/components/video-list/components/video-item-left-content/VideoItemLeftContent';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoItemTopRight } from 'libs/shared/components/video-list/components/video-item-top-right/VideoItemTopRight';\nimport { InteractiveItemQuestions } from 'libs/shared/components/video-list/interactive-item/InteractiveItemQuestions';\nimport { SortableVideoListContext } from 'libs/shared/components/video-list/VideoList';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { InteractiveMetadata } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport interface InteractiveItemProps extends BaseVideoItemProps<InteractiveMetadata> {\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n}\n\nexport const InteractiveItem = React.forwardRef((props: InteractiveItemProps, ref: React.LegacyRef<HTMLDivElement>) => {\n const breakpoints = useBreakpoints();\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n\n const size = VideoListHelper.getSize(breakpoints, props.size);\n const isSmall = size === 'sm';\n\n const { isSortable } = React.useContext(SortableVideoListContext);\n\n const mergedAudience = useMergeAudiences(props.video.subjectPresentationAudiences?.data, props.presentationAudiences);\n\n const showDragHandle = isSortable && !breakpoints.xs && (hovered || typeof props.index === 'undefined' || !props.showIndexes);\n const showIndexes = (props.showIndexes && !showDragHandle) && !breakpoints.xs;\n const hasIconOrIndex = (showDragHandle || props.showIndexes) && !breakpoints.xs;\n\n const appLink = props.getVideoAppLink(props.video, {});\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: {\n entity: EntityType.Interactive,\n location: LocationContext.InteractiveListItem\n }\n };\n\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n return (\n <div ref={hoverRef} className='w-100'>\n <div className='row g-0 py-2' ref={ref} style={props.style}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <Row>\n <VideoItemLeftContent\n index={props.index}\n showDragHandle={showDragHandle}\n showIndexes={showIndexes}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n dragAttributes={props.dragAttributes}\n dragListeners={props.dragListeners}\n />\n \n <Col xs={VideoListHelper.getThumbnailColSize(hasIconOrIndex)}>\n <VideoThumbnail\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n shareId={props.shareId}\n audience={mergedAudience}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n hideDuration={isSmall}\n commonVideoProps={{\n ...props.commonVideoProps,\n subTextType: 'none'\n }}\n />\n </Col>\n </Row>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={`position-relative ${isSmall ? 'pb-2' : 'px-2'}`}>\n <div className='d-flex justify-content-between'>\n <VideoItemTitle\n video={props.video}\n appLink={appLink}\n size={size}\n yearGroups={props.commonVideoProps.yearGroups}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n linkClassName='flex-grow-1'\n {...analyticsProps}\n />\n <VideoItemTopRight\n {...analyticsProps}\n video={props.video}\n showSignIn={props.showSignIn}\n signInAppLink={props.getSignInAppLink?.(appLink)}\n />\n </div>\n\n {canNavigate ? (\n <div className='pt-sm-1 pt-md-0'>\n <InteractiveItemQuestions\n timepoints={props.video._timepoints?.value}\n appLink={appLink}\n previewAppLink={props.getPreviewQuestionsAppLink(props.video)}\n />\n </div>\n ) : (\n <VideoItemDescription\n video={props.video}\n showSignIn={props.showSignIn}\n hasStudentExperience={props.commonVideoProps.hasStudentExperience}\n hasGuestExperience={props.commonVideoProps.hasGuestExperience}\n />\n )}\n\n {!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience && (\n <VideoItemRestrictionBadge video={props.video} yearGroups={props.commonVideoProps.yearGroups}/>\n )}\n </Col>\n </div>\n </div>\n );\n});\n\ntype SortableInteractiveItemProps = InteractiveItemProps & {\n index: number;\n}\n\nexport const SortableInteractiveItem = (props: SortableInteractiveItemProps) => {\n return (\n <SortableItemWrapper id={props.video.id} childComponent={InteractiveItem} childProps={props} />\n );\n};","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BaseVideoItemProps } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemDescription } from 'libs/shared/components/video-list/components/video-item-description/VideoItemDescription';\nimport { VideoItemLeftContent } from 'libs/shared/components/video-list/components/video-item-left-content/VideoItemLeftContent';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoItemTopRight } from 'libs/shared/components/video-list/components/video-item-top-right/VideoItemTopRight';\nimport { SortableVideoListContext } from 'libs/shared/components/video-list/VideoList';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { Video } from 'libs/shared/interfaces';\n\nimport styles from './video-item.module.scss';\n\nexport interface VideoItemProps extends BaseVideoItemProps<Video> {}\n\nexport const VideoItem = React.forwardRef((props: VideoItemProps, ref: React.LegacyRef<HTMLDivElement>) => {\n const breakpoints = useBreakpoints();\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n\n const size = VideoListHelper.getSize(breakpoints, props.size);\n\n const isSmall = size === 'sm';\n\n const { isSortable } = React.useContext(SortableVideoListContext);\n\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const showDragHandle = isSortable && !breakpoints.xs && (hovered || typeof props.index === 'undefined' || !props.showIndexes);\n const showIndexes = (props.showIndexes && !showDragHandle) && !breakpoints.xs;\n const hasIconOrIndex = (showDragHandle || props.showIndexes) && !breakpoints.xs;\n\n const appLink = props.getVideoAppLink?.(props.video, {});\n\n function getSubTextAppLink(): Core.AppLink {\n return props.commonVideoProps.getSubTextAppLink?.(props.video);\n }\n\n const subTextType = props.commonVideoProps.getSubTextType?.(props.video);\n\n const subTextAppLink = getSubTextAppLink();\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions ?? {\n entity: EntityType.Video,\n location: LocationContext.VideoListItem\n }\n };\n\n return (\n <div ref={hoverRef} className='w-100'>\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`} style={props.style} ref={ref}>\n <Col\n {...VideoListHelper.getThumbnailColumns()}\n className={`flex-column align-items-flex-start mb-1 mb-sm-0 pb-sm-2 pe-sm-2 px-md-2 pb-md-0`}\n >\n <Row>\n <VideoItemLeftContent\n index={props.index}\n showDragHandle={showDragHandle}\n showIndexes={showIndexes}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n dragAttributes={props.dragAttributes}\n dragListeners={props.dragListeners}\n />\n \n <Col xs={VideoListHelper.getThumbnailColSize(hasIconOrIndex)}>\n <VideoThumbnail\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n shareId={props.shareId}\n audience={mergedAudience}\n imageOptions={{ size: hasIconOrIndex ? ImageSize.Small : ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n hideRating={false}\n commonVideoProps={props.commonVideoProps}\n />\n </Col>\n </Row>\n </Col>\n <Col\n {...VideoListHelper.getDetailsColumns()}\n className={`d-flex position-relative flex-column px-0 px-md-2 pb-0 pb-sm-2 pb-md-0 justify-content-md-between`}\n >\n <div>\n <div className='d-flex justify-content-between'>\n <div className='flex-grow-1'>\n <VideoSubText\n {...analyticsProps}\n video={props.video}\n appLink={subTextAppLink}\n type={subTextType}\n />\n <VideoItemTitle\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n size={size}\n yearGroups={props.commonVideoProps.yearGroups}\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience\n && !props.commonVideoProps.hasGuestExperience}\n titleClassName='mb-0'\n />\n </div>\n <VideoItemTopRight\n {...analyticsProps}\n video={props.video}\n showSignIn={props.showSignIn}\n signInAppLink={props.getSignInAppLink?.(appLink)}\n />\n </div>\n\n {!isSmall && (\n <VideoItemDescription\n video={props.video}\n showSignIn={props.showSignIn}\n hasStudentExperience={props.commonVideoProps.hasStudentExperience}\n hasGuestExperience={props.commonVideoProps.hasGuestExperience}\n />\n )}\n\n {!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience && (\n <VideoItemRestrictionBadge video={props.video} yearGroups={props.commonVideoProps.yearGroups}/>\n )}\n </div>\n\n {!props.hideVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n getVideoAppLink={props.getVideoAppLink}\n commonVideoProps={props.commonVideoProps}\n containerClassName={`d-flex justify-content-start align-items-center pt-sm-1 gap-1`}\n responsiveClassName={styles.responsiveGuidance}\n {...analyticsProps}\n />\n )}\n </Col>\n </div>\n </div>\n );\n});\n\nVideoItem.defaultProps = {\n dragHandleIcon: HandleSvg,\n dragHandleIconSize: SvgContainerSize.Small,\n size: 'md'\n};\n\ntype SortableVideoItemProps = VideoItemProps & {\n index: number;\n};\n\nexport const SortableVideoItem = (props: SortableVideoItemProps) => {\n return (\n <SortableItemWrapper id={props.video.id} childComponent={VideoItem} childProps={props} />\n );\n};","import * as React from 'react';\nimport { DragEndEvent, DragStartEvent } from '@dnd-kit/core';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { DragDropMoveWrapper } from 'libs/shared/components/drag-drop-move/DragDropMoveWrapper';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { BulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { InteractiveMetadata, PresentationAudience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ClipItem, ClipItemProps, SortableClipItem } from './clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps, SortableInteractiveItem } from './interactive-item/InteractiveItem';\nimport { SortableVideoItem, VideoItem, VideoItemProps } from './video-item/VideoItem';\n\nimport styles from './video-list.module.scss';\n\nconst namespace = 'shared.videoList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ItemComponent = (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element;\n\nfunction getItemComponent(video: VideoTypes, isSortable: boolean): ItemComponent {\n if (VideoHelper.isClip(video))\n return isSortable ? SortableClipItem : ClipItem;\n\n if (VideoHelper.isInteractive(video))\n return isSortable ? SortableInteractiveItem : InteractiveItem;\n\n return isSortable ? SortableVideoItem : VideoItem;\n}\n\ninterface SortableVideoListContextProps {\n isSortable: boolean;\n currentSortingIndex?: number;\n}\n\nexport const SortableVideoListContext = React.createContext<SortableVideoListContextProps>({\n isSortable: false\n});\n\nexport interface VideoListProps {\n videos: VideoTypes[];\n getVideoAppLink: (video: VideoTypes, options: GetVideoAppLinkOptions) => Core.AppLink;\n getSignInAppLink?: (appLink: Core.AppLink) => Core.AppLink;\n getPreviewQuestionsAppLink?: (interactive: InteractiveMetadata) => Core.AppLink;\n hideVideoGuidance?: boolean;\n cursors?: Cursors;\n dragHandleIcon?: SvgIcon;\n dragHandleIconSize?: SvgContainerSize;\n showSignIn?: boolean;\n showIndexes?: boolean;\n startingPositionIndex?: number;\n canRemovePrivateVideos?: boolean;\n presentationAudiences?: PresentationAudience[];\n allowBulkAction?: boolean;\n getVideosBulkAction?: (items: string[]) => ActionOptions[];\n drag?: boolean;\n typeFilter?: SearchIndices | SearchIndices[];\n checkboxHelper?: BulkCheckboxManager;\n hasPermissions: HasPermissionsFunc;\n showOwner?: boolean;\n shareId?: string;\n getAnalyticsData?: (itemIndex: number) => HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function VideoList(props: VideoListProps): JSX.Element {\n const { isSortable } = React.useContext(SortableVideoListContext);\n const [ isDragging, setIsDragging ] = React.useState<boolean>(false);\n const { checkboxHelper: CheckboxHelper } = props;\n \n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n\n return (\n <>\n <div className={`position-relative ${styles.videoList}`}>\n \n {props.videos.map((v, idx) => {\n const Component = getItemComponent(v, isSortable);\n \n /**\n * Where we're provided with a starting position index by the parent, \n * we'll use that as the starting position instead of the local index.\n */\n const pagePositionStartingIndex = Number.isInteger(props.startingPositionIndex)\n ? props.startingPositionIndex\n : 0;\n\n const dragData = CheckboxHelper && CheckboxHelper.getSelectedCount() > 1 && CheckboxHelper.isChecked(v.id)\n ? CheckboxHelper.getSelected()\n : v;\n\n const analyticsData = typeof props.getAnalyticsData === 'function'\n ? props.getAnalyticsData(idx)\n : {\n pagePositionIndex: pagePositionStartingIndex + idx\n };\n\n return (\n <DragDropMoveWrapper\n draggable={(props.drag && !isSortable) && ({ id: v.id, data: dragData })}\n dragStyle={styles.dragStyle}\n isDragging={isDragging}\n setIsDragging={setIsDragging}\n key={`${v.id}:${idx}`}\n >\n <div className='d-flex flex-row align-items-center'>\n {props.allowBulkAction && (\n <Checkbox\n className='mx-0 mx-md-2'\n id={v.id}\n ariaLabel={`${getPhrase('ariaBulkAction')}: ${v.name}`}\n onChange={() => CheckboxHelper.onToggleItem(v.id)}\n checked={CheckboxHelper.isChecked(v.id)}\n />\n )}\n <Component\n video={v}\n index={idx}\n getVideoAppLink={props.getVideoAppLink}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n showSignIn={props.showSignIn}\n getSignInAppLink={props.getSignInAppLink}\n analyticsData={analyticsData}\n hasPermissions={props.hasPermissions}\n canRemovePrivateVideos={props.canRemovePrivateVideos}\n presentationAudiences={props.presentationAudiences}\n showIndexes={props.showIndexes}\n getPreviewQuestionsAppLink={props.getPreviewQuestionsAppLink}\n hideVideoGuidance={props.hideVideoGuidance}\n showOwner={props.showOwner}\n shareId={props.shareId}\n commonVideoProps={props.commonVideoProps}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n </DragDropMoveWrapper>\n );\n })}\n </div>\n\n {props.cursors &&\n <Pagination appLink={currentAppLink} cursors={props.cursors} />\n }\n </>\n );\n}\n\ninterface SortableVideoListProps extends VideoListProps {\n currentSortingIndex?: number;\n onSortEnd: (event: DragEndEvent) => void;\n onSortStart: (event: DragStartEvent) => void;\n\n}\n\nexport const SortableVideoList = (props: SortableVideoListProps) => {\n const ids = props.videos.map(v => v.id);\n\n const getDragOverlay = (id: string) => {\n const video = props.videos.find(v => v.id === id);\n const Component = getItemComponent(video, true);\n\n return (\n <div className={`bg-white ${styles.sortableVideo}`}>\n <SortableVideoListContext.Provider value={{ isSortable: true }}>\n <Component\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n showSignIn={props.showSignIn}\n getSignInAppLink={props.getSignInAppLink}\n hasPermissions={props.hasPermissions}\n hideVideoGuidance={props.hideVideoGuidance}\n getPreviewQuestionsAppLink={props.getPreviewQuestionsAppLink}\n shareId={props.shareId}\n commonVideoProps={props.commonVideoProps}\n />\n </SortableVideoListContext.Provider>\n </div>\n );\n };\n\n return (\n <SortableContainerWrapper\n ids={ids}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortEnd}\n onSortStart={props.onSortStart}\n >\n <SortableVideoListContext.Provider value={{ isSortable: true, currentSortingIndex: props.currentSortingIndex }}>\n <VideoList {...props} />\n </SortableVideoListContext.Provider>\n </SortableContainerWrapper>\n );\n};"],"names":["InteractionTypeId","ExperimentalInteractionTypes","VideoActionsContext","React.createContext","getSubTextAppLink","video","getSeriesAppLink","useCommonVideoProps","config","Flight.useBasicFetch","ConfigRequests","_a","buildCursor","appLink","cursorParam","prevHack","currentParams","Pagination","cursors","className","buttonVariant","scrollTop","onClick","onClickButton","page","ScrollHelper","AnalyticsHelper","LocationContext","EntityType","UserAction","jsx","LanguageNamespaceContext","jsxs","AppLink","Text","Button","arrayMove","array","from","to","newArray","isValidIndex","index","rectSortingStrategy","_ref","rects","activeIndex","overIndex","newRects","oldRect","newRect","ID_PREFIX","Context","defaultNewIndexGetter","id","items","defaultAnimateLayoutChanges","_ref2","containerId","isSorting","wasDragging","newIndex","previousItems","previousContainerId","transition","defaultTransition","transitionProperty","disabledTransition","CSS","defaultAttributes","useDerivedTransform","disabled","node","rect","derivedTransform","setDerivedtransform","useState","previousIndex","useRef","useIsomorphicLayoutEffect","initial","current","getClientRect","delta","useEffect","useSortable","animateLayoutChanges","userDefinedAttributes","localDisabled","customData","getNewIndex","localStrategy","resizeObserverConfig","globalDisabled","disableTransforms","sortedRects","useDragOverlay","globalStrategy","useContext","normalizeLocalDisabled","data","useMemo","itemsAfterCurrentSortable","isOver","setDroppableNodeRef","useDroppable","active","activatorEvent","activeNodeRect","attributes","setDraggableNodeRef","listeners","isDragging","over","setActivatorNodeRef","transform","useDraggable","setNodeRef","useCombinedRefs","displaceItem","shouldDisplaceDragSource","dragSourceDisplacement","finalTransform","activeId","previous","itemsHaveChanged","shouldAnimateLayoutChanges","timeoutId","getTransition","isKeyboardEvent","_localDisabled$dragga","_localDisabled$droppa","KeyboardCode","getDragDirection","SortableItemWrapper","props","style","Children","dragDirection","HeartOutlineSvg","HeartSvg","FavouriteHelper","object","user","ArrayHelper","shouldFavourite","isHovering","VideoHelper","UserAgentHelper","namespace","getPhrase","LanguageService","FavouriteButton","alerts","useAlerts","initialState","isFavourite","setIsFavourite","React.useState","React.useEffect","styles","onError","getErrorPhraseKey","FunctionHelper","Fragment","DivButton","SvgContainer","VideoWatchProgressBar","progress","watchPercentage","VideoThumbnailBottomBar","DEFAULT_CLASS_NAME","DEFAULT_TAG_NAME","SvgContainer2","children","tagName","size","SvgContainerSize","title","tooltipPlacement","Container","containerProps","Tooltip","LiteOwnerAvatar","_b","ClickViewLogoMark","Avatar","UserHelper","_c","PluginHover","ThumbnailPadlock","svgSize","LockSvg","ThumbnailCompanyLogo","company","url","ImageHelper","ImageSize","logoFallbackBgClassName","getBgColorClass","BG_COLOUR_CLASS_NAMES","_d","_e","VideoTypeBadge","TypeBadge","MasterType","GlobalPlayerConsumer","playerContext","usePlayerContext","theatreMode","OutPortal","shouldShow","rounding","PlayCircleSvg","getTitleClass","hovering","ExpandableVideoThumbnail","canNavigate","canConsume","hoverToPlay","appLinkParams","ObjectHelper","eventAnalyticsOptions","showFavouriteButton","isVideo","rating","thumbnailHoverRef","isThumbnailHovering","useHoverIntent","showThumbnailPreviewVideo","analyticsData","analyticsOptions","ClickDescriptor","BaseImage","ImageType","ImageFallback","ImageFallbackType","VideoSubText","BadgeListContainer","Badge","BadgeType","CloseCaptionBadgeSvg","VideoPreviewContext","React","useHoverLogger","hasHovered","setHasHovered","timeStartedHovering","timeHoveredInMilliseconds","EDGE_THRESHOLD","DEFAULT_SCALE","calculatePosition","parentDOMRect","fixedWith","minWidth","scale","x","y","width","height","contentReferenceEle","newX","previewWidth","previewHeight","realScale","newY","left","transformOrigin","HoverToPortalContainer","hoverableComponent","componentProps","minHoverWidth","fixedHoverWidth","hoverScale","setPreviewContentNode","Core.ErrorHelper","DevError","portalNode","createHtmlPortalNode","hoverCardRef","isHoverCardHovering","useHover","debugShow","setDebugShow","videoPositionRef","prevStatus","currentIsHovering","hoverPositionConfig","HoverableComponent","InPortal","AudienceLabel","VideoThumbnailBadges","showAudience","showRating","RestrictionPadlock","RestrictionHelper","TODAY","isDateInCurrentMonth","target","DateHelper","VideoTitle","dateRelease","isCurrentMonth","shouldShowNewVideoIndicator","ThumbnailText","ContainerWrapper","VideoGuidanceTag","ClassroomGuideTag","GraduationCapSvg","InteractivesTag","interactiveCount","InteractiveSvg","getResourceCount","ResourcesTag","resourceCount","ResourcesSvg","VideoItemGuidance","showingResourcesAndInteractives","showClassroomGuide","_f","RemoveVideoButton","tooltip","CloseSvg","PopoutVideo","imageOptions","preload","onClickRemove","e","showRemoveButton","PopoutVideoThumbnail","PlayCircleFilledSvg","MaskType","getClassByType","type","getSvg","displayInverse","Mask","alwaysShowIcon","typeClass","svg","TickSvg","CheckMarkButton","isComplete","setIsComplete","shouldRender","shouldComplete","newStatus","hasActions","VideoThumbnailActions","ThumbnailTextPosition","textPosition","isStatic","textIsOverlayed","StaticVideoThumbnail","hoverRef","hoverIntentRef","isHoveringIntentionally","setHoverRefs","r","canFavourite","getContainerClass","getThumbnailClass","showMask","VideoThumbnail","InnerContent","hasCaptions","LinkifyHelper","VideoItemDescription","isMobile","useMediaQuery","MediaQueryStrings","hasUserRestrictions","RestrictionType","HandleSvg","getClassName","showDragHandle","baseClassName","VideoItemLeftContent","dragProps","Col","RestrictionBadge","VideoItemRestrictionBadge","hasRestrictions","VideoItemTitle","getTitleSize","SignInToWatch","VideoItemActions","videoActions","React.useContext","actions","Actions","VideoItemTopRight","HAS_NUMBER_REGEX","COUNT_OFFSET","AudienceStringBuilders","audiences","combinedNames","a","numberList","name","num","wordList","audienceWithoutNum","p","prefix","audienceRange","processAudienceRanges","firstAudience","lastAudience","firstAudienceLevel","lastAudienceLevel","level","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","word","lastAudienceNumber","firstAudienceString","lastAudienceString","audienceValues","offset","initialVal","nextVal","isContinguous","ranges","b","i","j","DIGIT_REGEX","SPACE_REGEX","MIN_AUDIENCE_THRESHOLD","AudienceHelper","objectAudiences","presentationAudiences","objectAudienceIds","v","audience","presAudience","presentationId","mergedAudienceString","HardCoded","members","getLowestAudience","lowestAudience","lowestAudienceDigit","digit","nameCountMap","sorted","member","sortedSlice","firstObjLowestAudience","secondObjLowestAudience","comparison","params","normalizeAudienceName","audienceName","audienceLookup","state","audienceStr","useMergeAudiences","sortedAudiences","ClipItem","React.forwardRef","ref","breakpoints","useBreakpoints","hovered","VideoListHelper","isSmall","isSortable","SortableVideoListContext","mergedAudience","showIndexes","hasIconOrIndex","analyticsProps","Row","SortableClipItem","TrueOrFalseSvg","ShortAnswerSvg","MissingWordSvg","MultipleChoiceSvg","ImageSvg","AnnotationSvg","IllustrationSvg","internalGetPhrase","phrase","fallback","parseSvgElement","interactionTypeDefaults","InteractionTypeHelper","typeId","func","stripTag","text","tag","newLine","stripTags","tags","StripTagsHelper","options","fallbackText","result","t","formatAnnotationText","InteractionLabel","bgClassName","Svg","questionNumber","iconClassName","useGetQuestionDisplayLimit","totalToDisplay","mediaQuery","useGetMediaQueryString","InteractiveItemQuestions","questionDisplayLimit","interactionsToShow","interactionCount","timepoint","interaction","interactionData","interactionToShow","totalInteractions","acc","InteractiveItem","SortableInteractiveItem","VideoItem","videoAudiences","subTextType","subTextAppLink","SortableVideoItem","getItemComponent","VideoList","setIsDragging","CheckboxHelper","currentAppLink","Core.AppLinkHelper","idx","Component","pagePositionStartingIndex","dragData","DragDropMoveWrapper","Checkbox"],"mappings":"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","x_google_ignoreList":[4]}
1
+ {"version":3,"file":"PLxejfSI.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/interactive/InteractionTypeId.ts","../../../../libs/shared/src/context/VideoActionsContext.tsx","../../src/apps/exchange/hooks/useCommonVideoProps.ts","../../../../libs/shared/src/components/pagination/Pagination.tsx","../../../../../node_modules/@dnd-kit/sortable/dist/sortable.esm.js","../../../../libs/shared/src/components/sortable/SortableItemWrapper.tsx","../../../../libs/shared/src/images/svg/objects/HeartOutlineSvg.tsx","../../../../libs/shared/src/images/svg/objects/HeartSvg.tsx","../../../../libs/shared/src/utils/FavouriteHelpers.ts","../../../../libs/shared/src/components/favourite-button/FavouriteButton.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/videos/VideoWatchProgressBar.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/VideoThumbnailBottomBar.tsx","../../../../libs/shared/src/components/svg-container/SvgContainer2.tsx","../../../../libs/shared/src/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar.tsx","../../../../libs/shared/src/components/thumbnails/plugin-hover/PluginHover.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo.tsx","../../../../libs/shared/src/components/video-type-badge/VideoTypeBadge.tsx","../../../../libs/shared/src/context/player-context/components/GlobalPlayerConsumer.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleSvg.tsx","../../../../libs/shared/src/components/thumbnails/video/expandable/ExpandableVideoThumbnail.tsx","../../../../libs/shared/src/context/VideoPreviewContext.tsx","../../../../libs/shared/src/hooks/UseHoverLogger.ts","../../../../libs/shared/src/components/hover-to-portal-container/hoverToPortalContainerUtil.ts","../../../../libs/shared/src/components/hover-to-portal-container/HoverToPortalContainer.tsx","../../../../libs/shared/src/components/audience-label/AudienceLabel.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-badges/VideoThumbnailBadges.tsx","../../../../libs/shared/src/components/video-list/components/restriction-padlock/RestrictionPadlock.tsx","../../../../libs/shared/src/components/video-title/VideoTitle.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-text/ThumbnailText.tsx","../../../../libs/shared/src/components/video-guidance/tag/VideoGuidanceTag.tsx","../../../../libs/shared/src/components/video-guidance/classroom-guide/ClassroomGuideTag.tsx","../../../../libs/shared/src/components/video-guidance/interactives/InteractivesTag.tsx","../../../../libs/shared/src/components/video-guidance/resources/ResourcesTag.tsx","../../../../libs/shared/src/components/video-list/components/video-guidance/VideoItemGuidance.tsx","../../../../libs/shared/src/components/thumbnails/remove-button/RemoveVideoButton.tsx","../../../../libs/shared/src/components/thumbnails/video/popout/PopoutVideoThumbnail.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleFilledSvg.tsx","../../../../libs/shared/src/components/mask/Mask.tsx","../../../../libs/shared/src/images/svg/status/TickSvg.tsx","../../../../libs/shared/src/components/check-mark-button/CheckMarkButton.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/VideoThumbnailActions.tsx","../../../../libs/shared/src/enums/ThumbnailTextPosition.ts","../../../../libs/shared/src/components/thumbnails/video/static/StaticVideoThumbnail.tsx","../../../../libs/shared/src/components/thumbnails/video/VideoThumbnail.tsx","../../../../libs/shared/src/components/video-list/components/video-item-description/VideoItemDescription.tsx","../../../../libs/shared/src/images/svg/objects/HandleSvg.tsx","../../../../libs/shared/src/components/video-list/components/video-item-left-content/VideoItemLeftContent.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/RestrictionBadge.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge.tsx","../../../../libs/shared/src/components/video-list/components/video-item-title/VideoItemTitle.tsx","../../../../libs/shared/src/components/sign-in-to-watch/SignInToWatch.tsx","../../../../libs/shared/src/components/video-list/components/video-item-actions/VideoItemActions.tsx","../../../../libs/shared/src/components/video-list/components/video-item-top-right/VideoItemTopRight.tsx","../../../../libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","../../../../libs/shared/src/utils/audience-helper/AudienceHelper.ts","../../../../libs/shared/src/hooks/UseMergeAudiences.ts","../../../../libs/shared/src/components/video-list/clip-item/ClipItem.tsx","../../../../libs/shared/src/components/svgs/interaction-types/InteractionTypes.tsx","../../../../libs/shared/src/utils/interaction-type-helper/InteractionTypeHelper.tsx","../../../../libs/shared/src/utils/StripTagsHelper.ts","../../../../libs/shared/src/components/interactive-questions/formatAnnotationText.ts","../../../../libs/shared/src/components/interactive-questions/InteractionLabel.tsx","../../../../libs/shared/src/components/video-list/interactive-item/InteractiveItemQuestions.tsx","../../../../libs/shared/src/components/video-list/interactive-item/InteractiveItem.tsx","../../../../libs/shared/src/components/video-list/video-item/VideoItem.tsx","../../../../libs/shared/src/components/video-list/VideoList.tsx"],"sourcesContent":["export enum InteractionTypeId {\n MultipleChoice = 1,\n ShortAnswer = 2,\n TrueOrFalse = 3,\n Annotation = 4,\n Image = 5,\n MissingWord = 6,\n Illustration = 7\n}\n\nexport const ExperimentalInteractionTypes: Partial<Record<InteractionTypeId, boolean>> = {\n};","import * as React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface VideoActionsOptions {\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\ntype GetVideoActions = (video: VideoTypes, options: VideoActionsOptions) => ActionOptions[];\ntype FetchMoreActions = (video: VideoTypes) => void;\n\ninterface VideoActionsContextData {\n getVideoActions: GetVideoActions;\n fetchMoreActions?: FetchMoreActions;\n}\n\nexport const VideoActionsContext = React.createContext<VideoActionsContextData>(null);","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { Config, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { getSeriesAppLink } from 'apps/exchange/utils/ExchangeUtils';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nfunction getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n return getSeriesAppLink(video.series);\n}\n\nexport function useCommonVideoProps(): UseCommonVideoPropsResult {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const hasCommonVideoPropsCompleted = (\n config.hasCompleted\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin: false,\n canFavourite: null,\n setFavourite: null,\n yearGroups: null,\n imageCdnUrl: config.data?.imageCdnUrl,\n getClassroomGuideAppLink: null,\n getInteractiveGuidanceAppLink: null,\n getResourceGuidanceAppLink: null,\n showNewVideoIndicator: false,\n getCompanyLogoFallbackUrl: () => null,\n hasStudentExperience: false,\n hasGuestExperience: false,\n features: {\n showClassroomGuide: () => false\n }\n }\n };\n}","import * as React from 'react';\nimport { Button, ButtonProps } from 'react-bootstrap';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nfunction buildCursor(appLink: Core.AppLink, cursorParam: string, prevHack?: boolean): Core.AppLink {\n if (!cursorParam)\n return null;\n\n const currentParams = appLink.params as HashObject ?? {};\n /* \n Currently the pagination for My Videos shows the previous cursor in the first page cursor,\n so instead of using the previous cursor from the response, the current cursor is being passed\n as the previous cursor in the app link\n */\n\n if (prevHack) {\n if (!currentParams?.previous) {\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: null,\n previous: null\n }\n };\n }\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: currentParams?.previous,\n previous: null\n }\n };\n }\n\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: cursorParam,\n previous: currentParams.cursor\n }\n };\n}\n\ninterface CursorPaginationProps {\n cursors: Cursors;\n appLink?: Core.AppLink;\n className?: string;\n buttonVariant?: ButtonProps['variant'];\n prevHack?: boolean;\n scrollTop?: boolean;\n onClick?: (cursor: string) => void;\n}\n\nPagination.defaultProps = {\n className: 'py-2',\n buttonVariant: 'secondary'\n};\n\nexport function Pagination(\n { appLink, cursors, className, buttonVariant, prevHack, scrollTop, onClick }: CursorPaginationProps\n): JSX.Element {\n function onClickButton(page: 'next' | 'previous'): void {\n if (appLink && scrollTop === false)\n ScrollHelper.preventScrollTop();\n\n AnalyticsHelper.logUserAction({ page }, {\n location: LocationContext.Pagination,\n entity: EntityType.Pagination,\n actionType: UserAction.Navigate\n });\n\n if (onClick)\n onClick(cursors[page]);\n }\n\n if (appLink) {\n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <AppLink\n appLink={buildCursor(appLink, cursors.previous, prevHack)}\n className={`btn btn-${buttonVariant} me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='previous' />\n </AppLink>\n \n <AppLink\n appLink={buildCursor(appLink, cursors.next)}\n className={`btn btn-${buttonVariant} ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='next' />\n </AppLink>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n }\n \n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <Button\n variant={buttonVariant}\n className={`me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n >\n <Text phrase='previous' />\n </Button>\n <Button\n variant={buttonVariant}\n className={`btn ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n >\n <Text phrase='next' />\n </Button>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React, { useMemo, useRef, useEffect, useState, useContext } from 'react';\nimport { useDndContext, getClientRect, useDroppable, useDraggable, closestCorners, getFirstCollision, getScrollableAncestors, KeyboardCode } from '@dnd-kit/core';\nimport { useUniqueId, useIsomorphicLayoutEffect, CSS, useCombinedRefs, isKeyboardEvent, subtract } from '@dnd-kit/utilities';\n\n/**\r\n * Move an array item to a different position. Returns a new array with the item moved to the new position.\r\n */\nfunction arrayMove(array, from, to) {\n const newArray = array.slice();\n newArray.splice(to < 0 ? newArray.length + to : to, 0, newArray.splice(from, 1)[0]);\n return newArray;\n}\n\n/**\r\n * Swap an array item to a different position. Returns a new array with the item swapped to the new position.\r\n */\nfunction arraySwap(array, from, to) {\n const newArray = array.slice();\n newArray[from] = array[to];\n newArray[to] = array[from];\n return newArray;\n}\n\nfunction getSortedRects(items, rects) {\n return items.reduce((accumulator, id, index) => {\n const rect = rects.get(id);\n\n if (rect) {\n accumulator[index] = rect;\n }\n\n return accumulator;\n }, Array(items.length));\n}\n\nfunction isValidIndex(index) {\n return index !== null && index >= 0;\n}\n\nfunction itemsEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeDisabled(disabled) {\n if (typeof disabled === 'boolean') {\n return {\n draggable: disabled,\n droppable: disabled\n };\n }\n\n return disabled;\n}\n\n// To-do: We should be calculating scale transformation\nconst defaultScale = {\n scaleX: 1,\n scaleY: 1\n};\nconst horizontalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n rects,\n activeNodeRect: fallbackActiveRect,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n const itemGap = getItemGap(rects, index, activeIndex);\n\n if (index === activeIndex) {\n const newIndexRect = rects[overIndex];\n\n if (!newIndexRect) {\n return null;\n }\n\n return {\n x: activeIndex < overIndex ? newIndexRect.left + newIndexRect.width - (activeNodeRect.left + activeNodeRect.width) : newIndexRect.left - activeNodeRect.left,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: -activeNodeRect.width - itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: activeNodeRect.width + itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale\n };\n};\n\nfunction getItemGap(rects, index, activeIndex) {\n const currentRect = rects[index];\n const previousRect = rects[index - 1];\n const nextRect = rects[index + 1];\n\n if (!currentRect || !previousRect && !nextRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.left - (previousRect.left + previousRect.width) : nextRect.left - (currentRect.left + currentRect.width);\n }\n\n return nextRect ? nextRect.left - (currentRect.left + currentRect.width) : currentRect.left - (previousRect.left + previousRect.width);\n}\n\nconst rectSortingStrategy = _ref => {\n let {\n rects,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const newRects = arrayMove(rects, overIndex, activeIndex);\n const oldRect = rects[index];\n const newRect = newRects[index];\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\nconst rectSwappingStrategy = _ref => {\n let {\n activeIndex,\n index,\n rects,\n overIndex\n } = _ref;\n let oldRect;\n let newRect;\n\n if (index === activeIndex) {\n oldRect = rects[index];\n newRect = rects[overIndex];\n }\n\n if (index === overIndex) {\n oldRect = rects[index];\n newRect = rects[activeIndex];\n }\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\n// To-do: We should be calculating scale transformation\nconst defaultScale$1 = {\n scaleX: 1,\n scaleY: 1\n};\nconst verticalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n activeIndex,\n activeNodeRect: fallbackActiveRect,\n index,\n rects,\n overIndex\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n if (index === activeIndex) {\n const overIndexRect = rects[overIndex];\n\n if (!overIndexRect) {\n return null;\n }\n\n return {\n x: 0,\n y: activeIndex < overIndex ? overIndexRect.top + overIndexRect.height - (activeNodeRect.top + activeNodeRect.height) : overIndexRect.top - activeNodeRect.top,\n ...defaultScale$1\n };\n }\n\n const itemGap = getItemGap$1(rects, index, activeIndex);\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: 0,\n y: -activeNodeRect.height - itemGap,\n ...defaultScale$1\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: 0,\n y: activeNodeRect.height + itemGap,\n ...defaultScale$1\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale$1\n };\n};\n\nfunction getItemGap$1(clientRects, index, activeIndex) {\n const currentRect = clientRects[index];\n const previousRect = clientRects[index - 1];\n const nextRect = clientRects[index + 1];\n\n if (!currentRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.top - (previousRect.top + previousRect.height) : nextRect ? nextRect.top - (currentRect.top + currentRect.height) : 0;\n }\n\n return nextRect ? nextRect.top - (currentRect.top + currentRect.height) : previousRect ? currentRect.top - (previousRect.top + previousRect.height) : 0;\n}\n\nconst ID_PREFIX = 'Sortable';\nconst Context = /*#__PURE__*/React.createContext({\n activeIndex: -1,\n containerId: ID_PREFIX,\n disableTransforms: false,\n items: [],\n overIndex: -1,\n useDragOverlay: false,\n sortedRects: [],\n strategy: rectSortingStrategy,\n disabled: {\n draggable: false,\n droppable: false\n }\n});\nfunction SortableContext(_ref) {\n let {\n children,\n id,\n items: userDefinedItems,\n strategy = rectSortingStrategy,\n disabled: disabledProp = false\n } = _ref;\n const {\n active,\n dragOverlay,\n droppableRects,\n over,\n measureDroppableContainers,\n measuringScheduled\n } = useDndContext();\n const containerId = useUniqueId(ID_PREFIX, id);\n const useDragOverlay = Boolean(dragOverlay.rect !== null);\n const items = useMemo(() => userDefinedItems.map(item => typeof item === 'object' && 'id' in item ? item.id : item), [userDefinedItems]);\n const isDragging = active != null;\n const activeIndex = active ? items.indexOf(active.id) : -1;\n const overIndex = over ? items.indexOf(over.id) : -1;\n const previousItemsRef = useRef(items);\n const itemsHaveChanged = !itemsEqual(items, previousItemsRef.current);\n const disableTransforms = overIndex !== -1 && activeIndex === -1 || itemsHaveChanged;\n const disabled = normalizeDisabled(disabledProp);\n useIsomorphicLayoutEffect(() => {\n if (itemsHaveChanged && isDragging && !measuringScheduled) {\n measureDroppableContainers(items);\n }\n }, [itemsHaveChanged, items, isDragging, measureDroppableContainers, measuringScheduled]);\n useEffect(() => {\n previousItemsRef.current = items;\n }, [items]);\n const contextValue = useMemo(() => ({\n activeIndex,\n containerId,\n disabled,\n disableTransforms,\n items,\n overIndex,\n useDragOverlay,\n sortedRects: getSortedRects(items, droppableRects),\n strategy\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [activeIndex, containerId, disabled.draggable, disabled.droppable, disableTransforms, items, overIndex, droppableRects, useDragOverlay, strategy]);\n return React.createElement(Context.Provider, {\n value: contextValue\n }, children);\n}\n\nconst defaultNewIndexGetter = _ref => {\n let {\n id,\n items,\n activeIndex,\n overIndex\n } = _ref;\n return arrayMove(items, activeIndex, overIndex).indexOf(id);\n};\nconst defaultAnimateLayoutChanges = _ref2 => {\n let {\n containerId,\n isSorting,\n wasDragging,\n index,\n items,\n newIndex,\n previousItems,\n previousContainerId,\n transition\n } = _ref2;\n\n if (!transition || !wasDragging) {\n return false;\n }\n\n if (previousItems !== items && index === newIndex) {\n return false;\n }\n\n if (isSorting) {\n return true;\n }\n\n return newIndex !== index && containerId === previousContainerId;\n};\nconst defaultTransition = {\n duration: 200,\n easing: 'ease'\n};\nconst transitionProperty = 'transform';\nconst disabledTransition = /*#__PURE__*/CSS.Transition.toString({\n property: transitionProperty,\n duration: 0,\n easing: 'linear'\n});\nconst defaultAttributes = {\n roleDescription: 'sortable'\n};\n\n/*\r\n * When the index of an item changes while sorting,\r\n * we need to temporarily disable the transforms\r\n */\n\nfunction useDerivedTransform(_ref) {\n let {\n disabled,\n index,\n node,\n rect\n } = _ref;\n const [derivedTransform, setDerivedtransform] = useState(null);\n const previousIndex = useRef(index);\n useIsomorphicLayoutEffect(() => {\n if (!disabled && index !== previousIndex.current && node.current) {\n const initial = rect.current;\n\n if (initial) {\n const current = getClientRect(node.current, {\n ignoreTransform: true\n });\n const delta = {\n x: initial.left - current.left,\n y: initial.top - current.top,\n scaleX: initial.width / current.width,\n scaleY: initial.height / current.height\n };\n\n if (delta.x || delta.y) {\n setDerivedtransform(delta);\n }\n }\n }\n\n if (index !== previousIndex.current) {\n previousIndex.current = index;\n }\n }, [disabled, index, node, rect]);\n useEffect(() => {\n if (derivedTransform) {\n requestAnimationFrame(() => {\n setDerivedtransform(null);\n });\n }\n }, [derivedTransform]);\n return derivedTransform;\n}\n\nfunction useSortable(_ref) {\n let {\n animateLayoutChanges = defaultAnimateLayoutChanges,\n attributes: userDefinedAttributes,\n disabled: localDisabled,\n data: customData,\n getNewIndex = defaultNewIndexGetter,\n id,\n strategy: localStrategy,\n resizeObserverConfig,\n transition = defaultTransition\n } = _ref;\n const {\n items,\n containerId,\n activeIndex,\n disabled: globalDisabled,\n disableTransforms,\n sortedRects,\n overIndex,\n useDragOverlay,\n strategy: globalStrategy\n } = useContext(Context);\n const disabled = normalizeLocalDisabled(localDisabled, globalDisabled);\n const index = items.indexOf(id);\n const data = useMemo(() => ({\n sortable: {\n containerId,\n index,\n items\n },\n ...customData\n }), [containerId, customData, index, items]);\n const itemsAfterCurrentSortable = useMemo(() => items.slice(items.indexOf(id)), [items, id]);\n const {\n rect,\n node,\n isOver,\n setNodeRef: setDroppableNodeRef\n } = useDroppable({\n id,\n data,\n disabled: disabled.droppable,\n resizeObserverConfig: {\n updateMeasurementsFor: itemsAfterCurrentSortable,\n ...resizeObserverConfig\n }\n });\n const {\n active,\n activatorEvent,\n activeNodeRect,\n attributes,\n setNodeRef: setDraggableNodeRef,\n listeners,\n isDragging,\n over,\n setActivatorNodeRef,\n transform\n } = useDraggable({\n id,\n data,\n attributes: { ...defaultAttributes,\n ...userDefinedAttributes\n },\n disabled: disabled.draggable\n });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const isSorting = Boolean(active);\n const displaceItem = isSorting && !disableTransforms && isValidIndex(activeIndex) && isValidIndex(overIndex);\n const shouldDisplaceDragSource = !useDragOverlay && isDragging;\n const dragSourceDisplacement = shouldDisplaceDragSource && displaceItem ? transform : null;\n const strategy = localStrategy != null ? localStrategy : globalStrategy;\n const finalTransform = displaceItem ? dragSourceDisplacement != null ? dragSourceDisplacement : strategy({\n rects: sortedRects,\n activeNodeRect,\n activeIndex,\n overIndex,\n index\n }) : null;\n const newIndex = isValidIndex(activeIndex) && isValidIndex(overIndex) ? getNewIndex({\n id,\n items,\n activeIndex,\n overIndex\n }) : index;\n const activeId = active == null ? void 0 : active.id;\n const previous = useRef({\n activeId,\n items,\n newIndex,\n containerId\n });\n const itemsHaveChanged = items !== previous.current.items;\n const shouldAnimateLayoutChanges = animateLayoutChanges({\n active,\n containerId,\n isDragging,\n isSorting,\n id,\n index,\n items,\n newIndex: previous.current.newIndex,\n previousItems: previous.current.items,\n previousContainerId: previous.current.containerId,\n transition,\n wasDragging: previous.current.activeId != null\n });\n const derivedTransform = useDerivedTransform({\n disabled: !shouldAnimateLayoutChanges,\n index,\n node,\n rect\n });\n useEffect(() => {\n if (isSorting && previous.current.newIndex !== newIndex) {\n previous.current.newIndex = newIndex;\n }\n\n if (containerId !== previous.current.containerId) {\n previous.current.containerId = containerId;\n }\n\n if (items !== previous.current.items) {\n previous.current.items = items;\n }\n }, [isSorting, newIndex, containerId, items]);\n useEffect(() => {\n if (activeId === previous.current.activeId) {\n return;\n }\n\n if (activeId && !previous.current.activeId) {\n previous.current.activeId = activeId;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n previous.current.activeId = activeId;\n }, 50);\n return () => clearTimeout(timeoutId);\n }, [activeId]);\n return {\n active,\n activeIndex,\n attributes,\n data,\n rect,\n index,\n newIndex,\n items,\n isOver,\n isSorting,\n isDragging,\n listeners,\n node,\n overIndex,\n over,\n setNodeRef,\n setActivatorNodeRef,\n setDroppableNodeRef,\n setDraggableNodeRef,\n transform: derivedTransform != null ? derivedTransform : finalTransform,\n transition: getTransition()\n };\n\n function getTransition() {\n if ( // Temporarily disable transitions for a single frame to set up derived transforms\n derivedTransform || // Or to prevent items jumping to back to their \"new\" position when items change\n itemsHaveChanged && previous.current.newIndex === index) {\n return disabledTransition;\n }\n\n if (shouldDisplaceDragSource && !isKeyboardEvent(activatorEvent) || !transition) {\n return undefined;\n }\n\n if (isSorting || shouldAnimateLayoutChanges) {\n return CSS.Transition.toString({ ...transition,\n property: transitionProperty\n });\n }\n\n return undefined;\n }\n}\n\nfunction normalizeLocalDisabled(localDisabled, globalDisabled) {\n var _localDisabled$dragga, _localDisabled$droppa;\n\n if (typeof localDisabled === 'boolean') {\n return {\n draggable: localDisabled,\n // Backwards compatibility\n droppable: false\n };\n }\n\n return {\n draggable: (_localDisabled$dragga = localDisabled == null ? void 0 : localDisabled.draggable) != null ? _localDisabled$dragga : globalDisabled.draggable,\n droppable: (_localDisabled$droppa = localDisabled == null ? void 0 : localDisabled.droppable) != null ? _localDisabled$droppa : globalDisabled.droppable\n };\n}\n\nfunction hasSortableData(entry) {\n if (!entry) {\n return false;\n }\n\n const data = entry.data.current;\n\n if (data && 'sortable' in data && typeof data.sortable === 'object' && 'containerId' in data.sortable && 'items' in data.sortable && 'index' in data.sortable) {\n return true;\n }\n\n return false;\n}\n\nconst directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];\nconst sortableKeyboardCoordinates = (event, _ref) => {\n let {\n context: {\n active,\n collisionRect,\n droppableRects,\n droppableContainers,\n over,\n scrollableAncestors\n }\n } = _ref;\n\n if (directions.includes(event.code)) {\n event.preventDefault();\n\n if (!active || !collisionRect) {\n return;\n }\n\n const filteredContainers = [];\n droppableContainers.getEnabled().forEach(entry => {\n if (!entry || entry != null && entry.disabled) {\n return;\n }\n\n const rect = droppableRects.get(entry.id);\n\n if (!rect) {\n return;\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Left:\n if (collisionRect.left > rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Right:\n if (collisionRect.left < rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n }\n });\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null\n });\n let closestId = getFirstCollision(collisions, 'id');\n\n if (closestId === (over == null ? void 0 : over.id) && collisions.length > 1) {\n closestId = collisions[1].id;\n }\n\n if (closestId != null) {\n const activeDroppable = droppableContainers.get(active.id);\n const newDroppable = droppableContainers.get(closestId);\n const newRect = newDroppable ? droppableRects.get(newDroppable.id) : null;\n const newNode = newDroppable == null ? void 0 : newDroppable.node.current;\n\n if (newNode && newRect && activeDroppable && newDroppable) {\n const newScrollAncestors = getScrollableAncestors(newNode);\n const hasDifferentScrollAncestors = newScrollAncestors.some((element, index) => scrollableAncestors[index] !== element);\n const hasSameContainer = isSameContainer(activeDroppable, newDroppable);\n const isAfterActive = isAfter(activeDroppable, newDroppable);\n const offset = hasDifferentScrollAncestors || !hasSameContainer ? {\n x: 0,\n y: 0\n } : {\n x: isAfterActive ? collisionRect.width - newRect.width : 0,\n y: isAfterActive ? collisionRect.height - newRect.height : 0\n };\n const rectCoordinates = {\n x: newRect.left,\n y: newRect.top\n };\n const newCoordinates = offset.x && offset.y ? rectCoordinates : subtract(rectCoordinates, offset);\n return newCoordinates;\n }\n }\n }\n\n return undefined;\n};\n\nfunction isSameContainer(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n return a.data.current.sortable.containerId === b.data.current.sortable.containerId;\n}\n\nfunction isAfter(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n if (!isSameContainer(a, b)) {\n return false;\n }\n\n return a.data.current.sortable.index < b.data.current.sortable.index;\n}\n\nexport { SortableContext, arrayMove, arraySwap, defaultAnimateLayoutChanges, defaultNewIndexGetter, hasSortableData, horizontalListSortingStrategy, rectSortingStrategy, rectSwappingStrategy, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy };\n//# sourceMappingURL=sortable.esm.js.map\n","import React from 'react';\nimport { DraggableAttributes } from '@dnd-kit/core';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ntype DragDirection = 'up' | 'down';\n\nexport type PropsWithSortableItemProps<T> = T & {\n dragAttributes?: DraggableAttributes;\n dragListeners?: HashObject;\n dragDirection?: DragDirection;\n};\n\ninterface SortableItemWrapperProps<TProps> {\n id: string;\n disabled?: boolean;\n childProps: TProps;\n childComponent: (props: PropsWithSortableItemProps<TProps>) => JSX.Element;\n}\n\nfunction getDragDirection(index: number, activeIndex: number, overIndex: number): DragDirection {\n if (activeIndex !== index)\n return null;\n\n if (overIndex > activeIndex)\n return 'down';\n\n if (overIndex < activeIndex)\n return 'up';\n\n return null;\n}\n\nexport function SortableItemWrapper<TProps>(props: SortableItemWrapperProps<TProps>): JSX.Element {\n const {\n setNodeRef,\n transform,\n transition,\n isSorting,\n listeners,\n attributes,\n activeIndex,\n overIndex,\n index\n } = useSortable({ id: props.id, disabled: props.disabled });\n\n const style: HashObject = {\n transform: CSS.Transform.toString(transform),\n transition,\n touchAction: 'none',\n position: 'relative'\n };\n\n if (isSorting && index === activeIndex) {\n style.visibility = 'hidden';\n }\n\n const Children = props.childComponent;\n const dragDirection = getDragDirection(index, activeIndex, overIndex);\n\n return (\n <Children\n {...props.childProps}\n ref={setNodeRef}\n style={style}\n dragListeners={listeners}\n dragAttributes={attributes}\n dragDirection={dragDirection}\n />\n );\n}","import React from 'react';\n\nexport function HeartOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805m.812-10.7.001-.004.007-.022.03-.097a5.83 5.83 0 0 1 .744-1.463c.565-.798 1.428-1.532 2.72-1.532 2.03 0 3.516 1.72 3.516 3.866 0 1.445-.713 2.686-2.089 4.119-.944.984-2.151 2.01-3.579 3.224-.575.49-1.187 1.01-1.832 1.57-.645-.56-1.257-1.08-1.832-1.57-1.428-1.214-2.635-2.24-3.58-3.224C5.214 12.11 4.5 10.869 4.5 9.423c0-2.146 1.487-3.865 3.517-3.865 1.29 0 2.154.734 2.719 1.532a5.8 5.8 0 0 1 .774 1.56l.007.022v.004a.5.5 0 0 0 .965 0'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function HeartSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillOpacity={0.9}\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805'\n />\n </svg>\n );\n}\n","import { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CurrentUser, User, Video, VideoTypes } from 'libs/shared/interfaces';\n\nimport { VideoHelper } from './VideoHelper';\n\nexport const FavouriteHelper = {\n\n /**\n * This helper is based on a *critical* assumption that the with statement\n * retrieving the favouritedBy collection uses a filter for the current user's id.\n * \n * The reason we're not passing the current user as an arg is that we would need to \n * drill the user object all the way down to low level componenets.\n * \n * @param object \n */\n isFavouritedByCurrentUser(object: HashObject): boolean {\n return !!(object?.favouritedBy?.data.length === 1);\n },\n\n /**\n * Determine whether the user has favourited the object\n * \n * @param object \n */\n isFavouritedByUser(object: HashObject, user: User): boolean {\n return !!(ArrayHelper.findWhere(object?.favouritedBy?.data, { id: user?.id }));\n },\n\n updateVideoState(video: VideoTypes, user: CurrentUser | User, shouldFavourite: boolean): VideoTypes {\n return {\n id: video.id,\n favouritedBy: {\n data: shouldFavourite ? [{ id: user.id } as User] : [],\n pagination: { limit: 25, cursors: { next: '', previous: '' } }\n }\n };\n },\n\n showFavouriteButton(video: Video, isHovering: boolean): boolean {\n if (!VideoHelper.getCanBeConsumed(video)?.canConsume)\n return false;\n\n if (isHovering)\n return true;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n if (FavouriteHelper.isFavouritedByCurrentUser(video))\n return true;\n\n return false;\n }\n};\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { HeartOutlineSvg } from 'libs/shared/images/svg/objects/HeartOutlineSvg';\nimport { HeartSvg } from 'libs/shared/images/svg/objects/HeartSvg';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './favourite-button.module.scss';\n\nconst namespace = 'shared.favouriteButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FavouriteButtonProps {\n video: VideoTypes;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n className?: string;\n analyticsData?: HashObject,\n analyticsOptions?: AnalyticsOptions\n preventFocus?: boolean;\n}\n\nexport function FavouriteButton(props: FavouriteButtonProps): JSX.Element {\n const alerts = useAlerts();\n\n const initialState = FavouriteHelper.isFavouritedByCurrentUser(props.video);\n\n // Use local state so that changes are reflected immediately.\n const [ isFavourite, setIsFavourite ] = React.useState(initialState);\n\n React.useEffect(() => {\n setIsFavourite(initialState);\n }, [initialState]);\n\n const flexClasses = 'd-flex align-items-center justify-content-center';\n let className = `${flexClasses} cursor-pointer ${styles.favouriteButton} ${isFavourite ? styles.favourited : ''}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n function onClick(): void {\n const shouldFavourite = !isFavourite;\n\n function onError(): void {\n function getErrorPhraseKey(): string {\n if (VideoHelper.isClip(props.video))\n return shouldFavourite ? 'favouriteClipError' : 'unfavouriteClipError';\n\n if (VideoHelper.isInteractive(props.video))\n return shouldFavourite ? 'favouriteInteractiveError' : 'unfavouriteInteractiveError';\n\n return shouldFavourite ? 'favouriteVideoError' : 'unfavouriteVideoError';\n }\n\n alerts.error(getPhrase(getErrorPhraseKey()));\n setIsFavourite(!shouldFavourite);\n }\n\n setIsFavourite(shouldFavourite);\n props.setFavourite(props.video, shouldFavourite, null, onError, props.analyticsData, props.analyticsOptions);\n }\n\n if (!FunctionHelper.isFunction(props.setFavourite) || !FunctionHelper.isFunction(props.canFavourite))\n return <></>;\n\n // Don't render until we know the state of isFavourite\n if (!props.canFavourite(props.video))\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} tabIndex={props.preventFocus ? -1 : undefined}>\n {/* We have the two svgs because they get swapped out on hover by the styles */}\n <SvgContainer\n svg={HeartSvg}\n className={`svg-container ${styles.heart}`}\n />\n <SvgContainer\n svg={HeartOutlineSvg}\n className={`svg-container ${styles.heartOutline}`}\n />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoWatchProgressBarProps {\n video: Video;\n}\n\nexport function VideoWatchProgressBar(props: VideoWatchProgressBarProps): JSX.Element {\n const progress = VideoHelper.getVideoProgress(props.video);\n\n const watchPercentage = progress && props.video.duration\n && progress / props.video.duration * 100000;\n\n if (!watchPercentage)\n return <></>;\n\n return <div className='bg-primary h-100' style={{ width: `${watchPercentage}%` }} />;\n}","import React from 'react';\n\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { VideoWatchProgressBar } from './videos/VideoWatchProgressBar';\n\nimport styles from './video-thumbnail-bottom-bar.module.scss';\n\ninterface VideoThumbnailBottomBarProps {\n video: VideoTypes;\n}\n\nexport function VideoThumbnailBottomBar(props: VideoThumbnailBottomBarProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video)) {\n return <></>;\n }\n\n return (\n <div className={styles.bottomBar}>\n <VideoWatchProgressBar video={props.video} />\n </div>\n );\n}","import * as React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { SvgContainerSize } from './SvgContainer'; // TODO: Move this enum in here\n\nconst DEFAULT_CLASS_NAME = 'd-inline-block svg-container';\nconst DEFAULT_TAG_NAME = 'span';\n\ninterface SvgContainerProps2 {\n size?: SvgContainerSize;\n className?: string;\n tagName?: React.ElementType;\n onClick?: (...args: any[]) => void;\n title?: string;\n tooltipPlacement?: Placement;\n}\n\n/**\n * @deprecated please use SvgContainer instead. This component will be removed in the future\n * whenever someone gets around to it (that could be you!)\n */\nexport function SvgContainer2(props: React.PropsWithChildren<SvgContainerProps2>): React.ReactElement {\n const {\n children,\n className = DEFAULT_CLASS_NAME,\n tagName = DEFAULT_TAG_NAME,\n size = SvgContainerSize.Standard,\n onClick,\n title,\n tooltipPlacement = 'right'\n } = props;\n\n const Container = tagName;\n\n const containerProps = {\n className: `${className} svg-container ${size}`,\n onClick: FunctionHelper.isFunction(onClick) ? onClick : null\n };\n\n if (!title)\n return <Container {...containerProps}>{children}</Container>;\n\n return (\n <Tooltip title={title} placement={tooltipPlacement}>\n <Container {...containerProps}>\n {children}\n </Container>\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './lite-owner-avatar.module.scss';\n\ninterface LiteOwnerAvatarProps {\n video: VideoTypes;\n imageCdnUrl: string;\n size?: VideoItemSize;\n}\n\nexport function LiteOwnerAvatar(props: LiteOwnerAvatarProps): JSX.Element {\n if (!VideoHelper.isInteractive(props.video) && !VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._liteOwner && !props.video._isClickViewCurated?.value)\n return <></>;\n\n if (props.video._isClickViewCurated?.value) {\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1 rounded-circle position-relative bg-white`}>\n <SvgContainer2 className={props.size === 'sm' ? styles.smIcon : styles.stdIcon}>\n <ClickViewLogoMark />\n </SvgContainer2>\n </div>\n );\n }\n\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.video._liteOwner.name, props.video._liteOwner.surname)}\n imageUrl={props.video._liteOwner.avatar?.url}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './plugin-hover.module.scss';\n\nconst namespace = 'shared.pluginHover';\n\ninterface PluginHoverProps {\n isPlugin: boolean;\n isPluginPopup: boolean;\n className?: string;\n onClick?: () => void;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function PluginHover(props: PluginHoverProps): JSX.Element {\n if (!props.isPlugin || props.isPluginPopup)\n return <></>;\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n onClick={props.onClick}\n className={`\n position-absolute top-0 start-0 end-0 bottom-0 opacity-0 cursor-pointer\n ${styles.pluginHover}\n ${props.className ? props.className : ''}\n `}\n >\n <span className='position-absolute top-50 start-50 translate-middle text-nowrap h4 text-white'>\n <Text namespace={namespace} phrase='embed' />\n </span>\n </AppLink>\n );\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\n\nimport styles from './thumbnail-padlock.module.scss';\n\ninterface ThumbnailPadlockProps {\n size?: VideoItemSize;\n}\n\nexport function ThumbnailPadlock(props: ThumbnailPadlockProps): JSX.Element {\n const svgSize = props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard;\n\n return (\n <div className={`${styles.padlock} ${props.size === 'sm' ? styles.sm : ''} bg-white cursor-default d-flex align-items-center justify-content-center`}>\n <SvgContainer svg={LockSvg} size={svgSize} />\n </div>\n );\n}","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './thumbnail-company-logo.module.scss';\n\ninterface ThumbnailCompanyLogoProps {\n companyLogoFallbackUrl: string;\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nThumbnailCompanyLogo.defaultProps = {\n size: 'md'\n};\n\nexport function ThumbnailCompanyLogo(props: ThumbnailCompanyLogoProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video) || !props.companyLogoFallbackUrl)\n return <></>;\n\n const company = props.video.productionCompanies?.data?.[0];\n const url = ImageHelper.createUrl(company?.logo?.url ?? props.companyLogoFallbackUrl, { size: ImageSize.Small });\n const logoFallbackBgClassName = getBgColorClass(company.name, BG_COLOUR_CLASS_NAMES);\n \n if (!url)\n return <></>;\n\n return (\n <div>\n <Tooltip\n title={company?.name}\n spanHack\n >\n <div\n className={`${styles.logo} ${props.size === 'sm' ? styles.sm : ''} ${!company?.metadata?.colour && logoFallbackBgClassName}`}\n style={{\n backgroundImage: `url(${url})`,\n backgroundColor: company?.metadata?.colour\n }}\n />\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces/VideoTypes';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TypeBadge } from '../type-badge/TypeBadge';\n\ninterface VideoTypeBadgeProps {\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nVideoTypeBadge.default = {\n size: 'md'\n};\n\nexport function VideoTypeBadge(props: VideoTypeBadgeProps): JSX.Element {\n if (VideoHelper.isClip(props.video))\n return <TypeBadge typeId={MasterType.Clip} size={props.size} inContainer />;\n\n if (VideoHelper.isInteractive(props.video))\n return (\n <TypeBadge\n typeId={MasterType.Interactive}\n status={props.video.status}\n size={props.size}\n inContainer\n />\n );\n\n return <></>;\n}","import React from 'react';\nimport { OutPortal } from 'react-reverse-portal';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './global-player-consumer.module.scss';\n\ninterface GlobalPlayerConsumerOptions extends PlayerInitializationData {\n location?: 'popout-video' | 'play-page';\n}\n\nexport function GlobalPlayerConsumer(props: GlobalPlayerConsumerOptions): JSX.Element {\n const playerContext = usePlayerContext();\n\n playerContext.useInitialize?.(props);\n\n if (!playerContext.hasProvider)\n return <></>;\n\n if (playerContext.mode === 'picture-in-picture')\n return <></>;\n\n if (props.mode === 'hover' && playerContext.isOnPlayPage)\n return <></>;\n \n if (props.location === 'play-page') {\n // we don't want to add theatreModeOn style for interactive preview\n const theatreMode = playerContext.defaultDisplayMode === 'theatre' && props.objectTypeId !== MasterType.Interactive;\n return (\n <div className={theatreMode ? `w-100 h-100 ${styles.theatreModeOn}` : ''}>\n <OutPortal node={playerContext.portalNode} />\n </div>\n );\n }\n\n if (playerContext.mode !== 'hover')\n return <></>;\n\n /**\n * When hovering, we don't want to show the player until the video has started playing.\n */\n const shouldShow = playerContext.started;\n\n let rounding = 'rounded-3';\n if (props.location === 'popout-video')\n rounding = 'rounded-top-3';\n\n const className = `${styles.hoverContainer} ${shouldShow ? styles.hovering : ''} ${rounding} overflow-hidden`;\n\n /**\n * If the user clicks before GlobalPlayerView calls setPlayerMode('hover') to bind the click handler,\n * we still need to persist the player reference in the PlayerContext. Otherwise it will be set to null. - Sha\n */\n function onClick(): void {\n if (!props.appLink)\n return;\n\n playerContext.setPersist();\n }\n\n return (\n <AppLink className={className} onClick={onClick} appLink={props.appLink}>\n <OutPortal node={playerContext.portalNode} />\n </AppLink>\n );\n}","import React from 'react';\n\nexport function PlayCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { ExpandableVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { CloseCaptionBadgeSvg } from 'libs/shared/images/svg/status/CloseCaptionBadgeSvg';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './expandable-video-thumbnail.module.scss';\n\nfunction getTitleClass(hovering: boolean): string {\n let className = 'mb-1';\n\n if (hovering) {\n className += styles.downScale;\n }\n \n return className;\n}\n\nexport function ExpandableVideoThumbnail(props: ExpandableVideoThumbnailProps): JSX.Element {\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(props.video);\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(props.appLink?.params) ? props.appLink?.params as HashObject : {};\n\n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n };\n\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, props.hovering);\n const isVideo = VideoHelper.isVideo(props.video);\n\n const rating = VideoHelper.getRating(props.video);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n\n const showThumbnailPreviewVideo = isThumbnailHovering && canConsume && hoverToPlay;\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <div className='position-relative rounded-3 overflow-hidden' ref={thumbnailHoverRef}>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className='rounded-3'\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n\n {showFavouriteButton &&\n <div className={styles.topRightContainer}>\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n />\n </div>\n }\n {/* top right */}\n {!canNavigate && (\n <div className={styles.topRightContainer}>\n <ThumbnailPadlock />\n </div>\n )}\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={props.video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n\n <VideoTypeBadge video={props.video} />\n\n <ThumbnailCompanyLogo\n video={props.video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(props.video)}\n />\n </div>\n\n <BaseImage\n data={VideoHelper.getThumbnail(props.video)}\n appLink={canNavigate ? props.appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={props.imageOptions}\n preload={props.preload}\n className={styles.gradient}\n alt={('series' in props.video && props.video.series?.name ? `${props.video.series.name}: ` : '') + props.video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n >\n {!!(props.hovering && canNavigate) && (\n <SvgContainer className={styles.playIcon} svg={PlayCircleSvg} />\n )}\n\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n <div className={styles.overlay}>\n <div className={`${getTitleClass(props.hovering)} ${styles.title}`}>\n {isVideo && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-shadow clamp-1'\n video={props.video}\n appLink={null}\n analyticsOptions={null}\n />\n )}\n\n <span className='h6 text-reset text-shadow clamp-1'>\n {VideoHelper.getTitle(props.video)}\n </span>\n </div>\n\n <VideoThumbnailBottomBar video={props.video} />\n\n {props.hovering && (\n <BadgeListContainer className='mt-1'>\n {VideoHelper.isVideo(props.video) && (\n <>\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n {props.video.hasSubtitle && (\n <span className='badge p-0'>\n <SvgContainer svg={CloseCaptionBadgeSvg} />\n </span>\n )}\n <Badge\n type={BadgeType.Interactive}\n data={props.video.hasInteractives}\n />\n <Badge\n type={BadgeType.DurationExact}\n data={VideoHelper.getDuration(props.video)}\n />\n </>\n )}\n </BadgeListContainer>\n )}\n </div>\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={canNavigate ? props.appLink : null}\n />\n }\n </div>\n </Tooltip>\n );\n}","import React from 'react';\nimport { HtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\ninterface VideoPreviewContext {\n setPreviewContentNode?: (node: HtmlPortalNode) => void;\n}\n\nexport const VideoPreviewContext = React.createContext<VideoPreviewContext>({});\n\nexport const VideoPreviewContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ node, setNode ] = React.useState<HtmlPortalNode>(null);\n\n return (\n <VideoPreviewContext.Provider value={{ setPreviewContentNode: setNode }}>\n {node && (\n <OutPortal node={node}/>\n )}\n {props.children}\n </VideoPreviewContext.Provider>\n );\n};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nexport function useHoverLogger(\n isHovering: boolean,\n analyticsData: HashObject,\n analyticsOptions: AnalyticsOptions\n): void {\n const [ hasHovered, setHasHovered ] = React.useState(isHovering);\n const timeStartedHovering = React.useRef<Date>(isHovering ? new Date() : null);\n\n React.useEffect(() => {\n if (!analyticsData || !analyticsOptions)\n return;\n\n if (!analyticsOptions.entity || !analyticsData.location)\n return;\n\n if (isHovering) {\n if (!hasHovered)\n setHasHovered(true);\n\n timeStartedHovering.current = new Date();\n\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Hover\n });\n } else {\n if (!hasHovered)\n return;\n\n const timeHoveredInMilliseconds = new Date().getTime() - timeStartedHovering.current.getTime();\n timeStartedHovering.current = null;\n\n AnalyticsHelper.logUserAction({\n ...analyticsData,\n timeHoveredInMilliseconds,\n timeHoveredInSeconds: timeHoveredInMilliseconds / 1000\n }, {\n ...analyticsOptions,\n actionType: UserAction.Unhover\n });\n }\n }, [isHovering]);\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nconst EDGE_THRESHOLD = 8; // in px\nconst DEFAULT_SCALE = 1.2; // if no fixedWidth provided\n\nenum TransformOrigin {\n Left='8px',\n Right='calc(100% - 8px)',\n Center='center'\n}\n\ninterface ParentRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type HoverPositionConfig={\n width: number;\n height: number;\n top: number;\n left: number;\n transformOrigin: TransformOrigin;\n position: string;\n originalWidth: number;\n originalHeight: number;\n}\n\nexport const calculatePosition = (\n parentDOMRect: ParentRect,\n fixedWith?: number,\n minWidth?: number,\n scale: number = DEFAULT_SCALE\n): HoverPositionConfig | HashObject => {\n const { x, y, width, height } = parentDOMRect;\n \n const contentReferenceEle = document.getElementById('content-width-reference');\n if (!contentReferenceEle) return {};\n\n let newX: number;\n\n let previewWidth = fixedWith || width * scale;\n let previewHeight = fixedWith ? fixedWith * (height / width) : height * scale;\n\n let realScale = fixedWith ? previewWidth / width : scale;\n newX = x - (previewWidth - width) / 2 ;\n\n if (previewWidth < minWidth) {\n newX = newX - (minWidth - previewWidth) / 2;\n previewWidth = minWidth;\n realScale = previewWidth / width;\n previewHeight = height * realScale;\n }\n\n const newY = y - (previewHeight - height) / 2 + window.scrollY;\n let left = newX;\n let transformOrigin = TransformOrigin.Center;\n // too close to the left\n if (newX - contentReferenceEle.offsetLeft < EDGE_THRESHOLD) {\n left = x - EDGE_THRESHOLD / 2;\n transformOrigin = TransformOrigin.Left;\n }\n // too close to the right\n if (contentReferenceEle.offsetWidth + contentReferenceEle.offsetLeft - (newX + previewWidth) < EDGE_THRESHOLD) {\n left = fixedWith ? x + width - fixedWith : x - width * (realScale - 1) + EDGE_THRESHOLD;\n transformOrigin = TransformOrigin.Right;\n }\n\n return { left, top: newY, height: previewHeight, width: previewWidth, transformOrigin, position: 'absolute', originalWidth: width, originalHeight: height };\n};","import React from 'react';\nimport { createHtmlPortalNode, InPortal } from 'react-reverse-portal';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { VideoPreviewContext } from 'libs/shared/context/VideoPreviewContext';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useHoverLogger } from 'libs/shared/hooks/UseHoverLogger';\n\nimport { calculatePosition, HoverPositionConfig } from './hoverToPortalContainerUtil';\n\nimport styles from './hover-to-portal-container.module.scss';\n\nexport interface HoverableProps {\n isHovering: boolean;\n thumbnailHoverRef?: any;\n hoverPositionConfig?: HoverPositionConfig | HashObject;\n cleanPortalNode?: () => void;\n}\n\ninterface HoverToPortalContainerProps<T=any> {\n hoverableComponent: (props: HoverableProps) => JSX.Element;\n componentProps: T;\n fixedHoverWidth?: number;\n minHoverWidth?: number;\n hoverScale?: number\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function HoverToPortalContainer<T=any>(props: HoverToPortalContainerProps<T>): JSX.Element {\n const { hoverableComponent, componentProps, minHoverWidth, fixedHoverWidth, hoverScale } = props;\n const { setPreviewContentNode } = React.useContext(VideoPreviewContext);\n if (setPreviewContentNode === undefined) {\n Core.ErrorHelper.throw(new DevError(`Please use VideoPreviewContext inside a VideoPreviewContextProvider`));\n }\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const [ hoverCardRef, isHoverCardHovering ] = useHover<HTMLDivElement>();\n\n // eslint-disable-next-line\n const [ debugShow, setDebugShow ] = React.useState(false);\n\n const videoPositionRef = React.useRef<HTMLDivElement>(null);\n const prevStatus = React.useRef<boolean>(false);\n const currentIsHovering = isThumbnailHovering || isHoverCardHovering;\n\n useHoverLogger(currentIsHovering, props.analyticsData, props.analyticsOptions);\n\n React.useEffect(() => {\n if (prevStatus.current === currentIsHovering)\n return;\n if (currentIsHovering || debugShow) {\n setPreviewContentNode(portalNode);\n } else {\n setPreviewContentNode(null);\n }\n prevStatus.current = currentIsHovering;\n }, [currentIsHovering]);\n\n /**\n * Uncomment this if you want the hover to portal container to persist after a single hover\n * so you can inspect it's html - Sha\n */\n // React.useEffect(() => {\n // if (currentIsHovering)\n // setDebugShow(true);\n // }, [currentIsHovering]);\n\n const { x, y, width, height } = videoPositionRef.current?.getBoundingClientRect?.() || {};\n\n const hoverPositionConfig = React.useMemo(\n () => calculatePosition({ x, y, width, height }, fixedHoverWidth, minHoverWidth, hoverScale),\n [ x, y, width, height, hoverScale ]\n );\n const scale = hoverPositionConfig ? hoverPositionConfig.originalWidth / hoverPositionConfig.width : 1;\n\n const HoverableComponent = hoverableComponent;\n\n return (\n <div ref={videoPositionRef} >\n <div ref={thumbnailHoverRef}>\n <HoverableComponent isHovering={false} {...componentProps}/>\n </div>\n\n {(currentIsHovering || debugShow) && (\n <InPortal node={portalNode}>\n <div\n className={`${styles.positionWrapper} ${styles.animationWrapper}`}\n style={{\n '--scale': scale,\n ...hoverPositionConfig\n } as unknown as React.CSSProperties}\n ref={hoverCardRef}\n >\n <HoverableComponent\n isHovering={true}\n hoverPositionConfig={hoverPositionConfig}\n cleanPortalNode={() => setPreviewContentNode(null)}\n {...componentProps}/>\n </div>\n </InPortal>\n )}\n </div>\n );\n}\n\nHoverToPortalContainer.ReferenceContainer = (props: React.PropsWithChildren) => {\n return (\n <div id='content-width-reference' className='flex-grow-1'>\n {props.children}\n </div>\n );\n};\n","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.module.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { Audience, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-thumbnail-badges.module.scss';\n\ninterface VideoThumbnailBadgesProps {\n video?: Video;\n audience?: Audience;\n hideRating?: boolean;\n hideDuration?: boolean;\n newDurationStyle?: boolean;\n size?: VideoItemSize;\n duration?: number;\n}\n\nVideoThumbnailBadges.defaultProps = {\n newDurationStyle: true,\n size: 'md'\n};\n\nexport function VideoThumbnailBadges(props: VideoThumbnailBadgesProps): JSX.Element {\n const rating = VideoHelper.getRating(props.video);\n\n const showAudience = !!props.audience && props.size !== 'sm';\n const showRating = !showAudience && !props.hideRating && !!rating && props.size !== 'sm';\n\n if (props.hideDuration && !showAudience && !showRating)\n return <></>;\n\n return (\n <BadgeListContainer className={`${styles.badgeContainer} ${props.size === 'sm' ? styles.sm : ''}`}>\n {showAudience && (\n <AudienceLabel\n audience={props.audience}\n className='bg-white text-dark'\n border='dark'\n />\n )}\n {showRating && (\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n )}\n {!props.hideDuration && (\n <Badge\n type={props.newDurationStyle ? BadgeType.DurationApproximate : BadgeType.DurationExact}\n data={props.duration || VideoHelper.getDuration(props.video)}\n />\n )}\n </BadgeListContainer>\n );\n}","import React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface RestrictionPadlockProps {\n tooltip?: string;\n className?: string;\n tooltipPlacement?: Placement\n size?: VideoItemSize;\n video: VideoTypes;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionPadlock(props: RestrictionPadlockProps): JSX.Element {\n if (!props.yearGroups)\n return <></>;\n\n const title = RestrictionHelper.mapRestrictionToText(props.video._restrictions, props.yearGroups);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canConsume || !title)\n return <></>;\n\n return (\n <Tooltip\n spanHack\n spanHackClassName={props.className || 'd-inline-block ps-1'}\n title={title}\n placement={props.tooltipPlacement || 'top'}\n >\n <SvgContainer\n svg={LockSvg}\n size={props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard}\n />\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './video-title.module.scss';\n\nconst namespace = 'shared.videoTitle';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst TODAY = new Date();\n\nexport type VideoTitleSizes = 'h4' | 'h5' | 'h6';\n\ninterface VideoTitleProps {\n video: Video;\n yearGroups?: YearGroup[];\n showNewVideoIndicator?: boolean;\n title?: string;\n showPadlock: boolean;\n\n lockSize?: 'sm' | 'md';\n titleSize?: VideoTitleSizes;\n className?: string;\n}\n\nfunction isDateInCurrentMonth(target: string) {\n return DateHelper.isSame(target, TODAY, 'year') && DateHelper.isSame(target, TODAY, 'month');\n}\n\nVideoTitle.defaultProps = {\n titleSize: 'h6',\n className: ''\n};\n\nexport function VideoTitle(props: VideoTitleProps): JSX.Element {\n const dateRelease = props.video.dateReleased;\n const isCurrentMonth = dateRelease && isDateInCurrentMonth(dateRelease);\n\n const shouldShowNewVideoIndicator = props.showNewVideoIndicator\n && isCurrentMonth\n && props.video._isClickViewCurated?.value;\n\n return (\n <>\n <Tooltip\n title={`${shouldShowNewVideoIndicator ? getPhrase('newVideo') : ''}`}\n spanHack\n spanHackClassName='d-inline-block'\n >\n {shouldShowNewVideoIndicator && (\n <span className={`rounded-circle bg-green d-inline-block me-1 ${styles.dot} ${props.titleSize === 'h6' ? styles.smallText : ''}`} />\n )}\n </Tooltip>\n\n <h2 className={`${props.titleSize} ${styles.title} ${props.className} d-inline`}>\n {props.title || props.video.name}\n </h2>\n\n {props.showPadlock && (\n <RestrictionPadlock\n video={props.video}\n yearGroups={props.yearGroups}\n size={props.lockSize}\n />\n )}\n </>\n );\n}\n\n","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopoutVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './thumbnail-text.module.scss';\n\ntype VideoThumbnailTextProps = Pick<PopoutVideoThumbnailProps, 'video'|'appLink'|'commonVideoProps'>\n\nexport function ThumbnailText(props: VideoThumbnailTextProps): JSX.Element {\n const { video, appLink } = props;\n const { canNavigate } = VideoHelper.getCanBeConsumed(video);\n\n return (\n <div className={`mt-2 ${styles.container}`}>\n <div className={`d-flex flex-column ${styles.titleContainer}`}>\n {VideoHelper.isVideo(video) && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-truncate'\n video={video}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n )}\n <AppLink className='text-reset clamp-2 align-middle' appLink={canNavigate ? appLink : null}>\n <VideoTitle\n video={props.video}\n yearGroups={props.commonVideoProps.yearGroups}\n lockSize='sm'\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { AppLink } from '../../app-link/AppLink';\n\nimport styles from './video-guidance-tag.module.scss';\n\ninterface VideoGuidanceTagProps {\n text: string;\n svg: SvgIcon;\n iconVariant: string;\n active?: boolean;\n appLink?: Core.AppLink;\n appLinkAnalyticsData?: HashObject;\n appLinkAnalyticsOptions?: AnalyticsOptions;\n theme?: {\n tabLabel?: string;\n container?: string;\n }\n}\n\nfunction ContainerWrapper(props: VideoGuidanceTagProps): JSX.Element {\n if (props.appLink) {\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.appLinkAnalyticsData}\n analyticsOptions={props.appLinkAnalyticsOptions}\n className={`\n p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer\n text-decoration-none ${props.theme?.container} ${styles.tag} ${props.active ? styles.active : ''}\n `}\n >\n <VideoGuidanceTag {...props} />\n </AppLink>\n );\n }\n\n return (\n <div\n className={`p-1 pe-2 rounded-pill d-inline-flex align-items-center ${props.theme?.container} ${styles.tag} ${styles.disabled}`}\n >\n <VideoGuidanceTag {...props} />\n </div>\n );\n}\n\nfunction VideoGuidanceTag(props: VideoGuidanceTagProps): JSX.Element {\n return (\n <>\n <SvgContainer\n className={`${styles.icon} rounded-circle bg-${props.iconVariant} text-white`}\n svg={props.svg}\n />\n\n <span className={`ps-1 text-nowrap user-select-none ${props.theme?.tabLabel}`}>\n {props.text}\n </span>\n </>\n );\n}\n\nexport { ContainerWrapper as VideoGuidanceTag };","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.classroomGuideTag';\n\ninterface ClassroomGuideTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ClassroomGuideTag(props: ClassroomGuideTagProps): JSX.Element {\n if (!props.video || VideoHelper.isInteractive(props.video) || VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._hasCurriculumLinks?.value)\n return <></>;\n\n return (\n <VideoGuidanceTag\n theme={{\n container: 'classroom-guide-tag',\n tabLabel: 'classroom-guide-tag-label'\n }}\n svg={GraduationCapSvg}\n iconVariant='navy'\n text={LanguageService.getPhrase(namespace, 'curriculum')}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'curriculum',\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { InteractiveSvg } from 'libs/shared/images/svg/objects/InteractiveSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.interactivesTag';\n\ninterface InteractivesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function InteractivesTag(props: InteractivesTagProps): JSX.Element {\n if (!VideoHelper.showInteractivesGuidance(props.video))\n return <></>;\n \n const interactiveCount = !VideoHelper.isInteractive(props.video) && (props.video.interactives?.data.length || 0);\n\n return (\n <VideoGuidanceTag\n svg={InteractiveSvg}\n iconVariant='green'\n text={LanguageService.getPhrase(namespace, 'interactives', { smartCount: interactiveCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'interactive',\n videoGuidanceTotalItems: interactiveCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { ResourcesSvg } from 'libs/shared/images/svg/objects/ResourcesSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.resourcesTag';\n\nfunction getResourceCount(video: VideoTypes): number {\n if (VideoHelper.isInteractive(video))\n return 0;\n\n return (\n (video.resources?.data.length || 0) +\n (video.links?.data.length || 0)\n );\n}\n\ninterface ResourcesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ResourcesTag(props: ResourcesTagProps): JSX.Element {\n if (!VideoHelper.showResourcesGuidance(props.video))\n return <></>;\n\n const resourceCount = getResourceCount(props.video);\n\n return (\n <VideoGuidanceTag\n svg={ResourcesSvg}\n iconVariant='indigo'\n text={LanguageService.getPhrase(namespace, 'resources', { smartCount: resourceCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'resource',\n videoGuidanceTotalItems: resourceCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { ClassroomGuideTag } from 'libs/shared/components/video-guidance/classroom-guide/ClassroomGuideTag';\nimport { InteractivesTag } from 'libs/shared/components/video-guidance/interactives/InteractivesTag';\nimport { ResourcesTag } from 'libs/shared/components/video-guidance/resources/ResourcesTag';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemGuidanceProps {\n video: VideoTypes;\n getVideoAppLink?: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n containerClassName: string;\n responsiveClassName?: string;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function VideoItemGuidance(props: VideoItemGuidanceProps): JSX.Element {\n const showingResourcesAndInteractives = (\n VideoHelper.showInteractivesGuidance(props.video) &&\n VideoHelper.showResourcesGuidance(props.video)\n );\n\n const showClassroomGuide = props.commonVideoProps.features.showClassroomGuide(props.video);\n\n return (\n <div className={`${props.containerClassName} ${showingResourcesAndInteractives ? props.responsiveClassName : ''}`}>\n {showClassroomGuide && (\n <ClassroomGuideTag\n appLink={props.commonVideoProps.getClassroomGuideAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n )}\n <ResourcesTag\n appLink={props.commonVideoProps.getResourceGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n <InteractivesTag\n appLink={props.commonVideoProps.getInteractiveGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\n\nimport { DivButton } from '../../div-button/DivButton';\nimport { SvgContainer } from '../../svg-container/SvgContainer';\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './remove-video-button.module.scss';\n\nconst namespace = 'shared.removeVideoButton';\n\ninterface RemoveVideoButtonProps {\n onClickRemove: (e: React.MouseEvent<HTMLButtonElement>) => void;\n removeButtonTooltip?: string;\n preventFocus?: boolean;\n}\n\nexport function RemoveVideoButton(props: RemoveVideoButtonProps): JSX.Element {\n const tooltip = props.removeButtonTooltip || LanguageService.getPhrase(namespace, 'removeFromRow');\n\n return (\n <div className='me-2'>\n <Tooltip title={tooltip} spanHack>\n <DivButton\n onClick={props.onClickRemove}\n className={`d-flex align-items-center justify-content-center ${styles.button}`}\n tabIndex={props.preventFocus ? -1 : undefined}\n >\n <SvgContainer\n svg={CloseSvg}\n className={`svg-container ${styles.heart}`}\n />\n </DivButton>\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { HoverableProps, HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { RemoveVideoButton } from '../../remove-button/RemoveVideoButton';\nimport { ThumbnailCompanyLogo } from '../../thumbnail-company/ThumbnailCompanyLogo';\nimport { PopoutVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './popout-video-thumbnail.module.scss';\n\ntype PopoutVideoProps = HoverableProps & PopoutVideoThumbnailProps;\n\nconst PopoutVideo = (props: PopoutVideoProps): JSX.Element => {\n const {\n video, appLink, imageOptions, preload, isHovering\n } = props;\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(appLink?.params) ? appLink?.params as HashObject : {};\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n React.useEffect(() => {\n return () => {\n props.cleanPortalNode?.();\n };\n }, []);\n\n function onClickRemove(e: React.MouseEvent<HTMLButtonElement>) {\n e.preventDefault();\n props.onClickRemove?.();\n }\n\n let className = 'position-relative bg-white';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n if (isHovering)\n className += ` rounded-3 shadow-lg`;\n \n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n };\n\n const showThumbnailPreviewVideo = props.isHovering && canConsume && hoverToPlay;\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, isHovering);\n\n function showRemoveButton() {\n if (!FunctionHelper.isFunction(props.onClickRemove))\n return false;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n return isHovering;\n }\n\n const analyticsData = {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <div className={className}>\n <div className={styles.topRightContainer}>\n {showRemoveButton() && (\n <RemoveVideoButton\n onClickRemove={onClickRemove}\n removeButtonTooltip={props.removeButtonTooltip}\n preventFocus\n />\n )}\n\n {showFavouriteButton && (\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n preventFocus\n />\n )}\n\n {!canNavigate && (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <ThumbnailPadlock />\n </Tooltip>\n )}\n </div>\n\n <div className='position-relative'>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={isHovering ? 'rounded-top-3' : 'rounded-3'}\n onClick={() => props.cleanPortalNode?.()}\n appLink={canNavigate ? appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n <BaseImage\n onClick={() => props.cleanPortalNode?.()}\n data={VideoHelper.getThumbnail(video)}\n appLink={canNavigate ? appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus={!props.hideTitle}\n appLinkClassName={`position-absolute top-0 start-0 h-100 w-100 overflow-hidden ${isHovering ? 'rounded-top-3' : 'rounded-3'}`}\n imageClassName={isHovering ? 'rounded-top-3' : 'rounded-3'}\n >\n <ImageFallback type={ImageFallbackType.Video} />\n <div className='p-absolute w-100 h-100 text-white'>\n\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n \n <VideoTypeBadge video={video} />\n \n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n />\n </div>\n\n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n />\n\n {/* bottom */}\n <VideoThumbnailBottomBar video={props.video} />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n location='popout-video'\n onRemoveVideo={props.onClickRemove}\n appLink={canNavigate ? appLink : null}\n />\n }\n </div>\n\n {!isHovering && !props.hideTitle && (\n <ThumbnailText {...props}/>\n )}\n \n <div className={`${styles.details} ${isHovering ? `${styles.isHovering} box-shadow` : ''}`}>\n {isHovering && (\n <>\n <div className={`${isHovering ? styles.videoGuidanceTags : ''}`}>\n <ThumbnailText {...props}/>\n\n {(props.showVideoGuidance && isHovering) && (\n <VideoItemGuidance\n commonVideoProps={props.commonVideoProps}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n responsiveClassName={styles.responsiveGuidance}\n containerClassName={`d-flex justify-content-start align-items-center pt-2`}\n />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\n\nexport function PopoutVideoThumbnail(props: PopoutVideoThumbnailProps): JSX.Element {\n return (\n <>\n <HoverToPortalContainer<PopoutVideoThumbnailProps>\n hoverableComponent={PopoutVideo}\n componentProps={props}\n fixedHoverWidth={400}\n minHoverWidth={400}\n analyticsData={{\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n }}\n analyticsOptions={{\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n }}\n />\n </>\n );\n}","import React from 'react';\n\nexport function PlayCircleFilledSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PlayCircleFilledSvg } from 'libs/shared/images/svg/actions/PlayCircleFilledSvg';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\n\nimport styles from './mask.module.scss';\n\nexport enum MaskType {\n Video,\n Playlist,\n Series\n}\n\nfunction getClassByType(type: MaskType): string {\n if (type === MaskType.Video)\n return styles.video;\n\n if (type === MaskType.Playlist)\n return styles.playlist;\n\n return '';\n}\n\nfunction getSvg(type: MaskType, displayInverse: boolean = false) {\n if (type === MaskType.Video)\n return displayInverse ? PlayCircleFilledSvg : PlayCircleSvg;\n\n return null;\n}\n\ntype MaskSize = 'sm' | 'md';\n\ninterface MaskProps {\n type: MaskType;\n size?: MaskSize;\n alwaysShowIcon?: boolean;\n}\n\nMask.defaults = {\n size: 'md'\n};\n\nexport function Mask(props: MaskProps): JSX.Element {\n const { type, size, alwaysShowIcon } = props;\n\n const typeClass = getClassByType(type);\n const svg = getSvg(type, alwaysShowIcon);\n\n return (\n <div\n className={`${alwaysShowIcon ? styles.constantIconMaskContainer : styles.maskContainer} ${size === 'sm' ? styles.small : ''}`}\n >\n <div className={ styles.mask }></div>\n <SvgContainer svg={svg} className={ typeClass } />\n </div>\n );\n}","import React from 'react';\n\nexport function TickSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M18.783 5.192c.264.283.291.775.06 1.098l-8.91 12.444a.6.6 0 0 1-.457.266.58.58 0 0 1-.471-.228l-3.819-4.666a.905.905 0 0 1 0-1.1c.249-.304.652-.304.9 0l3.338 4.078 8.46-11.818c.232-.324.634-.356.899-.074'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TickSvg } from 'libs/shared/images/svg/status/TickSvg';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './check-mark-button.module.scss';\n\nexport enum CheckMarkStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n\nexport type SetCheckMarkStatusFunc = (status: CheckMarkStatus) => Promise<void>;\n\ninterface CheckMarkButtonProps {\n setStatus: SetCheckMarkStatusFunc;\n status: CheckMarkStatus;\n style?: 'outline' | 'filled';\n className?: string;\n disabled?: boolean;\n}\n\nCheckMarkButton.defaultProps = {\n style: 'filled'\n};\n\nexport function CheckMarkButton(props: CheckMarkButtonProps): JSX.Element {\n // Use local state so that changes are reflected immediately.\n const [ isComplete, setIsComplete ] = React.useState(props.status === CheckMarkStatus.Complete);\n\n React.useEffect(() => {\n setIsComplete(props.status === CheckMarkStatus.Complete);\n }, [props.status]);\n\n let className = `cursor-pointer rounded-circle ${isComplete ? styles.checked : styles.unchecked}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (props.style === 'outline')\n className += ` ${styles.outline}`;\n\n function shouldRender(): boolean {\n return (\n !!props.status &&\n props.status !== CheckMarkStatus.None &&\n FunctionHelper.isFunction(props.setStatus)\n );\n }\n\n function onClick(): void {\n const shouldComplete = !isComplete;\n\n setIsComplete(shouldComplete);\n\n const newStatus = shouldComplete ? CheckMarkStatus.Complete : CheckMarkStatus.Incomplete;\n\n props.setStatus(newStatus).catch(() => {\n setIsComplete(!shouldComplete);\n });\n }\n\n if (!shouldRender())\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} disabled={props.disabled}>\n <SvgContainer\n svg={TickSvg}\n className={`svg-container ${styles.checkMark}`}\n />\n </DivButton>\n );\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { CheckMarkButton, CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ThumbnailPadlock } from './padlock/ThumbnailPadlock';\n\nimport styles from './video-thumbnail-actions.module.scss';\n\nfunction hasActions(props: VideoThumbnailActionsProps): boolean {\n if (!VideoHelper.getCanBeConsumed(props.video)?.canConsume)\n return true;\n\n if (FunctionHelper.isFunction(props.setFavourite) && FunctionHelper.isFunction(props.canFavourite))\n return true;\n\n if (FunctionHelper.isFunction(props.setCheckMarkStatus))\n return true;\n\n return false;\n}\n\ninterface VideoThumbnailActionsProps {\n video: VideoTypes;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n checkMarkStatus?: CheckMarkStatus;\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n size?: VideoItemSize;\n}\n\nexport function VideoThumbnailActions(props: VideoThumbnailActionsProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canNavigate) {\n return (\n <div className={styles.container}>\n <ThumbnailPadlock size={props.size} />\n </div>\n );\n }\n \n if (!hasActions(props))\n return <></>;\n\n return (\n <div className={`${styles.container} d-flex align-items-center`}>\n <FavouriteButton\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n video={props.video}\n className={styles.action}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n preventFocus\n />\n\n <CheckMarkButton\n status={props.checkMarkStatus}\n setStatus={props.setCheckMarkStatus}\n className={styles.action}\n />\n </div>\n );\n}","export enum ThumbnailTextPosition {\n Below = 1,\n Overlay = 2,\n Independent = 3\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { VideoThumbnailActions } from 'libs/shared/components/thumbnails/thumbnail-actions/VideoThumbnailActions';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { CosmeticVideoThumbnailProps, StaticVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './static-video-thumbnail.module.scss';\n\nconst namespace = 'shared.staticVideoThumbnail';\n\ntype CombinedProps = StaticVideoThumbnailProps | CosmeticVideoThumbnailProps;\n\nfunction ThumbnailText(props: CombinedProps): JSX.Element {\n const { type, video, textPosition } = props;\n\n const isStatic = type === 'static';\n\n const textIsOverlayed = textPosition === ThumbnailTextPosition.Overlay;\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n let className = '';\n\n if (textIsOverlayed) {\n className = styles.titleOverlay;\n\n if (canNavigate) {\n if (VideoHelper.isClip(video))\n className += ' ' + styles.clip;\n if (VideoHelper.isInteractive(video))\n className += ' ' + styles.interactive;\n }\n } else {\n className = styles.titleBelow;\n }\n\n return (\n <div className={className}>\n {VideoHelper.isVideo(video) &&\n <VideoSubText\n type={isStatic ? props.commonVideoProps.subTextType : 'series'}\n className={textIsOverlayed ? 'text-shadow clamp-1' : 'clamp-2'}\n video={video}\n appLink={isStatic && !textIsOverlayed ? props.commonVideoProps.getSubTextAppLink?.(props.video) : null}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n }\n\n {(textIsOverlayed || !canNavigate || !isStatic)\n ? (\n <span className={`h6 text-reset clamp-1`}>\n <VideoTitle\n video={video}\n title={video.name ?? LanguageService.getPhrase(namespace, 'videoUnavailable')}\n showNewVideoIndicator={isStatic && props.commonVideoProps.showNewVideoIndicator}\n showPadlock={isStatic\n && !props.commonVideoProps.hasStudentExperience\n && !props.commonVideoProps.hasGuestExperience}\n />\n </span>\n ) : (\n <AppLink className='h6 text-reset clamp-2' appLink={props.appLink}>\n <VideoTitle\n video={video}\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n )\n }\n </div>\n );\n}\n\nexport function StaticVideoThumbnail(props: CombinedProps): JSX.Element {\n const { type, video, textPosition, imageOptions, preload, alwaysShowIcon } = props;\n const hoverToPlay = 'commonVideoProps' in props ? props.commonVideoProps?.hoverToPlay : false;\n\n const isStatic = type === 'static';\n\n const appLinkParams = isStatic && ObjectHelper.isObject(props.appLink?.params)\n ? props.appLink?.params as HashObject :\n {};\n\n const [ hoverRef, isHovering ] = useHover<HTMLDivElement>();\n const [ hoverIntentRef, isHoveringIntentionally ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n function setHoverRefs(r: HTMLDivElement) {\n hoverRef.current = r;\n hoverIntentRef.current = r;\n }\n\n const showThumbnailPreviewVideo = isStatic && isHoveringIntentionally && canConsume && hoverToPlay;\n\n function canFavourite(): boolean {\n if (!isStatic)\n return;\n\n return !props.disableFavourite &&\n props.commonVideoProps.canFavourite?.(props.video) &&\n FavouriteHelper.showFavouriteButton(video, isHovering);\n }\n\n function getContainerClass(): string {\n let className = 'position-relative';\n\n className += (isStatic && props.appLink && canNavigate) ? ' cursor-pointer' : '';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` rounded overflow-hidden`;\n\n return className;\n }\n\n function getThumbnailClass(): string {\n let className = `overflow-hidden ${props.size === 'sm' ? 'rounded' : 'rounded-3'}`;\n\n if (props.imageClassName)\n className += ` ${props.imageClassName}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` ${styles.gradient}`;\n \n return className;\n }\n\n const eventAnalyticsOptions = isStatic ? {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n } : {};\n\n const showMask = isStatic && !!props.appLink && !props.hideMask && canNavigate;\n const tooltip = isStatic\n ? VideoHelper.getPrivacyReasoning(props.video, props.showSignIn)\n : '';\n\n const analyticsData = isStatic ? {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n } : {};\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={tooltip} spanHack spanHackClassName=''>\n <div className={getContainerClass()} ref={setHoverRefs}>\n {isStatic &&\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={props.size === 'sm' ? 'rounded' : 'rounded-3'}\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n }\n\n <VideoThumbnailActions\n video={video}\n checkMarkStatus={!isStatic && props.checkMarkStatus}\n setCheckMarkStatus={!isStatic && props.setCheckMarkStatus}\n setFavourite={isStatic && props.commonVideoProps.setFavourite}\n canFavourite={canFavourite}\n analyticsData={isStatic && props.analyticsData}\n analyticsOptions={isStatic && eventAnalyticsOptions}\n size={props.size}\n />\n\n <BaseImage\n data={VideoHelper.getThumbnail(video)}\n appLink={isStatic && canNavigate ? props.appLink : null}\n onClick={isStatic && canNavigate ? props.onClick : undefined}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n className={getThumbnailClass()}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n openInNewTab={props.openInNewTab}\n forcePageLoad={props.forcePageLoad}\n >\n {showMask && (\n <Mask type={MaskType.Video} size={props.size} alwaysShowIcon={alwaysShowIcon}/>\n )}\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n {/* overlay */}\n {textPosition === ThumbnailTextPosition.Overlay && <ThumbnailText {...props} />}\n \n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {isStatic && props.showOwner &&\n <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />\n }\n \n {!props.hideVideoTypeBadge && <VideoTypeBadge video={video} size={props.size} />}\n\n {isStatic &&\n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n size={props.size}\n />\n }\n </div>\n\n {/* bottom */}\n {!props.hideBottomBar &&\n <VideoThumbnailBottomBar video={video} />\n }\n \n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n newDurationStyle={props.newDurationStyle}\n size={props.size}\n />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={isStatic && props.shareId }\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={isStatic && canNavigate ? props.appLink : null}\n />\n }\n\n {textPosition === ThumbnailTextPosition.Below && <ThumbnailText {...props} />}\n </div>\n </Tooltip>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Audience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport { ExpandableVideoThumbnail } from './expandable/ExpandableVideoThumbnail';\nimport { PopoutVideoThumbnail } from './popout/PopoutVideoThumbnail';\nimport { StaticVideoThumbnail } from './static/StaticVideoThumbnail';\n\ninterface BaseCommonVideoThumbnailProps {\n video: VideoTypes;\n imageOptions: ImageOptions;\n preload?: boolean;\n}\n\ninterface BasePlayableVideoThumbnailProps extends BaseCommonVideoThumbnailProps {\n appLink: Core.AppLink;\n onClick?: () => void;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Location context required\n\n /**\n * TODO: Fix whatever this used to do in playlists\n */\n canRemovePrivateVideos?: boolean;\n showSignIn?: boolean;\n\n showOwner?: boolean;\n\n shareId?: string;\n\n commonVideoProps: CommonVideoProps;\n}\n\nexport interface ExpandableVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'expandable'\n newDurationStyle?: boolean;\n hovering: boolean;\n}\n\nexport interface PopoutVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'popout'\n hideDuration: boolean;\n extraClasses?: string;\n hideRating?: boolean;\n hideTitle?: boolean;\n showVideoGuidance: boolean;\n onClickRemove: () => void;\n removeButtonTooltip?: string;\n audience: Audience;\n}\n\ninterface BaseStaticVideoThumbnailProps {\n textPosition?: ThumbnailTextPosition;\n extraClasses?: string;\n imageClassName?: string;\n size: 'sm' | 'md';\n hideMask?: boolean;\n videoTypeBadgeSize?: 'sm' | 'std';\n hideDuration?: boolean;\n audience?: Audience;\n newDurationStyle?: boolean;\n hideRating?: boolean;\n hideVideoTypeBadge?: boolean;\n hideBottomBar?: boolean;\n alwaysShowIcon?: boolean;\n openInNewTab?: boolean;\n forcePageLoad?: boolean;\n}\n\nexport interface StaticVideoThumbnailProps extends BaseStaticVideoThumbnailProps, BasePlayableVideoThumbnailProps {\n type: 'static'\n disableFavourite?: boolean;\n}\n\n/**\n * If you need any of the following, you should be using static:\n * - Favourite button\n * - Applink to link to the video\n * - Hover to play\n * - Analytics data\n * - Showing the owner\n * - Showing sign in\n * \n * Cosmetic should just be for displaying a thumbnail that is not interacted with, or the <AppLink />\n * is outside of the thumbnail like in shares.\n * \n * - Sha\n */\nexport interface CosmeticVideoThumbnailProps extends BaseCommonVideoThumbnailProps, BaseStaticVideoThumbnailProps{\n type: 'cosmetic';\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n checkMarkStatus?: CheckMarkStatus;\n}\n\nexport type VideoThumbnailProps =\n ExpandableVideoThumbnailProps |\n PopoutVideoThumbnailProps |\n StaticVideoThumbnailProps |\n CosmeticVideoThumbnailProps;\n\nVideoThumbnail.defaultProps = {\n hideRating: true,\n size: 'md',\n showOwner: true\n};\n\nexport function VideoThumbnail(props: VideoThumbnailProps): JSX.Element {\n switch (props.type) {\n case 'static':\n return <StaticVideoThumbnail {...props} />;\n case 'cosmetic':\n // No hover to play for cosmetic use of VideoThumbnail\n return <StaticVideoThumbnail {...props} />;\n case 'expandable':\n // Expandable thumbnails show metadata on hover. Static display the duration and don't expand on hover\n return <ExpandableVideoThumbnail {...props} />;\n case 'popout':\n return <PopoutVideoThumbnail {...props} />;\n default:\n return;\n }\n}\n","import * as React from 'react';\n\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Video } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-item-description.module.scss';\n\ninterface InnerContentProps {\n video: Video;\n showSignIn: boolean;\n}\n\nfunction InnerContent(props: InnerContentProps): JSX.Element {\n if (!props.video.description && !VideoHelper.getCanBeConsumed(props.video)?.canNavigate) {\n return (\n <em>{VideoHelper.getPrivacyReasoning(props.video, props.showSignIn)}</em>\n );\n }\n\n const hasCaptions = !!props.video?.subtitles?.data?.length;\n\n return (\n <>\n {hasCaptions && (\n <span className={`d-inline-block align-middle ${styles.captionsBadge}`}>\n <Badge type={BadgeType.Captions} data={props.video?.subtitles} />\n </span>\n )}\n {!!props.video?.productionYear && (\n <span className='fw-semibold align-middle'>\n {hasCaptions ? ' \\u2022 ' : ''}{props.video.productionYear}\n </span>\n )}\n {!!props.video.description && (\n <span\n className='align-middle'\n dangerouslySetInnerHTML={{\n __html: `${(props.video.productionYear || hasCaptions) ? ' \\u2022 ' : ''}${LinkifyHelper.linkifyText(props.video.description)}`\n }}\n />\n )}\n </>\n );\n}\n\ninterface VideoItemDescriptionProps {\n video: Video;\n showSignIn?: boolean;\n hasStudentExperience?: boolean;\n hasGuestExperience?: boolean;\n}\n\nexport function VideoItemDescription(props: VideoItemDescriptionProps): JSX.Element {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n const hasUserRestrictions = !!RestrictionHelper.getRestrictionByType(\n props.video?._restrictions,\n RestrictionType.User\n );\n\n if (isMobile)\n return <></>;\n\n if (hasUserRestrictions && !props.hasStudentExperience && !props.hasGuestExperience)\n return <></>;\n\n return (\n <div className={`position-relative overflow-hidden clamp-2`}>\n <p className='m-0'>\n <InnerContent\n video={props.video}\n showSignIn={props.showSignIn}\n />\n </p>\n </div>\n );\n}","import React from 'react';\n\nexport function HandleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props} viewBox='0 0 16 16'>\n <path\n d='M1 0h14a1 1 0 0 1 1 1v1.2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1m0 6.4h14a1 1 0 0 1 1 1v1.2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7.4a1 1 0 0 1 1-1m0 6.4h14a1 1 0 0 1 1 1V15a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-1.2a1 1 0 0 1 1-1'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\nimport { Col } from 'react-bootstrap';\n\nimport { PropsWithSortableItemProps } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './video-item-left-content.module.scss';\n\ninterface VideoItemLeftContentProps {\n index: number;\n showDragHandle: boolean;\n showIndexes: boolean;\n dragHandleIcon: SvgIcon;\n dragHandleIconSize: SvgContainerSize;\n}\n\nfunction getClassName(showDragHandle: boolean): string {\n const baseClassName = 'd-flex justify-content-center align-items-center';\n if (!showDragHandle) return baseClassName;\n\n return `${baseClassName} cursor-pointer ${styles.dragHandleContainer}`;\n}\n\nexport function VideoItemLeftContent(props: PropsWithSortableItemProps<VideoItemLeftContentProps>): JSX.Element {\n const dragProps = props.showDragHandle ? { ...props.dragAttributes, ...props.dragListeners } : {};\n const className = getClassName(props.showDragHandle);\n\n if (!props.showDragHandle && !props.showIndexes) return <></>;\n\n return (\n <Col\n xs={2}\n className={className}\n {...dragProps}\n >\n {!!props.showDragHandle &&\n <SvgContainer svg={props.dragHandleIcon} size={props.dragHandleIconSize} />\n }\n {!!props.showIndexes &&\n <span className='fw-semibold'>{props.index + 1}</span>\n }\n </Col>\n );\n}\n\nVideoItemLeftContent.defaultProps = {\n dragHandleIcon: HandleSvg,\n dragHandleIconSize: SvgContainerSize.Small\n};","import React from 'react';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\n\ninterface RestrictionBadgeProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionBadge(props: RestrictionBadgeProps): JSX.Element {\n return (\n <Badge\n type={BadgeType.Restriction}\n data={{ restrictions: props.restrictions, yearGroups: props.yearGroups }}\n inline\n />\n );\n}","import React from 'react';\n\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { RestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/RestrictionBadge';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemRestrictionBadgeProps {\n video: VideoTypes;\n yearGroups: YearGroup[];\n className?: string;\n}\n\nexport function VideoItemRestrictionBadge(props: VideoItemRestrictionBadgeProps): JSX.Element {\n const hasRestrictions = RestrictionHelper.hasRestrictions(props.video?._restrictions);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!hasRestrictions || !props.yearGroups || !canConsume)\n return <></>;\n \n return (\n <BadgeListContainer className={props.className || 'pt-1'}>\n <RestrictionBadge restrictions={props.video._restrictions} yearGroups={props.yearGroups} />\n </BadgeListContainer>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTitle, VideoTitleSizes } from 'libs/shared/components/video-title/VideoTitle';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemTitleProps {\n video: Video;\n appLink: Core.AppLink;\n onClickAppLink?: () => void;\n size?: VideoItemSize;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions;\n yearGroups: YearGroup[];\n showNewVideoIndicator?: boolean;\n showPadlock: boolean;\n\n linkClassName?: string;\n titleSize?: VideoTitleSizes;\n titleClassName?: string;\n clampLevel?: number;\n}\n\nVideoItemTitle.defaultProps = {\n clampLevel: 1\n};\n\nexport function VideoItemTitle(props: VideoItemTitleProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n const title = VideoHelper.getTitle(props.video);\n\n const analyticsData: HashObject = {\n ...props.analyticsData,\n id: props.video?.id,\n name: props.video?.name\n };\n\n const analyticsOptions: AnalyticsOptions = {\n ...props.analyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n function getTitleSize(): VideoTitleSizes {\n if (props.titleSize)\n return props.titleSize;\n\n if (props.size === 'md')\n return 'h4';\n\n return 'h5';\n }\n\n return (\n <AppLink\n className={props.linkClassName}\n appLink={canNavigate ? props.appLink : null}\n onClick={canNavigate ? props.onClickAppLink : null}\n analyticsOptions={analyticsOptions}\n analyticsData={analyticsData}\n >\n <div className={`clamp-${props.clampLevel} align-middle`} title={props.video.name ?? ''}>\n <VideoTitle\n video={props.video}\n title={title}\n yearGroups={props.yearGroups}\n lockSize={props.size}\n titleSize={getTitleSize()}\n className={props.titleClassName}\n showNewVideoIndicator={props.showNewVideoIndicator}\n showPadlock={props.showPadlock}\n />\n </div>\n </AppLink>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.signInToWatch';\n\ninterface SignInToWatchProps {\n appLink: Core.AppLink\n className: string;\n}\n\nexport function SignInToWatch(props: SignInToWatchProps): React.ReactElement {\n return (\n <AppLink appLink={props.appLink} className={props.className}>\n <Text namespace={namespace} phrase='signInToWatch'></Text>\n </AppLink>\n );\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { Video } from 'libs/shared/interfaces';\n\ninterface VideoItemActionsProps {\n video: Video;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function VideoItemActions(props: VideoItemActionsProps): JSX.Element {\n const videoActions = React.useContext(VideoActionsContext);\n\n if (!FunctionHelper.isFunction(videoActions?.getVideoActions))\n return <></>;\n\n const actions = videoActions.getVideoActions(props.video, {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions\n });\n\n return (\n <Actions\n actions={actions}\n className='align-items-start gap-2'\n actionsDropdownClassName='btn btn-link py-0'\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n fetchMore={videoActions.fetchMoreActions ? () => videoActions.fetchMoreActions(props.video) : null}\n customSize\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { SignInToWatch } from 'libs/shared/components/sign-in-to-watch/SignInToWatch';\nimport { VideoItemActions } from 'libs/shared/components/video-list/components/video-item-actions/VideoItemActions';\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemTopRightProps {\n video: Video;\n showSignIn: boolean;\n signInAppLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function VideoItemTopRight(props: VideoItemTopRightProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n if (props.showSignIn && !canNavigate)\n return <SignInToWatch appLink={props.signInAppLink} className='btn btn-outline-dark align-self-start' />;\n\n return (\n <VideoItemActions\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n internationalSecondaryBuilder(audiences: PresentationAudience[]): string {\n return AudienceStringBuilders.englandSecondaryBuilder(audiences);\n },\n\n scotlandPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'First')\n firstAudienceLevel = '1st';\n\n if (lastAudienceLevel === 'First')\n lastAudienceLevel = '1st';\n\n if (firstAudienceLevel === 'Second')\n firstAudienceLevel = '2nd';\n\n if (lastAudienceLevel === 'Second')\n lastAudienceLevel = '2nd';\n\n if (firstAudienceLevel === lastAudienceLevel)\n return `${firstAudienceLevel} Level`;\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Level`;\n },\n\n internationalPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'Lower')\n firstAudienceLevel = 'Low';\n\n if (lastAudienceLevel === 'Lower')\n lastAudienceLevel = 'Low';\n\n if (firstAudienceLevel === 'Middle')\n firstAudienceLevel = 'Mid';\n\n if (lastAudienceLevel === 'Middle')\n lastAudienceLevel = 'Mid';\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Pri`;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scotlandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n englandPrimaryBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, AudienceFilterParams, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n \n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.NZ_PRIMARY:\n case HardCoded.PresentationIds.NZ_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.CA_ELEMENTARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INT_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n // TODO: Implement this properly\n mergedAudienceString = AudienceStringBuilders.internationalSecondaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INT_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.internationalPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.SCT_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.scotlandPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENG_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englandSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCT_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scotlandSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENG_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.englandPrimaryBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n case HardCoded.PresentationIds.CA_MIDDLE:\n case HardCoded.PresentationIds.CA_HIGH:\n case HardCoded.PresentationIds.AU_TERTIARY:\n case HardCoded.PresentationIds.UK_TERTIARY:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): AudienceFilterParams {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BaseVideoItemProps } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemDescription } from 'libs/shared/components/video-list/components/video-item-description/VideoItemDescription';\nimport { VideoItemLeftContent } from 'libs/shared/components/video-list/components/video-item-left-content/VideoItemLeftContent';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoItemTopRight } from 'libs/shared/components/video-list/components/video-item-top-right/VideoItemTopRight';\nimport { SortableVideoListContext } from 'libs/shared/components/video-list/VideoList';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { Clip } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './clip-item.module.scss';\n\nexport type ClipItemProps = BaseVideoItemProps<Clip>;\n\nexport const ClipItem = React.forwardRef((props: ClipItemProps, ref: React.LegacyRef<HTMLDivElement>) => {\n const breakpoints = useBreakpoints();\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n \n const size = VideoListHelper.getSize(breakpoints, props.size);\n const isSmall = size === 'sm';\n\n const { isSortable } = React.useContext(SortableVideoListContext);\n\n const mergedAudience = useMergeAudiences(props.video.subjectPresentationAudiences?.data, props.presentationAudiences);\n\n const showDragHandle = isSortable && !breakpoints.xs && (hovered || typeof props.index === 'undefined' || !props.showIndexes);\n const showIndexes = (props.showIndexes && !showDragHandle) && !breakpoints.xs;\n const hasIconOrIndex = (showDragHandle || props.showIndexes) && !breakpoints.xs;\n\n const appLink = props.getVideoAppLink(props.video, {});\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: {\n entity: EntityType.Clip,\n location: LocationContext.ClipListItem\n }\n };\n\n return (\n <div ref={hoverRef} className='w-100'>\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`} ref={ref} style={props.style}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <Row>\n <VideoItemLeftContent\n index={props.index}\n showDragHandle={showDragHandle}\n showIndexes={showIndexes}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n dragAttributes={props.dragAttributes}\n dragListeners={props.dragListeners}\n />\n \n <Col xs={VideoListHelper.getThumbnailColSize(hasIconOrIndex)}>\n <VideoThumbnail\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n shareId={props.shareId}\n audience={mergedAudience}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n commonVideoProps={{\n ...props.commonVideoProps,\n subTextType: 'none'\n }}\n />\n </Col>\n </Row>\n </Col>\n\n <Col\n {...VideoListHelper.getDetailsColumns()}\n className={`${isSmall ? 'pb-2' : 'px-2'} d-flex position-relative flex-column`}\n >\n <div className='d-flex justify-content-between'>\n <VideoItemTitle\n video={props.video}\n appLink={appLink}\n size={size}\n yearGroups={props.commonVideoProps.yearGroups}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n linkClassName='flex-grow-1'\n {...analyticsProps}\n />\n \n <VideoItemTopRight\n {...analyticsProps}\n video={props.video}\n showSignIn={props.showSignIn}\n signInAppLink={props.getSignInAppLink?.(appLink)}\n />\n </div>\n\n <div>\n {!isSmall && (\n <VideoItemDescription\n video={props.video}\n showSignIn={props.showSignIn}\n hasStudentExperience={props.commonVideoProps.hasStudentExperience}\n hasGuestExperience={props.commonVideoProps.hasGuestExperience}\n />\n )}\n {!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience && (\n <VideoItemRestrictionBadge video={props.video} yearGroups={props.commonVideoProps.yearGroups}/>\n )}\n </div>\n\n {VideoHelper.showVideoGuidance(props.hasPermissions) && (\n <VideoItemGuidance\n video={props.video}\n getVideoAppLink={props.getVideoAppLink}\n containerClassName={`d-flex justify-content-start align-items-center pt-sm-1 gap-1`}\n responsiveClassName={styles.responsiveGuidance}\n commonVideoProps={props.commonVideoProps}\n {...analyticsProps}\n />\n )}\n </Col>\n </div>\n </div>\n );\n});\n\ntype SortableClipItemProps = ClipItemProps & {\n index: number;\n};\n\nexport const SortableClipItem = (props: SortableClipItemProps) => {\n return (\n <SortableItemWrapper id={props.video.id} childComponent={ClipItem} childProps={props} />\n );\n};","export function TrueOrFalseSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(1.000000, 1.000000)'>\n <g transform='translate(5.000000, 3.000000)'>\n <path d='M5.129,4.52970994e-14 C5.80434375,4.52970994e-14 6.35378125,0.5494375 6.35378125,1.22478125 L6.35378125,1.22478125 L6.35378125,4.12053125 C6.35378125,4.795875 5.80434375,5.3453125 5.129,5.3453125 L5.129,5.3453125 L5.01765625,5.3453125 L5.01765625,5.7625625 C5.14371875,5.7230625 5.2778125,5.70175 5.4166875,5.70175 C5.8579375,5.70175 6.24996875,5.9166875 6.4935,6.24740625 C6.6880625,6.13675 6.9129375,6.0735 7.15228125,6.0735 C7.61575,6.0735 8.024875,6.31059375 8.26471875,6.6699375 C8.450875,6.57140625 8.6629375,6.51559375 8.88784375,6.51559375 C9.6248125,6.51559375 10.2244688,7.11515625 10.2244688,7.85209375 L10.2244688,7.85209375 L10.2239688,11.0194063 C10.22375,12.719125 9.73003125,14.3683438 8.79625,15.7887188 C8.7095625,15.9205625 8.562375,15.9999688 8.4045625,15.9999688 L8.4045625,15.9999688 L3.1323125,15.9999688 C3.0124375,15.9999688 2.897125,15.9540625 2.8100625,15.8716563 C2.80745313,15.8691864 2.80274841,15.8647056 2.79608533,15.8582606 L2.73370254,15.7963915 C2.38498908,15.4434944 0.983540179,13.9211451 0.6698125,11.95725 L0.6698125,11.95725 L0.0538125,9.3209375 C-0.03209375,8.95328125 0.043625,8.5848125 0.261625,8.3100625 C0.46915625,8.04846875 0.78865625,7.89309375 1.14465625,7.8788125 C1.47575,7.8150625 1.81340625,7.8773125 2.10134375,8.0561875 C2.19071875,8.1116875 2.272125,8.17646875 2.34459375,8.24915625 L2.34459375,8.24915625 L2.34459375,5.34534375 L2.23325,5.34534375 C1.55790625,5.34534375 1.00846875,4.79590625 1.00846875,4.1205625 L1.00846875,4.1205625 L1.00846875,1.22478125 C1.00846875,0.5494375 1.55790625,4.52970994e-14 2.23325,4.52970994e-14 L2.23325,4.52970994e-14 Z M3.6810625,3.4381875 C3.46103125,3.4381875 3.282,3.61721875 3.282,3.83725 L3.282,3.83725 L3.282,11.2870938 C3.282,11.4215625 3.22428125,11.5495625 3.12346875,11.6385313 C3.02265625,11.7275 2.88853125,11.7689063 2.7550625,11.7522188 L2.7550625,11.7522188 L2.7175,11.7475313 C2.5228125,11.7231875 2.36390625,11.580125 2.31925,11.3890625 L2.31925,11.3890625 L1.78459375,9.10071875 C1.76034375,8.9969375 1.69715625,8.9088125 1.60659375,8.8525625 C1.51603125,8.7963125 1.407,8.78928125 1.30065625,8.79571875 C1.2585,8.79828125 1.23959375,8.8036875 1.194,8.80803125 C1.10340625,8.81665625 1.035625,8.84275 0.996,8.89271875 C0.956375,8.9426875 0.94596875,9.019 0.96665625,9.107625 L0.96665625,9.107625 L1.58653125,11.7605625 C1.5891875,11.7719063 1.59140625,11.7833438 1.59321875,11.794875 C1.83815625,13.3630313 2.95146875,14.6606563 3.32925,15.0625 L3.32925,15.0625 L8.1469375,15.0625 C8.893,13.8445 9.28625,12.4519688 9.2864375,11.0193125 L9.2864375,11.0193125 L9.2869375,7.85203125 C9.2869375,7.63209375 9.10790625,7.4530625 8.887875,7.4530625 C8.66784375,7.4530625 8.4888125,7.63209375 8.4888125,7.852125 L8.4888125,7.852125 L8.4888125,8.61359375 C8.4888125,8.87246875 8.2789375,9.08234375 8.0200625,9.08234375 C7.7611875,9.08234375 7.5513125,8.87246875 7.5513125,8.61359375 L7.5513125,8.61359375 L7.5513125,7.4100625 C7.5513125,7.19003125 7.3723125,7.011 7.15228125,7.011 C6.93225,7.011 6.75321875,7.19003125 6.75321875,7.4100625 L6.75321875,7.4100625 L6.75321875,8.28625 C6.75321875,8.545125 6.54334375,8.755 6.28446875,8.755 C6.02559375,8.755 5.81571875,8.545125 5.81571875,8.28625 L5.81571875,8.28625 L5.81571875,7.0383125 C5.81571875,6.81828125 5.6366875,6.63928125 5.41665625,6.63928125 C5.196625,6.63928125 5.017625,6.81828125 5.017625,7.0383125 L5.017625,7.0383125 L5.017625,8.232875 C5.017625,8.49175 4.80775,8.701625 4.548875,8.701625 C4.29,8.701625 4.080125,8.49175 4.080125,8.232875 L4.080125,8.232875 L4.080125,3.83725 C4.080125,3.61721875 3.90109375,3.4381875 3.6810625,3.4381875 Z M11.131,-1.59872116e-14 C11.8064063,-1.59872116e-14 12.3558125,0.5494375 12.3558125,1.22478125 L12.3558125,1.22478125 L12.3558125,4.1205625 C12.3558125,4.79590625 11.806375,5.34534375 11.131,5.34534375 L11.131,5.34534375 L8.23525,5.34534375 C7.55990625,5.34534375 7.01046875,4.79590625 7.01046875,4.1205625 L7.01046875,4.1205625 L7.01046875,1.22478125 C7.01046875,0.5494375 7.55990625,-1.59872116e-14 8.23525,-1.59872116e-14 L8.23525,-1.59872116e-14 Z M11.1310313,0.9375 L8.23528125,0.9375 C8.076875,0.9375 7.948,1.066375 7.948,1.22478125 L7.948,1.22478125 L7.948,4.1205625 C7.948,4.27896875 8.076875,4.40784375 8.23528125,4.40784375 L8.23528125,4.40784375 L11.1310313,4.40784375 C11.2894375,4.40784375 11.4183438,4.27896875 11.4183438,4.1205625 L11.4183438,4.1205625 L11.4183438,1.22478125 C11.4183438,1.066375 11.2894375,0.9375 11.1310313,0.9375 L11.1310313,0.9375 Z M5.129,0.9375 L2.23325,0.9375 C2.07484375,0.9375 1.94596875,1.066375 1.94596875,1.22478125 L1.94596875,1.22478125 L1.94596875,4.1205625 C1.94596875,4.27896875 2.07484375,4.40784375 2.2331875,4.40784375 L2.2331875,4.40784375 L2.34453125,4.40784375 L2.34453125,3.83721875 C2.34453125,3.10025 2.944125,2.50065625 3.68109375,2.50065625 C4.4180625,2.50065625 5.01765625,3.10025 5.01765625,3.83721875 L5.01765625,3.83721875 L5.01765625,4.40784375 L5.129,4.40784375 C5.28740625,4.40784375 5.41628125,4.27896875 5.41628125,4.1205625 L5.41628125,4.1205625 L5.41628125,1.22478125 C5.41628125,1.066375 5.28740625,0.9375 5.129,0.9375 L5.129,0.9375 Z'></path>\n </g>\n </g>\n </svg>\n `;\n}\n\nexport function ShortAnswerSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(1.000000, 1.000000)'>\n <path d='M16.5547082,3.66666667 C17.0307547,3.66666667 17.4166667,4.10561087 17.4166667,4.65176211 L17.4166667,17.3482379 C17.4166667,17.8922911 17.0325905,18.3333333 16.5547082,18.3333333 L5.44529184,18.3333333 C4.9692453,18.3333333 4.58333333,17.8943891 4.58333333,17.3482379 L4.58333333,4.65176211 C4.58333333,4.10770892 4.96740951,3.66666667 5.44529184,3.66666667 L16.5547082,3.66666667 Z M6.64149485,4.58362946 L5.39188119,4.58333333 L5.39188119,4.58333333 L5.39140886,4.63124366 C5.39133174,4.64701901 5.39125542,4.66659213 5.39117991,4.68981696 L5.39052172,4.99349248 C5.39045096,5.0373129 5.39038099,5.08434682 5.39031181,5.13444817 L5.38951907,5.87355262 C5.38945612,5.94585631 5.38939393,6.02064317 5.38933252,6.09776711 L5.38846857,7.41164942 C5.38841476,7.50849255 5.38836171,7.60694243 5.3883094,7.706853 L5.38744819,9.63144592 C5.38740476,9.7436262 5.38736207,9.85639075 5.3873201,9.96959351 L5.38636125,13.0260679 C5.38633211,13.1353268 5.38630366,13.2437094 5.38627591,13.3510694 L5.38541667,17.4092786 L5.38541667,17.4092786 C5.38541667,17.4094727 5.40139773,17.4096625 5.43215374,17.4098483 L5.66621602,17.410657 C5.70239956,17.4107438 5.74182455,17.4108296 5.78434021,17.4109144 L6.24635879,17.4116506 C6.30606164,17.4117294 6.36840286,17.4118072 6.43323171,17.411884 L7.07978636,17.412549 C7.15818403,17.4126199 7.23861702,17.4126899 7.32093458,17.4127589 L8.38955516,17.4135407 C8.48453695,17.413602 8.58080025,17.4136624 8.67819428,17.4137218 L10.2050643,17.4145426 C10.3099966,17.4145926 10.4153058,17.4146418 10.5208411,17.41469 L12.7186143,17.4155682 C12.8199282,17.4156037 12.9204129,17.4156383 13.0199177,17.4156721 L16.5962838,17.4166643 C16.6041235,17.4166659 16.6081188,17.4166667 16.6081188,17.4166667 L16.6083574,17.404543 L16.6083574,17.404543 L16.6092636,17.1281822 C16.609336,17.0909349 16.6094075,17.0503279 16.6094783,17.0065075 L16.6102897,16.3357629 C16.6103542,16.2685716 16.610418,16.1987511 16.6104809,16.1264474 L16.6111995,15.1489598 C16.6112564,15.059128 16.6113124,14.9673972 16.6113678,14.8739137 L16.6122825,13.0334559 C16.6123288,12.924197 16.6123745,12.8140617 16.6124193,12.703196 L16.6132553,10.3177583 C16.6132901,10.2038252 16.6133242,10.0901843 16.6133575,9.97698153 L16.6143069,6.10515513 C16.6143225,6.02803119 16.6143373,5.95324434 16.6143515,5.88094064 L16.6145833,4.59072136 L16.6145833,4.59072136 L16.6027483,4.59043343 L16.6027483,4.59043343 L16.5107818,4.58987601 C16.4881671,4.58978515 16.4620094,4.5896953 16.4324595,4.58960647 L16.0789915,4.58883422 C16.0304453,4.58875142 15.9789591,4.58866963 15.9246838,4.58858883 L15.1491499,4.58766678 C15.0749737,4.58759388 14.9986113,4.58752196 14.9202136,4.58745101 L14.1637515,4.58683864 C14.0744988,4.5867735 13.983663,4.58670932 13.891395,4.58664609 L12.4188002,4.58576887 C12.3159787,4.5857151 12.2124787,4.58566226 12.108451,4.58561036 L10.2115288,4.58477559 C10.1065966,4.58473469 10.0020412,4.58469469 9.89801354,4.5846556 L6.8573146,4.58368638 C6.78313834,4.58366655 6.71114817,4.58364758 6.64149485,4.58362946 Z M9.80280172,11.9166667 C10.0210177,11.9166667 10.1979167,12.1218695 10.1979167,12.375 C10.1979167,12.6281305 10.0210177,12.8333333 9.80280172,12.8333333 L9.80280172,12.8333333 L7.38469828,12.8333333 C7.16648232,12.8333333 6.98958333,12.6281305 6.98958333,12.375 C6.98958333,12.1218695 7.16648232,11.9166667 7.38469828,11.9166667 L7.38469828,11.9166667 Z M14.5678761,9.16666667 C14.8122845,9.16666667 15.0104167,9.37186949 15.0104167,9.625 C15.0104167,9.87813051 14.8122845,10.0833333 14.5678761,10.0833333 L14.5678761,10.0833333 L7.4321239,10.0833333 C7.18771549,10.0833333 6.98958333,9.87813051 6.98958333,9.625 C6.98958333,9.37186949 7.18771549,9.16666667 7.4321239,9.16666667 L7.4321239,9.16666667 Z M14.5678761,6.41666667 C14.8122845,6.41666667 15.0104167,6.62186949 15.0104167,6.875 C15.0104167,7.12813051 14.8122845,7.33333333 14.5678761,7.33333333 L14.5678761,7.33333333 L7.4321239,7.33333333 C7.18771549,7.33333333 6.98958333,7.12813051 6.98958333,6.875 C6.98958333,6.62186949 7.18771549,6.41666667 7.4321239,6.41666667 L7.4321239,6.41666667 Z'></path>\n </g>\n </svg>\n `;\n}\n\nexport function MissingWordSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(2.000000, 2.000000)'>\n <g transform='translate(3.500000, 2.000000)'>\n <path d='M10.78125,7.53125 C11.0285625,7.53125 11.2715937,7.59621875 11.4840312,7.71909375 C11.7963125,7.89971875 12.1875,7.6735625 12.1875,7.31334375 L12.1875,3.3125 C12.1875,3.053625 11.977625,2.84375 11.71875,2.84375 L8.38675,2.84375 C8.42015625,2.680125 8.4375,2.51184375 8.4375,2.34375 C8.4375,1.05140625 7.38609375,0 6.09375,0 C4.80140625,0 3.75,1.05140625 3.75,2.34375 C3.75,2.51184375 3.76734375,2.680125 3.80075,2.84375 L0.46875,2.84375 C0.209875,2.84375 0,3.053625 0,3.3125 L0,7.31334375 C0,7.674125 0.391625,7.899375 0.70346875,7.71909375 C0.91590625,7.59621875 1.1589375,7.53125 1.40625,7.53125 C2.18165625,7.53125 2.8125,8.16209375 2.8125,8.9375 C2.8125,9.71290625 2.18165625,10.34375 1.40625,10.34375 C1.1589375,10.34375 0.91590625,10.2787812 0.70346875,10.1559062 C0.3911875,9.9753125 0,10.2013437 0,10.5616563 L0,15.53125 C0,15.790125 0.209875,16 0.46875,16 L4.46959375,16 C4.8303125,16 5.05578125,15.608375 4.8753125,15.2965312 C4.7524375,15.0840937 4.6875,14.8410938 4.6875,14.59375 C4.6875,13.8183438 5.31834375,13.1875 6.09375,13.1875 C6.86915625,13.1875 7.5,13.8183438 7.5,14.59375 C7.5,14.8410938 7.4350625,15.0840937 7.31215625,15.2965312 C7.13146875,15.6087812 7.3576875,16 7.717875,16 L11.71875,16 C11.977625,16 12.1875,15.790125 12.1875,15.53125 L12.1875,10.5616563 C12.1875,10.2009375 11.7959375,9.97553125 11.4840312,10.1559063 C11.2715937,10.2787812 11.0285625,10.34375 10.78125,10.34375 C10.0058438,10.34375 9.375,9.71290625 9.375,8.9375 C9.375,8.16209375 10.0058438,7.53125 10.78125,7.53125 Z M10.78125,11.28125 C10.9393125,11.28125 11.096375,11.2652812 11.25,11.234 L11.25,15.0625 L8.39021875,15.0625 C8.42153125,14.9088438 8.4375,14.7518125 8.4375,14.59375 C8.4375,13.3014062 7.38609375,12.25 6.09375,12.25 C4.80140625,12.25 3.75,13.3014062 3.75,14.59375 C3.75,14.7518125 3.76596875,14.9088438 3.79728125,15.0625 L0.9375,15.0625 L0.9375,11.234 C1.091125,11.2652812 1.2481875,11.28125 1.40625,11.28125 C2.69859375,11.28125 3.75,10.2298438 3.75,8.9375 C3.75,7.64515625 2.69859375,6.59375 1.40625,6.59375 C1.2481875,6.59375 1.091125,6.60971875 0.9375,6.641 L0.9375,3.78125 L4.46959375,3.78125 C4.8303125,3.78125 5.05578125,3.389625 4.8753125,3.07778125 C4.75596875,2.87140625 4.6875,2.603875 4.6875,2.34375 C4.6875,1.56834375 5.31834375,0.9375 6.09375,0.9375 C6.86915625,0.9375 7.5,1.56834375 7.5,2.34375 C7.5,2.603875 7.43153125,2.87140625 7.31215625,3.07778125 C7.13146875,3.39003125 7.3576875,3.78125 7.717875,3.78125 L11.25,3.78125 L11.25,6.641 C11.096375,6.60971875 10.9393125,6.59375 10.78125,6.59375 C9.48890625,6.59375 8.4375,7.64515625 8.4375,8.9375 C8.4375,10.2298438 9.48890625,11.28125 10.78125,11.28125 Z'></path>\n </g>\n </g>\n </svg>\n `;\n}\n\nexport function MultipleChoiceSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <g transform='translate(1.000000, 1.000000)'>\n <path d='M15.125,3.66666667 C16.8969136,3.66666667 18.3333333,5.10308643 18.3333333,6.875 L18.3333333,15.125 C18.3333333,16.8969136 16.8969136,18.3333333 15.125,18.3333333 L6.875,18.3333333 C5.10308643,18.3333333 3.66666667,16.8969136 3.66666667,15.125 L3.66666667,6.875 C3.66666667,5.10308643 5.10308643,3.66666667 6.875,3.66666667 L15.125,3.66666667 Z M15.125,4.58333333 L6.875,4.58333333 C5.60934745,4.58333333 4.58333333,5.60934745 4.58333333,6.875 L4.58333333,15.125 C4.58333333,16.3906526 5.60934745,17.4166667 6.875,17.4166667 L15.125,17.4166667 C16.3906526,17.4166667 17.4166667,16.3906526 17.4166667,15.125 L17.4166667,6.875 C17.4166667,5.60934745 16.3906526,4.58333333 15.125,4.58333333 Z M7.33333333,13.2916667 C7.83959435,13.2916667 8.25,13.7020723 8.25,14.2083333 C8.25,14.7145944 7.83959435,15.125 7.33333333,15.125 C6.82707231,15.125 6.41666667,14.7145944 6.41666667,14.2083333 C6.41666667,13.7020723 6.82707231,13.2916667 7.33333333,13.2916667 Z M15.0349223,13.75 C15.2880528,13.75 15.4932556,13.9552028 15.4932556,14.2083333 C15.4932556,14.4614638 15.2880528,14.6666667 15.0349223,14.6666667 L9.625,14.6666667 C9.37186949,14.6666667 9.16666667,14.4614638 9.16666667,14.2083333 C9.16666667,13.9552028 9.37186949,13.75 9.625,13.75 L15.0349223,13.75 Z M7.33333333,10.0833333 C7.83959435,10.0833333 8.25,10.493739 8.25,11 C8.25,11.506261 7.83959435,11.9166667 7.33333333,11.9166667 C6.82707231,11.9166667 6.41666667,11.506261 6.41666667,11 C6.41666667,10.493739 6.82707231,10.0833333 7.33333333,10.0833333 Z M15.125,10.5416667 C15.3781305,10.5416667 15.5833333,10.7468695 15.5833333,11 C15.5833333,11.2531305 15.3781305,11.4583333 15.125,11.4583333 L9.625,11.4583333 C9.37186949,11.4583333 9.16666667,11.2531305 9.16666667,11 C9.16666667,10.7468695 9.37186949,10.5416667 9.625,10.5416667 L15.125,10.5416667 Z M7.33333333,6.875 C7.83959435,6.875 8.25,7.28540565 8.25,7.79166667 C8.25,8.29792769 7.83959435,8.70833333 7.33333333,8.70833333 C6.82707231,8.70833333 6.41666667,8.29792769 6.41666667,7.79166667 C6.41666667,7.28540565 6.82707231,6.875 7.33333333,6.875 Z M15.125,7.33333333 C15.3781305,7.33333333 15.5833333,7.53853616 15.5833333,7.79166667 C15.5833333,8.04479718 15.3781305,8.25 15.125,8.25 L9.625,8.25 C9.37186949,8.25 9.16666667,8.04479718 9.16666667,7.79166667 C9.16666667,7.53853616 9.37186949,7.33333333 9.625,7.33333333 L15.125,7.33333333 Z'></path>\n </g>\n </svg>\n `;\n}\n\nexport function ImageSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <path d='M19,5 C19.5522847,5 20,5.44771525 20,6 L20,18 C20,18.5522847 19.5522847,19 19,19 L5,19 C4.44771525,19 4,18.5522847 4,18 L4,6 C4,5.44771525 4.44771525,5 5,5 L19,5 Z M19,6 L5,6 L5,18 L19,18 L19,6 Z M13.5270821,8.72788029 L17.419465,14.7278803 C17.5697525,14.9595444 17.5037838,15.2691774 17.2721197,15.419465 C17.0404556,15.5697525 16.7308226,15.5037838 16.580535,15.2721197 L13.0911139,9.89327406 L11.4091273,12.2874279 C11.2306031,12.5415408 10.866042,12.5731488 10.6464466,12.3535534 L10.0540971,11.7612039 L7.4,15.3 C7.23431458,15.5209139 6.9209139,15.5656854 6.7,15.4 C6.4790861,15.2343146 6.43431458,14.9209139 6.6,14.7 L9.6,10.7 C9.7825648,10.4565803 10.1383987,10.4312919 10.3535534,10.6464466 L10.9328729,11.2257661 L12.6984898,8.71257207 C12.9021272,8.42271292 13.3342903,8.43069712 13.5270821,8.72788029 Z M8,7.5 C8.82842712,7.5 9.5,8.17157288 9.5,9 C9.5,9.82842712 8.82842712,10.5 8,10.5 C7.17157288,10.5 6.5,9.82842712 6.5,9 C6.5,8.17157288 7.17157288,7.5 8,7.5 Z M8,8.5 C7.72385763,8.5 7.5,8.72385763 7.5,9 C7.5,9.27614237 7.72385763,9.5 8,9.5 C8.27614237,9.5 8.5,9.27614237 8.5,9 C8.5,8.72385763 8.27614237,8.5 8,8.5 Z'></path>\n </svg>\n `;\n}\n\nexport function AnnotationSvg(): string {\n return `\n <svg viewBox='0 0 24 24'>\n <path d='M16.8002 15.5516C16.5657 15.84 16.5105 16.2347 16.6569 16.5764L17.145 17.7153L15.6723 17.0841C15.4046 16.9694 15.1 16.9771 14.8384 17.1053L14.756 17.1457C13.9034 17.5634 12.9645 17.7835 11.9918 17.7835C8.51692 17.7835 5.7 14.9666 5.7 11.4918C5.7 8.01692 8.51692 5.2 11.9918 5.2C15.4666 5.2 18.2835 8.01692 18.2835 11.4918C18.2835 12.958 17.7819 14.3442 16.8765 15.4578L16.8002 15.5516ZM17.1319 19.0152C17.9616 19.3708 18.8005 18.5319 18.4449 17.7021L17.8075 16.2148C18.8554 14.926 19.4835 13.2823 19.4835 11.4918C19.4835 7.35418 16.1294 4 11.9918 4C7.85418 4 4.5 7.35418 4.5 11.4918C4.5 15.6294 7.85418 18.9835 11.9918 18.9835C13.173 18.9835 14.2903 18.7102 15.284 18.2233L17.1319 19.0152Z' />\n </svg>\n `;\n}\n\nexport function IllustrationSvg(): string {\n return `\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path fill-rule='evenodd' clip-rule='evenodd' d='M18.2411 13.7881C18.2887 13.5157 18.0395 13.2465 17.6953 13.3346C17.3344 13.4271 16.9508 13.4506 16.5627 13.3938C15.8185 14.404 15.232 15.0693 14.7556 15.4771C14.9397 15.8591 14.9223 16.3164 14.7953 16.7237C14.663 17.148 14.3965 17.5746 14.004 17.9197C13.1974 18.6288 11.9124 18.9538 10.252 18.3555L9.6361 18.1336L10.8248 16.4403C10.8536 16.3994 10.895 16.2797 10.948 15.9967C10.9568 15.9502 10.9658 15.8998 10.9752 15.8466L10.9753 15.846L10.9754 15.8459L10.9754 15.8459C11.0141 15.6287 11.0613 15.3639 11.1335 15.1223C11.2242 14.8188 11.3771 14.4637 11.6835 14.2095C11.9817 13.9622 12.3608 13.8619 12.8023 13.9024C13.0571 13.2864 13.5182 12.476 14.2494 11.3987L14.2357 11.357C14.2007 11.2488 14.1511 11.0868 14.119 10.8858C14.0536 10.4764 14.0643 9.9266 14.3604 9.29657C14.4494 9.10715 14.5146 8.91445 14.5573 8.72168C14.8536 7.38674 14.077 6.0484 12.7163 5.76998C12.6531 5.75701 12.5892 5.74486 12.5246 5.73347C8.70188 5.05944 5.05659 7.61193 4.38254 11.4346C3.70848 15.2574 6.26101 18.9027 10.0837 19.5768C13.9064 20.2508 17.5518 17.6983 18.2258 13.8756L18.2411 13.7881ZM15.8626 12.6572C15.8947 12.5723 15.9481 12.5005 16.0149 12.4463C16.091 12.34 16.1692 12.2296 16.2493 12.1152C17.2716 10.6552 18.1315 9.27136 18.6754 8.22122C18.8855 7.81559 19.042 7.47194 19.1431 7.19994C18.9065 7.38016 18.6161 7.63896 18.2839 7.97168C17.4465 8.81052 16.4034 10.0589 15.3866 11.5111C14.5179 12.7517 14.0214 13.6064 13.7659 14.1913L14.285 14.5548C14.6757 14.1827 15.1887 13.5831 15.8626 12.6572ZM17.4471 12.3659C17.3881 12.381 17.3282 12.3933 17.2674 12.4027C18.2189 11.0249 19.029 9.71286 19.5633 8.68114C19.8471 8.13334 20.0641 7.64372 20.1787 7.25589C20.2351 7.06519 20.2765 6.8674 20.2745 6.68479C20.2725 6.51587 20.2295 6.23216 19.9736 6.05296C19.7244 5.87848 19.4469 5.92652 19.2885 5.97523C19.1139 6.02893 18.9362 6.12717 18.7674 6.23956C18.4249 6.46764 18.0169 6.82379 17.5762 7.26518C16.8442 7.99842 15.9806 9.00929 15.1147 10.1778C15.1398 10.0455 15.1836 9.90125 15.2542 9.74611L15.2654 9.72185C16.2163 7.69819 15.1756 5.25268 12.9173 4.7904C12.8445 4.77544 12.7715 4.76158 12.6983 4.74868C8.33172 3.97872 4.16769 6.89438 3.39773 11.261C2.62777 15.6276 5.54347 19.7916 9.91006 20.5616C14.2767 21.3315 18.4407 18.4159 19.2106 14.0492L19.2262 13.9606C19.4123 12.8961 18.4178 12.1172 17.4471 12.3659ZM11.6433 17.0149C11.8176 16.7665 11.8855 16.4229 11.9309 16.1811C11.9432 16.1158 11.9545 16.0525 11.9655 15.9909C12.0033 15.7804 12.0374 15.5901 12.0916 15.4086C12.161 15.1765 12.2405 15.0468 12.3219 14.9792C12.3717 14.9379 12.4608 14.8871 12.649 14.894L13.8774 15.9774C13.9004 16.0738 13.9028 16.2267 13.8406 16.426C13.7637 16.6728 13.6001 16.9432 13.3438 17.1686C12.934 17.5288 12.2479 17.8037 11.2342 17.5976L11.6433 17.0149ZM7 14.5C7 14.7761 7.22386 15 7.5 15C7.77614 15 8 14.7761 8 14.5C8 14.2239 7.77614 14 7.5 14C7.22386 14 7 14.2239 7 14.5ZM9 14.5C9 15.3284 8.32843 16 7.5 16C6.67157 16 6 15.3284 6 14.5C6 13.6716 6.67157 13 7.5 13C8.32843 13 9 13.6716 9 14.5ZM11.6 8.5C11.6 8.77614 11.3761 9 11.1 9C10.8238 9 10.6 8.77614 10.6 8.5C10.6 8.22386 10.8238 8 11.1 8C11.3761 8 11.6 8.22386 11.6 8.5ZM9.59998 8.5C9.59998 9.32843 10.2715 10 11.1 10C11.9284 10 12.6 9.32843 12.6 8.5C12.6 7.67157 11.9284 7 11.1 7C10.2715 7 9.59998 7.67157 9.59998 8.5ZM7.70007 11C7.42393 11 7.20007 10.7761 7.20007 10.5C7.20007 10.2239 7.42393 10 7.70007 10C7.97622 10 8.20007 10.2239 8.20007 10.5C8.20007 10.7761 7.97622 11 7.70007 11ZM7.70007 12C8.5285 12 9.20007 11.3284 9.20007 10.5C9.20007 9.67157 8.5285 9 7.70007 9C6.87165 9 6.20007 9.67157 6.20007 10.5C6.20007 11.3284 6.87165 12 7.70007 12Z' />\n </svg>\n `;\n}","import React from 'react';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnnotationSvg, IllustrationSvg, ImageSvg, MissingWordSvg, MultipleChoiceSvg, ShortAnswerSvg, TrueOrFalseSvg } from 'libs/shared/components/svgs/interaction-types/InteractionTypes';\nimport { InteractionTypeId } from 'libs/shared/interfaces';\n\nconst internalGetPhrase = LanguageService.encloseNamespace('shared.interactionTypes');\nconst getPhrase = (phrase: string, fallback: string) => {\n if (!LanguageService.isInitialised())\n return fallback;\n return internalGetPhrase(phrase);\n};\n\ninterface InteractionTypeInfo {\n name: string;\n prompt?: string;\n bgClassName: string;\n Svg: React.FC;\n svgEl?: string\n /**\n * Used for anlaytics\n */\n typeName: string;\n}\n\n\nfunction parseSvgElement(svg: string): React.ReactElement {\n return (\n <div dangerouslySetInnerHTML={{ __html: svg }}></div>\n );\n}\n\nconst interactionTypeDefaults = {\n [InteractionTypeId.Annotation](): InteractionTypeInfo {\n return {\n name: getPhrase('annotationName', 'Annotation'),\n bgClassName: 'bg-pink',\n Svg: () => parseSvgElement(AnnotationSvg()),\n svgEl: AnnotationSvg(),\n typeName: 'annotation'\n };\n },\n [InteractionTypeId.Image](): InteractionTypeInfo {\n return {\n name: getPhrase('imageName', 'Image'),\n bgClassName: 'bg-orange',\n Svg: () => parseSvgElement(ImageSvg()),\n svgEl: ImageSvg(),\n typeName: 'image'\n };\n },\n [InteractionTypeId.MissingWord](): InteractionTypeInfo {\n return {\n name: getPhrase('missingWordName', 'Fill in the blank'),\n prompt: getPhrase('missingWordPrompt', 'Fill in the blank by typing the missing word(s)'),\n bgClassName: 'bg-teal',\n Svg: () => parseSvgElement(MissingWordSvg()),\n svgEl: MissingWordSvg(),\n typeName: 'missing-word'\n };\n },\n [InteractionTypeId.MultipleChoice](): InteractionTypeInfo {\n return {\n name: getPhrase('multipleChoiceName', 'Multiple choice'),\n prompt: getPhrase('multipleChoicePrompt', 'Choose the correct answer(s)'),\n bgClassName: 'bg-blue',\n Svg: () => parseSvgElement(MultipleChoiceSvg()),\n svgEl: MultipleChoiceSvg(),\n typeName: 'multiple-choice'\n };\n },\n [InteractionTypeId.ShortAnswer](): InteractionTypeInfo {\n return {\n name: getPhrase('shortAnswerName', 'Short answer'),\n prompt: getPhrase('shortAnswerPrompt', 'Type in your answer to the question'),\n bgClassName: 'bg-green',\n Svg: () => parseSvgElement(ShortAnswerSvg()),\n svgEl: ShortAnswerSvg(),\n typeName: 'short-answer'\n };\n },\n [InteractionTypeId.TrueOrFalse](): InteractionTypeInfo {\n return {\n name: getPhrase('trueOrFalseName', 'True or false'),\n prompt: getPhrase('trueOrFalsePrompt', 'Choose the correct answer'),\n bgClassName: 'bg-purple',\n Svg: () => parseSvgElement(TrueOrFalseSvg()),\n svgEl: TrueOrFalseSvg(),\n typeName: 'true-or-false'\n };\n },\n [InteractionTypeId.Illustration](): InteractionTypeInfo {\n return {\n name: getPhrase('illustrationName', 'Illustrate'),\n prompt: getPhrase('illustrationPrompt', 'Draw the answer'),\n bgClassName: 'bg-indigo',\n Svg: () => parseSvgElement(IllustrationSvg()),\n svgEl: IllustrationSvg(),\n typeName: 'illustration'\n };\n }\n};\n\nexport const InteractionTypeHelper = {\n getTypeInfo: (typeId: InteractionTypeId) => {\n const func = interactionTypeDefaults[typeId];\n\n if (!func) {\n Core.ErrorHelper.throw(new DevError(`No type info defined for typeId: ${typeId}`));\n return;\n }\n\n return func();\n }\n};","function stripTag(text: string, tag: string, newLine: boolean) {\n return text\n .replace(new RegExp(`<${tag}.*?>`, 'gi'), '')\n .replace(new RegExp(`</${tag}>`, 'gi'), newLine ? '<br>' : '');\n}\n\nfunction stripTags(text: string, tags: string[], newLine: boolean = false): string {\n if (!text || !tags.length)\n return text;\n\n return tags.reduce((text, tag) => stripTag(text, tag, newLine), text);\n}\n\ninterface StripTagsOptions {\n text: string;\n fallbackText?: string;\n}\n\nexport const StripTagsHelper = {\n /**\n * Light weight helper that strips common tags from a html string.\n * NOTE: Does not strip all tags, only ones commonly found in text content such as annotations\n */\n stripTags(options: StripTagsOptions): string {\n const { text, fallbackText } = options;\n\n if (!text) return;\n\n let result = text;\n result = stripTags(result, [ 'ul', 'ol', 'b', 'i', 'u', 'old', 'em', 'strong', 'sup', 'sub', 'a', 'span', 'svg', 'path' ]);\n result = stripTags(result, [ 'li', 'p', 'div' ], true);\n \n return result.split('<br>')?.filter(t => !!t)?.join('')?.trim() || fallbackText;\n }\n};","import { StripTagsHelper } from 'libs/shared/utils/StripTagsHelper';\n\n\nexport function formatAnnotationText(text: string): string {\n return StripTagsHelper.stripTags({ text, fallbackText: 'Annotation' });\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Interaction, InteractionTypeId } from 'libs/shared/interfaces';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport { formatAnnotationText } from './formatAnnotationText';\n\ninterface InteractionLabelProps {\n interaction: Interaction;\n smallIcon?: boolean;\n showIcon?: boolean;\n showTypeName?: boolean;\n showQuestion?: boolean;\n iconClassName?: string;\n typeNameClassName?: string;\n questionClassName?: string;\n containerClassName?: string;\n questionNumber?: string | number;\n appLink?: Core.AppLink;\n onClick?: () => void;\n}\n\nInteractionLabel.defaultProps = {\n showIcon: true,\n showQuestion: true\n};\n\nexport function InteractionLabel(props: InteractionLabelProps): JSX.Element {\n const { name, bgClassName, Svg } = InteractionTypeHelper.getTypeInfo(props.interaction.typeId);\n\n const questionNumber = props.questionNumber ? `${props.questionNumber}. ` : '';\n\n let iconClassName = `interaction-type-icon flex-shrink-0 ${bgClassName}`;\n\n if (props.smallIcon)\n iconClassName += ' sm';\n\n if (props.showQuestion || props.showTypeName)\n iconClassName += props.smallIcon\n ? ' me-1'\n : ' me-2';\n\n if (props.iconClassName)\n iconClassName += ` ${props.iconClassName}`;\n\n return (\n <span className={props.containerClassName}>\n {!!props.showIcon &&\n <span className={iconClassName}>\n <Svg />\n </span>\n }\n <AppLink appLink={props.appLink} onClick={props.onClick}>\n {!!props.showTypeName &&\n <span className={props.typeNameClassName}><strong>{questionNumber}{name}</strong></span>\n }\n {!!props.showQuestion &&\n <span className={props.questionClassName}>\n {props.interaction.typeId === InteractionTypeId.Annotation\n ? <span dangerouslySetInnerHTML={{\n __html: formatAnnotationText(props.interaction.data.annotation)\n }} />\n : props.interaction.name\n }\n </span>\n }\n </AppLink>\n </span>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { ExperimentalInteractionTypes, Interaction, InteractionTypeId, Timepoint } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveItem';\n\nfunction useGetQuestionDisplayLimit(totalToDisplay: number): number {\n const mediaQuery = useGetMediaQueryString();\n\n if (typeof totalToDisplay === 'number')\n return totalToDisplay;\n \n if (mediaQuery === MediaQueryStrings.XS)\n return 3;\n\n if (mediaQuery === MediaQueryStrings.SM)\n return 1;\n\n if (mediaQuery === MediaQueryStrings.MD || mediaQuery === MediaQueryStrings.LG)\n return 2;\n\n return 3;\n}\n\ninterface InteractiveItemQuestionsProps {\n timepoints: Timepoint[];\n appLink?: Core.AppLink;\n onClickAppLink?: () => void;\n previewAppLink: Core.AppLink;\n totalToDisplay?: number;\n}\n\nexport function InteractiveItemQuestions(props: InteractiveItemQuestionsProps): JSX.Element {\n const questionDisplayLimit = useGetQuestionDisplayLimit(props.totalToDisplay);\n\n if (!props.timepoints?.length)\n return <></>;\n\n const interactionsToShow: Interaction[] = [];\n let interactionCount: number = 0;\n\n props.timepoints.forEach(timepoint => {\n timepoint?.interactions.forEach(interaction => {\n if (ExperimentalInteractionTypes[interaction.typeId])\n return;\n\n if (interactionCount >= questionDisplayLimit)\n return;\n\n interactionCount++;\n\n // When displaying an annotation interaction, we display the \"data\" field, which may be a JSON string\n // For other interactions we display the \"name\" field, so we don't need to parse those.\n const interactionData = interaction.typeId === InteractionTypeId.Annotation && typeof(interaction.data) === 'string'\n ? JSON.parse(interaction.data)\n : interaction.data;\n\n const interactionToShow = {\n ...interaction,\n data: {\n ...interactionData,\n // Add interactive time to applink and convert to seconds\n appLink: props.appLink && { ...props.appLink, params: { t: Math.floor(timepoint.visibleAt / 1000) } }\n }\n };\n \n interactionsToShow.push(interactionToShow);\n });\n });\n \n const totalInteractions = props.timepoints.reduce((acc, timepoint) => {\n const totalInteractions = timepoint?.interactions?.length ?? 0;\n acc += totalInteractions;\n\n return acc;\n }, 0);\n\n if (!interactionsToShow.length)\n return <></>;\n\n return (\n <>\n {interactionsToShow.map((interaction, i) => {\n return (\n <div key={i} className='d-flex align-items-center mb-1'>\n <div className='clamp-1'>\n <InteractionLabel\n interaction={interaction}\n appLink={interaction.data?.appLink}\n onClick={interaction.data?.appLink ? props.onClickAppLink : null}\n smallIcon\n />\n </div>\n </div>\n );\n })}\n <div className='mb-1 text-link'>\n <AppLink\n className='cursor-pointer hover-text-underline'\n appLink={props.previewAppLink}\n onClick={props.onClickAppLink}\n >\n <Text\n namespace={namespace}\n phrase='previewQuestions'\n options={{\n questionsShown: interactionsToShow.length,\n smartCount: totalInteractions\n }}\n />\n </AppLink>\n </div>\n </>\n );\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BaseVideoItemProps } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoItemDescription } from 'libs/shared/components/video-list/components/video-item-description/VideoItemDescription';\nimport { VideoItemLeftContent } from 'libs/shared/components/video-list/components/video-item-left-content/VideoItemLeftContent';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoItemTopRight } from 'libs/shared/components/video-list/components/video-item-top-right/VideoItemTopRight';\nimport { InteractiveItemQuestions } from 'libs/shared/components/video-list/interactive-item/InteractiveItemQuestions';\nimport { SortableVideoListContext } from 'libs/shared/components/video-list/VideoList';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { InteractiveMetadata } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport interface InteractiveItemProps extends BaseVideoItemProps<InteractiveMetadata> {\n getPreviewQuestionsAppLink: (interactive: InteractiveMetadata) => Core.AppLink;\n}\n\nexport const InteractiveItem = React.forwardRef((props: InteractiveItemProps, ref: React.LegacyRef<HTMLDivElement>) => {\n const breakpoints = useBreakpoints();\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n\n const size = VideoListHelper.getSize(breakpoints, props.size);\n const isSmall = size === 'sm';\n\n const { isSortable } = React.useContext(SortableVideoListContext);\n\n const mergedAudience = useMergeAudiences(props.video.subjectPresentationAudiences?.data, props.presentationAudiences);\n\n const showDragHandle = isSortable && !breakpoints.xs && (hovered || typeof props.index === 'undefined' || !props.showIndexes);\n const showIndexes = (props.showIndexes && !showDragHandle) && !breakpoints.xs;\n const hasIconOrIndex = (showDragHandle || props.showIndexes) && !breakpoints.xs;\n\n const appLink = props.getVideoAppLink(props.video, {});\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: {\n entity: EntityType.Interactive,\n location: LocationContext.InteractiveListItem\n }\n };\n\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n return (\n <div ref={hoverRef} className='w-100'>\n <div className='row g-0 py-2' ref={ref} style={props.style}>\n <Col {...VideoListHelper.getThumbnailColumns()} className={`flex-column align-items-flex-start ${isSmall ? `pb-2 pe-2` : 'mb-1 px-2'}`}>\n <Row>\n <VideoItemLeftContent\n index={props.index}\n showDragHandle={showDragHandle}\n showIndexes={showIndexes}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n dragAttributes={props.dragAttributes}\n dragListeners={props.dragListeners}\n />\n \n <Col xs={VideoListHelper.getThumbnailColSize(hasIconOrIndex)}>\n <VideoThumbnail\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n shareId={props.shareId}\n audience={mergedAudience}\n imageOptions={{ size: ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n hideDuration={isSmall}\n commonVideoProps={{\n ...props.commonVideoProps,\n subTextType: 'none'\n }}\n />\n </Col>\n </Row>\n </Col>\n\n <Col {...VideoListHelper.getDetailsColumns()} className={`position-relative ${isSmall ? 'pb-2' : 'px-2'}`}>\n <div className='d-flex justify-content-between'>\n <VideoItemTitle\n video={props.video}\n appLink={appLink}\n size={size}\n yearGroups={props.commonVideoProps.yearGroups}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n linkClassName='flex-grow-1'\n {...analyticsProps}\n />\n <VideoItemTopRight\n {...analyticsProps}\n video={props.video}\n showSignIn={props.showSignIn}\n signInAppLink={props.getSignInAppLink?.(appLink)}\n />\n </div>\n\n {canNavigate ? (\n <div className='pt-sm-1 pt-md-0'>\n <InteractiveItemQuestions\n timepoints={props.video._timepoints?.value}\n appLink={appLink}\n previewAppLink={props.getPreviewQuestionsAppLink(props.video)}\n />\n </div>\n ) : (\n <VideoItemDescription\n video={props.video}\n showSignIn={props.showSignIn}\n hasStudentExperience={props.commonVideoProps.hasStudentExperience}\n hasGuestExperience={props.commonVideoProps.hasGuestExperience}\n />\n )}\n\n {!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience && (\n <VideoItemRestrictionBadge video={props.video} yearGroups={props.commonVideoProps.yearGroups}/>\n )}\n </Col>\n </div>\n </div>\n );\n});\n\ntype SortableInteractiveItemProps = InteractiveItemProps & {\n index: number;\n}\n\nexport const SortableInteractiveItem = (props: SortableInteractiveItemProps) => {\n return (\n <SortableItemWrapper id={props.video.id} childComponent={InteractiveItem} childProps={props} />\n );\n};","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { BaseVideoItemProps } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoItemDescription } from 'libs/shared/components/video-list/components/video-item-description/VideoItemDescription';\nimport { VideoItemLeftContent } from 'libs/shared/components/video-list/components/video-item-left-content/VideoItemLeftContent';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { VideoItemTitle } from 'libs/shared/components/video-list/components/video-item-title/VideoItemTitle';\nimport { VideoItemTopRight } from 'libs/shared/components/video-list/components/video-item-top-right/VideoItemTopRight';\nimport { SortableVideoListContext } from 'libs/shared/components/video-list/VideoList';\nimport { VideoListHelper } from 'libs/shared/components/video-list/VideoListHelper';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { Video } from 'libs/shared/interfaces';\n\nimport styles from './video-item.module.scss';\n\nexport interface VideoItemProps extends BaseVideoItemProps<Video> {}\n\nexport const VideoItem = React.forwardRef((props: VideoItemProps, ref: React.LegacyRef<HTMLDivElement>) => {\n const breakpoints = useBreakpoints();\n const [ hoverRef, hovered ] = useHover<HTMLDivElement>();\n\n const size = VideoListHelper.getSize(breakpoints, props.size);\n\n const isSmall = size === 'sm';\n\n const { isSortable } = React.useContext(SortableVideoListContext);\n\n const videoAudiences = props.video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, props.presentationAudiences);\n\n const showDragHandle = isSortable && !breakpoints.xs && (hovered || typeof props.index === 'undefined' || !props.showIndexes);\n const showIndexes = (props.showIndexes && !showDragHandle) && !breakpoints.xs;\n const hasIconOrIndex = (showDragHandle || props.showIndexes) && !breakpoints.xs;\n\n const appLink = props.getVideoAppLink?.(props.video, {});\n\n function getSubTextAppLink(): Core.AppLink {\n return props.commonVideoProps.getSubTextAppLink?.(props.video);\n }\n\n const subTextType = props.commonVideoProps.getSubTextType?.(props.video);\n\n const subTextAppLink = getSubTextAppLink();\n const analyticsProps = {\n analyticsData: props.analyticsData,\n analyticsOptions: props.analyticsOptions ?? {\n entity: EntityType.Video,\n location: LocationContext.VideoListItem\n }\n };\n\n return (\n <div ref={hoverRef} className='w-100'>\n <div className={`row g-0 ${isSmall ? '' : 'py-2'}`} style={props.style} ref={ref}>\n <Col\n {...VideoListHelper.getThumbnailColumns()}\n className={`flex-column align-items-flex-start mb-1 mb-sm-0 pb-sm-2 pe-sm-2 px-md-2 pb-md-0`}\n >\n <Row>\n <VideoItemLeftContent\n index={props.index}\n showDragHandle={showDragHandle}\n showIndexes={showIndexes}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n dragAttributes={props.dragAttributes}\n dragListeners={props.dragListeners}\n />\n \n <Col xs={VideoListHelper.getThumbnailColSize(hasIconOrIndex)}>\n <VideoThumbnail\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n shareId={props.shareId}\n audience={mergedAudience}\n imageOptions={{ size: hasIconOrIndex ? ImageSize.Small : ImageSize.Medium }}\n textPosition={ThumbnailTextPosition.Independent}\n type='static'\n hideRating={false}\n commonVideoProps={props.commonVideoProps}\n />\n </Col>\n </Row>\n </Col>\n <Col\n {...VideoListHelper.getDetailsColumns()}\n className={`d-flex position-relative flex-column px-0 px-md-2 pb-0 pb-sm-2 pb-md-0 justify-content-md-between`}\n >\n <div>\n <div className='d-flex justify-content-between'>\n <div className='flex-grow-1'>\n <VideoSubText\n {...analyticsProps}\n video={props.video}\n appLink={subTextAppLink}\n type={subTextType}\n />\n <VideoItemTitle\n {...analyticsProps}\n video={props.video}\n appLink={appLink}\n size={size}\n yearGroups={props.commonVideoProps.yearGroups}\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience\n && !props.commonVideoProps.hasGuestExperience}\n titleClassName='mb-0'\n />\n </div>\n <VideoItemTopRight\n {...analyticsProps}\n video={props.video}\n showSignIn={props.showSignIn}\n signInAppLink={props.getSignInAppLink?.(appLink)}\n />\n </div>\n\n {!isSmall && (\n <VideoItemDescription\n video={props.video}\n showSignIn={props.showSignIn}\n hasStudentExperience={props.commonVideoProps.hasStudentExperience}\n hasGuestExperience={props.commonVideoProps.hasGuestExperience}\n />\n )}\n\n {!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience && (\n <VideoItemRestrictionBadge video={props.video} yearGroups={props.commonVideoProps.yearGroups}/>\n )}\n </div>\n\n {!props.hideVideoGuidance && (\n <VideoItemGuidance\n video={props.video}\n getVideoAppLink={props.getVideoAppLink}\n commonVideoProps={props.commonVideoProps}\n containerClassName={`d-flex justify-content-start align-items-center pt-sm-1 gap-1`}\n responsiveClassName={styles.responsiveGuidance}\n {...analyticsProps}\n />\n )}\n </Col>\n </div>\n </div>\n );\n});\n\nVideoItem.defaultProps = {\n dragHandleIcon: HandleSvg,\n dragHandleIconSize: SvgContainerSize.Small,\n size: 'md'\n};\n\ntype SortableVideoItemProps = VideoItemProps & {\n index: number;\n};\n\nexport const SortableVideoItem = (props: SortableVideoItemProps) => {\n return (\n <SortableItemWrapper id={props.video.id} childComponent={VideoItem} childProps={props} />\n );\n};","import * as React from 'react';\nimport { DragEndEvent, DragStartEvent } from '@dnd-kit/core';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { DragDropMoveWrapper } from 'libs/shared/components/drag-drop-move/DragDropMoveWrapper';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { BulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { InteractiveMetadata, PresentationAudience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ClipItem, ClipItemProps, SortableClipItem } from './clip-item/ClipItem';\nimport { InteractiveItem, InteractiveItemProps, SortableInteractiveItem } from './interactive-item/InteractiveItem';\nimport { SortableVideoItem, VideoItem, VideoItemProps } from './video-item/VideoItem';\n\nimport styles from './video-list.module.scss';\n\nconst namespace = 'shared.videoList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ItemComponent = (props: ClipItemProps | InteractiveItemProps | VideoItemProps) => JSX.Element;\n\nfunction getItemComponent(video: VideoTypes, isSortable: boolean): ItemComponent {\n if (VideoHelper.isClip(video))\n return isSortable ? SortableClipItem : ClipItem;\n\n if (VideoHelper.isInteractive(video))\n return isSortable ? SortableInteractiveItem : InteractiveItem;\n\n return isSortable ? SortableVideoItem : VideoItem;\n}\n\ninterface SortableVideoListContextProps {\n isSortable: boolean;\n currentSortingIndex?: number;\n}\n\nexport const SortableVideoListContext = React.createContext<SortableVideoListContextProps>({\n isSortable: false\n});\n\nexport interface VideoListProps {\n videos: VideoTypes[];\n getVideoAppLink: (video: VideoTypes, options: GetVideoAppLinkOptions) => Core.AppLink;\n getSignInAppLink?: (appLink: Core.AppLink) => Core.AppLink;\n getPreviewQuestionsAppLink?: (interactive: InteractiveMetadata) => Core.AppLink;\n hideVideoGuidance?: boolean;\n cursors?: Cursors;\n dragHandleIcon?: SvgIcon;\n dragHandleIconSize?: SvgContainerSize;\n showSignIn?: boolean;\n showIndexes?: boolean;\n startingPositionIndex?: number;\n canRemovePrivateVideos?: boolean;\n presentationAudiences?: PresentationAudience[];\n allowBulkAction?: boolean;\n getVideosBulkAction?: (items: string[]) => ActionOptions[];\n drag?: boolean;\n typeFilter?: SearchIndices | SearchIndices[];\n checkboxHelper?: BulkCheckboxManager;\n hasPermissions: HasPermissionsFunc;\n showOwner?: boolean;\n shareId?: string;\n getAnalyticsData?: (itemIndex: number) => HashObject;\n analyticsOptions?: AnalyticsOptions;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function VideoList(props: VideoListProps): JSX.Element {\n const { isSortable } = React.useContext(SortableVideoListContext);\n const [ isDragging, setIsDragging ] = React.useState<boolean>(false);\n const { checkboxHelper: CheckboxHelper } = props;\n \n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n\n return (\n <>\n <div className={`position-relative ${styles.videoList}`}>\n \n {props.videos.map((v, idx) => {\n const Component = getItemComponent(v, isSortable);\n \n /**\n * Where we're provided with a starting position index by the parent, \n * we'll use that as the starting position instead of the local index.\n */\n const pagePositionStartingIndex = Number.isInteger(props.startingPositionIndex)\n ? props.startingPositionIndex\n : 0;\n\n const dragData = CheckboxHelper && CheckboxHelper.getSelectedCount() > 1 && CheckboxHelper.isChecked(v.id)\n ? CheckboxHelper.getSelected()\n : v;\n\n const analyticsData = typeof props.getAnalyticsData === 'function'\n ? props.getAnalyticsData(idx)\n : {\n pagePositionIndex: pagePositionStartingIndex + idx\n };\n\n return (\n <DragDropMoveWrapper\n draggable={(props.drag && !isSortable) && ({ id: v.id, data: dragData })}\n dragStyle={styles.dragStyle}\n isDragging={isDragging}\n setIsDragging={setIsDragging}\n key={`${v.id}:${idx}`}\n >\n <div className='d-flex flex-row align-items-center'>\n {props.allowBulkAction && (\n <Checkbox\n className='mx-0 mx-md-2'\n id={v.id}\n ariaLabel={`${getPhrase('ariaBulkAction')}: ${v.name}`}\n onChange={() => CheckboxHelper.onToggleItem(v.id)}\n checked={CheckboxHelper.isChecked(v.id)}\n />\n )}\n <Component\n video={v}\n index={idx}\n getVideoAppLink={props.getVideoAppLink}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n showSignIn={props.showSignIn}\n getSignInAppLink={props.getSignInAppLink}\n analyticsData={analyticsData}\n hasPermissions={props.hasPermissions}\n canRemovePrivateVideos={props.canRemovePrivateVideos}\n presentationAudiences={props.presentationAudiences}\n showIndexes={props.showIndexes}\n getPreviewQuestionsAppLink={props.getPreviewQuestionsAppLink}\n hideVideoGuidance={props.hideVideoGuidance}\n showOwner={props.showOwner}\n shareId={props.shareId}\n commonVideoProps={props.commonVideoProps}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n </DragDropMoveWrapper>\n );\n })}\n </div>\n\n {props.cursors &&\n <Pagination appLink={currentAppLink} cursors={props.cursors} />\n }\n </>\n );\n}\n\ninterface SortableVideoListProps extends VideoListProps {\n currentSortingIndex?: number;\n onSortEnd: (event: DragEndEvent) => void;\n onSortStart: (event: DragStartEvent) => void;\n\n}\n\nexport const SortableVideoList = (props: SortableVideoListProps) => {\n const ids = props.videos.map(v => v.id);\n\n const getDragOverlay = (id: string) => {\n const video = props.videos.find(v => v.id === id);\n const Component = getItemComponent(video, true);\n\n return (\n <div className={`bg-white ${styles.sortableVideo}`}>\n <SortableVideoListContext.Provider value={{ isSortable: true }}>\n <Component\n video={video}\n getVideoAppLink={props.getVideoAppLink}\n dragHandleIcon={props.dragHandleIcon}\n dragHandleIconSize={props.dragHandleIconSize}\n showSignIn={props.showSignIn}\n getSignInAppLink={props.getSignInAppLink}\n hasPermissions={props.hasPermissions}\n hideVideoGuidance={props.hideVideoGuidance}\n getPreviewQuestionsAppLink={props.getPreviewQuestionsAppLink}\n shareId={props.shareId}\n commonVideoProps={props.commonVideoProps}\n />\n </SortableVideoListContext.Provider>\n </div>\n );\n };\n\n return (\n <SortableContainerWrapper\n ids={ids}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortEnd}\n onSortStart={props.onSortStart}\n >\n <SortableVideoListContext.Provider value={{ isSortable: true, currentSortingIndex: props.currentSortingIndex }}>\n <VideoList {...props} />\n </SortableVideoListContext.Provider>\n </SortableContainerWrapper>\n );\n};"],"names":["InteractionTypeId","ExperimentalInteractionTypes","VideoActionsContext","React.createContext","getSubTextAppLink","video","getSeriesAppLink","useCommonVideoProps","config","Flight.useBasicFetch","ConfigRequests","_a","buildCursor","appLink","cursorParam","prevHack","currentParams","Pagination","cursors","className","buttonVariant","scrollTop","onClick","onClickButton","page","ScrollHelper","AnalyticsHelper","LocationContext","EntityType","UserAction","jsx","LanguageNamespaceContext","jsxs","AppLink","Text","Button","arrayMove","array","from","to","newArray","isValidIndex","index","rectSortingStrategy","_ref","rects","activeIndex","overIndex","newRects","oldRect","newRect","ID_PREFIX","Context","defaultNewIndexGetter","id","items","defaultAnimateLayoutChanges","_ref2","containerId","isSorting","wasDragging","newIndex","previousItems","previousContainerId","transition","defaultTransition","transitionProperty","disabledTransition","CSS","defaultAttributes","useDerivedTransform","disabled","node","rect","derivedTransform","setDerivedtransform","useState","previousIndex","useRef","useIsomorphicLayoutEffect","initial","current","getClientRect","delta","useEffect","useSortable","animateLayoutChanges","userDefinedAttributes","localDisabled","customData","getNewIndex","localStrategy","resizeObserverConfig","globalDisabled","disableTransforms","sortedRects","useDragOverlay","globalStrategy","useContext","normalizeLocalDisabled","data","useMemo","itemsAfterCurrentSortable","isOver","setDroppableNodeRef","useDroppable","active","activatorEvent","activeNodeRect","attributes","setDraggableNodeRef","listeners","isDragging","over","setActivatorNodeRef","transform","useDraggable","setNodeRef","useCombinedRefs","displaceItem","shouldDisplaceDragSource","dragSourceDisplacement","finalTransform","activeId","previous","itemsHaveChanged","shouldAnimateLayoutChanges","timeoutId","getTransition","isKeyboardEvent","_localDisabled$dragga","_localDisabled$droppa","KeyboardCode","getDragDirection","SortableItemWrapper","props","style","Children","dragDirection","HeartOutlineSvg","HeartSvg","FavouriteHelper","object","user","ArrayHelper","shouldFavourite","isHovering","VideoHelper","UserAgentHelper","namespace","getPhrase","LanguageService","FavouriteButton","alerts","useAlerts","initialState","isFavourite","setIsFavourite","React.useState","React.useEffect","styles","onError","getErrorPhraseKey","FunctionHelper","Fragment","DivButton","SvgContainer","VideoWatchProgressBar","progress","watchPercentage","VideoThumbnailBottomBar","DEFAULT_CLASS_NAME","DEFAULT_TAG_NAME","SvgContainer2","children","tagName","size","SvgContainerSize","title","tooltipPlacement","Container","containerProps","Tooltip","LiteOwnerAvatar","_b","ClickViewLogoMark","Avatar","UserHelper","_c","PluginHover","ThumbnailPadlock","svgSize","LockSvg","ThumbnailCompanyLogo","company","url","ImageHelper","ImageSize","logoFallbackBgClassName","getBgColorClass","BG_COLOUR_CLASS_NAMES","_d","_e","VideoTypeBadge","TypeBadge","MasterType","GlobalPlayerConsumer","playerContext","usePlayerContext","theatreMode","OutPortal","shouldShow","rounding","PlayCircleSvg","getTitleClass","hovering","ExpandableVideoThumbnail","canNavigate","canConsume","hoverToPlay","appLinkParams","ObjectHelper","eventAnalyticsOptions","showFavouriteButton","isVideo","rating","thumbnailHoverRef","isThumbnailHovering","useHoverIntent","showThumbnailPreviewVideo","analyticsData","analyticsOptions","ClickDescriptor","BaseImage","ImageType","ImageFallback","ImageFallbackType","VideoSubText","BadgeListContainer","Badge","BadgeType","CloseCaptionBadgeSvg","VideoPreviewContext","React","useHoverLogger","hasHovered","setHasHovered","timeStartedHovering","timeHoveredInMilliseconds","EDGE_THRESHOLD","DEFAULT_SCALE","calculatePosition","parentDOMRect","fixedWith","minWidth","scale","x","y","width","height","contentReferenceEle","newX","previewWidth","previewHeight","realScale","newY","left","transformOrigin","HoverToPortalContainer","hoverableComponent","componentProps","minHoverWidth","fixedHoverWidth","hoverScale","setPreviewContentNode","Core.ErrorHelper","DevError","portalNode","createHtmlPortalNode","hoverCardRef","isHoverCardHovering","useHover","debugShow","setDebugShow","videoPositionRef","prevStatus","currentIsHovering","hoverPositionConfig","HoverableComponent","InPortal","AudienceLabel","VideoThumbnailBadges","showAudience","showRating","RestrictionPadlock","RestrictionHelper","TODAY","isDateInCurrentMonth","target","DateHelper","VideoTitle","dateRelease","isCurrentMonth","shouldShowNewVideoIndicator","ThumbnailText","ContainerWrapper","VideoGuidanceTag","ClassroomGuideTag","GraduationCapSvg","InteractivesTag","interactiveCount","InteractiveSvg","getResourceCount","ResourcesTag","resourceCount","ResourcesSvg","VideoItemGuidance","showingResourcesAndInteractives","showClassroomGuide","_f","RemoveVideoButton","tooltip","CloseSvg","PopoutVideo","imageOptions","preload","onClickRemove","e","showRemoveButton","PopoutVideoThumbnail","PlayCircleFilledSvg","MaskType","getClassByType","type","getSvg","displayInverse","Mask","alwaysShowIcon","typeClass","svg","TickSvg","CheckMarkButton","isComplete","setIsComplete","shouldRender","shouldComplete","newStatus","hasActions","VideoThumbnailActions","ThumbnailTextPosition","textPosition","isStatic","textIsOverlayed","StaticVideoThumbnail","hoverRef","hoverIntentRef","isHoveringIntentionally","setHoverRefs","r","canFavourite","getContainerClass","getThumbnailClass","showMask","VideoThumbnail","InnerContent","hasCaptions","LinkifyHelper","VideoItemDescription","isMobile","useMediaQuery","MediaQueryStrings","hasUserRestrictions","RestrictionType","HandleSvg","getClassName","showDragHandle","baseClassName","VideoItemLeftContent","dragProps","Col","RestrictionBadge","VideoItemRestrictionBadge","hasRestrictions","VideoItemTitle","getTitleSize","SignInToWatch","VideoItemActions","videoActions","React.useContext","actions","Actions","VideoItemTopRight","HAS_NUMBER_REGEX","COUNT_OFFSET","AudienceStringBuilders","audiences","combinedNames","a","numberList","name","num","wordList","audienceWithoutNum","p","prefix","audienceRange","processAudienceRanges","firstAudience","lastAudience","firstAudienceLevel","lastAudienceLevel","level","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","word","lastAudienceNumber","firstAudienceString","lastAudienceString","audienceValues","offset","initialVal","nextVal","isContinguous","ranges","b","i","j","DIGIT_REGEX","SPACE_REGEX","MIN_AUDIENCE_THRESHOLD","AudienceHelper","objectAudiences","presentationAudiences","objectAudienceIds","v","audience","presAudience","presentationId","mergedAudienceString","HardCoded","members","getLowestAudience","lowestAudience","lowestAudienceDigit","digit","nameCountMap","sorted","member","sortedSlice","firstObjLowestAudience","secondObjLowestAudience","comparison","params","normalizeAudienceName","audienceName","audienceLookup","state","audienceStr","useMergeAudiences","sortedAudiences","ClipItem","React.forwardRef","ref","breakpoints","useBreakpoints","hovered","VideoListHelper","isSmall","isSortable","SortableVideoListContext","mergedAudience","showIndexes","hasIconOrIndex","analyticsProps","Row","SortableClipItem","TrueOrFalseSvg","ShortAnswerSvg","MissingWordSvg","MultipleChoiceSvg","ImageSvg","AnnotationSvg","IllustrationSvg","internalGetPhrase","phrase","fallback","parseSvgElement","interactionTypeDefaults","InteractionTypeHelper","typeId","func","stripTag","text","tag","newLine","stripTags","tags","StripTagsHelper","options","fallbackText","result","t","formatAnnotationText","InteractionLabel","bgClassName","Svg","questionNumber","iconClassName","useGetQuestionDisplayLimit","totalToDisplay","mediaQuery","useGetMediaQueryString","InteractiveItemQuestions","questionDisplayLimit","interactionsToShow","interactionCount","timepoint","interaction","interactionData","interactionToShow","totalInteractions","acc","InteractiveItem","SortableInteractiveItem","VideoItem","videoAudiences","subTextType","subTextAppLink","SortableVideoItem","getItemComponent","VideoList","setIsDragging","CheckboxHelper","currentAppLink","Core.AppLinkHelper","idx","Component","pagePositionStartingIndex","dragData","DragDropMoveWrapper","Checkbox"],"mappings":"6tCAAO,IAAKA,GAAAA,IACVA,EAAAA,EAAA,eAAiB,CAAA,EAAjB,iBACAA,EAAAA,EAAA,YAAc,CAAA,EAAd,cACAA,EAAAA,EAAA,YAAc,CAAA,EAAd,cACAA,EAAAA,EAAA,WAAa,CAAA,EAAb,aACAA,EAAAA,EAAA,MAAQ,CAAA,EAAR,QACAA,EAAAA,EAAA,YAAc,CAAA,EAAd,cACAA,EAAAA,EAAA,aAAe,CAAA,EAAf,eAPUA,IAAAA,GAAA,CAAA,CAAA,EAUL,MAAMC,GAA4E,CAAA,ECY5EC,GAAsBC,EAAAA,cAA6C,IAAI,ECRpF,SAASC,GAAkBC,EAAiC,CAC1D,MAAM,WAAYA,EAGXC,GAAiBD,EAAM,MAAM,EAF3B,IAGX,CAEO,SAASE,IAAiD,OAC/D,MAAMC,EAASC,GAA6BC,GAAe,QAAQ,EAMnE,MAAO,CACL,6BAJAF,EAAO,aAKP,iBAAkB,CAChB,YAAa,SACb,kBAAAJ,GACA,SAAU,GACV,aAAc,KACd,aAAc,KACd,WAAY,KACZ,aAAaO,EAAAH,EAAO,OAAP,YAAAG,EAAa,YAC1B,yBAA0B,KAC1B,8BAA+B,KAC/B,2BAA4B,KAC5B,sBAAuB,GACvB,0BAA2B,IAAM,KACjC,qBAAsB,GACtB,mBAAoB,GACpB,SAAU,CACR,mBAAoB,IAAM,EAAA,CAC5B,CACF,CAEJ,CCpCA,SAASC,GAAYC,EAAuBC,EAAqBC,EAAkC,CACjG,GAAI,CAACD,EACH,OAAO,KAET,MAAME,EAAgBH,EAAQ,QAAwB,CAAA,EAOtD,OAAIE,EACGC,GAAA,MAAAA,EAAe,SAYb,CACL,YAAaH,EAAQ,YACrB,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,OAAQ,CACN,GAAGG,EACH,OAAQA,GAAA,YAAAA,EAAe,SACvB,SAAU,IAAA,CACZ,EAnBO,CACL,YAAaH,EAAQ,YACrB,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,OAAQ,CACN,GAAGG,EACH,OAAQ,KACR,SAAU,IAAA,CACZ,EAeC,CACL,YAAaH,EAAQ,YACrB,OAAQA,EAAQ,OAChB,KAAMA,EAAQ,KACd,OAAQ,CACN,GAAGG,EACH,OAAQF,EACR,SAAUE,EAAc,MAAA,CAC1B,CAEJ,CAYAC,GAAW,aAAe,CACxB,UAAW,OACX,cAAe,WACjB,EAEO,SAASA,GACd,CAAE,QAAAJ,EAAS,QAAAK,EAAS,UAAAC,EAAW,cAAAC,EAAe,SAAAL,EAAU,UAAAM,EAAW,QAAAC,GACtD,CACb,SAASC,EAAcC,EAAiC,CAClDX,GAAWQ,IAAc,IAC3BI,GAAa,iBAAA,EAEfC,GAAgB,cAAc,CAAE,KAAAF,GAAQ,CACtC,SAAUG,GAAgB,WAC1B,OAAQC,GAAW,WACnB,WAAYC,EAAW,QAAA,CACxB,EAEGP,GACFA,EAAQJ,EAAQM,CAAI,CAAC,CACzB,CAEA,OAAIX,EAEAiB,MAACC,GAAyB,SAAzB,CAAkC,MAAM,oBACvC,SAAAC,OAAC,OAAI,UAAAb,EACH,SAAA,CAAAW,EAAAA,IAACG,EAAA,CACC,QAASrB,GAAYC,EAASK,EAAQ,SAAUH,CAAQ,EACxD,UAAW,WAAWK,CAAa,SAAUF,EAAQ,SAAwB,GAAb,UAAe,GAC/E,QAAS,IAAMK,EAAc,UAAU,EAEvC,MAAO,CAAE,QAAS,cAAA,EAElB,SAAAO,EAAAA,IAACI,EAAA,CAAK,OAAO,UAAA,CAAW,CAAA,CAAA,EAG1BJ,EAAAA,IAACG,EAAA,CACC,QAASrB,GAAYC,EAASK,EAAQ,IAAI,EAC1C,UAAW,WAAWE,CAAa,IAAKF,EAAQ,KAAoB,GAAb,UAAe,GACtE,QAAS,IAAMK,EAAc,MAAM,EAEnC,MAAO,CAAE,QAAS,cAAA,EAElB,SAAAO,EAAAA,IAACI,EAAA,CAAK,OAAO,MAAA,CAAO,CAAA,CAAA,CACtB,CAAA,CACF,CAAA,CACF,EAKFJ,MAACC,GAAyB,SAAzB,CAAkC,MAAM,oBACvC,SAAAC,OAAC,OAAI,UAAAb,EACH,SAAA,CAAAW,EAAAA,IAACK,GAAA,CACC,QAASf,EACT,UAAW,QAASF,EAAQ,SAAwB,GAAb,UAAe,GACtD,QAAS,IAAMK,EAAc,UAAU,EAEvC,SAAAO,EAAAA,IAACI,EAAA,CAAK,OAAO,UAAA,CAAW,CAAA,CAAA,EAE1BJ,EAAAA,IAACK,GAAA,CACC,QAASf,EACT,UAAW,OAAQF,EAAQ,KAAoB,GAAb,UAAe,GACjD,QAAS,IAAMK,EAAc,MAAM,EAEnC,SAAAO,EAAAA,IAACI,EAAA,CAAK,OAAO,MAAA,CAAO,CAAA,CAAA,CACtB,CAAA,CACF,CAAA,CACF,CAEJ,CCvIA,SAASE,GAAUC,EAAOC,EAAMC,EAAI,CAClC,MAAMC,EAAWH,EAAM,MAAA,EACvB,OAAAG,EAAS,OAAOD,EAAK,EAAIC,EAAS,OAASD,EAAKA,EAAI,EAAGC,EAAS,OAAOF,EAAM,CAAC,EAAE,CAAC,CAAC,EAC3EE,CACT,CAwBA,SAASC,GAAaC,EAAO,CAC3B,OAAOA,IAAU,MAAQA,GAAS,CACpC,CA2GA,MAAMC,GAAsBC,GAAQ,CAClC,GAAI,CACF,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAL,CAAA,EACEE,EACJ,MAAMI,EAAWZ,GAAUS,EAAOE,EAAWD,CAAW,EAClDG,EAAUJ,EAAMH,CAAK,EACrBQ,EAAUF,EAASN,CAAK,EAE9B,MAAI,CAACQ,GAAW,CAACD,EACR,KAGF,CACL,EAAGC,EAAQ,KAAOD,EAAQ,KAC1B,EAAGC,EAAQ,IAAMD,EAAQ,IACzB,OAAQC,EAAQ,MAAQD,EAAQ,MAChC,OAAQC,EAAQ,OAASD,EAAQ,MAAA,CAErC,EA8GME,GAAY,WACZC,KAA6B,cAAc,CAC/C,YAAa,GACb,YAAaD,GACb,kBAAmB,GACnB,MAAO,CAAA,EACP,UAAW,GACX,eAAgB,GAChB,YAAa,CAAA,EACb,SAAUR,GACV,SAAU,CACR,UAAW,GACX,UAAW,EAAA,CAEf,CAAC,EAoDKU,GAAwBT,GAAQ,CACpC,GAAI,CACF,GAAAU,EACA,MAAAC,EACA,YAAAT,EACA,UAAAC,CAAA,EACEH,EACJ,OAAOR,GAAUmB,EAAOT,EAAaC,CAAS,EAAE,QAAQO,CAAE,CAC5D,EACME,GAA8BC,GAAS,CAC3C,GAAI,CACF,YAAAC,EACA,UAAAC,EACA,YAAAC,EACA,MAAAlB,EACA,MAAAa,EACA,SAAAM,EACA,cAAAC,EACA,oBAAAC,EACA,WAAAC,CAAA,EACEP,EAMJ,MAJI,CAACO,GAAc,CAACJ,GAIhBE,IAAkBP,GAASb,IAAUmB,EAChC,GAGLF,EACK,GAGFE,IAAanB,GAASgB,IAAgBK,CAC/C,EACME,GAAoB,CACxB,SAAU,IACV,OAAQ,MACV,EACMC,GAAqB,YACrBC,GAAkCC,GAAI,WAAW,SAAS,CAC9D,SAAUF,GACV,SAAU,EACV,OAAQ,QACV,CAAC,EACKG,GAAoB,CACxB,gBAAiB,UACnB,EAOA,SAASC,GAAoB1B,EAAM,CACjC,GAAI,CACF,SAAA2B,EACA,MAAA7B,EACA,KAAA8B,EACA,KAAAC,CAAA,EACE7B,EACJ,KAAM,CAAC8B,EAAkBC,CAAmB,EAAIC,EAAAA,SAAS,IAAI,EACvDC,EAAgBC,EAAAA,OAAOpC,CAAK,EAClC,OAAAqC,GAA0B,IAAM,CAC9B,GAAI,CAACR,GAAY7B,IAAUmC,EAAc,SAAWL,EAAK,QAAS,CAChE,MAAMQ,EAAUP,EAAK,QAErB,GAAIO,EAAS,CACX,MAAMC,EAAUC,GAAcV,EAAK,QAAS,CAC1C,gBAAiB,EAAA,CAClB,EACKW,EAAQ,CACZ,EAAGH,EAAQ,KAAOC,EAAQ,KAC1B,EAAGD,EAAQ,IAAMC,EAAQ,IACzB,OAAQD,EAAQ,MAAQC,EAAQ,MAChC,OAAQD,EAAQ,OAASC,EAAQ,MAAA,GAG/BE,EAAM,GAAKA,EAAM,IACnBR,EAAoBQ,CAAK,CAE7B,CACF,CAEIzC,IAAUmC,EAAc,UAC1BA,EAAc,QAAUnC,EAE5B,EAAG,CAAC6B,EAAU7B,EAAO8B,EAAMC,CAAI,CAAC,EAChCW,EAAAA,UAAU,IAAM,CACVV,GACF,sBAAsB,IAAM,CAC1BC,EAAoB,IAAI,CAC1B,CAAC,CAEL,EAAG,CAACD,CAAgB,CAAC,EACdA,CACT,CAEA,SAASW,GAAYzC,EAAM,CACzB,GAAI,CACF,qBAAA0C,EAAuB9B,GACvB,WAAY+B,EACZ,SAAUC,EACV,KAAMC,EACN,YAAAC,EAAcrC,GACd,GAAAC,EACA,SAAUqC,EACV,qBAAAC,EACA,WAAA5B,EAAaC,EAAA,EACXrB,EACJ,KAAM,CACJ,MAAAW,EACA,YAAAG,EACA,YAAAZ,EACA,SAAU+C,EACV,kBAAAC,EACA,YAAAC,EACA,UAAAhD,EACA,eAAAiD,EACA,SAAUC,CAAA,EACRC,EAAAA,WAAW9C,EAAO,EAChBmB,EAAW4B,GAAuBX,EAAeK,CAAc,EAC/DnD,EAAQa,EAAM,QAAQD,CAAE,EACxB8C,EAAOC,EAAAA,QAAQ,KAAO,CAC1B,SAAU,CACR,YAAA3C,EACA,MAAAhB,EACA,MAAAa,CAAA,EAEF,GAAGkC,CAAA,GACD,CAAC/B,EAAa+B,EAAY/C,EAAOa,CAAK,CAAC,EACrC+C,EAA4BD,EAAAA,QAAQ,IAAM9C,EAAM,MAAMA,EAAM,QAAQD,CAAE,CAAC,EAAG,CAACC,EAAOD,CAAE,CAAC,EACrF,CACJ,KAAAmB,EACA,KAAAD,EACA,OAAA+B,EACA,WAAYC,EAAA,EACVC,GAAa,CACf,GAAAnD,EACA,KAAA8C,EACA,SAAU7B,EAAS,UACnB,qBAAsB,CACpB,sBAAuB+B,EACvB,GAAGV,CAAA,CACL,CACD,EACK,CACJ,OAAAc,EACA,eAAAC,GACA,eAAAC,GACA,WAAAC,GACA,WAAYC,GACZ,UAAAC,EACA,WAAAC,GACA,KAAAC,GACA,oBAAAC,GACA,UAAAC,EAAA,EACEC,GAAa,CACf,GAAA9D,EACA,KAAA8C,EACA,WAAY,CAAE,GAAG/B,GACf,GAAGkB,CAAA,EAEL,SAAUhB,EAAS,SAAA,CACpB,EACK8C,GAAaC,GAAgBd,GAAqBM,EAAmB,EACrEnD,GAAY,EAAQ+C,EACpBa,GAAe5D,IAAa,CAACmC,GAAqBrD,GAAaK,CAAW,GAAKL,GAAaM,CAAS,EACrGyE,GAA2B,CAACxB,GAAkBgB,GAC9CS,GAAyBD,IAA4BD,GAAeJ,GAAY,KAEhFO,GAAiBH,GAAeE,KADrB9B,GAAwCM,GACgD,CACvG,MAAOF,EACP,eAAAa,GACA,YAAA9D,EACA,UAAAC,EACA,MAAAL,CAAA,CACD,EAAI,KACCmB,GAAWpB,GAAaK,CAAW,GAAKL,GAAaM,CAAS,EAAI2C,EAAY,CAClF,GAAApC,EACA,MAAAC,EACA,YAAAT,EACA,UAAAC,CAAA,CACD,EAAIL,EACCiF,GAAWjB,GAAU,KAAO,OAASA,EAAO,GAC5CkB,EAAW9C,EAAAA,OAAO,CACtB,SAAA6C,GACA,MAAApE,EACA,SAAAM,GACA,YAAAH,CAAA,CACD,EACKmE,GAAmBtE,IAAUqE,EAAS,QAAQ,MAC9CE,GAA6BxC,EAAqB,CACtD,OAAAoB,EACA,YAAAhD,EACA,WAAAsD,GACA,UAAArD,GACA,GAAAL,EACA,MAAAZ,EACA,MAAAa,EACA,SAAUqE,EAAS,QAAQ,SAC3B,cAAeA,EAAS,QAAQ,MAChC,oBAAqBA,EAAS,QAAQ,YACtC,WAAA5D,EACA,YAAa4D,EAAS,QAAQ,UAAY,IAAA,CAC3C,EACKlD,GAAmBJ,GAAoB,CAC3C,SAAU,CAACwD,GACX,MAAApF,EACA,KAAA8B,EACA,KAAAC,CAAA,CACD,EACDW,OAAAA,EAAAA,UAAU,IAAM,CACVzB,IAAaiE,EAAS,QAAQ,WAAa/D,KAC7C+D,EAAS,QAAQ,SAAW/D,IAG1BH,IAAgBkE,EAAS,QAAQ,cACnCA,EAAS,QAAQ,YAAclE,GAG7BH,IAAUqE,EAAS,QAAQ,QAC7BA,EAAS,QAAQ,MAAQrE,EAE7B,EAAG,CAACI,GAAWE,GAAUH,EAAaH,CAAK,CAAC,EAC5C6B,EAAAA,UAAU,IAAM,CACd,GAAIuC,KAAaC,EAAS,QAAQ,SAChC,OAGF,GAAID,IAAY,CAACC,EAAS,QAAQ,SAAU,CAC1CA,EAAS,QAAQ,SAAWD,GAC5B,MACF,CAEA,MAAMI,GAAY,WAAW,IAAM,CACjCH,EAAS,QAAQ,SAAWD,EAC9B,EAAG,EAAE,EACL,MAAO,IAAM,aAAaI,EAAS,CACrC,EAAG,CAACJ,EAAQ,CAAC,EACN,CACL,OAAAjB,EACA,YAAA5D,EACA,WAAA+D,GACA,KAAAT,EACA,KAAA3B,EACA,MAAA/B,EACA,SAAAmB,GACA,MAAAN,EACA,OAAAgD,EACA,UAAA5C,GACA,WAAAqD,GACA,UAAAD,EACA,KAAAvC,EACA,UAAAzB,EACA,KAAAkE,GACA,WAAAI,GACA,oBAAAH,GACA,oBAAAV,GACA,oBAAAM,GACA,UAAWpC,IAA8CgD,GACzD,WAAYM,GAAA,CAAc,EAG5B,SAASA,IAAgB,CACvB,GACAtD,IACAmD,IAAoBD,EAAS,QAAQ,WAAalF,EAChD,OAAOyB,GAGT,GAAI,EAAAqD,IAA4B,CAACS,GAAgBtB,EAAc,GAAK,CAAC3C,KAIjEL,IAAamE,IACf,OAAO1D,GAAI,WAAW,SAAS,CAAE,GAAGJ,EAClC,SAAUE,EAAA,CACX,CAIL,CACF,CAEA,SAASiC,GAAuBX,EAAeK,EAAgB,CAC7D,IAAIqC,EAAuBC,EAE3B,OAAI,OAAO3C,GAAkB,UACpB,CACL,UAAWA,EAEX,UAAW,EAAA,EAIR,CACL,WAAY0C,EAAwB1C,GAAiB,KAAO,OAASA,EAAc,YAAc,KAAO0C,EAAwBrC,EAAe,UAC/I,WAAYsC,EAAwB3C,GAAiB,KAAO,OAASA,EAAc,YAAc,KAAO2C,EAAwBtC,EAAe,SAAA,CAEnJ,CAgBoBuC,GAAa,KAAMA,GAAa,MAAOA,GAAa,GAAIA,GAAa,KC5nBzF,SAASC,GAAiB3F,EAAeI,EAAqBC,EAAkC,CAC9F,OAAID,IAAgBJ,EACX,KAELK,EAAYD,EACP,OAELC,EAAYD,EACP,KAEF,IACT,CAEO,SAASwF,GAA4BC,EAAsD,CAChG,KAAM,CACJ,WAAAlB,EACA,UAAAF,EACA,WAAAnD,EACA,UAAAL,EACA,UAAAoD,EACA,WAAAF,EACA,YAAA/D,EACA,UAAAC,EACA,MAAAL,CAAA,EACE2C,GAAY,CAAE,GAAIkD,EAAM,GAAI,SAAUA,EAAM,SAAU,EAEpDC,EAAoB,CACxB,UAAWpE,GAAI,UAAU,SAAS+C,CAAS,EAC3C,WAAAnD,EACA,YAAa,OACb,SAAU,UAAA,EAGRL,GAAajB,IAAUI,IACzB0F,EAAM,WAAa,UAGrB,MAAMC,EAAWF,EAAM,eACjBG,EAAgBL,GAAiB3F,EAAOI,EAAaC,CAAS,EAEpE,OACEjB,EAAAA,IAAC2G,EAAA,CACE,GAAGF,EAAM,WACV,IAAKlB,EACL,MAAAmB,EACA,cAAezB,EACf,eAAgBF,EAChB,cAAA6B,CAAA,CAAA,CAGN,CCtEO,SAASC,GAAgBJ,EAAsC,CACpE,OACEzG,EAAAA,IAAC,MAAA,CAAK,GAAGyG,EACP,SAAAzG,EAAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,uzBAAA,CAAA,EAEN,CAEJ,CCTO,SAAS8G,GAASL,EAAsC,CAC7D,OACEzG,EAAAA,IAAC,MAAA,CAAK,GAAGyG,EACP,SAAAzG,EAAAA,IAAC,OAAA,CACC,KAAK,eACL,YAAa,GACb,EAAE,qYAAA,CAAA,EAEN,CAEJ,CCJO,MAAM+G,GAAkB,CAW7B,0BAA0BC,EAA6B,OACrD,QAAUnI,EAAAmI,GAAA,YAAAA,EAAQ,eAAR,YAAAnI,EAAsB,KAAK,UAAW,CAClD,EAOA,mBAAmBmI,EAAoBC,EAAqB,OAC1D,MAAO,CAAC,CAAEC,EAAY,WAAUrI,EAAAmI,GAAA,YAAAA,EAAQ,eAAR,YAAAnI,EAAsB,KAAM,CAAE,GAAIoI,GAAA,YAAAA,EAAM,GAAI,CAC9E,EAEA,iBAAiB1I,EAAmB0I,EAA0BE,EAAsC,CAClG,MAAO,CACL,GAAI5I,EAAM,GACV,aAAc,CACZ,KAAM4I,EAAkB,CAAC,CAAE,GAAIF,EAAK,EAAA,CAAY,EAAI,CAAA,EACpD,WAAY,CAAE,MAAO,GAAI,QAAS,CAAE,KAAM,GAAI,SAAU,EAAA,CAAG,CAAE,CAC/D,CAEJ,EAEA,oBAAoB1I,EAAc6I,EAA8B,OAC9D,OAAKvI,EAAAwI,EAAY,iBAAiB9I,CAAK,IAAlC,MAAAM,EAAqC,WAGtC,GAAAuI,GAGAE,GAAgB,iBAAA,GAGhBP,GAAgB,0BAA0BxI,CAAK,GAR1C,EAYX,CACF,wKCtCMgJ,GAAY,yBACZC,GAAYC,EAAgB,iBAAiBF,EAAS,EAYrD,SAASG,GAAgBjB,EAA0C,CACxE,MAAMkB,EAASC,GAAA,EAETC,EAAed,GAAgB,0BAA0BN,EAAM,KAAK,EAGpE,CAAEqB,EAAaC,CAAe,EAAIC,EAAAA,SAAeH,CAAY,EAEnEI,EAAAA,UAAgB,IAAM,CACpBF,EAAeF,CAAY,CAC7B,EAAG,CAACA,CAAY,CAAC,EAGjB,IAAIxI,EAAY,mEAAiC6I,GAAO,eAAe,IAAIJ,EAAcI,GAAO,WAAa,EAAE,GAE3GzB,EAAM,YACRpH,GAAa,IAAIoH,EAAM,SAAS,IAElC,SAASjH,GAAgB,CACvB,MAAM2H,EAAkB,CAACW,EAEzB,SAASK,GAAgB,CACvB,SAASC,GAA4B,CACnC,OAAIf,EAAY,OAAOZ,EAAM,KAAK,EACzBU,EAAkB,qBAAuB,uBAE9CE,EAAY,cAAcZ,EAAM,KAAK,EAChCU,EAAkB,4BAA8B,8BAElDA,EAAkB,sBAAwB,uBACnD,CAEAQ,EAAO,MAAMH,GAAUY,EAAA,CAAmB,CAAC,EAC3CL,EAAe,CAACZ,CAAe,CACjC,CAEAY,EAAeZ,CAAe,EAC9BV,EAAM,aAAaA,EAAM,MAAOU,EAAiB,KAAMgB,EAAS1B,EAAM,cAAeA,EAAM,gBAAgB,CAC7G,CAEA,MAAI,CAAC4B,EAAe,WAAW5B,EAAM,YAAY,GAAK,CAAC4B,EAAe,WAAW5B,EAAM,YAAY,EAC1FzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAGN7B,EAAM,aAAaA,EAAM,KAAK,EAIjCvG,OAACqI,IAAU,UAAAlJ,EAAsB,QAAAG,EAAkB,SAAUiH,EAAM,aAAe,GAAK,OAErF,SAAA,CAAAzG,EAAAA,IAACwI,EAAA,CACC,IAAK1B,GACL,UAAW,iBAAiBoB,GAAO,KAAK,EAAA,CAAA,EAE1ClI,EAAAA,IAACwI,EAAA,CACC,IAAK3B,GACL,UAAW,iBAAiBqB,GAAO,YAAY,EAAA,CAAA,CACjD,EACF,EAbOlI,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAeb,CCnFO,SAASG,GAAsBhC,EAAgD,CACpF,MAAMiC,EAAWrB,EAAY,iBAAiBZ,EAAM,KAAK,EAEnDkC,EAAkBD,GAAYjC,EAAM,MAAM,UAC3CiC,EAAWjC,EAAM,MAAM,SAAW,IAEvC,OAAKkC,EAGE3I,MAAC,MAAA,CAAI,UAAU,mBAAmB,MAAO,CAAE,MAAO,GAAG2I,CAAe,GAAA,CAAI,CAAG,EAFzE3I,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAGb,iDCNO,SAASM,GAAwBnC,EAAkD,CACxF,OAAKY,EAAY,QAAQZ,EAAM,KAAK,EAKlCzG,EAAAA,IAAC,MAAA,CAAI,UAAWkI,GAAO,UACrB,eAACO,GAAA,CAAsB,MAAOhC,EAAM,KAAA,CAAO,CAAA,CAC7C,EANOzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAQb,CCdA,MAAMO,GAAqB,+BACrBC,GAAmB,OAelB,SAASC,GAActC,EAAwE,CACpG,KAAM,CACJ,SAAAuC,EACA,UAAA3J,EAAYwJ,GACZ,QAAAI,EAAUH,GACV,KAAAI,EAAOC,EAAiB,SACxB,QAAA3J,EACA,MAAA4J,EACA,iBAAAC,EAAmB,OAAA,EACjB5C,EAEE6C,EAAYL,EAEZM,EAAiB,CACrB,UAAW,GAAGlK,CAAS,kBAAkB6J,CAAI,GAC7C,QAASb,EAAe,WAAW7I,CAAO,EAAIA,EAAU,IAAA,EAG1D,OAAK4J,EAIHpJ,EAAAA,IAACwJ,EAAA,CAAQ,MAAAJ,EAAc,UAAWC,EAChC,eAACC,EAAA,CAAW,GAAGC,EACZ,SAAAP,CAAA,CACH,CAAA,CACF,EAPOhJ,EAAAA,IAACsJ,EAAA,CAAW,GAAGC,EAAiB,SAAAP,CAAA,CAAS,CASpD,8HCnCO,SAASS,GAAgBhD,EAA0C,WACxE,MAAI,CAACY,EAAY,cAAcZ,EAAM,KAAK,GAAK,CAACY,EAAY,OAAOZ,EAAM,KAAK,EACrEzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEP,CAAC7B,EAAM,MAAM,YAAc,GAAC5H,EAAA4H,EAAM,MAAM,sBAAZ,MAAA5H,EAAiC,OACxDmB,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,GAEPoB,EAAAjD,EAAM,MAAM,sBAAZ,MAAAiD,EAAiC,MAEjC1J,EAAAA,IAAC,MAAA,CAAI,UAAW,GAAGyG,EAAM,OAAS,KAAOyB,GAAO,GAAKA,GAAO,GAAG,kDAC7D,eAACa,GAAA,CAAc,UAAWtC,EAAM,OAAS,KAAOyB,GAAO,OAASA,GAAO,QACrE,SAAAlI,EAAAA,IAAC2J,GAAA,CAAA,CAAkB,CAAA,CACrB,EACF,EAKF3J,EAAAA,IAAC,MAAA,CAAI,UAAW,GAAGyG,EAAM,OAAS,KAAOyB,GAAO,GAAKA,GAAO,GAAG,QAC7D,SAAAlI,EAAAA,IAAC4J,GAAA,CACC,YAAanD,EAAM,YACnB,SAAUoD,GAAW,YAAYpD,EAAM,MAAM,WAAW,KAAMA,EAAM,MAAM,WAAW,OAAO,EAC5F,UAAUqD,EAAArD,EAAM,MAAM,WAAW,SAAvB,YAAAqD,EAA+B,GAAA,CAAA,EAE7C,CAEJ,qDCjCMvC,GAAY,qBAYX,SAASwC,GAAYtD,EAAsC,CAChE,MAAI,CAACA,EAAM,UAAYA,EAAM,cACpBzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAGTtI,EAAAA,IAACG,EAAA,CACC,QAASsG,EAAM,QACf,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,iBACxB,QAASA,EAAM,QACf,UAAW;AAAA;AAAA,UAEPyB,GAAO,WAAW;AAAA,UAClBzB,EAAM,UAAYA,EAAM,UAAY,EAAE;AAAA,QAG1C,SAAAzG,EAAAA,IAAC,QAAK,UAAU,+EACd,eAACI,EAAA,CAAA,UAAKmH,GAAsB,OAAO,OAAA,CAAQ,CAAA,CAC7C,CAAA,CAAA,CAGN,oEChCO,SAASyC,GAAiBvD,EAA2C,CAC1E,MAAMwD,EAAUxD,EAAM,OAAS,KAAO0C,EAAiB,MAAQA,EAAiB,SAEhF,OACEnJ,MAAC,OAAI,UAAW,GAAGkI,GAAO,OAAO,IAAIzB,EAAM,OAAS,KAAOyB,GAAO,GAAK,EAAE,4EACvE,SAAAlI,EAAAA,IAACwI,EAAA,CAAa,IAAK0B,GAAS,KAAMD,EAAS,CAAA,CAC7C,CAEJ,8DCAAE,GAAqB,aAAe,CAClC,KAAM,IACR,EAEO,SAASA,GAAqB1D,EAA+C,eAClF,GAAI,CAACY,EAAY,QAAQZ,EAAM,KAAK,GAAK,CAACA,EAAM,uBAC9C,OAAOzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,MAAM8B,GAAUV,GAAA7K,EAAA4H,EAAM,MAAM,sBAAZ,YAAA5H,EAAiC,OAAjC,YAAA6K,EAAwC,GAClDW,EAAMC,GAAY,YAAUR,EAAAM,GAAA,YAAAA,EAAS,OAAT,YAAAN,EAAe,MAAOrD,EAAM,uBAAwB,CAAE,KAAM8D,GAAU,KAAA,CAAO,EACzGC,EAA0BC,GAAgBL,EAAQ,KAAMM,EAAqB,EAEnF,OAAKL,QAIF,MAAA,CACC,SAAArK,EAAAA,IAACwJ,EAAA,CACC,MAAOY,GAAA,YAAAA,EAAS,KAChB,SAAQ,GAER,SAAApK,EAAAA,IAAC,MAAA,CACC,UAAW,GAAGkI,GAAO,IAAI,IAAIzB,EAAM,OAAS,KAAOyB,GAAO,GAAK,EAAE,IAAI,GAACyC,EAAAP,GAAA,YAAAA,EAAS,WAAT,MAAAO,EAAmB,SAAUH,CAAuB,GAC1H,MAAO,CACL,gBAAiB,OAAOH,CAAG,IAC3B,iBAAiBO,EAAAR,GAAA,YAAAA,EAAS,WAAT,YAAAQ,EAAmB,MAAA,CACtC,CAAA,CACF,CAAA,EAEJ,EAhBO5K,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAkBb,CCrCAuC,GAAe,QAAU,CACvB,KAAM,IACR,EAEO,SAASA,GAAepE,EAAyC,CACtE,OAAIY,EAAY,OAAOZ,EAAM,KAAK,EACzBzG,MAAC8K,IAAU,OAAQC,GAAW,KAAM,KAAMtE,EAAM,KAAM,YAAW,EAAA,CAAC,EAEvEY,EAAY,cAAcZ,EAAM,KAAK,EAErCzG,EAAAA,IAAC8K,GAAA,CACC,OAAQC,GAAW,YACnB,OAAQtE,EAAM,MAAM,OACpB,KAAMA,EAAM,KACZ,YAAW,EAAA,CAAA,EAIVzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CACX,6ICnBO,SAAS0C,GAAqBvE,EAAiD,OACpF,MAAMwE,EAAgBC,GAAA,EAItB,IAFArM,EAAAoM,EAAc,gBAAd,MAAApM,EAAA,KAAAoM,EAA8BxE,GAE1B,CAACwE,EAAc,YACjB,OAAOjL,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,GAAI2C,EAAc,OAAS,qBACzB,OAAOjL,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,GAAI7B,EAAM,OAAS,SAAWwE,EAAc,aAC1C,OAAOjL,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,GAAI7B,EAAM,WAAa,YAAa,CAElC,MAAM0E,EAAcF,EAAc,qBAAuB,WAAaxE,EAAM,eAAiBsE,GAAW,YACxG,aACG,MAAA,CAAI,UAAWI,EAAc,eAAejD,GAAO,aAAa,GAAK,GACpE,SAAAlI,EAAAA,IAACoL,GAAA,CAAU,KAAMH,EAAc,UAAA,CAAY,EAC7C,CAEJ,CAEA,GAAIA,EAAc,OAAS,QACzB,OAAOjL,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAKX,MAAM+C,EAAaJ,EAAc,QAEjC,IAAIK,EAAW,YACX7E,EAAM,WAAa,iBACrB6E,EAAW,iBAEb,MAAMjM,EAAY,GAAG6I,GAAO,cAAc,IAAImD,EAAanD,GAAO,SAAW,EAAE,IAAIoD,CAAQ,mBAM3F,SAAS9L,GAAgB,CAClBiH,EAAM,SAGXwE,EAAc,WAAA,CAChB,CAEA,aACG9K,EAAA,CAAQ,UAAAd,EAAsB,QAAAG,EAAkB,QAASiH,EAAM,QAC9D,SAAAzG,EAAAA,IAACoL,GAAA,CAAU,KAAMH,EAAc,UAAA,CAAY,EAC7C,CAEJ,CClEO,SAASM,GAAc9E,EAAsC,CAClE,OACEzG,EAAAA,IAAC,MAAA,CAAK,GAAGyG,EACP,SAAAzG,EAAAA,IAAC,OAAA,CACC,SAAS,UACT,EAAE,8PACF,KAAK,cAAA,CAAA,EAET,CAEJ,oVCoBA,SAASwL,GAAcC,EAA2B,CAChD,IAAIpM,EAAY,OAEhB,OAAIoM,IACFpM,GAAa6I,EAAO,WAGf7I,CACT,CAEO,SAASqM,GAAyBjF,EAAmD,eAC1F,KAAM,CAAE,YAAAkF,EAAa,WAAAC,CAAA,EAAevE,EAAY,iBAAiBZ,EAAM,KAAK,EACtE,CAAE,YAAAoF,GAAgBpF,EAAM,iBAExBqF,EAAgBC,GAAa,UAASlN,EAAA4H,EAAM,UAAN,YAAA5H,EAAe,MAAM,GAAI6K,EAAAjD,EAAM,UAAN,YAAAiD,EAAe,OAAuB,CAAA,EAErGsC,EAAwB,CAC5B,GAAGvF,EAAM,iBACT,OAAQY,EAAY,mBAAmBZ,EAAM,KAAK,CAAA,EAG9CwF,EAAsBlF,GAAgB,oBAAoBN,EAAM,MAAOA,EAAM,QAAQ,EACrFyF,EAAU7E,EAAY,QAAQZ,EAAM,KAAK,EAEzC0F,EAAS9E,EAAY,UAAUZ,EAAM,KAAK,EAE1C,CAAE2F,EAAmBC,CAAoB,EAAIC,GAA+B,CAAE,MAAO,IAAK,EAE1FC,EAA4BF,GAAuBT,GAAcC,EAEjEW,EAAgB,CACpB,GAAG/F,EAAM,cACT,GAAIA,EAAM,MAAM,GAChB,KAAMA,EAAM,MAAM,IAAA,EAEdgG,EAAmB,CACvB,GAAGT,EACH,WAAYjM,EAAW,MACvB,WAAY2M,GAAgB,SAAA,EAG9B,aACGlD,EAAA,CAAQ,MAAOnC,EAAY,oBAAoBZ,EAAM,KAAK,EAAG,SAAQ,GAAC,kBAAkB,GACvF,SAAAvG,EAAAA,KAAC,OAAI,UAAU,8CAA8C,IAAKkM,EAChE,SAAA,CAAApM,EAAAA,IAAC+J,GAAA,CACC,SAAUtD,EAAM,iBAAiB,SACjC,cAAeA,EAAM,iBAAiB,cACtC,UAAU,YACV,QAASkF,EAAclF,EAAM,QAAU,KACvC,cAAA+F,EACA,iBAAAC,CAAA,CAAA,EAGDR,GACCjM,EAAAA,IAAC,MAAA,CAAI,UAAWkI,EAAO,kBACrB,SAAAlI,EAAAA,IAAC0H,GAAA,CACC,aAAcjB,EAAM,iBAAiB,aACrC,aAAcA,EAAM,iBAAiB,aACrC,MAAOA,EAAM,MACb,cAAeA,EAAM,cACrB,iBAAkBuF,CAAA,CAAA,EAEtB,EAGD,CAACL,GACA3L,EAAAA,IAAC,MAAA,CAAI,UAAWkI,EAAO,kBACrB,SAAAlI,EAAAA,IAACgK,GAAA,CAAA,CAAiB,CAAA,CACpB,SAGD,MAAA,CAAI,UAAW,GAAG9B,EAAO,gBAAgB,uBACvC,SAAA,CAAAzB,EAAM,iBAAcgD,GAAA,CAAgB,MAAOhD,EAAM,MAAO,YAAaA,EAAM,iBAAiB,WAAA,CAAa,EAE1GzG,EAAAA,IAAC6K,GAAA,CAAe,MAAOpE,EAAM,KAAA,CAAO,EAEpCzG,EAAAA,IAACmK,GAAA,CACC,MAAO1D,EAAM,MACb,wBAAwBkE,GAAAb,EAAArD,EAAM,kBAAiB,4BAAvB,YAAAkE,EAAA,KAAAb,EAAmDrD,EAAM,MAAK,CAAA,CACxF,EACF,EAEAvG,EAAAA,KAACyM,GAAA,CACC,KAAMtF,EAAY,aAAaZ,EAAM,KAAK,EAC1C,QAASkF,EAAclF,EAAM,QAAU,KACvC,UAAWmG,GAAU,WACrB,aAAcnG,EAAM,aACpB,QAASA,EAAM,QACf,UAAWyB,EAAO,SAClB,KAAM,WAAYzB,EAAM,SAASmE,EAAAnE,EAAM,MAAM,SAAZ,MAAAmE,EAAoB,MAAO,GAAGnE,EAAM,MAAM,OAAO,IAAI,KAAO,IAAMA,EAAM,MAAM,KAC/G,cAAA+F,EACA,iBAAAC,EACA,aAAY,GAEX,SAAA,CAAA,CAAC,EAAEhG,EAAM,UAAYkF,IACpB3L,EAAAA,IAACwI,GAAa,UAAWN,EAAO,SAAU,IAAKqD,EAAA,CAAe,EAGhEvL,EAAAA,IAAC6M,GAAA,CAAc,KAAMC,GAAkB,KAAA,CAAO,EAC9C9M,EAAAA,IAAC,OAAI,UAAWkI,EAAO,iBACrB,SAAAhI,EAAAA,KAAC,MAAA,CAAI,UAAWgI,EAAO,QACrB,SAAA,CAAAhI,EAAAA,KAAC,MAAA,CAAI,UAAW,GAAGsL,GAAc/E,EAAM,QAAQ,CAAC,IAAIyB,EAAO,KAAK,GAC7D,SAAA,CAAAgE,GACClM,EAAAA,IAAC+M,GAAA,CACC,KAAMtG,EAAM,iBAAiB,YAC7B,UAAU,sBACV,MAAOA,EAAM,MACb,QAAS,KACT,iBAAkB,IAAA,CAAA,EAItBzG,MAAC,QAAK,UAAU,oCACb,WAAY,SAASyG,EAAM,KAAK,CAAA,CACnC,CAAA,EACF,EAEAzG,EAAAA,IAAC4I,GAAA,CAAwB,MAAOnC,EAAM,KAAA,CAAO,EAE5CA,EAAM,UACLzG,EAAAA,IAACgN,GAAA,CAAmB,UAAU,OAC3B,SAAA3F,EAAY,QAAQZ,EAAM,KAAK,GAC9BvG,EAAAA,KAAAoI,EAAAA,SAAA,CACE,SAAA,CAAAtI,EAAAA,IAACiN,EAAA,CACC,KAAMC,EAAU,OAChB,KAAMf,CAAA,CAAA,EAEP1F,EAAM,MAAM,aACXzG,EAAAA,IAAC,OAAA,CAAK,UAAU,YACd,SAAAA,EAAAA,IAACwI,EAAA,CAAa,IAAK2E,EAAA,CAAsB,CAAA,CAC3C,EAEFnN,EAAAA,IAACiN,EAAA,CACC,KAAMC,EAAU,YAChB,KAAMzG,EAAM,MAAM,eAAA,CAAA,EAEpBzG,EAAAA,IAACiN,EAAA,CACC,KAAMC,EAAU,cAChB,KAAM7F,EAAY,YAAYZ,EAAM,KAAK,CAAA,CAAA,CAC3C,CAAA,CACF,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CAAA,CAAA,EAED8F,GACCvM,EAAAA,IAACgL,GAAA,CAEC,SAAUvE,EAAM,MAAM,GACtB,aAAcA,EAAM,MAAM,OAC1B,KAAK,QACL,QAASA,EAAM,QACf,QAASqF,EAAc,QACvB,UAAWA,EAAc,UACzB,YAAaA,EAAc,IAC3B,QAASH,EAAclF,EAAM,QAAU,IAAA,EARlCA,EAAM,MAAM,EAAA,CASnB,CAAA,CAEJ,CAAA,CACF,CAEJ,CC5LO,MAAM2G,GAAsBC,EAAM,cAAmC,EAAE,ECAvE,SAASC,GACdlG,EACAoF,EACAC,EACM,CACN,KAAM,CAAEc,EAAYC,CAAc,EAAIH,EAAM,SAASjG,CAAU,EACzDqG,EAAsBJ,EAAM,OAAajG,EAAa,IAAI,KAAS,IAAI,EAE7EiG,EAAM,UAAU,IAAM,CACpB,GAAI,GAACb,GAAiB,CAACC,IAGnB,GAACA,EAAiB,QAAU,CAACD,EAAc,UAG/C,GAAIpF,EACGmG,GACHC,EAAc,EAAI,EAEpBC,EAAoB,YAAc,KAElC7N,GAAgB,cAAc4M,EAAe,CAC3C,GAAGC,EACH,WAAY1M,EAAW,KAAA,CACxB,MACI,CACL,GAAI,CAACwN,EACH,OAEF,MAAMG,MAAgC,KAAA,EAAO,UAAYD,EAAoB,QAAQ,QAAA,EACrFA,EAAoB,QAAU,KAE9B7N,GAAgB,cAAc,CAC5B,GAAG4M,EACH,0BAAAkB,EACA,qBAAsBA,EAA4B,GAAA,EACjD,CACD,GAAGjB,EACH,WAAY1M,EAAW,OAAA,CACxB,CACH,CACF,EAAG,CAACqH,CAAU,CAAC,CACjB,CC/CA,MAAMuG,GAAiB,EACjBC,GAAgB,IA0BTC,GAAoB,CAC/BC,EACAC,EACAC,EACAC,EAAgBL,KACqB,CACrC,KAAM,CAAE,EAAAM,EAAG,EAAAC,EAAG,MAAAC,EAAO,OAAAC,GAAWP,EAE1BQ,EAAsB,SAAS,eAAe,yBAAyB,EAC7E,GAAI,CAACA,EAAqB,MAAO,CAAA,EAEjC,IAAIC,EAEAC,EAAeT,GAAaK,EAAQH,EACpCQ,EAAgBV,EAAYA,GAAaM,EAASD,GAASC,EAASJ,EAEpES,EAAYX,EAAYS,EAAeJ,EAAQH,EACnDM,EAAOL,GAAKM,EAAeJ,GAAS,EAEhCI,EAAeR,IACjBO,EAAOA,GAAQP,EAAWQ,GAAgB,EAC1CA,EAAeR,EACfU,EAAYF,EAAeJ,EAC3BK,EAAgBJ,EAASK,GAG3B,MAAMC,EAAOR,GAAKM,EAAgBJ,GAAU,EAAI,OAAO,QACvD,IAAIO,EAAOL,EACPM,EAAkB,SAEtB,OAAIN,EAAOD,EAAoB,WAAaX,KAC1CiB,EAAOV,EAAIP,GAAiB,EAC5BkB,EAAkB,OAGhBP,EAAoB,YAAcA,EAAoB,YAAcC,EAAOC,GAAgBb,KAC7FiB,EAAOb,EAAYG,EAAIE,EAAQL,EAAYG,EAAIE,GAASM,EAAY,GAAKf,GACzEkB,EAAkB,oBAGb,CAAE,KAAAD,EAAM,IAAKD,EAAM,OAAQF,EAAe,MAAOD,EAAc,gBAAAK,EAAiB,SAAU,WAAY,cAAeT,EAAO,eAAgBC,CAAA,CACrJ,2GCpCO,SAASS,GAA8BrI,EAAoD,SAChG,KAAM,CAAE,mBAAAsI,EAAoB,eAAAC,EAAgB,cAAAC,EAAe,gBAAAC,EAAiB,WAAAC,GAAe1I,EACrF,CAAE,sBAAA2I,CAAA,EAA0B/B,EAAM,WAAWD,EAAmB,EAClEgC,IAA0B,QAC5BC,GAAiB,MAAM,IAAIC,GAAS,qEAAqE,CAAC,EAG5G,MAAMC,EAAalC,EAAM,QAAQ,IAAMmC,GAAA,EAAwB,CAAA,CAAE,EAE3D,CAAEpD,EAAmBC,CAAoB,EAAIC,GAA+B,CAAE,MAAO,IAAK,EAC1F,CAAEmD,EAAcC,CAAoB,EAAIC,GAAA,EAGxC,CAAEC,EAAWC,CAAa,EAAIxC,EAAM,SAAS,EAAK,EAElDyC,EAAmBzC,EAAM,OAAuB,IAAI,EACpD0C,EAAa1C,EAAM,OAAgB,EAAK,EACxC2C,EAAoB3D,GAAuBqD,EAEjDpC,GAAe0C,EAAmBvJ,EAAM,cAAeA,EAAM,gBAAgB,EAE7E4G,EAAM,UAAU,IAAM,CAChB0C,EAAW,UAAYC,IAGzBZ,EADEY,GAAqBJ,EACDL,EAEA,IAFU,EAIlCQ,EAAW,QAAUC,EACvB,EAAG,CAACA,CAAiB,CAAC,EAWtB,KAAM,CAAE,EAAA9B,EAAG,EAAAC,EAAG,MAAAC,EAAO,OAAAC,CAAA,IAAW3E,GAAA7K,EAAAiR,EAAiB,UAAjB,YAAAjR,EAA0B,wBAA1B,YAAA6K,EAAA,KAAA7K,KAAuD,CAAA,EAEjFoR,EAAsB5C,EAAM,QAChC,IAAMQ,GAAkB,CAAE,EAAAK,EAAG,EAAAC,EAAG,MAAAC,EAAO,OAAAC,GAAUa,EAAiBD,EAAeE,CAAU,EAC3F,CAAEjB,EAAGC,EAAGC,EAAOC,EAAQc,CAAW,CAAA,EAE9BlB,EAAQgC,EAAsBA,EAAoB,cAAgBA,EAAoB,MAAQ,EAE9FC,EAAqBnB,EAE3B,OACE7O,EAAAA,KAAC,MAAA,CAAI,IAAK4P,EACR,SAAA,CAAA9P,EAAAA,IAAC,MAAA,CAAI,IAAKoM,EACR,SAAApM,EAAAA,IAACkQ,GAAmB,WAAY,GAAQ,GAAGlB,CAAA,CAAe,CAAA,CAC5D,GAEEgB,GAAqBJ,IACrB5P,MAACmQ,GAAA,CAAS,KAAMZ,EACd,SAAAvP,EAAAA,IAAC,MAAA,CACC,UAAW,GAAGkI,GAAO,eAAe,IAAIA,GAAO,gBAAgB,GAC/D,MAAO,CACL,UAAW+F,EACX,GAAGgC,CAAA,EAEL,IAAKR,EAEL,SAAAzP,EAAAA,IAACkQ,EAAA,CACC,WAAY,GACZ,oBAAAD,EACA,gBAAiB,IAAMb,EAAsB,IAAI,EAChD,GAAGJ,CAAA,CAAA,CAAe,CAAA,CACvB,CACF,CAAA,EAEJ,CAEJ,CAEAF,GAAuB,mBAAsBrI,SAExC,MAAA,CAAI,GAAG,0BAA0B,UAAU,cACzC,WAAM,SACT,ECvGG,SAAS2J,GAAc3J,EAAwC,CACpE,OAAKA,EAAM,SAKTzG,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA,QACT,UAAYyG,EAAM,MAAM,IAAIA,EAAM,UAAYA,EAAM,UAAY,EAAE,GAEnE,WAAM,SAAS,IAAA,CAAA,EARXzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAWb,mFCNA+H,GAAqB,aAAe,CAClC,iBAAkB,GAClB,KAAM,IACR,EAEO,SAASA,GAAqB5J,EAA+C,CAClF,MAAM0F,EAAS9E,EAAY,UAAUZ,EAAM,KAAK,EAE1C6J,EAAe,CAAC,CAAC7J,EAAM,UAAYA,EAAM,OAAS,KAClD8J,EAAa,CAACD,GAAgB,CAAC7J,EAAM,YAAc,CAAC,CAAC0F,GAAU1F,EAAM,OAAS,KAEpF,OAAIA,EAAM,cAAgB,CAAC6J,GAAgB,CAACC,EACnCvQ,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAGTpI,EAAAA,KAAC8M,GAAA,CAAmB,UAAW,GAAG9E,GAAO,cAAc,IAAIzB,EAAM,OAAS,KAAOyB,GAAO,GAAK,EAAE,GAC5F,SAAA,CAAAoI,GACCtQ,EAAAA,IAACoQ,GAAA,CACC,SAAU3J,EAAM,SAChB,UAAU,qBACV,OAAO,MAAA,CAAA,EAGV8J,GACCvQ,EAAAA,IAACiN,EAAA,CACC,KAAMC,EAAU,OAChB,KAAMf,CAAA,CAAA,EAGT,CAAC1F,EAAM,cACNzG,EAAAA,IAACiN,EAAA,CACC,KAAMxG,EAAM,iBAAmByG,EAAU,oBAAsBA,EAAU,cACzE,KAAMzG,EAAM,UAAYY,EAAY,YAAYZ,EAAM,KAAK,CAAA,CAAA,CAC7D,EAEJ,CAEJ,CCtCO,SAAS+J,GAAmB/J,EAA6C,CAC9E,GAAI,CAACA,EAAM,WACT,OAAOzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,MAAMc,EAAQqH,GAAkB,qBAAqBhK,EAAM,MAAM,cAAeA,EAAM,UAAU,EAC1F,CAAE,WAAAmF,CAAA,EAAevE,EAAY,iBAAiBZ,EAAM,KAAK,EAE/D,MAAI,CAACmF,GAAc,CAACxC,EACXpJ,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAGTtI,EAAAA,IAACwJ,EAAA,CACC,SAAQ,GACR,kBAAmB/C,EAAM,WAAa,sBACtC,MAAA2C,EACA,UAAW3C,EAAM,kBAAoB,MAErC,SAAAzG,EAAAA,IAACwI,EAAA,CACC,IAAK0B,GACL,KAAMzD,EAAM,OAAS,KAAO0C,EAAiB,MAAQA,EAAiB,QAAA,CAAA,CACxE,CAAA,CAGN,uGChCM5B,GAAY,oBACZC,GAAYC,EAAgB,iBAAiBF,EAAS,EAEtDmJ,OAAY,KAgBlB,SAASC,GAAqBC,EAAgB,CAC5C,OAAOC,GAAW,OAAOD,EAAQF,GAAO,MAAM,GAAKG,GAAW,OAAOD,EAAQF,GAAO,OAAO,CAC7F,CAEAI,GAAW,aAAe,CACxB,UAAW,KACX,UAAW,EACb,EAEO,SAASA,GAAWrK,EAAqC,OAC9D,MAAMsK,EAActK,EAAM,MAAM,aAC1BuK,EAAiBD,GAAeJ,GAAqBI,CAAW,EAEhEE,EAA8BxK,EAAM,uBACrCuK,KACAnS,EAAA4H,EAAM,MAAM,sBAAZ,YAAA5H,EAAiC,OAEtC,OACEqB,EAAAA,KAAAoI,WAAA,CACE,SAAA,CAAAtI,EAAAA,IAACwJ,EAAA,CACC,MAAO,GAAGyH,EAA8BzJ,GAAU,UAAU,EAAI,EAAE,GAClE,SAAQ,GACR,kBAAkB,iBAEjB,SAAAyJ,GACCjR,MAAC,OAAA,CAAK,UAAW,+CAA+CkI,GAAO,GAAG,IAAIzB,EAAM,YAAc,KAAOyB,GAAO,UAAY,EAAE,EAAA,CAAI,CAAA,CAAA,QAIrI,KAAA,CAAG,UAAW,GAAGzB,EAAM,SAAS,IAAIyB,GAAO,KAAK,IAAIzB,EAAM,SAAS,YACjE,WAAM,OAASA,EAAM,MAAM,KAC9B,EAECA,EAAM,aACLzG,EAAAA,IAACwQ,GAAA,CACC,MAAO/J,EAAM,MACb,WAAYA,EAAM,WAClB,KAAMA,EAAM,QAAA,CAAA,CACd,EAEJ,CAEJ,gGC1DO,SAASyK,GAAczK,EAA6C,SACzE,KAAM,CAAE,MAAAlI,EAAO,QAAAQ,CAAA,EAAY0H,EACrB,CAAE,YAAAkF,CAAA,EAAgBtE,EAAY,iBAAiB9I,CAAK,EAE1D,OACEyB,EAAAA,IAAC,MAAA,CAAI,UAAW,QAAQkI,GAAO,SAAS,GACtC,SAAAhI,EAAAA,KAAC,MAAA,CAAI,UAAW,sBAAsBgI,GAAO,cAAc,GACxD,SAAA,CAAAb,EAAY,QAAQ9I,CAAK,GACxByB,EAAAA,IAAC+M,GAAA,CACC,KAAMtG,EAAM,iBAAiB,YAC7B,UAAU,gBACV,MAAAlI,EACA,SAASmL,GAAA7K,EAAA4H,EAAM,kBAAiB,oBAAvB,YAAAiD,EAAA,KAAA7K,EAA2C4H,EAAM,OAC1D,iBAAkB,CAAE,SAAU5G,GAAgB,cAAA,CAAe,CAAA,QAGhEM,EAAA,CAAQ,UAAU,kCAAkC,QAASwL,EAAc5M,EAAU,KACpF,SAAAiB,EAAAA,IAAC8Q,GAAA,CACC,MAAOrK,EAAM,MACb,WAAYA,EAAM,iBAAiB,WACnC,SAAS,KACT,sBAAuBA,EAAM,iBAAiB,sBAC9C,YAAa,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,kBAAA,CAAA,CACvF,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,oICdA,SAAS0K,GAAiB1K,EAA2C,SACnE,OAAIA,EAAM,QAENzG,EAAAA,IAACG,EAAA,CACC,QAASsG,EAAM,QACf,cAAeA,EAAM,qBACrB,iBAAkBA,EAAM,wBACxB,UAAW;AAAA;AAAA,kCAEc5H,EAAA4H,EAAM,QAAN,YAAA5H,EAAa,SAAS,IAAIqJ,GAAO,GAAG,IAAIzB,EAAM,OAASyB,GAAO,OAAS,EAAE;AAAA,UAGlG,SAAAlI,EAAAA,IAACoR,GAAA,CAAkB,GAAG3K,CAAA,CAAO,CAAA,CAAA,EAMjCzG,EAAAA,IAAC,MAAA,CACC,UAAW,2DAA0D0J,EAAAjD,EAAM,QAAN,YAAAiD,EAAa,SAAS,IAAIxB,GAAO,GAAG,IAAIA,GAAO,QAAQ,GAE5H,SAAAlI,EAAAA,IAACoR,GAAA,CAAkB,GAAG3K,CAAA,CAAO,CAAA,CAAA,CAGnC,CAEA,SAAS2K,GAAiB3K,EAA2C,OACnE,OACEvG,EAAAA,KAAAoI,WAAA,CACE,SAAA,CAAAtI,EAAAA,IAACwI,EAAA,CACC,UAAW,GAAGN,GAAO,IAAI,sBAAsBzB,EAAM,WAAW,cAChE,IAAKA,EAAM,GAAA,CAAA,EAGbzG,EAAAA,IAAC,QAAK,UAAW,sCAAqCnB,EAAA4H,EAAM,QAAN,YAAA5H,EAAa,QAAQ,GACxE,SAAA4H,EAAM,IAAA,CACT,CAAA,EACF,CAEJ,CCtDA,MAAMc,GAAY,2BASX,SAAS8J,GAAkB5K,EAA4C,OAC5E,MAAI,CAACA,EAAM,OAASY,EAAY,cAAcZ,EAAM,KAAK,GAAKY,EAAY,OAAOZ,EAAM,KAAK,EACnFzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,GAENzJ,EAAA4H,EAAM,MAAM,sBAAZ,MAAA5H,EAAiC,MAIpCmB,EAAAA,IAACoR,GAAA,CACC,MAAO,CACL,UAAW,sBACX,SAAU,2BAAA,EAEZ,IAAKE,GACL,YAAY,OACZ,KAAM7J,EAAgB,UAAUF,GAAW,YAAY,EACvD,QAASd,EAAM,QACf,qBAAsB,CACpB,kBAAmB,aACnB,GAAGY,EAAY,iBAAiBZ,EAAM,KAAK,EAC3C,GAAGA,EAAM,aAAA,EAEX,wBAAyB,CACvB,WAAY1G,EAAW,MACvB,OAAQsH,EAAY,mBAAmBZ,EAAM,KAAK,EAClD,GAAGA,EAAM,gBAAA,CACX,CAAA,EArBKzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAwBb,CCtCA,MAAMf,GAAY,yBASX,SAASgK,GAAgB9K,EAA0C,OACxE,GAAI,CAACY,EAAY,yBAAyBZ,EAAM,KAAK,EACnD,OAAOzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,MAAMkJ,EAAmB,CAACnK,EAAY,cAAcZ,EAAM,KAAK,MAAM5H,EAAA4H,EAAM,MAAM,eAAZ,YAAA5H,EAA0B,KAAK,SAAU,GAE9G,OACEmB,EAAAA,IAACoR,GAAA,CACC,IAAKK,GACL,YAAY,QACZ,KAAMhK,EAAgB,UAAUF,GAAW,eAAgB,CAAE,WAAYiK,EAAkB,EAC3F,QAAS/K,EAAM,QACf,qBAAsB,CACpB,kBAAmB,cACnB,wBAAyB+K,EACzB,GAAGnK,EAAY,iBAAiBZ,EAAM,KAAK,EAC3C,GAAGA,EAAM,aAAA,EAEX,wBAAyB,CACvB,WAAY1G,EAAW,MACvB,OAAQsH,EAAY,mBAAmBZ,EAAM,KAAK,EAClD,GAAGA,EAAM,gBAAA,CACX,CAAA,CAGN,CClCA,MAAMc,GAAY,sBAElB,SAASmK,GAAiBnT,EAA2B,SACnD,OAAI8I,EAAY,cAAc9I,CAAK,EAC1B,KAGNM,EAAAN,EAAM,YAAN,YAAAM,EAAiB,KAAK,SAAU,MAChC6K,EAAAnL,EAAM,QAAN,YAAAmL,EAAa,KAAK,SAAU,EAEjC,CASO,SAASiI,GAAalL,EAAuC,CAClE,GAAI,CAACY,EAAY,sBAAsBZ,EAAM,KAAK,EAChD,OAAOzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,MAAMsJ,EAAgBF,GAAiBjL,EAAM,KAAK,EAElD,OACEzG,EAAAA,IAACoR,GAAA,CACC,IAAKS,GACL,YAAY,SACZ,KAAMpK,EAAgB,UAAUF,GAAW,YAAa,CAAE,WAAYqK,EAAe,EACrF,QAASnL,EAAM,QACf,qBAAsB,CACpB,kBAAmB,WACnB,wBAAyBmL,EACzB,GAAGvK,EAAY,iBAAiBZ,EAAM,KAAK,EAC3C,GAAGA,EAAM,aAAA,EAEX,wBAAyB,CACvB,WAAY1G,EAAW,MACvB,OAAQsH,EAAY,mBAAmBZ,EAAM,KAAK,EAClD,GAAGA,EAAM,gBAAA,CACX,CAAA,CAGN,CChCO,SAASqL,GAAkBrL,EAA4C,iBAC5E,MAAMsL,EACJ1K,EAAY,yBAAyBZ,EAAM,KAAK,GAChDY,EAAY,sBAAsBZ,EAAM,KAAK,EAGzCuL,EAAqBvL,EAAM,iBAAiB,SAAS,mBAAmBA,EAAM,KAAK,EAEzF,OACEvG,EAAAA,KAAC,MAAA,CAAI,UAAW,GAAGuG,EAAM,kBAAkB,IAAIsL,EAAkCtL,EAAM,oBAAsB,EAAE,GAC5G,SAAA,CAAAuL,GACChS,EAAAA,IAACqR,GAAA,CACC,SAAS3H,GAAA7K,EAAA4H,EAAM,kBAAiB,2BAAvB,YAAAiD,EAAA,KAAA7K,EAAkD4H,EAAM,MAAM,GAAIA,EAAM,MAAM,QACvF,MAAOA,EAAM,MACb,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,gBAAA,CAAA,EAG5BzG,EAAAA,IAAC2R,GAAA,CACC,SAAShH,GAAAb,EAAArD,EAAM,kBAAiB,6BAAvB,YAAAkE,EAAA,KAAAb,EAAoDrD,EAAM,MAAM,GAAIA,EAAM,MAAM,QACzF,MAAOA,EAAM,MACb,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,gBAAA,CAAA,EAE1BzG,EAAAA,IAACuR,GAAA,CACC,SAASU,GAAArH,EAAAnE,EAAM,kBAAiB,gCAAvB,YAAAwL,EAAA,KAAArH,EAAuDnE,EAAM,MAAM,GAAIA,EAAM,MAAM,QAC5F,MAAOA,EAAM,MACb,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,gBAAA,CAAA,CAC1B,EACF,CAEJ,2CC7CMc,GAAY,2BAQX,SAAS2K,GAAkBzL,EAA4C,CAC5E,MAAM0L,EAAU1L,EAAM,qBAAuBgB,EAAgB,UAAUF,GAAW,eAAe,EAEjG,OACEvH,EAAAA,IAAC,OAAI,UAAU,OACb,eAACwJ,EAAA,CAAQ,MAAO2I,EAAS,SAAQ,GAC/B,SAAAnS,EAAAA,IAACuI,GAAA,CACC,QAAS9B,EAAM,cACf,UAAW,oDAAoDyB,GAAO,MAAM,GAC5E,SAAUzB,EAAM,aAAe,GAAK,OAEpC,SAAAzG,EAAAA,IAACwI,EAAA,CACC,IAAK4J,GACL,UAAW,iBAAiBlK,GAAO,KAAK,EAAA,CAAA,CAC1C,CAAA,EAEJ,CAAA,CACF,CAEJ,4SCJMmK,GAAe5L,GAAyC,WAC5D,KAAM,CACJ,MAAAlI,EAAO,QAAAQ,EAAS,aAAAuT,EAAc,QAAAC,EAAS,WAAAnL,CAAA,EACrCX,EACE,CAAE,YAAAoF,GAAgBpF,EAAM,iBAExBqF,EAAgBC,GAAa,SAAShN,GAAA,YAAAA,EAAS,MAAM,EAAIA,GAAA,YAAAA,EAAS,OAAuB,CAAA,EACzF,CAAE,YAAA4M,EAAa,WAAAC,CAAA,EAAevE,EAAY,iBAAiB9I,CAAK,EAEtE8O,EAAM,UAAU,IACP,IAAM,QACXxO,EAAA4H,EAAM,kBAAN,MAAA5H,EAAA,KAAA4H,EACF,EACC,CAAA,CAAE,EAEL,SAAS+L,EAAcC,EAAwC,OAC7DA,EAAE,eAAA,GACF5T,EAAA4H,EAAM,gBAAN,MAAA5H,EAAA,KAAA4H,EACF,CAEA,IAAIpH,EAAY,6BAEZoH,EAAM,eACRpH,GAAa,IAAIoH,EAAM,YAAY,IACjCW,IACF/H,GAAa,wBAEf,MAAM2M,EAAwB,CAC5B,GAAGvF,EAAM,iBACT,OAAQY,EAAY,mBAAmB9I,CAAK,CAAA,EAGxCgO,EAA4B9F,EAAM,YAAcmF,GAAcC,EAC9DI,EAAsBlF,GAAgB,oBAAoBN,EAAM,MAAOW,CAAU,EAEvF,SAASsL,GAAmB,CAC1B,OAAKrK,EAAe,WAAW5B,EAAM,aAAa,EAG9Ca,GAAgB,iBAAA,EACX,GAEFF,EALE,EAMX,CAEA,MAAMoF,EAAgB,CACpB,GAAG/F,EAAM,cACT,GAAIlI,EAAM,GACV,KAAMA,EAAM,IAAA,EAERkO,EAAmB,CACvB,GAAGT,EACH,WAAYjM,EAAW,MACvB,WAAY2M,GAAgB,SAAA,EAG9B,OACExM,OAAC,OAAI,UAAAb,EACH,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAWgI,GAAO,kBACpB,SAAA,CAAAwK,EAAA,GACC1S,EAAAA,IAACkS,GAAA,CACC,cAAAM,EACA,oBAAqB/L,EAAM,oBAC3B,aAAY,EAAA,CAAA,EAIfwF,GACCjM,EAAAA,IAAC0H,GAAA,CACC,aAAcjB,EAAM,iBAAiB,aACrC,aAAcA,EAAM,iBAAiB,aACrC,MAAAlI,EACA,cAAekI,EAAM,cACrB,iBAAkBuF,EAClB,aAAY,EAAA,CAAA,EAIf,CAACL,GACA3L,EAAAA,IAACwJ,EAAA,CAAQ,MAAOnC,EAAY,oBAAoBZ,EAAM,KAAK,EAAG,SAAQ,GAAC,kBAAkB,GACvF,SAAAzG,MAACgK,KAAiB,CAAA,CACpB,CAAA,EAEJ,EAEA9J,EAAAA,KAAC,MAAA,CAAI,UAAU,oBACb,SAAA,CAAAF,EAAAA,IAAC+J,GAAA,CACC,SAAUtD,EAAM,iBAAiB,SACjC,cAAeA,EAAM,iBAAiB,cACtC,UAAWW,EAAa,gBAAkB,YAC1C,QAAS,IAAA,OAAM,OAAAvI,EAAA4H,EAAM,kBAAN,YAAA5H,EAAA,KAAA4H,IACf,QAASkF,EAAc5M,EAAU,KACjC,cAAAyN,EACA,iBAAAC,CAAA,CAAA,EAEFvM,EAAAA,KAACyM,GAAA,CACC,QAAS,IAAA,OAAM,OAAA9N,EAAA4H,EAAM,kBAAN,YAAA5H,EAAA,KAAA4H,IACf,KAAMY,EAAY,aAAa9I,CAAK,EACpC,QAASoN,EAAc5M,EAAU,KACjC,UAAW6N,GAAU,WACrB,aAAA0F,EACA,QAAAC,EACA,KAAM,WAAYhU,KAASM,EAAAN,EAAM,SAAN,MAAAM,EAAc,MAAO,GAAGN,EAAM,OAAO,IAAI,KAAO,IAAMA,EAAM,KACvF,cAAAiO,EACA,iBAAAC,EACA,aAAc,CAAChG,EAAM,UACrB,iBAAkB,+DAA+DW,EAAa,gBAAkB,WAAW,GAC3H,eAAgBA,EAAa,gBAAkB,YAE/C,SAAA,CAAApH,EAAAA,IAAC6M,GAAA,CAAc,KAAMC,GAAkB,KAAA,CAAO,EAC9C5M,EAAAA,KAAC,MAAA,CAAI,UAAU,oCAGb,SAAA,CAAAA,OAAC,MAAA,CAAI,UAAW,GAAGgI,GAAO,gBAAgB,uBACvC,SAAA,CAAAzB,EAAM,WAAazG,EAAAA,IAACyJ,GAAA,CAAgB,MAAAlL,EAAc,YAAakI,EAAM,iBAAiB,YAAa,EAEpGzG,MAAC6K,IAAe,MAAAtM,EAAc,EAE9ByB,EAAAA,IAACmK,GAAA,CACC,MAAA5L,EACA,wBAAwBuL,GAAAJ,EAAAjD,EAAM,kBAAiB,4BAAvB,YAAAqD,EAAA,KAAAJ,EAAmDnL,EAAK,CAAA,CAClF,EACF,EAGAyB,EAAAA,IAACqQ,GAAA,CACC,MAAO5J,EAAM,MACb,SAAUA,EAAM,SAChB,WAAYA,EAAM,WAClB,aAAcA,EAAM,YAAA,CAAA,EAItBzG,EAAAA,IAAC4I,GAAA,CAAwB,MAAOnC,EAAM,KAAA,CAAO,CAAA,CAAA,CAC/C,CAAA,CAAA,CAAA,EAED8F,GACCvM,EAAAA,IAACgL,GAAA,CAEC,SAAUvE,EAAM,MAAM,GACtB,aAAcA,EAAM,MAAM,OAC1B,KAAK,QACL,QAASA,EAAM,QACf,QAASqF,EAAc,QACvB,UAAWA,EAAc,UACzB,YAAaA,EAAc,IAC3B,SAAS,eACT,cAAerF,EAAM,cACrB,QAASkF,EAAc5M,EAAU,IAAA,EAV5B0H,EAAM,MAAM,EAAA,CAWnB,EAEJ,EAEC,CAACW,GAAc,CAACX,EAAM,WACrBzG,EAAAA,IAACkR,GAAA,CAAe,GAAGzK,EAAM,EAG3BzG,EAAAA,IAAC,MAAA,CAAI,UAAW,GAAGkI,GAAO,OAAO,IAAId,EAAa,GAAGc,GAAO,UAAU,cAAgB,EAAE,GACrF,SAAAd,GACCpH,EAAAA,IAAAsI,EAAAA,SAAA,CACE,SAAApI,EAAAA,KAAC,MAAA,CAAI,UAAW,GAAGkH,EAAac,GAAO,kBAAoB,EAAE,GAC3D,SAAA,CAAAlI,EAAAA,IAACkR,GAAA,CAAe,GAAGzK,EAAM,EAEvBA,EAAM,mBAAqBW,GAC3BpH,EAAAA,IAAC8R,GAAA,CACC,iBAAkBrL,EAAM,iBACxB,MAAOA,EAAM,MACb,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,iBACxB,oBAAqByB,GAAO,mBAC5B,mBAAoB,sDAAA,CAAA,CACtB,CAAA,CAEJ,EACF,CAAA,CAEJ,CAAA,EACF,CAEJ,EAGO,SAASyK,GAAqBlM,EAA+C,CAClF,OACEzG,MAAAsI,EAAAA,SAAA,CACE,SAAAtI,EAAAA,IAAC8O,GAAA,CACC,mBAAoBuD,GACpB,eAAgB5L,EAChB,gBAAiB,IACjB,cAAe,IACf,cAAe,CACb,GAAGA,EAAM,cACT,GAAIA,EAAM,MAAM,GAChB,KAAMA,EAAM,MAAM,IAAA,EAEpB,iBAAkB,CAChB,GAAGA,EAAM,iBACT,OAAQY,EAAY,mBAAmBZ,EAAM,KAAK,CAAA,CACpD,CAAA,EAEJ,CAEJ,CC3OO,SAASmM,GAAoBnM,EAAsC,CACxE,OACEzG,EAAAA,IAAC,MAAA,CAAK,GAAGyG,EACP,SAAAzG,EAAAA,IAAC,OAAA,CACC,SAAS,UACT,EAAE,uLACF,KAAK,cAAA,CAAA,EAET,CAEJ,2PCJO,IAAK6S,IAAAA,IACVA,EAAAA,EAAA,MAAA,CAAA,EAAA,QACAA,EAAAA,EAAA,SAAA,CAAA,EAAA,WACAA,EAAAA,EAAA,OAAA,CAAA,EAAA,SAHUA,IAAAA,IAAA,CAAA,CAAA,EAMZ,SAASC,GAAeC,EAAwB,CAC9C,OAAIA,IAAS,EACJ7K,GAAO,MAEZ6K,IAAS,EACJ7K,GAAO,SAET,EACT,CAEA,SAAS8K,GAAOD,EAAgBE,EAA0B,GAAO,CAC/D,OAAIF,IAAS,EACJE,EAAiBL,GAAsBrH,GAEzC,IACT,CAUA2H,GAAK,SAAW,CACd,KAAM,IACR,EAEO,SAASA,GAAKzM,EAA+B,CAClD,KAAM,CAAE,KAAAsM,EAAM,KAAA7J,EAAM,eAAAiK,CAAA,EAAmB1M,EAEjC2M,EAAYN,GAAeC,CAAI,EAC/BM,EAAML,GAAOD,EAAMI,CAAc,EAEvC,OACEjT,EAAAA,KAAC,MAAA,CACC,UAAW,GAAGiT,EAAiBjL,GAAO,0BAA4BA,GAAO,aAAa,IAAIgB,IAAS,KAAOhB,GAAO,MAAQ,EAAE,GAE3H,SAAA,CAAAlI,EAAAA,IAAC,MAAA,CAAI,UAAYkI,GAAO,IAAA,CAAO,EAC/BlI,EAAAA,IAACwI,EAAA,CAAa,IAAA6K,EAAU,UAAYD,CAAA,CAAY,CAAA,CAAA,CAAA,CAGtD,CCvDO,SAASE,GAAQ7M,EAAsC,CAC5D,OACEzG,EAAAA,IAAC,MAAA,CAAK,GAAGyG,EACP,SAAAzG,EAAAA,IAAC,OAAA,CACC,EAAE,8MACF,KAAK,cAAA,CAAA,EAET,CAEJ,0JCgBAuT,GAAgB,aAAe,CAC7B,MAAO,QACT,EAEO,SAASA,GAAgB9M,EAA0C,CAExE,KAAM,CAAE+M,EAAYC,CAAc,EAAIpG,EAAM,SAAS5G,EAAM,SAAW,UAAA,EAEtE4G,EAAM,UAAU,IAAM,CACpBoG,EAAchN,EAAM,SAAW,UAAA,CACjC,EAAG,CAACA,EAAM,MAAM,CAAC,EAEjB,IAAIpH,EAAY,iCAAiCmU,EAAatL,GAAO,QAAUA,GAAO,SAAS,GAE3FzB,EAAM,YACRpH,GAAa,IAAIoH,EAAM,SAAS,IAE9BA,EAAM,QAAU,YAClBpH,GAAa,IAAI6I,GAAO,OAAO,IAEjC,SAASwL,GAAwB,CAC/B,MACE,CAAC,CAACjN,EAAM,QACRA,EAAM,SAAW,QACjB4B,EAAe,WAAW5B,EAAM,SAAS,CAE7C,CAEA,SAASjH,GAAgB,CACvB,MAAMmU,EAAiB,CAACH,EAExBC,EAAcE,CAAc,EAE5B,MAAMC,EAAYD,EAAiB,WAA2B,aAE9DlN,EAAM,UAAUmN,CAAS,EAAE,MAAM,IAAM,CACrCH,EAAc,CAACE,CAAc,CAC/B,CAAC,CACH,CAEA,OAAKD,EAAA,QAIFnL,GAAA,CAAU,UAAAlJ,EAAsB,QAAAG,EAAkB,SAAUiH,EAAM,SACjE,SAAAzG,EAAAA,IAACwI,EAAA,CACC,IAAK8K,GACL,UAAW,iBAAiBpL,GAAO,SAAS,EAAA,CAAA,EAEhD,EAROlI,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAUb,iFC7DA,SAASuL,GAAWpN,EAA4C,OAO9D,MANI,MAAC5H,EAAAwI,EAAY,iBAAiBZ,EAAM,KAAK,IAAxC,MAAA5H,EAA2C,aAG5CwJ,EAAe,WAAW5B,EAAM,YAAY,GAAK4B,EAAe,WAAW5B,EAAM,YAAY,GAG7F4B,EAAe,WAAW5B,EAAM,kBAAkB,EAIxD,CAaO,SAASqN,GAAsBrN,EAAgD,CACpF,KAAM,CAAE,YAAAkF,CAAA,EAAgBtE,EAAY,iBAAiBZ,EAAM,KAAK,EAEhE,OAAKkF,EAQAkI,GAAWpN,CAAK,SAIlB,MAAA,CAAI,UAAW,GAAGyB,GAAO,SAAS,6BACjC,SAAA,CAAAlI,EAAAA,IAAC0H,GAAA,CACC,aAAcjB,EAAM,aACpB,aAAcA,EAAM,aACpB,MAAOA,EAAM,MACb,UAAWyB,GAAO,OAClB,cAAezB,EAAM,cACrB,iBAAkBA,EAAM,iBACxB,aAAY,EAAA,CAAA,EAGdzG,EAAAA,IAACuT,GAAA,CACC,OAAQ9M,EAAM,gBACd,UAAWA,EAAM,mBACjB,UAAWyB,GAAO,MAAA,CAAA,CACpB,EACF,EAnBOlI,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAPPtI,EAAAA,IAAC,MAAA,CAAI,UAAWkI,GAAO,UACrB,eAAC8B,GAAA,CAAiB,KAAMvD,EAAM,IAAA,CAAM,CAAA,CACtC,CA0BN,CC1EO,IAAKsN,GAAAA,IACVA,EAAAA,EAAA,MAAQ,CAAA,EAAR,QACAA,EAAAA,EAAA,QAAU,CAAA,EAAV,UACAA,EAAAA,EAAA,YAAc,CAAA,EAAd,cAHUA,IAAAA,GAAA,CAAA,CAAA,iTCiCNxM,GAAY,8BAIlB,SAAS2J,GAAczK,EAAmC,SACxD,KAAM,CAAE,KAAAsM,EAAM,MAAAxU,EAAO,aAAAyV,CAAA,EAAiBvN,EAEhCwN,EAAWlB,IAAS,SAEpBmB,EAAkBF,IAAiBD,EAAsB,QACzD,CAAE,YAAApI,CAAA,EAAgBtE,EAAY,iBAAiBZ,EAAM,KAAK,EAEhE,IAAIpH,EAAY,GAEhB,OAAI6U,GACF7U,EAAY6I,EAAO,aAEfyD,IACEtE,EAAY,OAAO9I,CAAK,IAC1Bc,GAAa,IAAM6I,EAAO,MACxBb,EAAY,cAAc9I,CAAK,IACjCc,GAAa,IAAM6I,EAAO,eAG9B7I,EAAY6I,EAAO,WAInBhI,OAAC,OAAI,UAAAb,EACF,SAAA,CAAAgI,EAAY,QAAQ9I,CAAK,GACxByB,EAAAA,IAAC+M,GAAA,CACC,KAAMkH,EAAWxN,EAAM,iBAAiB,YAAc,SACtD,UAAWyN,EAAkB,sBAAwB,UACrD,MAAA3V,EACA,QAAS0V,GAAY,CAACC,GAAkBxK,GAAA7K,EAAA4H,EAAM,kBAAiB,oBAAvB,YAAAiD,EAAA,KAAA7K,EAA2C4H,EAAM,OAAS,KAClG,iBAAkB,CAAE,SAAU5G,GAAgB,cAAA,CAAe,CAAA,EAI/DqU,GAAmB,CAACvI,GAAe,CAACsI,EAElCjU,EAAAA,IAAC,OAAA,CAAK,UAAW,wBACf,SAAAA,EAAAA,IAAC8Q,GAAA,CACC,MAAAvS,EACA,MAAOA,EAAM,MAAQkJ,EAAgB,UAAUF,GAAW,kBAAkB,EAC5E,sBAAuB0M,GAAYxN,EAAM,iBAAiB,sBAC1D,YAAawN,GACR,CAACxN,EAAM,iBAAiB,sBACxB,CAACA,EAAM,iBAAiB,kBAAA,CAAA,CAC/B,CACF,EAEAzG,EAAAA,IAACG,EAAA,CAAQ,UAAU,wBAAwB,QAASsG,EAAM,QACxD,SAAAzG,EAAAA,IAAC8Q,GAAA,CACC,MAAAvS,EACA,sBAAuBkI,EAAM,iBAAiB,sBAC9C,YAAa,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,kBAAA,CAAA,CACvF,CACF,CAAA,EAGN,CAEJ,CAEO,SAAS0N,GAAqB1N,EAAmC,sBACtE,KAAM,CAAE,KAAAsM,EAAM,MAAAxU,EAAO,aAAAyV,EAAc,aAAA1B,EAAc,QAAAC,EAAS,eAAAY,GAAmB1M,EACvEoF,EAAc,qBAAsBpF,GAAQ5H,GAAA4H,EAAM,mBAAN,YAAA5H,GAAwB,YAAc,GAElFoV,EAAWlB,IAAS,SAEpBjH,EAAgBmI,GAAYlI,GAAa,UAASrC,EAAAjD,EAAM,UAAN,YAAAiD,EAAe,MAAM,GACzEI,GAAArD,EAAM,UAAN,YAAAqD,GAAe,OACjB,CAAA,EAEI,CAAEsK,EAAUhN,CAAW,EAAIuI,GAAA,EAC3B,CAAE0E,EAAgBC,CAAwB,EAAIhI,GAA+B,CAAE,MAAO,IAAK,EAC3F,CAAE,YAAAX,EAAa,WAAAC,CAAA,EAAevE,EAAY,iBAAiB9I,CAAK,EAEtE,SAASgW,EAAaC,EAAmB,CACvCJ,EAAS,QAAUI,EACnBH,EAAe,QAAUG,CAC3B,CAEA,MAAMjI,EAA4B0H,GAAYK,GAA2B1I,GAAcC,EAEvF,SAAS4I,GAAwB,UAC/B,GAAKR,EAGL,MAAO,CAACxN,EAAM,oBACZiD,IAAA7K,EAAA4H,EAAM,kBAAiB,eAAvB,YAAAiD,GAAA,KAAA7K,EAAsC4H,EAAM,SAC5CM,GAAgB,oBAAoBxI,EAAO6I,CAAU,CACzD,CAEA,SAASsN,GAA4B,CACnC,IAAIrV,EAAY,oBAEhB,OAAAA,GAAc4U,GAAYxN,EAAM,SAAWkF,EAAe,kBAAoB,GAE1ElF,EAAM,eACRpH,GAAa,IAAIoH,EAAM,YAAY,IAEjCuN,IAAiBD,EAAsB,UACzC1U,GAAa,4BAERA,CACT,CAEA,SAASsV,GAA4B,CACnC,IAAItV,EAAY,mBAAmBoH,EAAM,OAAS,KAAO,UAAY,WAAW,GAEhF,OAAIA,EAAM,iBACRpH,GAAa,IAAIoH,EAAM,cAAc,IAEnCuN,IAAiBD,EAAsB,UACzC1U,GAAa,IAAI6I,EAAO,QAAQ,IAE3B7I,CACT,CAEA,MAAM2M,EAAwBiI,EAAW,CACvC,GAAGxN,EAAM,iBACT,OAAQY,EAAY,mBAAmB9I,CAAK,CAAA,EAC1C,CAAA,EAEEqW,EAAWX,GAAY,CAAC,CAACxN,EAAM,SAAW,CAACA,EAAM,UAAYkF,EAC7DwG,EAAU8B,EACZ5M,EAAY,oBAAoBZ,EAAM,MAAOA,EAAM,UAAU,EAC7D,GAEE+F,EAAgByH,EAAW,CAC/B,GAAGxN,EAAM,cACT,GAAIlI,EAAM,GACV,KAAMA,EAAM,IAAA,EACV,CAAA,EACEkO,EAAmB,CACvB,GAAGT,EACH,WAAYjM,EAAW,MACvB,WAAY2M,GAAgB,SAAA,EAG9B,OACE1M,EAAAA,IAACwJ,EAAA,CAAQ,MAAO2I,EAAS,SAAQ,GAAC,kBAAkB,GAClD,SAAAjS,EAAAA,KAAC,MAAA,CAAI,UAAWwU,EAAA,EAAqB,IAAKH,EACvC,SAAA,CAAAN,GACCjU,EAAAA,IAAC+J,GAAA,CACC,SAAUtD,EAAM,iBAAiB,SACjC,cAAeA,EAAM,iBAAiB,cACtC,UAAWA,EAAM,OAAS,KAAO,UAAY,YAC7C,QAASkF,EAAclF,EAAM,QAAU,KACvC,cAAA+F,EACA,iBAAAC,CAAA,CAAA,EAIJzM,EAAAA,IAAC8T,GAAA,CACC,MAAAvV,EACA,gBAAiB,CAAC0V,GAAYxN,EAAM,gBACpC,mBAAoB,CAACwN,GAAYxN,EAAM,mBACvC,aAAcwN,GAAYxN,EAAM,iBAAiB,aACjD,aAAAgO,EACA,cAAeR,GAAYxN,EAAM,cACjC,iBAAkBwN,GAAYjI,EAC9B,KAAMvF,EAAM,IAAA,CAAA,EAGdvG,EAAAA,KAACyM,GAAA,CACC,KAAMtF,EAAY,aAAa9I,CAAK,EACpC,QAAS0V,GAAYtI,EAAclF,EAAM,QAAU,KACnD,QAASwN,GAAYtI,EAAclF,EAAM,QAAU,OACnD,UAAWmG,GAAU,WACrB,aAAA0F,EACA,QAAAC,EACA,UAAWoC,EAAA,EACX,KAAM,WAAYpW,KAASoM,GAAApM,EAAM,SAAN,MAAAoM,GAAc,MAAO,GAAGpM,EAAM,OAAO,IAAI,KAAO,IAAMA,EAAM,KACvF,cAAAiO,EACA,iBAAAC,EACA,aAAY,GACZ,aAAchG,EAAM,aACpB,cAAeA,EAAM,cAEpB,SAAA,CAAAmO,GACC5U,EAAAA,IAACkT,IAAK,KAAML,GAAS,MAAO,KAAMpM,EAAM,KAAM,eAAA0M,CAAA,CAA+B,EAE/EnT,EAAAA,IAAC6M,GAAA,CAAc,KAAMC,GAAkB,KAAA,CAAO,EAC9C5M,EAAAA,KAAC,MAAA,CAAI,UAAWgI,EAAO,iBAEpB,SAAA,CAAA8L,IAAiBD,EAAsB,SAAW/T,EAAAA,IAACkR,GAAA,CAAe,GAAGzK,EAAO,SAG5E,MAAA,CAAI,UAAW,GAAGyB,EAAO,gBAAgB,uBACvC,SAAA,CAAA+L,GAAYxN,EAAM,WACjBzG,EAAAA,IAACyJ,GAAA,CAAgB,MAAAlL,EAAc,YAAakI,EAAM,iBAAiB,WAAA,CAAa,EAGjF,CAACA,EAAM,oBAAsBzG,EAAAA,IAAC6K,IAAe,MAAAtM,EAAc,KAAMkI,EAAM,KAAM,EAE7EwN,GACCjU,EAAAA,IAACmK,GAAA,CACC,MAAA5L,EACA,wBAAwB0T,IAAArH,GAAAnE,EAAM,kBAAiB,4BAAvB,YAAAwL,GAAA,KAAArH,GAAmDrM,GAC3E,KAAMkI,EAAM,IAAA,CAAA,CACd,EAEJ,EAGC,CAACA,EAAM,eACNzG,EAAAA,IAAC4I,IAAwB,MAAArK,CAAA,CAAc,EAIzCyB,EAAAA,IAACqQ,GAAA,CACC,MAAO5J,EAAM,MACb,SAAUA,EAAM,SAChB,WAAYA,EAAM,WAClB,aAAcA,EAAM,aACpB,iBAAkBA,EAAM,iBACxB,KAAMA,EAAM,IAAA,CAAA,CACd,CAAA,CACF,CAAA,CAAA,CAAA,EAED8F,GACCvM,EAAAA,IAACgL,GAAA,CAEC,SAAUvE,EAAM,MAAM,GACtB,aAAcA,EAAM,MAAM,OAC1B,KAAK,QACL,QAASwN,GAAYxN,EAAM,QAC3B,QAASqF,EAAc,QACvB,UAAWA,EAAc,UACzB,YAAaA,EAAc,IAC3B,QAASmI,GAAYtI,EAAclF,EAAM,QAAU,IAAA,EAR9CA,EAAM,MAAM,EAAA,EAYpBuN,IAAiBD,EAAsB,OAAS/T,EAAAA,IAACkR,GAAA,CAAe,GAAGzK,CAAA,CAAO,CAAA,CAAA,CAC7E,CAAA,CACF,CAEJ,CCtKAoO,GAAe,aAAe,CAC5B,WAAY,GACZ,KAAM,KACN,UAAW,EACb,EAEO,SAASA,GAAepO,EAAyC,CACtE,OAAQA,EAAM,KAAA,CACZ,IAAK,SACH,OAAOzG,MAACmU,GAAA,CAAsB,GAAG1N,CAAA,CAAO,EAC1C,IAAK,WAEH,OAAOzG,MAACmU,GAAA,CAAsB,GAAG1N,CAAA,CAAO,EAC1C,IAAK,aAEH,OAAOzG,MAAC0L,GAAA,CAA0B,GAAGjF,CAAA,CAAO,EAC9C,IAAK,SACH,OAAOzG,MAAC2S,GAAA,CAAsB,GAAGlM,CAAA,CAAO,EAC1C,QACE,MAAA,CAEN,yDC9GA,SAASqO,GAAarO,EAAuC,iBAC3D,GAAI,CAACA,EAAM,MAAM,aAAe,GAAC5H,EAAAwI,EAAY,iBAAiBZ,EAAM,KAAK,IAAxC,MAAA5H,EAA2C,aAC1E,OACEmB,MAAC,MAAI,SAAAqH,EAAY,oBAAoBZ,EAAM,MAAOA,EAAM,UAAU,CAAA,CAAE,EAIxE,MAAMsO,EAAc,CAAC,GAACpK,GAAAb,GAAAJ,EAAAjD,EAAM,QAAN,YAAAiD,EAAa,YAAb,YAAAI,EAAwB,OAAxB,MAAAa,EAA8B,QAEpD,OACEzK,EAAAA,KAAAoI,WAAA,CACG,SAAA,CAAAyM,SACE,OAAA,CAAK,UAAW,+BAA+B7M,GAAO,aAAa,GAClE,SAAAlI,EAAAA,IAACiN,EAAA,CAAM,KAAMC,EAAU,SAAU,MAAMtC,EAAAnE,EAAM,QAAN,YAAAmE,EAAa,UAAW,EACjE,EAED,CAAC,GAACqH,EAAAxL,EAAM,QAAN,MAAAwL,EAAa,iBACd/R,EAAAA,KAAC,OAAA,CAAK,UAAU,2BACb,SAAA,CAAA6U,EAAc,MAAa,GAAItO,EAAM,MAAM,cAAA,EAC9C,EAED,CAAC,CAACA,EAAM,MAAM,aACbzG,EAAAA,IAAC,OAAA,CACC,UAAU,eACV,wBAAyB,CACvB,OAAQ,GAAIyG,EAAM,MAAM,gBAAkBsO,EAAe,MAAa,EAAE,GAAGC,GAAc,YAAYvO,EAAM,MAAM,WAAW,CAAC,EAAA,CAC/H,CAAA,CACF,EAEJ,CAEJ,CASO,SAASwO,GAAqBxO,EAA+C,OAClF,MAAMyO,EAAWC,GAAcC,GAAkB,EAAE,EAC7CC,EAAsB,CAAC,CAAC5E,GAAkB,sBAC9C5R,EAAA4H,EAAM,QAAN,YAAA5H,EAAa,cACbyW,GAAgB,IAAA,EAGlB,OAAIJ,EACKlV,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEP+M,GAAuB,CAAC5O,EAAM,sBAAwB,CAACA,EAAM,mBACxDzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,QAGR,MAAA,CAAI,UAAW,4CACd,SAAAtI,EAAAA,IAAC,IAAA,CAAE,UAAU,MACX,SAAAA,EAAAA,IAAC8U,GAAA,CACC,MAAOrO,EAAM,MACb,WAAYA,EAAM,UAAA,CAAA,EAEtB,CAAA,CACF,CAEJ,CChFO,SAAS8O,GAAU9O,EAAsC,CAC9D,OACEzG,EAAAA,IAAC,MAAA,CAAK,GAAGyG,EAAO,QAAQ,YACtB,SAAAzG,EAAAA,IAAC,OAAA,CACC,EAAE,gOACF,KAAK,cAAA,CAAA,EAET,CAEJ,qECOA,SAASwV,GAAaC,EAAiC,CACrD,MAAMC,EAAgB,mDACtB,OAAKD,EAEE,GAAGC,CAAa,mBAAmBxN,GAAO,mBAAmB,GAFxCwN,CAG9B,CAEO,SAASC,GAAqBlP,EAA2E,CAC9G,MAAMmP,EAAYnP,EAAM,eAAiB,CAAE,GAAGA,EAAM,eAAgB,GAAGA,EAAM,aAAA,EAAkB,CAAA,EACzFpH,EAAYmW,GAAa/O,EAAM,cAAc,EAEnD,MAAI,CAACA,EAAM,gBAAkB,CAACA,EAAM,YAAoBzG,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAGxDpI,EAAAA,KAAC2V,EAAA,CACC,GAAI,EACJ,UAAAxW,EACC,GAAGuW,EAEH,SAAA,CAAA,CAAC,CAACnP,EAAM,gBACPzG,EAAAA,IAACwI,EAAA,CAAa,IAAK/B,EAAM,eAAgB,KAAMA,EAAM,kBAAA,CAAoB,EAE1E,CAAC,CAACA,EAAM,aACPzG,EAAAA,IAAC,QAAK,UAAU,cAAe,SAAAyG,EAAM,MAAQ,CAAA,CAAE,CAAA,CAAA,CAAA,CAIvD,CAEAkP,GAAqB,aAAe,CAClC,eAAgBJ,GAChB,mBAAoBpM,EAAiB,KACvC,ECxCO,SAAS2M,GAAiBrP,EAA2C,CAC1E,OACEzG,EAAAA,IAACiN,EAAA,CACC,KAAMC,EAAU,YAChB,KAAM,CAAE,aAAczG,EAAM,aAAc,WAAYA,EAAM,UAAA,EAC5D,OAAM,EAAA,CAAA,CAGZ,CCJO,SAASsP,GAA0BtP,EAAoD,OAC5F,MAAMuP,EAAkBvF,GAAkB,iBAAgB5R,EAAA4H,EAAM,QAAN,YAAA5H,EAAa,aAAa,EAC9E,CAAE,WAAA+M,CAAA,EAAevE,EAAY,iBAAiBZ,EAAM,KAAK,EAE/D,MAAI,CAACuP,GAAmB,CAACvP,EAAM,YAAc,CAACmF,EACrC5L,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAGTtI,EAAAA,IAACgN,GAAA,CAAmB,UAAWvG,EAAM,WAAa,OAChD,SAAAzG,EAAAA,IAAC8V,GAAA,CAAiB,aAAcrP,EAAM,MAAM,cAAe,WAAYA,EAAM,WAAY,EAC3F,CAEJ,CCGAwP,GAAe,aAAe,CAC5B,WAAY,CACd,EAEO,SAASA,GAAexP,EAAyC,SACtE,KAAM,CAAE,YAAAkF,CAAA,EAAgBtE,EAAY,iBAAiBZ,EAAM,KAAK,EAC1D2C,EAAQ/B,EAAY,SAASZ,EAAM,KAAK,EAExC+F,EAA4B,CAChC,GAAG/F,EAAM,cACT,IAAI5H,EAAA4H,EAAM,QAAN,YAAA5H,EAAa,GACjB,MAAM6K,EAAAjD,EAAM,QAAN,YAAAiD,EAAa,IAAA,EAGf+C,EAAqC,CACzC,GAAGhG,EAAM,iBACT,WAAY1G,EAAW,MACvB,WAAY2M,GAAgB,KAAA,EAG9B,SAASwJ,GAAgC,CACvC,OAAIzP,EAAM,UACDA,EAAM,UAEXA,EAAM,OAAS,KACV,KAEF,IACT,CAEA,OACEzG,EAAAA,IAACG,EAAA,CACC,UAAWsG,EAAM,cACjB,QAASkF,EAAclF,EAAM,QAAU,KACvC,QAASkF,EAAclF,EAAM,eAAiB,KAC9C,iBAAAgG,EACA,cAAAD,EAEA,SAAAxM,EAAAA,IAAC,MAAA,CAAI,UAAW,SAASyG,EAAM,UAAU,gBAAiB,MAAOA,EAAM,MAAM,MAAQ,GACnF,SAAAzG,EAAAA,IAAC8Q,GAAA,CACC,MAAOrK,EAAM,MACb,MAAA2C,EACA,WAAY3C,EAAM,WAClB,SAAUA,EAAM,KAChB,UAAWyP,EAAA,EACX,UAAWzP,EAAM,eACjB,sBAAuBA,EAAM,sBAC7B,YAAaA,EAAM,WAAA,CAAA,CACrB,CACF,CAAA,CAAA,CAGN,CC1EA,MAAMc,GAAY,uBAOX,SAAS4O,GAAc1P,EAA+C,CAC3E,OACEzG,EAAAA,IAACG,EAAA,CAAQ,QAASsG,EAAM,QAAS,UAAWA,EAAM,UAChD,SAAAzG,EAAAA,IAACI,EAAA,CAAA,UAAKmH,GAAsB,OAAO,gBAAgB,EACrD,CAEJ,CCFO,SAAS6O,GAAiB3P,EAA2C,CAC1E,MAAM4P,EAAeC,EAAAA,WAAiBlY,EAAmB,EAEzD,GAAI,CAACiK,EAAe,WAAWgO,GAAA,YAAAA,EAAc,eAAe,EAC1D,OAAOrW,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,MAAMiO,EAAUF,EAAa,gBAAgB5P,EAAM,MAAO,CACxD,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,gBAAA,CACzB,EAED,OACEzG,EAAAA,IAACwW,GAAA,CACC,QAAAD,EACA,UAAU,0BACV,yBAAyB,oBACzB,sBAAuBpN,EAAiB,SACxC,UAAWkN,EAAa,iBAAmB,IAAMA,EAAa,iBAAiB5P,EAAM,KAAK,EAAI,KAC9F,WAAU,EAAA,CAAA,CAGhB,CCnBO,SAASgQ,GAAkBhQ,EAA4C,CAC5E,KAAM,CAAE,YAAAkF,CAAA,EAAgBtE,EAAY,iBAAiBZ,EAAM,KAAK,EAEhE,OAAIA,EAAM,YAAc,CAACkF,QACfwK,GAAA,CAAc,QAAS1P,EAAM,cAAe,UAAU,wCAAwC,EAGtGzG,EAAAA,IAACoW,GAAA,CACC,MAAO3P,EAAM,MACb,cAAeA,EAAM,cACrB,iBAAkBA,EAAM,gBAAA,CAAA,CAG9B,CC7BA,MAAMiQ,GAAmB,KACnBC,GAAe,EAERC,EAAyB,CAMpC,sBAAsBC,EAA2C,CAI/D,MAAMC,EAAgBD,EAAU,IAAIE,GAAKA,EAAE,IAAI,EAAE,KAAK,GAAG,EAKnDC,EAAaF,EAAc,MAAM,GAAG,EAAE,UAAe,CAAC,MAAM,CAACG,CAAI,CAAC,EAAE,OAAW,CAACC,CAAG,GAAK,CAAA,EACxFC,EAAWL,EAAc,MAAM,GAAG,EAAE,OAAOG,GAAQ,MAAM,CAACA,CAAI,CAAC,GAAK,CAAA,EAGpEG,EAAqBP,EAAU,KAAKQ,GACjC,CAACX,GAAiB,KAAKW,EAAE,IAAI,CACrC,EAGD,IAAIC,EAASH,EAAS,KAAKF,GAAQA,KAASG,GAAA,YAAAA,EAAoB,KAAI,EAMpE,GAHIP,EAAU,OAAS,IACrBS,GAAU,KAERF,GAAsBJ,EAAW,OACnC,MAAO,GAAGM,CAAM,IAAIF,EAAmB,KAAK,OAAO,CAAC,CAAC,MAAMJ,EAAW,IAAA,CAAK,GAK7E,MAAMO,EAAgBC,GAAsBR,CAAU,EAEtD,MAAO,GAAGM,CAAM,IAAIC,EAAc,KAAK,IAAI,CAAC,EAC9C,EAEA,8BAA8BV,EAA2C,CACvE,OAAOD,EAAuB,wBAAwBC,CAAS,CACjE,EAEA,uBAAuBA,EAA2C,CAChE,MAAMY,EAAgBvQ,EAAY,MAAM2P,CAAS,EAC3Ca,EAAexQ,EAAY,KAAK2P,CAAS,EAE/C,GAAI,CAACc,CAAkB,EAAIF,EAAc,KAAK,MAAM,GAAG,EACnD,CAACG,CAAiB,EAAIF,EAAa,KAAK,MAAM,GAAG,EAcrD,OAZIC,IAAuB,UACzBA,EAAqB,OAEnBC,IAAsB,UACxBA,EAAoB,OAElBD,IAAuB,WACzBA,EAAqB,OAEnBC,IAAsB,WACxBA,EAAoB,OAElBD,IAAuBC,EAClB,GAAGD,CAAkB,SAEvB,GAAGA,CAAkB,MAAMC,CAAiB,QACrD,EAEA,4BAA4Bf,EAA2C,CACrE,MAAMY,EAAgBvQ,EAAY,MAAM2P,CAAS,EAC3Ca,EAAexQ,EAAY,KAAK2P,CAAS,EAE/C,GAAIY,EAAc,OAASC,EAAa,KACtC,OAAOD,EAAc,KAEvB,GAAI,CAACE,CAAkB,EAAIF,EAAc,KAAK,MAAM,GAAG,EACnD,CAACG,CAAiB,EAAIF,EAAa,KAAK,MAAM,GAAG,EAErD,OAAIC,IAAuB,UACzBA,EAAqB,OAEnBC,IAAsB,UACxBA,EAAoB,OAElBD,IAAuB,WACzBA,EAAqB,OAEnBC,IAAsB,WACxBA,EAAoB,OAEf,GAAGD,CAAkB,MAAMC,CAAiB,MACrD,EAKA,wBAAwBf,EAA2C,CACjE,MAAMY,EAAgBvQ,EAAY,MAAM2P,CAAS,EAC3Ca,EAAexQ,EAAY,KAAK2P,CAAS,EAE/C,GAAIY,EAAc,OAASC,EAAa,KACtC,OAAOD,EAAc,KAEvB,GAAIC,EAAa,OAAS,WAAY,CACpC,KAAM,CAACG,CAAK,EAAIJ,EAAc,KAAK,MAAM,GAAG,EAE5C,OAAII,EAAM,gBAAkB,QACnB,kBAEF,iBACT,CAEA,MAAO,mBACT,EAEA,yBAAyBhB,EAA2C,CAClE,MAAMY,EAAgBvQ,EAAY,MAAM2P,CAAS,EAC3Ca,EAAexQ,EAAY,KAAK2P,CAAS,EAE/C,OAAIY,EAAc,OAASC,EAAa,KAC/BD,EAAc,KAEnBC,EAAa,OAAS,eACjB,GAAGD,EAAc,IAAI,YAEvB,sBACT,EAKA,sBAAsBZ,EAA2C,CAE/D,MAAMY,EAAgBvQ,EAAY,MAAM2P,CAAS,EAC3Ca,EAAexQ,EAAY,KAAK2P,CAAS,EAGzCiB,EAAyB5Q,EAAY,MAAMuQ,EAAc,KAAK,MAAM,GAAG,CAAC,EACxEM,EAAwB7Q,EAAY,MAAMwQ,EAAa,KAAK,MAAM,GAAG,CAAC,EAGtEM,EAAsBP,EAAc,KAAK,MAAM,GAAG,EAAE,KAAKQ,GAAQ,CAAC,MAAM,CAACA,CAAI,CAAC,EAC9EC,EAAqBR,EAAa,KAAK,MAAM,GAAG,EAAE,KAAKO,GAAQ,CAAC,MAAM,CAACA,CAAI,CAAC,EAGlF,GAAIR,IAAkBC,EAEpB,OAAII,IAA2B,OAASA,IAA2B,YAC1DL,EAAc,KAGhB,GAAGK,CAAsB,MAAME,CAAmB,GAO3D,IAAIG,EAAsB,GACtBC,EAAqB,GAczB,OAXIN,IAA2B,YAC7BK,EAAsB,IAGtBA,EAAsB,KAAKH,CAAmB,GAIhDI,EAAqB,KAAKF,CAAkB,GAGxCJ,IAA2B,SAAWC,IAA0B,QAC3D,KAAKI,CAAmB,QAAQC,CAAkB,IAIvDN,IAA2B,UAC7BK,EAAsB,SAASA,CAAmB,IAGhDJ,IAA0B,UAC5BK,EAAqB,SAASA,CAAkB,IAI9CL,IAA0B,QAC5BK,EAAqBV,EAAa,MAG7B,GAAGS,CAAmB,MAAMC,CAAkB,GACvD,CACF,EAEA,SAASZ,GAAsBa,EAAoC,CAIjE,MAAMC,EAAS3B,GAEf,IAAI4B,EAAgBC,EAChBC,EAAyB,GAE7B,MAAMC,EAAmB,CAAA,EAGzBL,EAAiBA,EAAe,KAAK,CAACtB,EAAG4B,IAAM5B,EAAI4B,CAAC,EAEpD,IAAIC,EAAOC,EAEX,IAAKD,EAAI,EAAGA,EAAIP,EAAe,OAAQO,IACrCC,EAAID,EAAI,EAGHH,IACHF,EAAaF,EAAeO,CAAC,GAE/BJ,EAAUH,EAAeQ,CAAC,EAOtBR,EAAeO,CAAC,EAAIN,IAAWE,EACjCC,EAAgB,GACPA,GAMTC,EAAO,KAAK,GAAGH,CAAU,MAAMF,EAAeO,CAAC,CAAC,EAAE,EAClDH,EAAgB,KAMhBC,EAAO,KAAK,GAAGL,EAAeO,CAAC,CAAC,EAAE,EAClCH,EAAgB,IAIpB,OAAOC,CACT,CCtPA,MAAMI,GAAc,aACdC,GAAc,UAMdC,GAAyB,EAElBC,GAAiB,CAM5B,+BACEC,EACAC,EACwB,CAMxB,MAAMC,EAAoBF,EACvB,OAAOG,GAAK,CAAC,CAACA,CAAC,EACf,IAAIC,GAAYA,EAAS,GAAG,UAAU,EASzC,OAJ0BH,EAAsB,OAAOI,GAC9CH,EAAkB,SAASG,EAAa,SAAS,UAAU,CACnE,CAGH,EAUA,oCAAoCJ,EAAqE,CACvG,KAAM,CAAE,eAAAK,CAAA,EAAmBtS,EAAY,MAAMiS,CAAqB,EAElE,IAAIM,EAAuB,GAE3B,OAAQ,CAACD,EAAA,CAEP,KAAKE,EAAU,gBAAgB,QAC/B,KAAKA,EAAU,gBAAgB,aAC/B,KAAKA,EAAU,gBAAgB,WAC/B,KAAKA,EAAU,gBAAgB,WAC/B,KAAKA,EAAU,gBAAgB,aAC/B,KAAKA,EAAU,gBAAgB,cAC/B,KAAKA,EAAU,gBAAgB,cAC/B,KAAKA,EAAU,gBAAgB,oBAC7B,GAAIP,EAAsB,SAAW,EACnC,OAAOA,EAAsB,CAAC,EAEhCM,EAAuB7C,EAAuB,sBAAsBuC,CAAqB,EACzF,MAEF,KAAKO,EAAU,gBAAgB,cAC7B,GAAIP,EAAsB,SAAW,EACnC,OAAOA,EAAsB,CAAC,EAGhCM,EAAuB7C,EAAuB,8BAA8BuC,CAAqB,EACjG,MAEF,KAAKO,EAAU,gBAAgB,YAC7BD,EAAuB7C,EAAuB,4BAA4BuC,CAAqB,EAC/F,MAEF,KAAKO,EAAU,gBAAgB,YAC7BD,EAAuB7C,EAAuB,uBAAuBuC,CAAqB,EAC1F,MAEF,KAAKO,EAAU,gBAAgB,cAC7BD,EAAuB7C,EAAuB,wBAAwBuC,CAAqB,EAC3F,MAGF,KAAKO,EAAU,gBAAgB,cAC7BD,EAAuB7C,EAAuB,yBAAyBuC,CAAqB,EAC5F,MAGF,KAAKO,EAAU,gBAAgB,YAC7BD,EAAuB7C,EAAuB,sBAAsBuC,CAAqB,EACzF,KAUA,CAGJ,OAAKM,EAGE,CAAE,KAAMA,CAAA,EAFN,IAGX,EAKA,wCAAwCE,EAAqC,CAE3E,MAAMC,EAAqB/C,GAA0B,CACnD,GAAI,CAACA,EAAU,OACb,OAAO,KAET,IAAIgD,EACAC,EAEJ,OAAAjD,EAAU,QAAQyC,GAAY,CAC5B,MAAMS,EAAQ,CAAC7S,EAAY,MAAMoS,EAAS,KAAK,MAAMR,EAAW,CAAC,EAEjE,GAAI,CAACe,EAAgB,CACnBA,EAAiBP,EACjBQ,EAAsBC,EACtB,MACF,CAEIA,EAAQD,IACVD,EAAiBP,EACrB,CAAC,EAEMO,CACT,EAGMG,EAAmC,CAAA,EAEzC,IAAIC,EAAuB,CAAA,EAE3B,OAAAN,EAAQ,QAAQO,GAAU,CACxB,GAAI,CAACF,EAAaE,EAAO,IAAI,EAAG,CAC9BF,EAAaE,EAAO,IAAI,EAAI,EAC5BD,EAAO,KAAKC,CAAM,EAClB,MACF,CAEAD,EAAO,KAAKC,CAAM,EAClBF,EAAaE,EAAO,IAAI,IAMxB,MAAMC,EAHQF,EAAO,OAAOA,EAAO,OAASD,EAAaE,EAAO,IAAI,CAAC,EAG3C,KAAK,CAACnD,EAAQ4B,IAAW,CACjD,MAAMyB,EAAyBR,EAAkB7C,EAAE,6BAA6B,IAAI,EAC9EsD,EAA0BT,EAAkBjB,EAAE,6BAA6B,IAAI,EAErF,GAAI,CAACyB,GAA0BC,EAC7B,MAAO,GAET,GAAI,CAACA,EACH,MAAO,GAET,MAAMC,EAAaF,EAAuB,KAAK,cAAcC,EAAwB,IAAI,EAEzF,OAAIC,IAAe,EAAUA,EAEtBA,EAAa,EAAI,GAAK,CAC/B,CAAC,EAEDL,EAASA,EAAO,OAAOE,CAAW,CACpC,CAAC,EAEMF,CACT,EAEA,6BAA6BpD,EAAmC0D,EAAqB,GAA4B,CAO/G,GANI,CAACxO,GAAa,SAASwO,CAAM,GAAKxO,GAAa,QAAQwO,CAAM,GAG7D,CAAC1D,GAAa,CAACA,EAAU,QAGzB,CAACoC,GAAe,oBAAoBpC,CAAS,EAC/C,OAGF,GAAI,CAAE,EAAAE,GAAMwD,EAEZ,GAAI,CAACxD,EACH,OAGE,OAAOA,GAAM,WACfA,EAAI,CAACA,CAAC,GAER,MAAMyD,EAAyBC,GACtBA,EAAa,QAAQ1B,GAAa,EAAE,EAAE,YAAA,EAIzC2B,EAAiB3D,EAAE,OAAO,CAAC4D,EAAmBC,KAClDD,EAAMH,EAAsBI,CAAW,CAAC,EAAIA,EACrCD,GACN,CAAA,CAAE,EAGL,OAAO9D,EAAU,OAAQyC,GAChBoB,EAAeF,EAAsBlB,EAAS,IAAI,CAAC,CAC3D,CACH,EAEA,kBAAkBzC,EAAyD,CACzE,OAAKA,GAAA,MAAAA,EAAW,OAGT,CAAE,EAAGA,EAAU,IAAIE,GAAKA,EAAE,IAAI,CAAA,EAF5B,IAGX,EAEA,oBAAoBF,EAAoC,GAAa,CACnE,OAAKA,EAGEA,EAAU,OAASmC,GAFjB,EAGX,CACF,EC7OO,SAAS6B,GACdhE,EACAsC,EACsB,CAEtB,MAAM2B,EAAkBzN,EAAM,QAAQ,IAChC,EAACwJ,GAAA,MAAAA,EAAW,SAAU,CAACsC,GAAyB,CAACF,GAAe,oBAAoBE,CAAqB,EACpG,KAEFF,GAAe,+BAA+BpC,EAAWsC,CAAqB,EACpF,CAACtC,CAAS,CAAC,EASd,OAPuBxJ,EAAM,QAAQ,IAC9ByN,GAAA,MAAAA,EAAiB,OAGf7B,GAAe,oCAAoC6B,CAAe,EAFhE,KAGR,CAACA,CAAe,CAAC,CAGtB,mECGaC,GAAWC,EAAAA,WAAiB,CAACvU,EAAsBwU,IAAyC,SACvG,MAAMC,EAAcC,GAAA,EACd,CAAE/G,EAAUgH,CAAQ,EAAIzL,GAAA,EAExBzG,EAAOmS,EAAgB,QAAQH,EAAazU,EAAM,IAAI,EACtD6U,EAAUpS,IAAS,KAEnB,CAAE,WAAAqS,CAAA,EAAejF,EAAAA,WAAiBkF,EAAwB,EAE1DC,EAAiBZ,IAAkBhc,EAAA4H,EAAM,MAAM,+BAAZ,YAAA5H,EAA0C,KAAM4H,EAAM,qBAAqB,EAE9GgP,EAAiB8F,GAAc,CAACL,EAAY,KAAOE,GAAW,OAAO3U,EAAM,MAAU,KAAe,CAACA,EAAM,aAC3GiV,EAAejV,EAAM,aAAe,CAACgP,GAAmB,CAACyF,EAAY,GACrES,GAAkBlG,GAAkBhP,EAAM,cAAgB,CAACyU,EAAY,GAEvEnc,EAAU0H,EAAM,gBAAgBA,EAAM,MAAO,CAAA,CAAE,EAC/CmV,EAAiB,CACrB,cAAenV,EAAM,cACrB,iBAAkB,CAChB,OAAQ3G,GAAW,KACnB,SAAUD,GAAgB,YAAA,CAC5B,EAGF,aACG,MAAA,CAAI,IAAKuU,EAAU,UAAU,QAC5B,SAAAlU,EAAAA,KAAC,MAAA,CAAI,UAAW,WAAWob,EAAU,GAAK,MAAM,GAAI,IAAAL,EAAU,MAAOxU,EAAM,MACzE,SAAA,CAAAzG,EAAAA,IAAC6V,EAAA,CAAK,GAAGwF,EAAgB,sBAAuB,UAAW,sCAAsCC,EAAU,YAAc,WAAW,GAClI,SAAApb,OAAC2b,GAAA,CACC,SAAA,CAAA7b,EAAAA,IAAC2V,GAAA,CACC,MAAOlP,EAAM,MACb,eAAAgP,EACA,YAAAiG,EACA,eAAgBjV,EAAM,eACtB,mBAAoBA,EAAM,mBAC1B,eAAgBA,EAAM,eACtB,cAAeA,EAAM,aAAA,CAAA,QAGtBoP,EAAA,CAAI,GAAIwF,EAAgB,oBAAoBM,CAAc,EACzD,SAAA3b,EAAAA,IAAC6U,GAAA,CACE,GAAG+G,EACJ,MAAOnV,EAAM,MACb,QAAA1H,EACA,QAAS0H,EAAM,QACf,SAAUgV,EACV,aAAc,CAAE,KAAMlR,GAAU,MAAA,EAChC,aAAcwJ,EAAsB,YACpC,KAAK,SACL,iBAAkB,CAChB,GAAGtN,EAAM,iBACT,YAAa,MAAA,CACf,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CACF,EAEAvG,EAAAA,KAAC2V,EAAA,CACE,GAAGwF,EAAgB,kBAAA,EACpB,UAAW,GAAGC,EAAU,OAAS,MAAM,wCAEvC,SAAA,CAAApb,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAF,EAAAA,IAACiW,GAAA,CACC,MAAOxP,EAAM,MACb,QAAA1H,EACA,KAAAmK,EACA,WAAYzC,EAAM,iBAAiB,WACnC,YAAa,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,mBACrF,cAAc,cACb,GAAGmV,CAAA,CAAA,EAGN5b,EAAAA,IAACyW,GAAA,CACE,GAAGmF,EACJ,MAAOnV,EAAM,MACb,WAAYA,EAAM,WAClB,eAAeiD,EAAAjD,EAAM,mBAAN,YAAAiD,EAAA,KAAAjD,EAAyB1H,EAAO,CAAA,CACjD,EACF,SAEC,MAAA,CACE,SAAA,CAAA,CAACuc,GACAtb,EAAAA,IAACiV,GAAA,CACC,MAAOxO,EAAM,MACb,WAAYA,EAAM,WAClB,qBAAsBA,EAAM,iBAAiB,qBAC7C,mBAAoBA,EAAM,iBAAiB,kBAAA,CAAA,EAG9C,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,oBACvEzG,EAAAA,IAAC+V,GAAA,CAA0B,MAAOtP,EAAM,MAAO,WAAYA,EAAM,iBAAiB,UAAA,CAAW,CAAA,EAEjG,EAECY,EAAY,kBAAkBZ,EAAM,cAAc,GACjDzG,EAAAA,IAAC8R,GAAA,CACC,MAAOrL,EAAM,MACb,gBAAiBA,EAAM,gBACvB,mBAAoB,gEACpB,oBAAqByB,GAAO,mBAC5B,iBAAkBzB,EAAM,iBACvB,GAAGmV,CAAA,CAAA,CACN,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CACF,CAEJ,CAAC,EAMYE,GAAoBrV,GAE7BzG,MAACwG,IAAoB,GAAIC,EAAM,MAAM,GAAI,eAAgBsU,GAAU,WAAYtU,CAAA,CAAO,ECjJnF,SAASsV,IAAyB,CACvC,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAST,CAEO,SAASC,IAAyB,CACvC,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOT,CAEO,SAASC,IAAyB,CACvC,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAST,CAEO,SAASC,IAA4B,CAC1C,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOT,CAEO,SAASC,IAAmB,CACjC,MAAO;AAAA;AAAA;AAAA;AAAA,GAKT,CAEO,SAASC,IAAwB,CACtC,MAAO;AAAA;AAAA;AAAA;AAAA,GAKT,CAEO,SAASC,IAA0B,CACxC,MAAO;AAAA;AAAA;AAAA;AAAA,GAKT,CCzDA,MAAMC,GAAoB7U,EAAgB,iBAAiB,yBAAyB,EAC9ED,EAAY,CAAC+U,EAAgBC,IAC5B/U,EAAgB,cAAA,EAEd6U,GAAkBC,CAAM,EADtBC,EAiBX,SAASC,EAAgBpJ,EAAiC,CACxD,aACG,MAAA,CAAI,wBAAyB,CAAE,OAAQA,GAAO,CAEnD,CAEA,MAAMqJ,GAA0B,CAC9B,CAACxe,EAAkB,UAAU,GAAyB,CACpD,MAAO,CACL,KAAMsJ,EAAU,iBAAkB,YAAY,EAC9C,YAAa,UACb,IAAK,IAAMiV,EAAgBL,IAAe,EAC1C,MAAOA,GAAA,EACP,SAAU,YAAA,CAEd,EACA,CAACle,EAAkB,KAAK,GAAyB,CAC/C,MAAO,CACL,KAAMsJ,EAAU,YAAa,OAAO,EACpC,YAAa,YACb,IAAK,IAAMiV,EAAgBN,IAAU,EACrC,MAAOA,GAAA,EACP,SAAU,OAAA,CAEd,EACA,CAACje,EAAkB,WAAW,GAAyB,CACrD,MAAO,CACL,KAAMsJ,EAAU,kBAAmB,mBAAmB,EACtD,OAAQA,EAAU,oBAAqB,iDAAiD,EACxF,YAAa,UACb,IAAK,IAAMiV,EAAgBR,IAAgB,EAC3C,MAAOA,GAAA,EACP,SAAU,cAAA,CAEd,EACA,CAAC/d,EAAkB,cAAc,GAAyB,CACxD,MAAO,CACL,KAAMsJ,EAAU,qBAAsB,iBAAiB,EACvD,OAAQA,EAAU,uBAAwB,8BAA8B,EACxE,YAAa,UACb,IAAK,IAAMiV,EAAgBP,IAAmB,EAC9C,MAAOA,GAAA,EACP,SAAU,iBAAA,CAEd,EACA,CAAChe,EAAkB,WAAW,GAAyB,CACrD,MAAO,CACL,KAAMsJ,EAAU,kBAAmB,cAAc,EACjD,OAAQA,EAAU,oBAAqB,qCAAqC,EAC5E,YAAa,WACb,IAAK,IAAMiV,EAAgBT,IAAgB,EAC3C,MAAOA,GAAA,EACP,SAAU,cAAA,CAEd,EACA,CAAC9d,EAAkB,WAAW,GAAyB,CACrD,MAAO,CACL,KAAMsJ,EAAU,kBAAmB,eAAe,EAClD,OAAQA,EAAU,oBAAqB,2BAA2B,EAClE,YAAa,YACb,IAAK,IAAMiV,EAAgBV,IAAgB,EAC3C,MAAOA,GAAA,EACP,SAAU,eAAA,CAEd,EACA,CAAC7d,EAAkB,YAAY,GAAyB,CACtD,MAAO,CACL,KAAMsJ,EAAU,mBAAoB,YAAY,EAChD,OAAQA,EAAU,qBAAsB,iBAAiB,EACzD,YAAa,YACb,IAAK,IAAMiV,EAAgBJ,IAAiB,EAC5C,MAAOA,GAAA,EACP,SAAU,cAAA,CAEd,CACF,EAEaM,GAAwB,CACnC,YAAcC,GAA8B,CAC1C,MAAMC,EAAOH,GAAwBE,CAAM,EAE3C,GAAI,CAACC,EAAM,CACTxN,GAAiB,MAAM,IAAIC,GAAS,oCAAoCsN,CAAM,EAAE,CAAC,EACjF,MACF,CAEA,OAAOC,EAAA,CACT,CACF,ECrHA,SAASC,GAASC,EAAcC,EAAaC,EAAkB,CAC7D,OAAOF,EACJ,QAAQ,IAAI,OAAO,IAAIC,CAAG,OAAQ,IAAI,EAAG,EAAE,EAC3C,QAAQ,IAAI,OAAO,KAAKA,CAAG,IAAK,IAAI,EAAGC,EAAU,OAAS,EAAE,CACjE,CAEA,SAASC,GAAUH,EAAcI,EAAgBF,EAAmB,GAAe,CACjF,MAAI,CAACF,GAAQ,CAACI,EAAK,OACVJ,EAEFI,EAAK,OAAO,CAACJ,EAAMC,IAAQF,GAASC,EAAMC,EAAKC,CAAO,EAAGF,CAAI,CACtE,CAOO,MAAMK,GAAkB,CAK7B,UAAUC,EAAmC,WAC3C,KAAM,CAAE,KAAAN,EAAM,aAAAO,CAAA,EAAiBD,EAE/B,GAAI,CAACN,EAAM,OAEX,IAAIQ,EAASR,EACb,OAAAQ,EAASL,GAAUK,EAAQ,CAAE,KAAM,KAAM,IAAK,IAAK,IAAK,MAAO,KAAM,SAAU,MAAO,MAAO,IAAK,OAAQ,MAAO,MAAO,CAAC,EACzHA,EAASL,GAAUK,EAAQ,CAAE,KAAM,IAAK,KAAM,EAAG,EAAI,IAE9CzT,GAAAJ,GAAA7K,EAAA0e,EAAO,MAAM,MAAM,IAAnB,YAAA1e,EAAsB,OAAO2e,GAAK,CAAC,CAACA,KAApC,YAAA9T,EAAwC,KAAK,MAA7C,YAAAI,EAAkD,SAAUwT,CACrE,CACF,EC/BO,SAASG,GAAqBV,EAAsB,CACzD,OAAOK,GAAgB,UAAU,CAAE,KAAAL,EAAM,aAAc,aAAc,CACvE,CCoBAW,GAAiB,aAAe,CAC9B,SAAU,GACV,aAAc,EAChB,EAEO,SAASA,GAAiBjX,EAA2C,CAC1E,KAAM,CAAE,KAAAwQ,EAAM,YAAA0G,EAAa,IAAAC,CAAA,EAAQjB,GAAsB,YAAYlW,EAAM,YAAY,MAAM,EAEvFoX,EAAiBpX,EAAM,eAAiB,GAAGA,EAAM,cAAc,KAAO,GAE5E,IAAIqX,EAAgB,uCAAuCH,CAAW,GAEtE,OAAIlX,EAAM,YACRqX,GAAiB,QAEfrX,EAAM,cAAgBA,EAAM,gBAC9BqX,GAAiBrX,EAAM,UACnB,QACA,SAEFA,EAAM,gBACRqX,GAAiB,IAAIrX,EAAM,aAAa,IAGxCvG,EAAAA,KAAC,OAAA,CAAK,UAAWuG,EAAM,mBACpB,SAAA,CAAA,CAAC,CAACA,EAAM,UACPzG,EAAAA,IAAC,QAAK,UAAW8d,EACf,SAAA9d,EAAAA,IAAC4d,EAAA,CAAA,CAAI,CAAA,CACP,SAEDzd,EAAA,CAAQ,QAASsG,EAAM,QAAS,QAASA,EAAM,QAC7C,SAAA,CAAA,CAAC,CAACA,EAAM,cACPzG,EAAAA,IAAC,QAAK,UAAWyG,EAAM,kBAAmB,SAAAvG,EAAAA,KAAC,SAAA,CAAQ,SAAA,CAAA2d,EAAgB5G,CAAA,CAAA,CAAK,CAAA,CAAS,EAElF,CAAC,CAACxQ,EAAM,cACPzG,EAAAA,IAAC,QAAK,UAAWyG,EAAM,kBACpB,SAAAA,EAAM,YAAY,SAAWvI,EAAkB,WAC5C8B,MAAC,QAAK,wBAAyB,CAC/B,OAAQyd,GAAqBhX,EAAM,YAAY,KAAK,UAAU,CAAA,CAChE,CAAG,EACDA,EAAM,YAAY,IAAA,CAExB,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CC7DA,MAAMc,GAAY,yBAElB,SAASwW,GAA2BC,EAAgC,CAClE,MAAMC,EAAaC,GAAA,EAEnB,OAAI,OAAOF,GAAmB,SACrBA,EAELC,IAAe7I,GAAkB,GAC5B,EAEL6I,IAAe7I,GAAkB,GAC5B,EAEL6I,IAAe7I,GAAkB,IAAM6I,IAAe7I,GAAkB,GACnE,EAEF,CACT,CAUO,SAAS+I,GAAyB1X,EAAmD,OAC1F,MAAM2X,EAAuBL,GAA2BtX,EAAM,cAAc,EAE5E,GAAI,GAAC5H,EAAA4H,EAAM,aAAN,MAAA5H,EAAkB,QACrB,OAAOmB,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,EAEX,MAAM+V,EAAoC,CAAA,EAC1C,IAAIC,EAA2B,EAE/B7X,EAAM,WAAW,QAAQ8X,GAAa,CACpCA,GAAA,MAAAA,EAAW,aAAa,QAAQC,GAAe,CAI7C,GAHIrgB,GAA6BqgB,EAAY,MAAM,GAG/CF,GAAoBF,EACtB,OAEFE,IAIA,MAAMG,EAAkBD,EAAY,SAAWtgB,EAAkB,YAAc,OAAOsgB,EAAY,MAAU,SACxG,KAAK,MAAMA,EAAY,IAAI,EAC3BA,EAAY,KAEVE,EAAoB,CACxB,GAAGF,EACH,KAAM,CACJ,GAAGC,EAEH,QAAShY,EAAM,SAAW,CAAE,GAAGA,EAAM,QAAS,OAAQ,CAAE,EAAG,KAAK,MAAM8X,EAAU,UAAY,GAAI,EAAE,CAAE,CACtG,EAGFF,EAAmB,KAAKK,CAAiB,CAC3C,EACF,CAAC,EAED,MAAMC,EAAoBlY,EAAM,WAAW,OAAO,CAACmY,EAAKL,IAAc,OACpE,MAAMI,IAAoB9f,EAAA0f,GAAA,YAAAA,EAAW,eAAX,YAAA1f,EAAyB,SAAU,EAC7D,OAAA+f,GAAOD,EAEAC,CACT,EAAG,CAAC,EAEJ,OAAKP,EAAmB,OAItBne,EAAAA,KAAAoI,WAAA,CACG,SAAA,CAAA+V,EAAmB,IAAI,CAACG,EAAa5F,IAAM,SAC1C,aACG,MAAA,CAAY,UAAU,iCACrB,SAAA5Y,EAAAA,IAAC,MAAA,CAAI,UAAU,UACb,SAAAA,EAAAA,IAAC0d,GAAA,CACC,YAAAc,EACA,SAAS3f,EAAA2f,EAAY,OAAZ,YAAA3f,EAAkB,QAC3B,SAAS6K,EAAA8U,EAAY,OAAZ,MAAA9U,EAAkB,QAAUjD,EAAM,eAAiB,KAC5D,UAAS,EAAA,CAAA,CACX,CACF,GARQmS,CASV,CAEJ,CAAC,EACD5Y,EAAAA,IAAC,MAAA,CAAI,UAAU,iBACb,SAAAA,EAAAA,IAACG,EAAA,CACC,UAAU,sCACV,QAASsG,EAAM,eACf,QAASA,EAAM,eAEf,SAAAzG,EAAAA,IAACI,EAAA,CAAA,UACCmH,GACA,OAAO,mBACP,QAAS,CACP,eAAgB8W,EAAmB,OACnC,WAAYM,CAAA,CACd,CAAA,CACF,CAAA,CACF,CACF,CAAA,EACF,EAlCO3e,EAAAA,IAAAsI,EAAAA,SAAA,EAAE,CAoCb,CC3FO,MAAMuW,GAAkB7D,EAAAA,WAAiB,CAACvU,EAA6BwU,IAAyC,WACrH,MAAMC,EAAcC,GAAA,EACd,CAAE/G,EAAUgH,CAAQ,EAAIzL,GAAA,EAExBzG,EAAOmS,EAAgB,QAAQH,EAAazU,EAAM,IAAI,EACtD6U,EAAUpS,IAAS,KAEnB,CAAE,WAAAqS,CAAA,EAAejF,EAAAA,WAAiBkF,EAAwB,EAE1DC,EAAiBZ,IAAkBhc,EAAA4H,EAAM,MAAM,+BAAZ,YAAA5H,EAA0C,KAAM4H,EAAM,qBAAqB,EAE9GgP,EAAiB8F,GAAc,CAACL,EAAY,KAAOE,GAAW,OAAO3U,EAAM,MAAU,KAAe,CAACA,EAAM,aAC3GiV,EAAejV,EAAM,aAAe,CAACgP,GAAmB,CAACyF,EAAY,GACrES,GAAkBlG,GAAkBhP,EAAM,cAAgB,CAACyU,EAAY,GAEvEnc,EAAU0H,EAAM,gBAAgBA,EAAM,MAAO,CAAA,CAAE,EAC/CmV,EAAiB,CACrB,cAAenV,EAAM,cACrB,iBAAkB,CAChB,OAAQ3G,GAAW,YACnB,SAAUD,GAAgB,mBAAA,CAC5B,EAGI,CAAE,YAAA8L,CAAA,EAAgBtE,EAAY,iBAAiBZ,EAAM,KAAK,EAEhE,OACEzG,EAAAA,IAAC,MAAA,CAAI,IAAKoU,EAAU,UAAU,QAC5B,SAAAlU,EAAAA,KAAC,MAAA,CAAI,UAAU,eAAe,IAAA+a,EAAU,MAAOxU,EAAM,MACnD,SAAA,CAAAzG,EAAAA,IAAC6V,EAAA,CAAK,GAAGwF,EAAgB,sBAAuB,UAAW,sCAAsCC,EAAU,YAAc,WAAW,GAClI,SAAApb,OAAC2b,GAAA,CACC,SAAA,CAAA7b,EAAAA,IAAC2V,GAAA,CACC,MAAOlP,EAAM,MACb,eAAAgP,EACA,YAAAiG,EACA,eAAgBjV,EAAM,eACtB,mBAAoBA,EAAM,mBAC1B,eAAgBA,EAAM,eACtB,cAAeA,EAAM,aAAA,CAAA,QAGtBoP,EAAA,CAAI,GAAIwF,EAAgB,oBAAoBM,CAAc,EACzD,SAAA3b,EAAAA,IAAC6U,GAAA,CACE,GAAG+G,EACJ,MAAOnV,EAAM,MACb,QAAA1H,EACA,QAAS0H,EAAM,QACf,SAAUgV,EACV,aAAc,CAAE,KAAMlR,GAAU,MAAA,EAChC,aAAcwJ,EAAsB,YACpC,KAAK,SACL,aAAcuH,EACd,iBAAkB,CAChB,GAAG7U,EAAM,iBACT,YAAa,MAAA,CACf,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CACF,EAEAvG,EAAAA,KAAC2V,EAAA,CAAK,GAAGwF,EAAgB,kBAAA,EAAqB,UAAW,qBAAqBC,EAAU,OAAS,MAAM,GACrG,SAAA,CAAApb,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAF,EAAAA,IAACiW,GAAA,CACC,MAAOxP,EAAM,MACb,QAAA1H,EACA,KAAAmK,EACA,WAAYzC,EAAM,iBAAiB,WACnC,YAAa,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,mBACrF,cAAc,cACb,GAAGmV,CAAA,CAAA,EAEN5b,EAAAA,IAACyW,GAAA,CACE,GAAGmF,EACJ,MAAOnV,EAAM,MACb,WAAYA,EAAM,WAClB,eAAeiD,EAAAjD,EAAM,mBAAN,YAAAiD,EAAA,KAAAjD,EAAyB1H,EAAO,CAAA,CACjD,EACF,EAEC4M,EACC3L,EAAAA,IAAC,MAAA,CAAI,UAAU,kBACb,SAAAA,EAAAA,IAACme,GAAA,CACC,YAAYrU,EAAArD,EAAM,MAAM,cAAZ,YAAAqD,EAAyB,MACrC,QAAA/K,EACA,eAAgB0H,EAAM,2BAA2BA,EAAM,KAAK,CAAA,CAAA,EAEhE,EAEAzG,EAAAA,IAACiV,GAAA,CACC,MAAOxO,EAAM,MACb,WAAYA,EAAM,WAClB,qBAAsBA,EAAM,iBAAiB,qBAC7C,mBAAoBA,EAAM,iBAAiB,kBAAA,CAAA,EAI9C,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,oBACvEzG,EAAAA,IAAC+V,GAAA,CAA0B,MAAOtP,EAAM,MAAO,WAAYA,EAAM,iBAAiB,UAAA,CAAW,CAAA,CAAA,CAEjG,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAAC,EAMYqY,GAA2BrY,GAEpCzG,MAACwG,IAAoB,GAAIC,EAAM,MAAM,GAAI,eAAgBoY,GAAiB,WAAYpY,CAAA,CAAO,8DC9GpFsY,GAAY/D,EAAAA,WAAiB,CAACvU,EAAuBwU,IAAyC,iBACzG,MAAMC,EAAcC,GAAA,EACd,CAAE/G,EAAUgH,CAAQ,EAAIzL,GAAA,EAExBzG,EAAOmS,EAAgB,QAAQH,EAAazU,EAAM,IAAI,EAEtD6U,EAAUpS,IAAS,KAEnB,CAAE,WAAAqS,CAAA,EAAejF,EAAAA,WAAiBkF,EAAwB,EAE1DwD,GAAiBtV,GAAA7K,EAAA4H,EAAM,QAAN,YAAA5H,EAAa,+BAAb,YAAA6K,EAA2C,KAC5D+R,EAAiBZ,GAAkBmE,EAAgBvY,EAAM,qBAAqB,EAE9EgP,EAAiB8F,GAAc,CAACL,EAAY,KAAOE,GAAW,OAAO3U,EAAM,MAAU,KAAe,CAACA,EAAM,aAC3GiV,EAAejV,EAAM,aAAe,CAACgP,GAAmB,CAACyF,EAAY,GACrES,GAAkBlG,GAAkBhP,EAAM,cAAgB,CAACyU,EAAY,GAEvEnc,GAAU+K,EAAArD,EAAM,kBAAN,YAAAqD,EAAA,KAAArD,EAAwBA,EAAM,MAAO,CAAA,GAErD,SAASnI,GAAkC,SACzC,OAAOoL,GAAA7K,EAAA4H,EAAM,kBAAiB,oBAAvB,YAAAiD,EAAA,KAAA7K,EAA2C4H,EAAM,MAC1D,CAEA,MAAMwY,GAAcrU,GAAAD,EAAAlE,EAAM,kBAAiB,iBAAvB,YAAAmE,EAAA,KAAAD,EAAwClE,EAAM,OAE5DyY,EAAiB5gB,EAAA,EACjBsd,EAAiB,CACrB,cAAenV,EAAM,cACrB,iBAAkBA,EAAM,kBAAoB,CAC1C,OAAQ3G,GAAW,MACnB,SAAUD,GAAgB,aAAA,CAC5B,EAGF,aACG,MAAA,CAAI,IAAKuU,EAAU,UAAU,QAC5B,SAAAlU,EAAAA,KAAC,MAAA,CAAI,UAAW,WAAWob,EAAU,GAAK,MAAM,GAAI,MAAO7U,EAAM,MAAO,IAAAwU,EACtE,SAAA,CAAAjb,EAAAA,IAAC6V,EAAA,CACE,GAAGwF,EAAgB,oBAAA,EACpB,UAAW,kFAEX,gBAACQ,GAAA,CACC,SAAA,CAAA7b,EAAAA,IAAC2V,GAAA,CACC,MAAOlP,EAAM,MACb,eAAAgP,EACA,YAAAiG,EACA,eAAgBjV,EAAM,eACtB,mBAAoBA,EAAM,mBAC1B,eAAgBA,EAAM,eACtB,cAAeA,EAAM,aAAA,CAAA,QAGtBoP,EAAA,CAAI,GAAIwF,EAAgB,oBAAoBM,CAAc,EACzD,SAAA3b,EAAAA,IAAC6U,GAAA,CACE,GAAG+G,EACJ,MAAOnV,EAAM,MACb,QAAA1H,EACA,QAAS0H,EAAM,QACf,SAAUgV,EACV,aAAc,CAAE,KAAME,EAAiBpR,GAAU,MAAQA,GAAU,MAAA,EACnE,aAAcwJ,EAAsB,YACpC,KAAK,SACL,WAAY,GACZ,iBAAkBtN,EAAM,gBAAA,CAAA,CAC1B,CACF,CAAA,CAAA,CACF,CAAA,CAAA,EAEFvG,EAAAA,KAAC2V,EAAA,CACE,GAAGwF,EAAgB,kBAAA,EACpB,UAAW,oGAEX,SAAA,CAAAnb,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAF,EAAAA,IAAC+M,GAAA,CACE,GAAG6O,EACJ,MAAOnV,EAAM,MACb,QAASyY,EACT,KAAMD,CAAA,CAAA,EAERjf,EAAAA,IAACiW,GAAA,CACE,GAAG2F,EACJ,MAAOnV,EAAM,MACb,QAAA1H,EACA,KAAAmK,EACA,WAAYzC,EAAM,iBAAiB,WACnC,sBAAuBA,EAAM,iBAAiB,sBAC9C,YAAa,CAACA,EAAM,iBAAiB,sBAChC,CAACA,EAAM,iBAAiB,mBAC7B,eAAe,MAAA,CAAA,CACjB,EACF,EACAzG,EAAAA,IAACyW,GAAA,CACE,GAAGmF,EACJ,MAAOnV,EAAM,MACb,WAAYA,EAAM,WAClB,eAAewL,EAAAxL,EAAM,mBAAN,YAAAwL,EAAA,KAAAxL,EAAyB1H,EAAO,CAAA,CACjD,EACF,EAEC,CAACuc,GACAtb,EAAAA,IAACiV,GAAA,CACC,MAAOxO,EAAM,MACb,WAAYA,EAAM,WAClB,qBAAsBA,EAAM,iBAAiB,qBAC7C,mBAAoBA,EAAM,iBAAiB,kBAAA,CAAA,EAI9C,CAACA,EAAM,iBAAiB,sBAAwB,CAACA,EAAM,iBAAiB,oBACvEzG,EAAAA,IAAC+V,GAAA,CAA0B,MAAOtP,EAAM,MAAO,WAAYA,EAAM,iBAAiB,UAAA,CAAW,CAAA,EAEjG,EAEC,CAACA,EAAM,mBACNzG,EAAAA,IAAC8R,GAAA,CACC,MAAOrL,EAAM,MACb,gBAAiBA,EAAM,gBACvB,iBAAkBA,EAAM,iBACxB,mBAAoB,gEACpB,oBAAqByB,GAAO,mBAC3B,GAAG0T,CAAA,CAAA,CACN,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CACF,CAEJ,CAAC,EAEDmD,GAAU,aAAe,CACvB,eAAgBxJ,GAChB,mBAAoBpM,EAAiB,MACrC,KAAM,IACR,EAMO,MAAMgW,GAAqB1Y,GAE9BzG,MAACwG,IAAoB,GAAIC,EAAM,MAAM,GAAI,eAAgBsY,GAAW,WAAYtY,CAAA,CAAO,kFCjJrFc,GAAY,mBACZC,GAAYC,EAAgB,iBAAiBF,EAAS,EAI5D,SAAS6X,GAAiB7gB,EAAmBgd,EAAoC,CAC/E,OAAIlU,EAAY,OAAO9I,CAAK,EACnBgd,EAAaO,GAAmBf,GAErC1T,EAAY,cAAc9I,CAAK,EAC1Bgd,EAAauD,GAA0BD,GAEzCtD,EAAa4D,GAAoBJ,EAC1C,CAOO,MAAMvD,GAA2Bnd,EAAAA,cAAmD,CACzF,WAAY,EACd,CAAC,EA6BM,SAASghB,GAAU5Y,EAAoC,CAC5D,KAAM,CAAE,WAAA8U,CAAA,EAAejF,EAAAA,WAAiBkF,EAAwB,EAC1D,CAAEtW,EAAYoa,CAAc,EAAItX,EAAAA,SAAwB,EAAK,EAC7D,CAAE,eAAgBuX,CAAA,EAAmB9Y,EAErC+Y,EAAiBC,GAAmB,kBAAA,EAE1C,OACEvf,EAAAA,KAAAoI,WAAA,CACE,SAAA,CAAAtI,EAAAA,IAAC,MAAA,CAAI,UAAW,qBAAqBkI,GAAO,SAAS,GAElD,SAAAzB,EAAM,OAAO,IAAI,CAAC4S,EAAGqG,IAAQ,CAC5B,MAAMC,EAAYP,GAAiB/F,EAAGkC,CAAU,EAM1CqE,EAA4B,OAAO,UAAUnZ,EAAM,qBAAqB,EAC1EA,EAAM,sBACN,EAEEoZ,EAAWN,GAAkBA,EAAe,iBAAA,EAAqB,GAAKA,EAAe,UAAUlG,EAAE,EAAE,EACrGkG,EAAe,cACflG,EAEE7M,EAAgB,OAAO/F,EAAM,kBAAqB,WACpDA,EAAM,iBAAiBiZ,CAAG,EAC1B,CACA,kBAAmBE,EAA4BF,CAAA,EAGnD,OACE1f,EAAAA,IAAC8f,GAAA,CACC,UAAYrZ,EAAM,MAAQ,CAAC8U,GAAgB,CAAE,GAAIlC,EAAE,GAAI,KAAMwG,CAAA,EAC7D,UAAW3X,GAAO,UAClB,WAAAhD,EACA,cAAAoa,EAGA,SAAApf,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACZ,SAAA,CAAAuG,EAAM,iBACLzG,EAAAA,IAAC+f,GAAA,CACC,UAAU,eACV,GAAI1G,EAAE,GACN,UAAW,GAAG7R,GAAU,gBAAgB,CAAC,KAAK6R,EAAE,IAAI,GACpD,SAAU,IAAMkG,EAAe,aAAalG,EAAE,EAAE,EAChD,QAASkG,EAAe,UAAUlG,EAAE,EAAE,CAAA,CAAA,EAG1CrZ,EAAAA,IAAC2f,EAAA,CACC,MAAOtG,EACP,MAAOqG,EACP,gBAAiBjZ,EAAM,gBACvB,eAAgBA,EAAM,eACtB,mBAAoBA,EAAM,mBAC1B,WAAYA,EAAM,WAClB,iBAAkBA,EAAM,iBACxB,cAAA+F,EACA,eAAgB/F,EAAM,eACtB,uBAAwBA,EAAM,uBAC9B,sBAAuBA,EAAM,sBAC7B,YAAaA,EAAM,YACnB,2BAA4BA,EAAM,2BAClC,kBAAmBA,EAAM,kBACzB,UAAWA,EAAM,UACjB,QAASA,EAAM,QACf,iBAAkBA,EAAM,iBACxB,iBAAkBA,EAAM,gBAAA,CAAA,CAC1B,CAAA,CACF,CAAA,EAhCK,GAAG4S,EAAE,EAAE,IAAIqG,CAAG,EAAA,CAmCzB,CAAC,CAAA,CACH,EAECjZ,EAAM,SACLzG,EAAAA,IAACb,GAAA,CAAW,QAASqgB,EAAgB,QAAS/Y,EAAM,OAAA,CAAS,CAAA,EAEjE,CAEJ","x_google_ignoreList":[4]}