pcm-agents 0.6.76 → 0.6.78

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 (187) hide show
  1. package/dist/cjs/components-position-selector.cjs.entry.js +1 -1
  2. package/dist/cjs/index-C_qhED9Z.js +2 -6
  3. package/dist/cjs/{index-DJuHr4W9.js → index-DOCJeM7I.js} +3 -3
  4. package/dist/cjs/{index-DJuHr4W9.js.map → index-DOCJeM7I.js.map} +1 -1
  5. package/dist/cjs/index.cjs.js +1 -1
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/cjs/oem-htws-modal.cjs.entry.js +1 -1
  8. package/dist/cjs/oem-jd-modal.cjs.entry.js +2 -2
  9. package/dist/cjs/oem-jlpp-modal.cjs.entry.js +1 -1
  10. package/dist/cjs/oem-jlsx-modal.cjs.entry.js +24 -2
  11. package/dist/cjs/oem-jlsx-modal.cjs.entry.js.map +1 -1
  12. package/dist/cjs/oem-jlsx-modal.entry.cjs.js.map +1 -1
  13. package/dist/cjs/oem-jlzz-modal.cjs.entry.js +1 -1
  14. package/dist/cjs/oem-mnct-modal.cjs.entry.js +1 -1
  15. package/dist/cjs/oem-mnms-modal.cjs.entry.js +1 -1
  16. package/dist/cjs/oem-qgqjl-modal.cjs.entry.js +1 -1
  17. package/dist/cjs/oem-zygh-modal.cjs.entry.js +1 -1
  18. package/dist/cjs/{pcm-1zhanshi-mnms-modal_28.cjs.entry.js → pcm-1zhanshi-mnms-modal_29.cjs.entry.js} +540 -108
  19. package/dist/cjs/pcm-1zhanshi-mnms-modal_29.cjs.entry.js.map +1 -0
  20. package/dist/cjs/pcm-agents.cjs.js +1 -1
  21. package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +19 -2
  22. package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js.map +1 -1
  23. package/dist/cjs/pcm-hr-chat-modal.entry.cjs.js.map +1 -1
  24. package/dist/cjs/{sentry-reporter-COJ0pOg4.js → sentry-reporter-BY3e-WWj.js} +3 -3
  25. package/dist/cjs/{sentry-reporter-COJ0pOg4.js.map → sentry-reporter-BY3e-WWj.js.map} +1 -1
  26. package/dist/collection/components/oem-jlsx-modal/oem-jlsx-modal.js +22 -0
  27. package/dist/collection/components/oem-jlsx-modal/oem-jlsx-modal.js.map +1 -1
  28. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js +19 -0
  29. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js.map +1 -1
  30. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +17 -0
  31. package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
  32. package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js +12 -11
  33. package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js.map +1 -1
  34. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js +12 -0
  35. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js.map +1 -1
  36. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js +88 -2
  37. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js.map +1 -1
  38. package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.js +20 -19
  39. package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.js.map +1 -1
  40. package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.js +108 -3
  41. package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.js.map +1 -1
  42. package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.js +17 -0
  43. package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.js.map +1 -1
  44. package/dist/collection/components/pcm-zygh-v2-modal/pcm-zygh-v2-modal.js +14 -14
  45. package/dist/collection/components/pcm-zygh-v2-modal/pcm-zygh-v2-modal.js.map +1 -1
  46. package/dist/components/components-position-selector.js +1 -1
  47. package/dist/components/index.js +1 -1
  48. package/dist/components/oem-htws-modal.js +6 -6
  49. package/dist/components/oem-jd-modal.js +4 -4
  50. package/dist/components/oem-jlpp-modal.js +8 -8
  51. package/dist/components/oem-jlsx-modal.js +28 -6
  52. package/dist/components/oem-jlsx-modal.js.map +1 -1
  53. package/dist/components/oem-jlzz-modal.js +6 -6
  54. package/dist/components/oem-mnct-modal.js +8 -8
  55. package/dist/components/oem-mnms-modal.js +9 -9
  56. package/dist/components/oem-qgqjl-modal.js +8 -8
  57. package/dist/components/oem-zygh-modal.js +6 -6
  58. package/dist/components/{p-CGRQB-kz.js → p-9hnllPbt.js} +3 -3
  59. package/dist/components/{p-CGRQB-kz.js.map → p-9hnllPbt.js.map} +1 -1
  60. package/dist/components/{p-nFix5BDn.js → p-B7cdvqSY.js} +4 -4
  61. package/dist/components/{p-nFix5BDn.js.map → p-B7cdvqSY.js.map} +1 -1
  62. package/dist/components/{p-BZeNORff.js → p-BnkPmLIU.js} +111 -6
  63. package/dist/components/p-BnkPmLIU.js.map +1 -0
  64. package/dist/components/{p-DtCXILg5.js → p-C4KAf-6-.js} +3 -3
  65. package/dist/components/{p-DtCXILg5.js.map → p-C4KAf-6-.js.map} +1 -1
  66. package/dist/components/{p-pTzOe1-b.js → p-C6OdIxkm.js} +3 -3
  67. package/dist/components/{p-pTzOe1-b.js.map → p-C6OdIxkm.js.map} +1 -1
  68. package/dist/components/{p-BJnD41Qm.js → p-DHwXxizT.js} +3 -3
  69. package/dist/components/{p-BJnD41Qm.js.map → p-DHwXxizT.js.map} +1 -1
  70. package/dist/components/{p-Caxrsbp0.js → p-Da-8BxdM.js} +24 -5
  71. package/dist/components/p-Da-8BxdM.js.map +1 -0
  72. package/dist/components/{p--B9t4xVs.js → p-QwH3TimN.js} +3 -3
  73. package/dist/components/{p--B9t4xVs.js.map → p-QwH3TimN.js.map} +1 -1
  74. package/dist/components/{p-BjKpPzZZ.js → p-ikx6J73I.js} +3 -3
  75. package/dist/components/{p-BjKpPzZZ.js.map → p-ikx6J73I.js.map} +1 -1
  76. package/dist/components/{p-CvHWzHdd.js → p-qUBE1daM.js} +3 -3
  77. package/dist/components/{p-CvHWzHdd.js.map → p-qUBE1daM.js.map} +1 -1
  78. package/dist/components/pcm-1zhanshi-mnms-modal.js +5 -5
  79. package/dist/components/pcm-app-chat-modal.js +1 -1
  80. package/dist/components/pcm-ats-mnms-modal.js +5 -5
  81. package/dist/components/pcm-card.js +1 -1
  82. package/dist/components/pcm-chat-message.js +1 -1
  83. package/dist/components/pcm-digital-human.js +1 -1
  84. package/dist/components/pcm-export-records-modal.js +1 -1
  85. package/dist/components/pcm-hr-chat-modal.js +19 -2
  86. package/dist/components/pcm-hr-chat-modal.js.map +1 -1
  87. package/dist/components/pcm-htws-modal.js +7 -7
  88. package/dist/components/pcm-hyzj-modal.js +4 -4
  89. package/dist/components/pcm-jd-modal.js +4 -4
  90. package/dist/components/pcm-jlpp-modal.js +18 -17
  91. package/dist/components/pcm-jlpp-modal.js.map +1 -1
  92. package/dist/components/pcm-jlsx-modal.js +17 -5
  93. package/dist/components/pcm-jlsx-modal.js.map +1 -1
  94. package/dist/components/pcm-jlzz-modal.js +39 -8
  95. package/dist/components/pcm-jlzz-modal.js.map +1 -1
  96. package/dist/components/pcm-mnct-modal.js +4 -4
  97. package/dist/components/pcm-mnms-modal.js +8 -8
  98. package/dist/components/pcm-mnms-zp-modal.js +8 -8
  99. package/dist/components/pcm-mobile-input-btn.js +1 -1
  100. package/dist/components/pcm-mobile-upload-btn.js +1 -1
  101. package/dist/components/pcm-msbg-modal.js +4 -4
  102. package/dist/components/pcm-qgqjl-modal.js +26 -25
  103. package/dist/components/pcm-qgqjl-modal.js.map +1 -1
  104. package/dist/components/pcm-upload.js +1 -1
  105. package/dist/components/pcm-virtual-chat-modal.js +1 -1
  106. package/dist/components/pcm-zsk-chat-modal.js +19 -2
  107. package/dist/components/pcm-zsk-chat-modal.js.map +1 -1
  108. package/dist/components/pcm-zygh-modal.js +6 -6
  109. package/dist/components/pcm-zygh-v2-modal.js +18 -18
  110. package/dist/components/pcm-zygh-v2-modal.js.map +1 -1
  111. package/dist/esm/components-position-selector.entry.js +1 -1
  112. package/dist/esm/index-Bq0K-WqZ.js +2 -6
  113. package/dist/esm/{index-DBfBNGaa.js → index-CtBK1m67.js} +3 -3
  114. package/dist/esm/{index-DBfBNGaa.js.map → index-CtBK1m67.js.map} +1 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/loader.js +1 -1
  117. package/dist/esm/oem-htws-modal.entry.js +1 -1
  118. package/dist/esm/oem-jd-modal.entry.js +2 -2
  119. package/dist/esm/oem-jlpp-modal.entry.js +1 -1
  120. package/dist/esm/oem-jlsx-modal.entry.js +24 -2
  121. package/dist/esm/oem-jlsx-modal.entry.js.map +1 -1
  122. package/dist/esm/oem-jlzz-modal.entry.js +1 -1
  123. package/dist/esm/oem-mnct-modal.entry.js +1 -1
  124. package/dist/esm/oem-mnms-modal.entry.js +1 -1
  125. package/dist/esm/oem-qgqjl-modal.entry.js +1 -1
  126. package/dist/esm/oem-zygh-modal.entry.js +1 -1
  127. package/dist/esm/{pcm-1zhanshi-mnms-modal_28.entry.js → pcm-1zhanshi-mnms-modal_29.entry.js} +540 -109
  128. package/dist/esm/pcm-1zhanshi-mnms-modal_29.entry.js.map +1 -0
  129. package/dist/esm/pcm-agents.js +1 -1
  130. package/dist/esm/pcm-hr-chat-modal.entry.js +19 -2
  131. package/dist/esm/pcm-hr-chat-modal.entry.js.map +1 -1
  132. package/dist/esm/{sentry-reporter-BcA0r0vQ.js → sentry-reporter-D8jwTnnH.js} +3 -3
  133. package/dist/esm/{sentry-reporter-BcA0r0vQ.js.map → sentry-reporter-D8jwTnnH.js.map} +1 -1
  134. package/dist/pcm-agents/index.esm.js +1 -1
  135. package/dist/pcm-agents/oem-jlsx-modal.entry.esm.js.map +1 -1
  136. package/dist/pcm-agents/p-0a831595.entry.js +2 -0
  137. package/dist/pcm-agents/{p-365a351b.entry.js.map → p-0a831595.entry.js.map} +1 -1
  138. package/dist/pcm-agents/{p-d9e464fd.entry.js → p-1cc1dbcc.entry.js} +2 -2
  139. package/dist/pcm-agents/{p-cc3c0220.entry.js → p-43cefa20.entry.js} +2 -2
  140. package/dist/pcm-agents/{p-4b363eb3.entry.js → p-5bf761de.entry.js} +2 -2
  141. package/dist/pcm-agents/{p-96c41b85.entry.js → p-680bf3a3.entry.js} +2 -2
  142. package/dist/pcm-agents/p-8452f80b.entry.js +251 -0
  143. package/dist/pcm-agents/p-8452f80b.entry.js.map +1 -0
  144. package/dist/pcm-agents/{p-86c2748a.entry.js → p-890fb793.entry.js} +2 -2
  145. package/dist/pcm-agents/{p-Dz4pPCio.js → p-B1X08zm_.js} +2 -2
  146. package/dist/pcm-agents/{p-Dz4pPCio.js.map → p-B1X08zm_.js.map} +1 -1
  147. package/dist/pcm-agents/{p-zJbvNgZt.js → p-BmPGiYO3.js} +2 -2
  148. package/dist/pcm-agents/{p-zJbvNgZt.js.map → p-BmPGiYO3.js.map} +1 -1
  149. package/dist/pcm-agents/{p-a54ca8e2.entry.js → p-a31fa268.entry.js} +2 -2
  150. package/dist/pcm-agents/{p-4b257381.entry.js → p-ad6ce0c9.entry.js} +2 -2
  151. package/dist/pcm-agents/{p-41b4b6bb.entry.js → p-b80f01e6.entry.js} +2 -2
  152. package/dist/pcm-agents/{p-e442dabc.entry.js → p-c3eb9590.entry.js} +2 -2
  153. package/dist/pcm-agents/{p-92eea906.entry.js → p-eb44bda0.entry.js} +2 -2
  154. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  155. package/dist/pcm-agents/pcm-hr-chat-modal.entry.esm.js.map +1 -1
  156. package/dist/types/components/pcm-jlpp-modal/pcm-jlpp-modal.d.ts +3 -2
  157. package/dist/types/components/pcm-jlzz-modal/pcm-jlzz-modal.d.ts +14 -0
  158. package/dist/types/components/pcm-qgqjl-modal/pcm-qgqjl-modal.d.ts +3 -2
  159. package/dist/types/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.d.ts +10 -0
  160. package/dist/types/components/pcm-zygh-v2-modal/pcm-zygh-v2-modal.d.ts +4 -4
  161. package/dist/types/components.d.ts +36 -12
  162. package/package.json +1 -1
  163. package/dist/cjs/pcm-1zhanshi-mnms-modal_28.cjs.entry.js.map +0 -1
  164. package/dist/cjs/pcm-zygh-v2-modal.cjs.entry.js +0 -260
  165. package/dist/cjs/pcm-zygh-v2-modal.cjs.entry.js.map +0 -1
  166. package/dist/cjs/pcm-zygh-v2-modal.entry.cjs.js.map +0 -1
  167. package/dist/components/p-BZeNORff.js.map +0 -1
  168. package/dist/components/p-Caxrsbp0.js.map +0 -1
  169. package/dist/esm/pcm-1zhanshi-mnms-modal_28.entry.js.map +0 -1
  170. package/dist/esm/pcm-zygh-v2-modal.entry.js +0 -258
  171. package/dist/esm/pcm-zygh-v2-modal.entry.js.map +0 -1
  172. package/dist/pcm-agents/p-210d610a.entry.js +0 -2
  173. package/dist/pcm-agents/p-210d610a.entry.js.map +0 -1
  174. package/dist/pcm-agents/p-365a351b.entry.js +0 -2
  175. package/dist/pcm-agents/p-6551d616.entry.js +0 -251
  176. package/dist/pcm-agents/p-6551d616.entry.js.map +0 -1
  177. package/dist/pcm-agents/pcm-zygh-v2-modal.entry.esm.js.map +0 -1
  178. /package/dist/pcm-agents/{p-d9e464fd.entry.js.map → p-1cc1dbcc.entry.js.map} +0 -0
  179. /package/dist/pcm-agents/{p-cc3c0220.entry.js.map → p-43cefa20.entry.js.map} +0 -0
  180. /package/dist/pcm-agents/{p-4b363eb3.entry.js.map → p-5bf761de.entry.js.map} +0 -0
  181. /package/dist/pcm-agents/{p-96c41b85.entry.js.map → p-680bf3a3.entry.js.map} +0 -0
  182. /package/dist/pcm-agents/{p-86c2748a.entry.js.map → p-890fb793.entry.js.map} +0 -0
  183. /package/dist/pcm-agents/{p-a54ca8e2.entry.js.map → p-a31fa268.entry.js.map} +0 -0
  184. /package/dist/pcm-agents/{p-4b257381.entry.js.map → p-ad6ce0c9.entry.js.map} +0 -0
  185. /package/dist/pcm-agents/{p-41b4b6bb.entry.js.map → p-b80f01e6.entry.js.map} +0 -0
  186. /package/dist/pcm-agents/{p-e442dabc.entry.js.map → p-c3eb9590.entry.js.map} +0 -0
  187. /package/dist/pcm-agents/{p-92eea906.entry.js.map → p-eb44bda0.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"pcm-virtual-chat-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAgB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACnJ,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC,CAAC,eAAe;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAO7D,MAAM,OAAO,mBAAmB;IAC9B;;OAEG;IAC2B,KAAK,CAAU;IAE7C;;OAEG;IACsB,MAAM,GAAY,KAAK,CAAC;IAEjD;;OAEG;IACM,QAAQ,GAAkB,EAAE,CAAC;IAEtC;;OAEG;IACsB,MAAM,CAAU;IAEzC;;OAEG;IACsB,cAAc,CAAU;IAEjD;;OAEG;IACM,SAAS,GAAY,KAAK,CAAC;IAEpC;;OAEG;IACM,uBAAuB,GAAuB,IAAI,CAAC;IAEnD,gBAAgB,GAAY,KAAK,CAAC;IAE3C,+BAA+B;IACpB,WAAW,CAAc;IAEpC;;OAEG;IACM,cAAc,CAAwC;IAE/D;;OAEG;IACM,iBAAiB,CAA2C;IAErE;;OAEG;IACK,YAAY,GAAW,QAAQ,CAAC;IAExC;;OAEG;IACK,gBAAgB,GAAW,GAAG,CAAC;IAEvC;;;OAGG;IACK,oBAAoB,GAAW,EAAE,CAAC;IAE1C,aAAa;IACJ,WAAW,GAAY,KAAK,CAAC;IAC7B,eAAe,GAAuB,IAAI,CAAC;IAC3C,YAAY,GAAgB,IAAI,CAAC;IACjC,aAAa,GAAyB,IAAI,CAAC;IAC3C,iBAAiB,GAAW,CAAC,CAAC;IAC9B,eAAe,GAAY,KAAK,CAAC;IACjC,cAAc,GAAQ,IAAI,CAAC;IAC3B,kBAAkB,GAAW,CAAC,CAAC;IAC/B,eAAe,GAAY,KAAK,CAAC;IACjC,YAAY,GAAQ,IAAI,CAAC;IACzB,eAAe,GAAW,EAAE,CAAC,CAAC,UAAU;IAEjD,uBAAuB;IACf,QAAQ,GAA4B,IAAI,CAAC;IAEjD;;OAEG;IACM,qBAAqB,GAAW,CAAC,CAAC;IAE3C;;OAEG;IACM,iBAAiB,CAA2C;IAE5D,oBAAoB,GAAY,KAAK,CAAC;IAE/C;;OAEG;IACK,UAAU,GAAY,KAAK,CAAC;IAEpC,gBAAgB;IACP,gBAAgB,GAAY,KAAK,CAAC;IAE3C;;OAEG;IACM,oBAAoB,GAAW,EAAE,CAAC;IAClC,2BAA2B,GAAW,EAAE,CAAC;IACzC,aAAa,GAAW,EAAE,CAAC;IAC3B,0BAA0B,GAAY,KAAK,CAAC;IAC5C,sBAAsB,GAAY,KAAK,CAAC;IACxC,2BAA2B,GAA+C,EAAE,CAAC;IAC7E,qBAAqB,GAAY,KAAK,CAAC;IACvC,6BAA6B,GAAY,KAAK,CAAC;IAExD;;OAEG;IACM,wBAAwB,GAAW,EAAE,CAAC;IAE/C,YAAY;IACJ,eAAe,GAAgB,IAAI,GAAG,EAAE,CAAC;IACzC,gBAAgB,GAA+B,IAAI,GAAG,EAAE,CAAC;IAEjE;;OAEG;IACM,sBAAsB,GAAY,KAAK,CAAC;IAEjD;;OAEG;IACK,SAAS,CAAU;IAE3B;;;;;OAKG;IACK,YAAY,GAAW,CAAC,CAAC;IAEjC;;OAEG;IACK,WAAW,GAAW,EAAE,CAAC;IAEjC;;OAEG;IACK,YAAY,GAAW,GAAG,CAAC;IAEnC;;OAEG;IACK,sBAAsB,GAAY,KAAK,CAAC;IAEhD;;OAEG;IACM,cAAc,CAAwC;IAE/D;;OAEG;IACM,qBAAqB,CAA+C;IAE7E;;OAEG;IACM,YAAY,CAAqB;IAE1C;;OAEG;IACM,WAAW,CAAqB;IAEzC;;OAEG;IACsB,YAAY,GAAwB,EAAE,CAAC;IAEhE;;OAEG;IACK,KAAK,CAAU;IAEvB;;OAEG;IACM,SAAS,GAAW,EAAE,CAAC;IAEhC,qBAAqB;IACZ,eAAe,GAAY,KAAK,CAAC;IAElC,oBAAoB,CAAa;IAGhC,WAAW,GAAkB,IAAI,CAAC;IAE3C;;;;;;;;;;;;;;;;;;OAkBG;IAEH,aAAa;IACJ,gBAAgB,GAAY,KAAK,CAAC;IAClC,wBAAwB,GAAY,KAAK,CAAC;IAEnD,aAAa;IACJ,qBAAqB,GAAY,KAAK,CAAC;IAEhD,eAAe;IACN,4BAA4B,GAAY,KAAK,CAAC;IAEvD;;OAEG;IACM,iBAAiB,GAAY,KAAK,CAAC;IAE5C,uBAAuB;IACN,iBAAiB,GAAY,IAAI,CAAC;IAGnD,iBAAiB,CAAC,QAAgB;QAChC,uCAAuC;QACvC,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAGD;;;OAGG;IAEH,KAAK,CAAC,kBAAkB,CAAC,MAAe;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;IAClC,CAAC;IAED,iBAAiB;QACf,kBAAkB;QAClB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAS,cAAc,CAAC,CAAC;YACjE,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE1E,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAED,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE;YAC1C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;QAIH,yBAAyB;QACzB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,8CAA8C;gBAC9C,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,WAAW;gBACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAC7B,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAChC,CAAC;gBACD,8CAA8C;gBAC9C,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3C,CAAC,EAAE,CAAC,CAAC,CAAC;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAGD,eAAe;IACP,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnD,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAChC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,gBAAgB;gBACxB,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,QAAiB;QAC/D,yBAAyB;QACzB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,aAAa;QACb,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACpC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAEpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAEjF,sBAAsB;QACtB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC;QAE1C,4BAA4B;QAC5B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,GAAG;gBAClB,GAAG,IAAI,CAAC,YAAY;gBACpB,SAAS,EAAE,QAAQ;aACpB,CAAC;QACJ,CAAC;QACD,4BAA4B;QAC5B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG;gBAClB,GAAG,IAAI,CAAC,YAAY;gBACpB,YAAY,EAAE,wDAAwD;aACvE,CAAC;QACJ,CAAC;QAED,WAAW;QACX,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,oBAAoB;YAC9C,eAAe,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO;YAC7C,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,OAAO;YACxC,KAAK,EAAE,SAAS,EAAE,YAAY;YAC9B,MAAM,EAAE,EAAE,EAAE,OAAO;YACnB,aAAa,EAAE,EAAE,EAAE,OAAO;YAC1B,QAAQ,EAAE,EAAE,EAAE,KAAK;YACnB,mBAAmB,EAAE,EAAE,EAAE,OAAO;YAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO;YAC7D,cAAc,EAAE,EAAE,EAAE,SAAS;YAC7B,MAAM,EAAE,QAAQ,EAAE,OAAO;YACzB,KAAK,EAAE,IAAI,EAAE,OAAO;YACpB,cAAc;YACd,IAAI,EAAE,IAAI,EAAE,YAAY;YACxB,WAAW,EAAE,IAAI,EAAE,WAAW;SAC/B,CAAC;QAEF,WAAW;QACX,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC;QAG1C,SAAS;QACT,MAAM,WAAW,GAAQ;YACvB,aAAa,EAAE,WAAW;YAC1B,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,kBAAkB;SACvC,CAAC;QAEF,mBAAmB;QACnB,WAAW,CAAC,MAAM,GAAG;YACnB,YAAY;YACZ,GAAG,IAAI,CAAC,YAAY;SACrB,CAAC;QAEF,MAAM,cAAc,CAAC;YACnB,GAAG,EAAE,4BAA4B;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBAEjC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACjD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;wBAC1B,eAAe,EAAE,IAAI,CAAC,eAAe;wBACrC,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;qBACZ,CAAC,CAAC;gBACL,CAAC;gBAED,kCAAkC;gBAClC,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnF,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBACrC,CAAC;gBAED,aAAa;gBACb,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;oBAEhC,eAAe;oBACf,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAE5B,oCAAoC;oBACpC,MAAM,UAAU,GAAG,OAAO,IAAI,MAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE,MAAM,IAAI,EAAE,CAAC;oBAEnF,WAAW;oBACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;wBAC1B,eAAe,EAAE,IAAI,CAAC,cAAc;wBACpC,uBAAuB,EAAE,IAAI,CAAC,qBAAqB;wBACnD,WAAW,EAAE,UAAU,EAAE,WAAW;qBACrC,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9F,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;oBACjF,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;oBAC1C,IAAI,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;gBACvD,CAAC;gBAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAC/D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;4BAChB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;4BACtB,iBAAiB;4BACjB,MAAM,cAAc,GAAgB;gCAClC,GAAG,IAAI,CAAC,uBAAuB;gCAC/B,MAAM;gCACN,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,uBAAuB,CAAC,EAAE;gCACtD,WAAW,EAAE,IAAI;gCACjB,qBAAqB;gCACrB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,uBAAuB,CAAC,mBAAmB;gCACjG,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB,CAAC,cAAc;6BACnF,CAAC;4BACF,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC;wBAChD,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;oBACjC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACvB,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;wBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,EAAE,KAAK,CAAC,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC9B,aAAa,CAAC,SAAS,CAAC;oBACtB,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;gBACH,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;oBACjC,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,wBAAwB;oBACnC,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,GAAG;oBACd,GAAG,IAAI,CAAC,QAAQ;oBAChB;wBACE,GAAG,UAAU;wBACb,MAAM,EAAE,eAAe;wBACvB,KAAK,EAAE,KAAK;wBACZ,WAAW,EAAE,KAAK;qBACnB;iBACF,CAAC;gBACF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBACpC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACzB,CAAC;YACD,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,4CAA4C;gBAC5C,IAAI,IAAI,CAAC,qBAAqB,KAAK,CAAC,EAAE,CAAC;oBACrC,kCAAkC;oBAClC,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;4BACtB,kBAAkB;4BAClB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;4BAClC,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;4BAClC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;wBACrC,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB;gBAC9B,CAAC;gBAED,cAAc;gBACd,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC;gBACrD,eAAe,CAAC,WAAW,GAAG,KAAK,CAAC;gBAGpC,IAAI,IAAI,CAAC,SAAS,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;oBAChE,qBAAqB;oBACrB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBACzD,CAAC;gBAED,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBAEpC,SAAS;gBACT,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAEpD,OAAO;gBACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAE7B,yBAAyB;gBACzB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACnD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBAED,uBAAuB;gBACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,cAAc;IACN,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;QAElC,IAAI,CAAC;YACH,WAAW;YACX,MAAM,0BAA0B,GAAG,MAAM,eAAe,CAAC;gBACvD,GAAG,EAAE,2BAA2B;gBAChC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE;oBACJ,eAAe,EAAE,IAAI,CAAC,cAAc;iBACrC;aACF,CAAC,CAAC;YACH,SAAS;YACT,IAAI,0BAA0B,CAAC,OAAO,IAAI,0BAA0B,CAAC,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;gBAChI,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;YAED,SAAS;YACT,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,GAAG,EAAE,uBAAuB;gBAC5B,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE;oBACJ,eAAe,EAAE,IAAI,CAAC,cAAc;oBACpC,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,EAAE;iBACV;aACF,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC3C,MAAM,iBAAiB,GAAkB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC9D,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;oBAEtC,mBAAmB;oBACnB,OAAO;wBACL,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,eAAe,EAAE,GAAG,CAAC,eAAe;wBACpC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;wBACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;wBACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;wBACxB,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;wBACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;wBAC5B,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,IAAI,EAAE;wBAClD,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;wBACxC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,QAAQ;wBAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,YAAY;wBACZ,IAAI,EAAE,OAAO;wBACb,WAAW,EAAE,KAAK;qBACnB,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC;gBAElC,kCAAkC;gBAClC,IAAI,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,MAAM,IAAI,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,qBAAqB;gBAC7B,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACtG,UAAU;gBACV,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;gBACxC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;gBACnC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;gBAEnC,2BAA2B;gBAC3B,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBACtC,mBAAmB;oBACnB,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC;wBACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,2BAA2B,CAAC;oBAC/D,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,UAAU,CAAC,GAAG,EAAE;oBACd,SAAS;oBACT,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,CAAC,EAAE,GAAG,CAAC,CAAC;YAEV,CAAC;iBAAM,IAAI,kBAAkB,EAAE,CAAC;gBAC9B,mBAAmB;gBACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAE5B,gBAAgB;gBAChB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;oBACxC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;oBACnC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;oBAEnC,2BAA2B;oBAC3B,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;wBACtC,mBAAmB;wBACnB,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC;4BACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,2BAA2B,CAAC;wBAC/D,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;IACD,oBAAoB;QAC1B,yBAAyB;QACzB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,aAAa;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;QAExC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAED,SAAS;IACD,KAAK,CAAC,cAAc;QAC1B,uBAAuB;QACvB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;gBACvD,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;oBACtB,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;oBACtB,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBACzB;aACF,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;YAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAElC,SAAS;YACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,aAAa;YACb,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAE/B,iBAAiB;YACjB,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;YAExC,oBAAoB;YACpB,IAAI,aAAa,CAAC;YAClB,IAAI,CAAC;gBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;oBACxC,QAAQ,EAAE,QAAQ;oBAClB,kBAAkB,EAAE,MAAM,EAAE,kBAAkB;oBAC9C,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;iBAC7C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,wBAAwB;gBACxB,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC;oBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;wBACxC,kBAAkB,EAAE,MAAM,EAAE,eAAe;wBAC3C,kBAAkB,EAAE,KAAK;qBAC1B,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,kBAAkB;oBAClB,IAAI,CAAC;wBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBACpB,eAAe;wBACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;4BACvB,IAAI,EAAE,0BAA0B;4BAChC,OAAO,EAAE,yBAAyB;4BAClC,OAAO,EAAE,UAAU;yBACpB,CAAC,CAAC;wBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;wBAC7B,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YAEnC,MAAM,MAAM,GAAe,EAAE,CAAC;YAE9B,aAAa,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE;gBACtC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC,CAAC;YAEF,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE;gBAC9B,iBAAiB;gBACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC,CAAC;YAEF,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC1B,IAAI,CAAC;oBACH,sBAAsB;oBACtB,MAAM,QAAQ,GAAG,QAAQ,IAAI,WAAW,CAAC;oBACzC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAElD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACpB,eAAe;wBACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;4BACvB,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,SAAS;yBACnB,CAAC,CAAC;wBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;wBAC7B,OAAO;oBACT,CAAC;oBAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBAEzB,aAAa;oBACb,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;wBAC9B,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE;4BACP,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;4BACnE,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,IAAI,EAAE,IAAI,CAAC,IAAI;yBAChB;qBACF,CAAC,CAAC;oBAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,iBAAiB;oBACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACvB,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,WAAW;wBACpB,OAAO,EAAE,KAAK;qBACf,CAAC,CAAC;oBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;wBACjC,MAAM,EAAE,qBAAqB;wBAC7B,SAAS,EAAE,mBAAmB;wBAC9B,KAAK,EAAE,WAAW;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC;YAEF,OAAO;YACP,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAE/C,aAAa;gBACb,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAC9B,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE;wBACP,WAAW,EAAE,IAAI,CAAC,gBAAgB;wBAClC,QAAQ,EAAE,aAAa,CAAC,QAAQ;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,cAAc;gBACd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,kBAAkB;oBAC3B,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;gBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,cAAc,CAAC,YAAY,CAAC,UAAU,EAAE;oBACtC,MAAM,EAAE,gBAAgB;oBACxB,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,UAAU;YACV,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9E,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,CAAC;gBAE1E,gBAAgB;gBAChB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACtF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACnC,CAAC;gBAED,YAAY;gBACZ,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAErC,WAAW;YACX,IAAI,YAAY,GAAG,QAAQ,CAAC;YAE5B,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACrC,YAAY,GAAG,gBAAgB,CAAC;YAClC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC1C,YAAY,GAAG,eAAe,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC7C,YAAY,GAAG,mCAAmC,CAAC;YACrD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBACjD,YAAY,GAAG,aAAa,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,qBAAqB,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;YAChC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;YAEH,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,gBAAgB;gBACxB,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,eAAe;IACP,iBAAiB,CAAC,MAAmB;QAC3C,gBAAgB;QAChB,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,qBAAqB,CAAqB,CAAC;YAC3G,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;gBAC3B,YAAY;gBACZ,IAAI,CAAC;oBACH,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;oBAChC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBAC9B,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;wBAC9B,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE;4BAC/B,MAAM,EAAE,mBAAmB;4BAC3B,SAAS,EAAE,wBAAwB;4BACnC,KAAK,EAAE,QAAQ;yBAChB,CAAC,CAAC;wBACH,aAAa,CAAC,SAAS,CAAC;4BACtB,KAAK,EAAE,GAAG;4BACV,OAAO,EAAE,QAAQ;yBAClB,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;oBAEzC,4CAA4C;oBAC5C,IAAI,CAAC;wBACH,uBAAuB;wBACvB,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,MAAgC,CAAC,CAAC;wBACxE,YAAY,CAAC,GAAG,GAAG,SAAS,CAAC;wBAE7B,oBAAoB;wBACpB,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE;4BAC1B,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;wBACjC,CAAC,CAAC;oBACJ,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;wBACtC,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE;4BACpC,MAAM,EAAE,mBAAmB;4BAC3B,SAAS,EAAE,wBAAwB;4BACnC,KAAK,EAAE,WAAW;yBACnB,CAAC,CAAC;wBACH,aAAa,CAAC,SAAS,CAAC;4BACtB,KAAK,EAAE,QAAQ;4BACf,OAAO,EAAE,WAAW;yBACrB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,OAAO;IACC,aAAa;QACnB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAEzB,QAAQ;YACR,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,WAAW;YACX,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;YAED,SAAS;YACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;IACrC,CAAC;IAED,aAAa;IACL,mBAAmB,GAAG,GAAG,EAAE;QACjC,qBAAqB;QACrB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,YAAY;QACZ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC,CAAC;IAEF,oBAAoB;IACZ,uBAAuB,GAAG,CAAC,KAAY,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA0B,CAAC;QAClD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC,OAAO,CAAC;IACnD,CAAC,CAAC;IAEF,eAAe;IACP,wBAAwB,GAAG,GAAG,EAAE;QACtC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC;IAEF,eAAe;IACP,oBAAoB,GAAG,GAAG,EAAE;QAClC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,mBAAmB;IACX,6BAA6B,GAAG,GAAG,EAAE;QAC3C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC;IAGF,UAAU;IACF,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAE/B,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,YAAY;YAC1C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,SAAS;YAEvC,kBAAkB;YAClB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/E,MAAM,QAAQ,GAAG,UAAU,aAAa,EAAE,CAAC;YAE3C,WAAW;YACX,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAEvF,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,IAAI,EACJ,EAAE,EACF;gBACE,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CACF,CAAC;YACF,qBAAqB;YACrB,aAAa;YACb,MAAM,iBAAiB,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAErE,cAAc;YACd,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,qBAAqB;gBACrB,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,IAAI,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC,UAAU;YAC1C,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,qBAAqB;gBAC7B,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,YAAY;YAC3C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,WAAW;IACH,gBAAgB,GAAG,GAAG,EAAE;QAC9B,YAAY;QACZ,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC,CAAC;IAEF,iBAAiB;IACT,oBAAoB,GAAG,GAAG,EAAE;QAClC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,iBAAiB;IACT,wBAAwB,GAAG,GAAG,EAAE;QACtC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,CAAC,CAAC;IAEF,cAAc;IACd,oBAAoB;QAClB,QAAQ,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE7E,UAAU;QACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,OAAO;QACP,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,YAAY;QACZ,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAE9B,cAAc;QACd,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,2BAA2B,CAAC,kBAA4B;QACpE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,kCAAkC;YAClC,OAAO;QACT,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YACpC,IAAI,CAAC;gBACH,uBAAuB;gBACvB,MAAM,eAAe,CAAC;oBACpB,GAAG,EAAE,oCAAoC;oBACzC,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE;wBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;wBACjC,SAAS,EAAE,IAAI;wBACf,WAAW,EAAE;4BACX,KAAK,EAAE,CAAC;yBACT;wBACD,UAAU,EAAE;4BACV,MAAM,EAAE,iBAAiB;yBAC1B;wBACD,UAAU,EAAE,MAAM;qBACnB;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,aAAa,EAAE,KAAK,CAAC,CAAC;gBAChD,aAAa;gBACb,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;oBACjC,MAAM,EAAE,6BAA6B;oBACrC,SAAS,EAAE,wBAAwB;oBACnC,KAAK,EAAE,QAAQ,IAAI,YAAY;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAGD;;OAEG;IACK,KAAK,CAAC,sBAAsB;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;gBACrC,GAAG,EAAE,qCAAqC;gBAC1C,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAElF,IAAI,qBAAqB,EAAE,CAAC;oBAC1B,IAAI,CAAC,2BAA2B,GAAG,qBAAqB,CAAC;oBACzD,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC;gBACpD,CAAC;gBAED,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;gBACtC,CAAC;gBAED,kBAAkB;gBAClB,IAAI,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvF,IAAI,CAAC,2BAA2B,GAAG,gBAAgB,CAAC;oBAEpD,aAAa;oBACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;oBACjF,MAAM,sBAAsB,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;oBAEnH,uCAAuC;oBACvC,MAAM,sBAAsB,GAAa,EAAE,CAAC;oBAE5C,iBAAiB;oBACjB,IAAI,sBAAsB,CAAC,SAAS,EAAE,CAAC;wBACrC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;oBAChE,CAAC;oBAED,8BAA8B;oBAC9B,IAAI,qBAAqB,IAAI,qBAAqB,KAAK,sBAAsB,CAAC,SAAS,EAAE,CAAC;wBACxF,sBAAsB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACrD,CAAC;oBAGD,UAAU;oBACV,IAAI,CAAC,gCAAgC,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;oBAE5E,kCAAkC;oBAClC,IAAI,sBAAsB,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACrE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,sBAAsB,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;wBAC/E,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,oBAAoB;oBACpB,IAAI,qBAAqB,EAAE,CAAC;wBAC1B,IAAI,CAAC,gCAAgC,CAAC,CAAC,qBAAqB,CAAC,EAAE,eAAe,CAAC,CAAC;oBAClF,CAAC;gBACH,CAAC;YAEH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,wBAAwB;gBAChC,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB,CAAC,IAAY;QAClD,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAExC,yBAAyB;YACzB,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;YACD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAErC,cAAc;QACd,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAE1C,IAAI,CAAC;YACH,SAAS;YACT,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC;gBAC3C,GAAG,EAAE,oCAAoC;gBACzC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE;oBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE;wBACX,KAAK,EAAE,CAAC;qBACT;oBACD,UAAU,EAAE;wBACV,MAAM,EAAE,iBAAiB;qBAC1B;oBACD,UAAU,EAAE,MAAM;iBACnB;aACF,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YAE1C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC5B,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,aAAa,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;YAExC,SAAS;YACT,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACtD,wBAAwB;YACxB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,4BAA4B;gBAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAElC,eAAe;gBACf,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC7B,OAAO;gBACT,CAAC;gBAED,gBAAgB;gBAChB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC/B,mCAAmC;oBACnC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;oBAC9C,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,cAAc;oBACd,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,2BAA2B;gBACnC,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YAEH,6BAA6B;YAC7B,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,mBAAmB;YACnB,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC5C,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC;QAE1B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;oBACrC,GAAG,EAAE,sCAAsC;oBAC3C,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE;wBACJ,MAAM,EAAE,MAAM;qBACf;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjD,CAAC;gBAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;gBAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;oBAC7D,OAAO,OAAO,CAAC,QAAQ,CAAC;gBAC1B,CAAC;qBAAM,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YAElE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAClC,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,iBAA0B,KAAK;QACnF,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAElC,kBAAkB;YAClB,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;YACrC,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;YACvC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC;QAG9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAEnC,6BAA6B;YAC7B,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;QAEjE,gBAAgB;QAChB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9F,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,wBAAwB;QACxB,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClG,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC;QACnD,CAAC;QAED,iBAAiB;QACjB,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,cAAc,CAAC;YACrB,kBAAkB;YAClB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YACrG,uBAAuB;QACzB,CAAC;gBAAS,CAAC;YACT,aAAa;YACb,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC;YAC9B,YAAY,CAAC,GAAG,GAAG,QAAQ,CAAC;YAC5B,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW;YACtC,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,SAAS;YAEjD,IAAI,UAAU,GAAG,KAAK,CAAC;YAEvB,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,IAAI,UAAU;oBAAE,OAAO;gBACvB,UAAU,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,MAAM,WAAW,GAAG,CAAC,KAAW,EAAE,EAAE;gBAClC,IAAI,UAAU;oBAAE,OAAO;gBACvB,UAAU,GAAG,IAAI,CAAC;gBAClB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,YAAY,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;gBAClE,YAAY,CAAC,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;gBAC9D,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACvD,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACvD,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC;YACxB,CAAC,CAAC;YAEF,iBAAiB;YACjB,YAAY,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;YAC/D,YAAY,CAAC,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;YAE3D,SAAS;YACT,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACpD,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAEpD,iBAAiB;YACjB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBACnC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ;YAEnB,OAAO;YACP,YAAY,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,uBAAuB,CAAC,SAAmB;QACvD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;QAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;YAE7C,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,YAAY,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,YAAY,QAAQ,QAAQ,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1I,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,YAAY,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChI,oBAAoB;YACtB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAGD;;;OAGG;IACK,gCAAgC,CAAC,SAAmB,EAAE,UAAkB,EAAE;QAChF,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,OAAO,CAAC,GAAG,CAAC,QAAQ,SAAS,CAAC,MAAM,mBAAmB,OAAO,GAAG,CAAC,CAAC;QAEnE,iBAAiB;QACjB,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACpD,OAAO,CAAC,IAAI,CAAC,iBAAiB,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,uBAAuB,GAAG,KAAK,IAAI,EAAE;QAC3C,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAE9D,yBAAyB;YACzB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,2BAA2B,CAAC;YAC7D,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACxC,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC;YACnD,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YAEnC,6BAA6B;YAC7B,IAAI,eAAe,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC;gBAC/C,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC,aAAa;gBACjD,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;gBAC3C,OAAO,CAAC,qBAAqB;YAC/B,CAAC;YAED,uBAAuB;YACvB,yBAAyB;YACzB,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxG,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,kBAAkB,GAAG,GAAG,EAAE;QAChC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;IAC3C,CAAC,CAAC;IAEF;;OAEG;IACK,yBAAyB,GAAG,KAAK,IAAI,EAAE;QAC7C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC;YAE1C,WAAW;YACX,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAE9B,gBAAgB;YAChB,eAAe;YACf,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAE7B,eAAe;YACf,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;YAEpC,2BAA2B;YAC3B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAChC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,6CAA6C;gBACnE,qDAAqD;gBACrD,YAAY;YACd,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACvC,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,2BAA2B;gBACnC,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,uBAAuB,GAAG,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;gBACxB,eAAe,EAAE,IAAI,CAAC,cAAc;gBACpC,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;YAEH,WAAW;YACX,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAExC,OAAO;YACP,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,wBAAwB,GAAG,GAAG,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC;IAC5C,CAAC,CAAC;IAEF;;OAEG;IACK,wBAAwB,GAAG,GAAW,EAAE;QAC9C,4BAA4B;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC7E,CAAC,CAAC;IAEM,iBAAiB;QACvB,qBAAqB;QACrB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,aAAa;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;YACjF,MAAM,sBAAsB,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;YACnH,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC;YAEhD,OAAO,CACL,WAAK,KAAK,EAAC,iBAAiB;gBAC1B,WAAK,KAAK,EAAC,oBAAoB,IAAE,WAAW,CAAO,CAC/C,CACP,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,6BAA6B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzD,OAAO,CACL,WAAK,KAAK,EAAC,iBAAiB;gBAC1B,WAAK,KAAK,EAAC,oBAAoB,0GAA0B,CACrD,CACP,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACxE,OAAO,CACL,WAAK,KAAK,EAAC,2BAA2B;gBACpC,WAAK,KAAK,EAAC,oBAAoB,EAAC,SAAS,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAQ;gBACrF,IAAI,CAAC,uBAAuB,CAAC,WAAW,IAAI,CAC3C,WAAK,KAAK,EAAC,kBAAkB;oBAC3B,eAAa;oBACb,eAAa;oBACb,eAAa,CACT,CACP,CACG,CACP,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAExG,IAAI,qBAAqB,EAAE,CAAC;YAC1B,OAAO,CACL,WAAK,KAAK,EAAC,iBAAiB;gBAC1B,WAAK,KAAK,EAAC,oBAAoB,EAAC,SAAS,EAAE,qBAAqB,CAAC,MAAM,GAAQ,CAC3E,CACP,CAAC;QACJ,CAAC;QAED,OAAO,CACL,WAAK,KAAK,EAAC,iBAAiB;YAC1B,WAAK,KAAK,EAAC,oBAAoB,0GAA0B,CACrD,CACP,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,UAAU,GAAG;YACjB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SAC5B,CAAC;QAEF,MAAM,cAAc,GAAG;YACrB,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,IAAI,CAAC,UAAU;YAC7B,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;SACvC,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI,CAAC,UAAU;SACtC,CAAC;QAEF,OAAO,CACL,WAAK,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU;YACzC,WAAK,KAAK,EAAE,cAAc;gBAExB,cAAQ,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB;oBACzD,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;wBACjE,YAAM,CAAC,EAAC,uGAAuG,GAAG,CAC9G,CACC;gBAGR,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAC9C,WAAK,KAAK,EAAC,0BAA0B;oBACnC,aACE,QAAQ,QACR,WAAW,QACX,IAAI,EAAE,CAAC,IAAI,CAAC,0BAA0B,EACtC,KAAK,EAAE,CAAC,IAAI,CAAC,0BAA0B,EACvC,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAC9B,KAAK,EAAC,gCAAgC,EACtC,OAAO,EAAE,IAAI,CAAC,uBAAuB,EACrC,GAAG,EAAE,EAAE,CAAC,EAAE;4BACR,IAAI,EAAE,EAAE,CAAC;gCACP,mBAAmB;gCACnB,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,2BAA2B,CAAC;gCACtF,EAAE,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;gCAE3D,uBAAuB;gCACvB,2BAA2B;gCAC3B,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;oCAClC,EAAE,CAAC,IAAI,EAAE,CAAC;gCACZ,CAAC;4BACH,CAAC;wBACH,CAAC,GAGD,CACE,CACP;gBAEA,IAAI,CAAC,kBAAkB,EAAE;gBAG1B,WAAK,KAAK,EAAC,qBAAqB;oBAC9B,WAAK,KAAK,EAAC,cAAc;wBAEvB,WAAK,KAAK,EAAC,sBAAsB,IAAE,IAAI,CAAC,iBAAiB,EAAE,CAAO;wBAEjE,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,cAAc,IAAI,CAC9E,WAAK,KAAK,EAAC,gCAAgC;4BACzC,cACE,KAAK,EAAC,sBAAsB,EAC5B,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAChC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,WAAW,EACrD,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAEnF,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CACrC,CACL,CACP;wBACA,IAAI,CAAC,wBAAwB,EAAE,CAC5B,CACF;gBAGN,WAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;oBACjD,yBACE,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAC7B,UAAU,EAAC,4CAAS,EACpB,MAAM,EAAC,0BAAM,EACb,UAAU,EAAC,0BAAM,EACjB,MAAM,EAAC,QAAQ,EACf,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAC/B,QAAQ,EAAE,IAAI,CAAC,6BAA6B,EAC5C,QAAQ,EAAE,IAAI,CAAC,wBAAwB;wBAEvC,WAAK,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;4BAClC,WACE,KAAK,EAAE;oCACL,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,SAAS;oCAChB,UAAU,EAAE,KAAK;oCACjB,YAAY,EAAE,MAAM;oCACpB,SAAS,EAAE,QAAQ;iCACpB;;gCAGA,CAAC,GAAG,EAAE;oCACL,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oCACnH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;oCAChD,MAAM,OAAO,GAAG,cAAc,GAAG,EAAE,CAAC;oCACpC,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gCACzF,CAAC,CAAC,EAAE,CACA;4BAEN,WACE,KAAK,EAAE;oCACL,OAAO,EAAE,MAAM;oCACf,UAAU,EAAE,QAAQ;oCACpB,GAAG,EAAE,KAAK;oCACV,OAAO,EAAE,WAAW;oCACpB,UAAU,EAAE,SAAS;oCACrB,MAAM,EAAE,mBAAmB;oCAC3B,YAAY,EAAE,KAAK;oCACnB,KAAK,EAAE,SAAS;oCAChB,QAAQ,EAAE,MAAM;oCAChB,YAAY,EAAE,MAAM;iCACrB;gCAED,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;oCACjE,YAAM,CAAC,EAAC,oDAAoD,GAAG,CAC3D;gCACN,+EAAuB,CACnB;4BAEN,WACE,KAAK,EAAE;oCACL,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,SAAS;oCAChB,UAAU,EAAE,KAAK;oCACjB,YAAY,EAAE,MAAM;iCACrB,yFAGG;4BAEN,aACE,KAAK,EAAE;oCACL,OAAO,EAAE,MAAM;oCACf,UAAU,EAAE,QAAQ;oCACpB,GAAG,EAAE,KAAK;oCACV,MAAM,EAAE,SAAS;oCACjB,OAAO,EAAE,OAAO;oCAChB,UAAU,EAAE,MAAM;iCACnB;gCAED,aACE,IAAI,EAAC,UAAU,EACf,KAAK,EAAE;wCACL,KAAK,EAAE,MAAM;wCACb,MAAM,EAAE,MAAM;wCACd,WAAW,EAAE,SAAS;wCACtB,MAAM,EAAE,SAAS;wCACjB,MAAM,EAAE,GAAG;qCACZ,EACD,OAAO,EAAE,IAAI,CAAC,wBAAwB,EACtC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,GACtC;gCACF,YACE,KAAK,EAAE;wCACL,QAAQ,EAAE,MAAM;wCAChB,KAAK,EAAE,SAAS;wCAChB,MAAM,EAAE,SAAS;wCACjB,UAAU,EAAE,KAAK;qCAClB,uDAGI,CACD,CACJ,CACY,CAChB;gBAGN,WAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;oBACjD,yBACE,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAClC,UAAU,EAAC,gCAAO,EAClB,MAAM,EAAC,0BAAM,EACb,UAAU,EAAC,cAAI,EACf,MAAM,EAAC,QAAQ,EACf,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAC/B,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EACvC,QAAQ,EAAE,IAAI,CAAC,wBAAwB;wBAEvC,WAAK,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;4BAClC,WACE,KAAK,EAAE;oCACL,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,SAAS;oCAChB,UAAU,EAAE,KAAK;oCACjB,YAAY,EAAE,MAAM;iCACrB,IAEA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CACvD,CACF,CACY,CAChB;gBACN,WAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;oBAEjD,yBACE,MAAM,EAAE,IAAI,CAAC,4BAA4B,EACzC,UAAU,EAAC,4CAAS,EACpB,MAAM,EAAC,0BAAM,EACb,UAAU,EAAC,cAAI,EACf,MAAM,EAAC,QAAQ,EACf,IAAI,EAAE,IAAI,CAAC,yBAAyB,EACpC,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EACvC,QAAQ,EAAE,IAAI,CAAC,wBAAwB;wBAEvC,WAAK,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IACjC,CAAC,GAAG,EAAE;4BACL,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;4BACtD,OAAO,CACL;gCACE,WACE,KAAK,EAAE;wCACL,QAAQ,EAAE,MAAM;wCAChB,KAAK,EAAE,SAAS;wCAChB,UAAU,EAAE,KAAK;wCACjB,YAAY,EAAE,MAAM;wCACpB,SAAS,EAAE,QAAQ;qCACpB;;oCAEI,aAAa;8CACd;gCAEL,aAAa,GAAG,CAAC,IAAI,CACpB,WACE,KAAK,EAAE;wCACL,OAAO,EAAE,MAAM;wCACf,UAAU,EAAE,YAAY;wCACxB,GAAG,EAAE,KAAK;wCACV,OAAO,EAAE,WAAW;wCACpB,UAAU,EAAE,SAAS;wCACrB,MAAM,EAAE,mBAAmB;wCAC3B,YAAY,EAAE,KAAK;wCACnB,KAAK,EAAE,SAAS;wCAChB,QAAQ,EAAE,MAAM;wCAChB,YAAY,EAAE,MAAM;qCACrB;oCAED,WACE,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE;wCAE5C,YAAM,CAAC,EAAC,oDAAoD,GAAG,CAC3D;oCACN;wCACE,uCAAoB;4TACf,CACH,CACP;gCAED,WACE,KAAK,EAAE;wCACL,QAAQ,EAAE,MAAM;wCAChB,KAAK,EAAE,SAAS;wCAChB,UAAU,EAAE,KAAK;wCACjB,SAAS,EAAE,QAAQ;qCACpB,+HAGG,CACF,CACP,CAAC;wBACJ,CAAC,CAAC,EAAE,CACA,CACY,CAChB,CACF,CACF,CACP,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CACL,WAAK,KAAK,EAAC,6BAA6B;YACtC,aACE,KAAK,EAAC,oBAAoB,EAC1B,QAAQ,QACR,WAAW,QACX,KAAK,QACL,KAAK,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAClC,GAAG,EAAE,EAAE,CAAC,EAAE;oBACR,IAAI,EAAE,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACjD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;oBACrB,CAAC;gBACH,CAAC,GACD,CACE,CACP,CAAC;IACJ,CAAC;IAEO,wBAAwB;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;iBACpD,QAAQ,EAAE;iBACV,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAE1E,OAAO,CACL,WAAK,KAAK,EAAC,sBAAsB;gBAC/B,WAAK,KAAK,EAAC,gBAAgB;oBACzB,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO;oBAChC,WAAK,KAAK,EAAC,cAAc,GAAO,CAC5B;gBACN,YAAM,KAAK,EAAC,iBAAiB;oBAC1B,OAAO;;oBAAG,OAAO,CACb;gBACP,cAAQ,KAAK,EAAC,sBAAsB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE;oBAC5E,WACE,GAAG,EAAC,gFAAgF,EACpF,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,GAAG,EAAC,cAAI,EACR,KAAK,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE,GAC5C,CACK,CACL,CACP,CAAC;QACJ,CAAC;QAED,OAAO,WAAK,KAAK,EAAC,sBAAsB,IAAE,IAAI,CAAC,qBAAqB,EAAE,CAAO,CAAC;IAChF,CAAC;IAEO,qBAAqB;QAC3B,WAAW;QACX,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CACL,WAAK,KAAK,EAAC,6BAA6B;gBACtC,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;oBACjE,YAAM,CAAC,EAAC,oDAAoD,GAAG,CAC3D;gBACN,gBAAO,IAAI,CAAC,WAAW,CAAQ,CAC3B,CACP,CAAC;QACJ,CAAC;QAED,OAAO;QACP,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CACL,WAAK,KAAK,EAAC,uBAAuB;gBAChC,iDAAkB,CACd,CACP,CAAC;QACJ,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClD,OAAO,CACL,WAAK,KAAK,EAAC,+BAA+B;gBACxC,WAAK,KAAK,EAAC,uBAAuB,GAAO;gBACzC,wEAA0B,CACtB,CACP,CAAC;QACJ,CAAC;QAED,QAAQ;QACR,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,CACL,WAAK,KAAK,EAAC,+BAA+B;gBACxC,WAAK,KAAK,EAAC,uBAAuB,GAAO;gBACzC,8CAAoB,CAChB,CACP,CAAC;QACJ,CAAC;QAED,OAAO;QACP,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACnD,OAAO,CACL,WAAK,KAAK,EAAC,+BAA+B;gBACxC,WAAK,KAAK,EAAC,uBAAuB,GAAO;gBACzC,8CAAoB,CAChB,CACP,CAAC;QACJ,CAAC;QAED,OAAO;QACP,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CACL,WAAK,KAAK,EAAC,uBAAuB;gBAChC;oBAAO,IAAI,CAAC,eAAe;wEAAiB,CACxC,CACP,CAAC;QACJ,CAAC;QAED,OAAO;QACP,OAAO,CACL,WAAK,KAAK,EAAC,6BAA6B;YACtC,WACE,GAAG,EAAC,gFAAgF,EACpF,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,GAAG,EAAC,0BAAM,GACV;YACF,2CAAiB,CACb,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element, Watch, Method } from '@stencil/core';\r\nimport { sendSSERequest, sendHttpRequest, uploadFileToBackend, fetchAgentInfo, getSupportedMimeType, convertAudioToText } from '../../utils/utils';\r\nimport { showMessage } from '../../utils/message-utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\nimport { StreamCompleteEventData, ConversationStartEventData, InterviewCompleteEventData, RecordingErrorEventData, RecordingStatusChangeEventData } from '../../interfaces/events';\r\nimport { ErrorEventBus } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store'; // 导入 authStore\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\n\r\n@Component({\r\n tag: 'pcm-virtual-chat-modal',\r\n styleUrls: ['pcm-virtual-chat-modal.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class ChatVirtualAPPModal {\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token?: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop({ mutable: true }) zIndex?: number;\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * 默认发送文本\r\n */\r\n @Prop() defaultQuery: string = '你好!聘才猫';\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<InterviewCompleteEventData>;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n /**\r\n * 数字人视频相关状态\r\n */\r\n @State() digitalHumanVideoUrl: string = '';\r\n @State() digitalHumanDefaultVideoUrl: string = '';\r\n @State() virtualmanKey: string = '';\r\n @State() isPlayingDigitalHumanVideo: boolean = false;\r\n @State() digitalHumanVideoReady: boolean = false;\r\n @State() digitalHumanOpeningContents: Array<{ text: string, video_url: string }> = [];\r\n @State() isPlayingWelcomeVideo: boolean = false;\r\n @State() isGeneratingDigitalHumanVideo: boolean = false;\r\n\r\n /**\r\n * 待播放的生成视频URL(当开场白视频播放时,暂存生成的视频URL)\r\n */\r\n @State() pendingGeneratedVideoUrl: string = '';\r\n\r\n // 视频预加载缓存管理\r\n private preloadedVideos: Set<string> = new Set();\r\n private preloadingVideos: Map<string, Promise<void>> = new Map();\r\n\r\n /**\r\n * 是否正在等待数字人视频播放完成\r\n */\r\n @State() waitingForDigitalHuman: boolean = false;\r\n\r\n /**\r\n * 虚拟数字人ID,指定则开启虚拟数字人功能\r\n */\r\n @Prop() digitalId?: string;\r\n\r\n /**\r\n * 数字人开场白索引,用于选择开场白和开场视频(可选:0, 1, 2)\r\n * 0、您好,我是聘才猫 AI 面试助手。很高兴为你主持这场面试!在开始前,请确保:身处安静、光线充足的环境。网络顺畅,摄像头和麦克风工作正常。现在我正在查看本次面试的相关信息,为您生成专属面试题,马上就好,请稍等片刻。</br>\r\n * 1、您好,我是您的 AI 面试助手。欢迎参加本次AI面试!为了获得最佳效果,请确认:您在安静、明亮的环境中。您的网络稳定,摄像头和麦克风已开启。我们正在后台为您准备本次专属面试内容,很快开始,请稍候。<br>\r\n * 2、您好,我是您的 AI 面试助手。面试马上开始。趁此片刻,请快速确认:周围安静吗?光线足够吗?网络没问题?摄像头和麦克风准备好了吗?我们正在为您加载个性化的面试环节,稍等就好!\r\n */\r\n @Prop() openingIndex: number = 0;\r\n\r\n /**\r\n * 等待录制时间(秒)默认10\r\n */\r\n @Prop() waitingTime: number = 10;\r\n\r\n /**\r\n * 数字人视频播放速率(0.5-2.0之间),默认1.0\r\n */\r\n @Prop() playbackRate: number = 1.0;\r\n\r\n /**\r\n * 是否显示结束面试按钮\r\n */\r\n @Prop() showEndInterviewButton: boolean = false;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<RecordingErrorEventData>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<RecordingStatusChangeEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop({ mutable: true }) customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n /**\r\n * 智能体头像URL(从后端获取)\r\n */\r\n @State() agentLogo: string = '';\r\n\r\n // 添加新的状态属性来跟踪任务是否已完成\r\n @State() isTaskCompleted: boolean = false;\r\n\r\n private tokenInvalidListener: () => void;\r\n\r\n\r\n @State() deviceError: string | null = null;\r\n\r\n /**\r\n * 面试流程状态管理说明:\r\n *\r\n * 核心状态:\r\n * - isTaskCompleted: 任务是否已完成(面试正常结束)\r\n * - isEndingInterview: 是否正在执行结束面试流程(用户主动结束)\r\n * - isRecording: 是否正在录制视频\r\n * - waitingToRecord: 是否正在等待开始录制\r\n * - waitingForDigitalHuman: 是否正在等待数字人视频播放完成\r\n * - isLoading: 是否正在等待AI回复\r\n * - isUploadingVideo: 是否正在上传视频\r\n * - isGeneratingDigitalHumanVideo: 是否正在生成数字人视频\r\n *\r\n * 流程控制原则:\r\n * 1. 一旦 isTaskCompleted 或 isEndingInterview 为 true,所有录制和等待流程都应停止\r\n * 2. isEndingInterview 设置为 true 后,只允许发送结束面试消息\r\n * 3. 结束面试按钮在 isTaskCompleted 或 isEndingInterview 为 true 时置灰禁用\r\n * 4. 所有可能触发新录制的地方都需要检查这两个状态\r\n */\r\n\r\n // 添加二次确认相关状态\r\n @State() showConfirmModal: boolean = false;\r\n @State() skipConfirmThisInterview: boolean = false;\r\n\r\n // 添加关闭确认相关状态\r\n @State() showCloseConfirmModal: boolean = false;\r\n\r\n // 添加结束面试确认相关状态\r\n @State() showEndInterviewConfirmModal: boolean = false;\r\n\r\n /**\r\n * 标记是否正在执行结束面试流程\r\n */\r\n @State() isEndingInterview: boolean = false;\r\n\r\n // 添加内部状态标志,用于控制异步操作的执行\r\n @State() private isComponentActive: boolean = true;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 公共方法:设置组件活动状态\r\n * 可被外部调用来控制组件是否继续执行异步操作\r\n */\r\n @Method()\r\n async setComponentActive(active: boolean): Promise<void> {\r\n console.log('设置组件活动状态:', active);\r\n this.isComponentActive = active;\r\n }\r\n\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n } else {\r\n // 如果没有提供 zIndex,尝试从缓存中读取\r\n const cachedZIndex = configStore.getItem<number>('modal-zIndex');\r\n if (cachedZIndex) {\r\n this.zIndex = cachedZIndex;\r\n } else {\r\n this.zIndex = 1000;\r\n configStore.setItem('modal-zIndex', 1000);\r\n }\r\n }\r\n\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 确保 customInputs 是一个对象\r\n if (!this.customInputs) {\r\n this.customInputs = {};\r\n }\r\n\r\n // 如果没有设置助手头像,尝试获取智能体头像\r\n if (this.botId) {\r\n this.fetchAgentLogo();\r\n }\r\n\r\n // 添加数字人初始化日志\r\n console.log('componentWillLoad - 数字人相关状态:', {\r\n digitalId: this.digitalId,\r\n isOpen: this.isOpen,\r\n conversationId: this.conversationId,\r\n virtualmanKey: this.virtualmanKey,\r\n });\r\n\r\n\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 初始化数字人功能\r\n if (this.digitalId) {\r\n console.log('准备初始化数字人功能...');\r\n this.initializeDigitalHuman();\r\n }\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => {\r\n this.sendMessageToAPI(this.defaultQuery);\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n\r\n // 添加获取智能体信息的方法\r\n private async fetchAgentLogo() {\r\n if (!this.botId) return;\r\n\r\n try {\r\n const agentInfo = await fetchAgentInfo(this.botId);\r\n\r\n if (agentInfo && agentInfo.logo) {\r\n this.agentLogo = agentInfo.logo;\r\n }\r\n } catch (error) {\r\n SentryReporter.captureError(error, {\r\n action: 'fetchAgentLogo',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '获取智能体信息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取智能体信息失败',\r\n });\r\n }\r\n }\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n // 如果任务已完成或正在结束面试,不允许发送消息\r\n if (this.isTaskCompleted && !this.isEndingInterview) {\r\n console.log('任务已完成,不允许发送消息');\r\n return;\r\n }\r\n\r\n // 发送新消息时重置状态\r\n this.waitingForDigitalHuman = false;\r\n this.digitalHumanVideoReady = false;\r\n\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = '';\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || '请开始';\r\n\r\n // 如果有视频URL,添加到customInputs中\r\n if (videoUrl) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n video_url: videoUrl,\r\n };\r\n }\r\n // 如果没有设置url_callback,则使用默认值\r\n if (!this.customInputs.url_callback) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n url_callback: 'https://tagents.ylzhaopin.com/agents/api/test/callback',\r\n };\r\n }\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 临时ID,将被服务器返回的ID替换\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: this.customInputs || {}, // 输入参数\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // 初始为空\r\n message_files: [], // 消息附件\r\n feedback: {}, // 反馈\r\n retriever_resources: [], // 检索资源\r\n created_at: Math.floor(Date.now() / 1000).toString(), // 创建时间\r\n agent_thoughts: [], // 代理思考过程\r\n status: 'normal', // 消息状态\r\n error: null, // 错误信息\r\n // 添加组件内部使用的字段\r\n time: time, // 消息时间(显示用)\r\n isStreaming: true, // 是否正在流式输出\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId, // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs,\r\n };\r\n\r\n await sendSSERequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n data: requestData,\r\n onMessage: data => {\r\n console.log(new Date().toLocaleString());\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n }\r\n\r\n // 添加对任务结束的判断\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫任务结束')) {\r\n console.log('检测到任务结束事件:', data);\r\n\r\n // 设置标志,表示任务已结束\r\n this.isTaskCompleted = true;\r\n\r\n // 获取当前AI回复内容,优先使用LLMText,否则使用answer\r\n const aiResponse = llmText || answer || this.currentStreamingMessage?.answer || '';\r\n\r\n // 触发面试完成事件\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n current_question_number: this.currentQuestionNumber,\r\n ai_response: aiResponse, // 添加AI回复内容\r\n });\r\n }\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫数字人题目')) {\r\n const digital_human_list = JSON.parse(data.data.process_data.digital_human_list);\r\n console.log('数字人题目:', digital_human_list);\r\n this.precreateDigitalHumanVideos(digital_human_list);\r\n }\r\n\r\n if (data.event === 'message') {\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n // 更新消息时保持完整的消息结构\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n id: data.message_id || this.currentStreamingMessage.id,\r\n isStreaming: true,\r\n // 如果服务器返回了其他字段,也更新它们\r\n retriever_resources: data.retriever_resources || this.currentStreamingMessage.retriever_resources,\r\n agent_thoughts: data.agent_thoughts || this.currentStreamingMessage.agent_thoughts,\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n }\r\n }\r\n }\r\n if (data.event === 'message_end') {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: error => {\r\n console.error('发生错误:', error);\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '消息发送失败,请稍后再试',\r\n });\r\n SentryReporter.captureError(error, {\r\n action: 'sendMessageToAPI',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '消息发送失败',\r\n });\r\n\r\n this.messages = [\r\n ...this.messages,\r\n {\r\n ...newMessage,\r\n answer: '消息发送失败,请检查网络。',\r\n error: error,\r\n isStreaming: false,\r\n },\r\n ];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n // 根据currentQuestionNumber判断是否清空customInputs\r\n if (this.currentQuestionNumber === 0) {\r\n // 发送第一条消息后,清空指定的 customInputs 字段\r\n setTimeout(() => {\r\n if (this.customInputs) {\r\n // 只清除指定的字段,其他字段保留\r\n delete this.customInputs.job_info;\r\n delete this.customInputs.file_url;\r\n delete this.customInputs.file_name;\r\n }\r\n }, 1000); // 给一些时间让第一条消息处理完成\r\n }\r\n\r\n // 获取最新的AI回复内容\r\n const latestAIMessage = this.currentStreamingMessage;\r\n latestAIMessage.isStreaming = false;\r\n\r\n\r\n if (this.digitalId && latestAIMessage && latestAIMessage.answer) {\r\n // 如果开启了数字人功能,生成数字人视频\r\n console.log('生成数字人视频:', latestAIMessage.answer);\r\n this.generateDigitalHumanVideo(latestAIMessage.answer);\r\n }\r\n\r\n this.currentStreamingMessage = null;\r\n\r\n // 更新消息列表\r\n this.messages = [...this.messages, latestAIMessage];\r\n\r\n // 增加计数\r\n this.currentQuestionNumber++;\r\n\r\n // 如果任务已完成或正在结束面试,不执行后续流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,停止后续流程');\r\n return;\r\n }\r\n\r\n // 如果开启了数字人,等待数字人视频播放完成\r\n if (this.digitalId) {\r\n this.waitingForDigitalHuman = true;\r\n console.log('等待数字人视频播放完成...');\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 修改加载历史消息的方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n let conversationStatus = false;\r\n this.digitalHumanVideoReady = true\r\n\r\n try {\r\n // 首先获取会话状态\r\n const conversationStatusResponse = await sendHttpRequest({\r\n url: `/sdk/v1/chat/conversation`,\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n },\r\n });\r\n // 处理会话状态\r\n if (conversationStatusResponse.success && conversationStatusResponse.data && conversationStatusResponse.data.run_status == '结束') {\r\n conversationStatus = true;\r\n }\r\n\r\n // 获取历史消息\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(parseInt(msg.created_at) * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建完整的消息对象,保持统一结构\r\n return {\r\n id: msg.id,\r\n conversation_id: msg.conversation_id,\r\n inputs: msg.inputs || {},\r\n query: msg.query || '',\r\n answer: msg.answer || '',\r\n message_files: msg.message_files || [],\r\n feedback: msg.feedback || {},\r\n retriever_resources: msg.retriever_resources || [],\r\n created_at: msg.created_at,\r\n agent_thoughts: msg.agent_thoughts || [],\r\n status: msg.status || 'normal',\r\n error: msg.error,\r\n // 组件内部使用的字段\r\n time: timeStr,\r\n isStreaming: false,\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n\r\n // 根据历史消息数量设置currentQuestionNumber\r\n this.currentQuestionNumber = formattedMessages.length || 0;\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息或会话状态失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryMessages',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '加载历史消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '加载历史消息失败,请刷新重试',\r\n });\r\n } finally {\r\n this.isLoadingHistory = false;\r\n if (this.conversationId && this.messages.length > 0 && !conversationStatus && !this.isEndingInterview) {\r\n // 不播放欢迎视频\r\n this.isPlayingDigitalHumanVideo = false;\r\n this.isPlayingWelcomeVideo = false;\r\n this.digitalHumanVideoReady = true;\r\n\r\n // 先初始化数字人,等待获取到默认视频URL后再设置\r\n this.initializeDigitalHuman().then(() => {\r\n // 确保在初始化完成后设置视频URL\r\n if (this.digitalHumanDefaultVideoUrl) {\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n }\r\n });\r\n\r\n setTimeout(() => {\r\n // 开始等待录制\r\n this.startWaitingToRecord();\r\n }, 200);\r\n\r\n } else if (conversationStatus) {\r\n // 如果会话已结束,设置任务完成状态\r\n this.isTaskCompleted = true;\r\n\r\n // 确保数字人视频状态正确设置\r\n if (this.digitalId) {\r\n this.isPlayingDigitalHumanVideo = false;\r\n this.isPlayingWelcomeVideo = false;\r\n this.digitalHumanVideoReady = true;\r\n\r\n // 先初始化数字人,等待获取到默认视频URL后再设置\r\n this.initializeDigitalHuman().then(() => {\r\n // 确保在初始化完成后设置视频URL\r\n if (this.digitalHumanDefaultVideoUrl) {\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制流程');\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = this.waitingTime;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n // 如果任务已完成或正在结束面试,不开始录制\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制');\r\n return;\r\n }\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 },\r\n },\r\n });\r\n\r\n // 如果成功获取到媒体流,清除之前的设备错误\r\n this.deviceError = null;\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 800000, // 800kbps 视频比特率限制\r\n audioBitsPerSecond: 64000, // 64kbps 音频比特率限制\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n videoBitsPerSecond: 800000, // 即使降级也保持比特率限制\r\n audioBitsPerSecond: 64000,\r\n });\r\n } catch (recorderError) {\r\n // 最后的降级选项,不设置任何参数\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (finalError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: finalError,\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = event => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = event => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: '录制过程中发生错误',\r\n details: event,\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: '录制的视频为空',\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type,\r\n },\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: '处理录制视频时出错',\r\n details: error,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-hr-chat-modal',\r\n title: '处理录制视频时出错',\r\n });\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType,\r\n },\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(startError, {\r\n action: 'startRecording',\r\n component: 'pcm-hr-chat-modal',\r\n title: '开始录制失败',\r\n });\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n\r\n // 设置设备错误状态\r\n let errorMessage = '设备访问失败';\r\n\r\n if (error.name === 'NotAllowedError') {\r\n errorMessage = '请允许访问摄像头和麦克风权限';\r\n } else if (error.name === 'NotFoundError') {\r\n errorMessage = '未检测到摄像头或麦克风设备';\r\n } else if (error.name === 'NotReadableError') {\r\n errorMessage = '您的浏览器不支持视频录制,请切换到微信或Chrome、Edge使用';\r\n } else if (error.name === 'OverconstrainedError') {\r\n errorMessage = '摄像头不支持指定的配置';\r\n } else {\r\n errorMessage = '无法访问摄像头或麦克风,请检查设备连接';\r\n }\r\n\r\n this.deviceError = errorMessage;\r\n this.showRecordingUI = false;\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: errorMessage,\r\n });\r\n\r\n SentryReporter.captureError(error, {\r\n action: 'startRecording',\r\n component: 'pcm-virtual-chat-modal',\r\n title: errorMessage,\r\n });\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('.user-video-preview') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n SentryReporter.captureError(err, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '视频播放失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: err,\r\n message: '视频播放失败',\r\n });\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n SentryReporter.captureError(urlError, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '创建对象URL失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: urlError,\r\n message: '创建对象URL失败',\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n\r\n // 清理待播放的视频URL(即使没有正在录制,也需要清理待播放状态)\r\n this.pendingGeneratedVideoUrl = '';\r\n }\r\n\r\n // 处理停止录制按钮点击\r\n private handleStopRecording = () => {\r\n // 如果已经设置了跳过确认,直接停止录制\r\n if (this.skipConfirmThisInterview) {\r\n this.stopRecording();\r\n return;\r\n }\r\n\r\n // 否则显示确认模态框\r\n this.showConfirmModal = true;\r\n };\r\n\r\n // 处理\"本次面试不再提醒\"复选框变化\r\n private handleSkipConfirmChange = (event: Event) => {\r\n const checkbox = event.target as HTMLInputElement;\r\n this.skipConfirmThisInterview = checkbox.checked;\r\n };\r\n\r\n // 处理确认模态框的取消事件\r\n private handleConfirmModalCancel = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n // 处理确认模态框的OK事件\r\n private handleConfirmModalOk = () => {\r\n this.showConfirmModal = false;\r\n this.stopRecording();\r\n };\r\n\r\n // 处理确认模态框的Cancel事件\r\n private handleConfirmModalCancelEvent = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n\r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(\r\n file,\r\n {},\r\n {\r\n tags: ['other'],\r\n },\r\n );\r\n // 使用 cos_key 作为视频标识符\r\n // 调用音频转文字API\r\n const transcriptionText = await convertAudioToText(fileInfo.cos_key);\r\n\r\n // 检查是否是结束面试流程\r\n if (this.isEndingInterview) {\r\n console.log('视频上传完成,现在发送结束面试消息');\r\n // 如果是结束面试流程,发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n } else {\r\n // 正常流程:发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || '下一题', fileInfo.cos_key);\r\n }\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n this.isEndingInterview = false; // 出错时重置标志\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '视频上传或处理失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '视频上传或处理失败',\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n // 处理关闭按钮点击\r\n private handleCloseClick = () => {\r\n // 显示关闭确认对话框\r\n this.showCloseConfirmModal = true;\r\n };\r\n\r\n // 处理关闭确认对话框的确认事件\r\n private handleCloseConfirmOk = () => {\r\n this.showCloseConfirmModal = false;\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n // 处理关闭确认对话框的取消事件\r\n private handleCloseConfirmCancel = () => {\r\n this.showCloseConfirmModal = false;\r\n };\r\n\r\n // 确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n\r\n // 清理视频预加载缓存\r\n this.preloadedVideos.clear();\r\n this.preloadingVideos.clear();\r\n\r\n // 清理待播放的视频URL\r\n this.pendingGeneratedVideoUrl = '';\r\n }\r\n\r\n /**\r\n * 预创建数字人视频\r\n */\r\n private async precreateDigitalHumanVideos(digital_human_list: string[]) {\r\n if (!this.virtualmanKey) {\r\n console.warn('VirtualmanKey尚未加载,无法预创建视频。');\r\n // 可以在此处添加逻辑,等待virtualmanKey加载后再执行\r\n return;\r\n }\r\n\r\n for (const text of digital_human_list) {\r\n if (!text || !text.trim()) continue;\r\n try {\r\n // 注意:这里只创建任务,不等待视频生成完成\r\n await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/create-video',\r\n method: 'POST',\r\n data: {\r\n VirtualmanKey: this.virtualmanKey,\r\n InputSsml: text,\r\n SpeechParam: {\r\n Speed: 1,\r\n },\r\n VideoParam: {\r\n Format: 'TransparentWebm',\r\n },\r\n DriverType: 'Text',\r\n },\r\n });\r\n } catch (error) {\r\n console.error(`为文本 \"${text}\" 创建视频任务失败:`, error);\r\n // 可以选择性地报告错误\r\n SentryReporter.captureError(error, {\r\n action: 'precreateDigitalHumanVideos',\r\n component: 'pcm-virtual-chat-modal',\r\n title: `为文本 \"${text}\" 创建视频任务失败`,\r\n });\r\n }\r\n }\r\n console.log('数字人视频预创建任务已全部发送。');\r\n }\r\n\r\n\r\n /**\r\n * 初始化数字人功能\r\n */\r\n private async initializeDigitalHuman() {\r\n if (!this.digitalId) return;\r\n\r\n try {\r\n console.log('初始化数字人功能,digitalId:', this.digitalId);\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/avatar-detail',\r\n method: 'POST',\r\n data: {\r\n avatar_id: this.digitalId\r\n }\r\n });\r\n\r\n if (response.success) {\r\n const { placeholder_video_url, virtualman_key, opening_contents } = response.data;\r\n\r\n if (placeholder_video_url) {\r\n this.digitalHumanDefaultVideoUrl = placeholder_video_url;\r\n this.digitalHumanVideoUrl = placeholder_video_url;\r\n }\r\n\r\n if (virtualman_key) {\r\n this.virtualmanKey = virtualman_key;\r\n }\r\n\r\n // 处理开场白内容(JSON格式)\r\n if (opening_contents && Array.isArray(opening_contents) && opening_contents.length > 0) {\r\n this.digitalHumanOpeningContents = opening_contents;\r\n\r\n // 验证并调整开场白索引\r\n const validIndex = Math.max(0, Math.min(2, this.openingIndex || 0)); // 限制索引范围0-2\r\n const selectedOpeningContent = this.digitalHumanOpeningContents[validIndex] || this.digitalHumanOpeningContents[0];\r\n\r\n // 按顺序准备预加载列表:1.选择的欢迎视频 2.默认占位视频 3.其他视频\r\n const orderedVideosToPreload: string[] = [];\r\n\r\n // 1. 首先加载选择的欢迎视频\r\n if (selectedOpeningContent.video_url) {\r\n orderedVideosToPreload.push(selectedOpeningContent.video_url);\r\n }\r\n\r\n // 2. 然后加载默认占位视频(如果不同于选择的欢迎视频)\r\n if (placeholder_video_url && placeholder_video_url !== selectedOpeningContent.video_url) {\r\n orderedVideosToPreload.push(placeholder_video_url);\r\n }\r\n\r\n\r\n // 使用顺序预加载\r\n this.handleVideoUrlReceivedSequential(orderedVideosToPreload, '数字人初始化(顺序)');\r\n\r\n // 播放选择的欢迎视频 - 检查是否已经在继续对话模式下设置了状态\r\n if (selectedOpeningContent.video_url && !this.digitalHumanVideoReady) {\r\n console.log('播放数字人欢迎视频:', selectedOpeningContent.video_url, '索引:', validIndex);\r\n this.playDigitalHumanVideo(selectedOpeningContent.video_url, true);\r\n }\r\n } else {\r\n // 没有欢迎视频,只预加载默认占位视频\r\n if (placeholder_video_url) {\r\n this.handleVideoUrlReceivedSequential([placeholder_video_url], '数字人初始化(仅默认视频)');\r\n }\r\n }\r\n\r\n }\r\n } catch (error) {\r\n console.error('初始化数字人失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'initializeDigitalHuman',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '数字人初始化失败',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 生成数字人视频\r\n */\r\n private async generateDigitalHumanVideo(text: string) {\r\n // 如果组件已停用,直接跳过生成视频\r\n if (!this.isComponentActive) {\r\n console.warn('组件已停用,跳过数字人视频生成');\r\n return;\r\n }\r\n\r\n if (!text.trim() || !this.virtualmanKey) {\r\n\r\n // 条件不满足时,取消等待状态并直接开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted) {\r\n console.log('数字人视频生成条件不满足,直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n return;\r\n }\r\n\r\n console.log('开始生成数字人视频,文本内容:', text);\r\n\r\n // 设置正在生成视频的状态\r\n this.isGeneratingDigitalHumanVideo = true;\r\n\r\n try {\r\n // 创建视频任务\r\n const createResponse = await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/create-video',\r\n method: 'POST',\r\n data: {\r\n VirtualmanKey: this.virtualmanKey,\r\n InputSsml: text,\r\n SpeechParam: {\r\n Speed: 1\r\n },\r\n VideoParam: {\r\n Format: 'TransparentWebm',\r\n },\r\n DriverType: \"Text\",\r\n }\r\n });\r\n\r\n console.log('数字人视频创建响应:', createResponse);\r\n\r\n if (!createResponse.success) {\r\n showMessage(createResponse.message, 'error');\r\n throw new Error(`创建视频任务失败: ${createResponse.message}`);\r\n }\r\n\r\n const taskId = createResponse.data.Payload.TaskId;\r\n console.log('视频任务创建成功,TaskId:', taskId);\r\n\r\n // 轮询查询进度\r\n const videoUrl = await this.pollVideoProgress(taskId);\r\n // 轮询完成后,再次检查组件是否仍处于活动状态\r\n if (!this.isComponentActive) {\r\n console.warn('组件已停用,跳过视频播放');\r\n return;\r\n }\r\n\r\n if (videoUrl) {\r\n // 立即预加载新生成的视频(单个视频,不需要顺序处理)\r\n await this.preloadVideo(videoUrl);\r\n\r\n // 预加载后再次检查组件状态\r\n if (!this.isComponentActive) {\r\n console.warn('组件已停用,跳过视频播放');\r\n return;\r\n }\r\n\r\n // 检查是否正在播放开场白视频\r\n if (this.isPlayingWelcomeVideo) {\r\n // 如果正在播放开场白视频,保存生成的视频URL,等待开场白播放完成\r\n console.log('正在播放开场白视频,暂存生成的视频URL,等待开场白播放完成');\r\n this.pendingGeneratedVideoUrl = videoUrl;\r\n } else {\r\n // 否则立即播放生成的视频\r\n await this.playDigitalHumanVideo(videoUrl);\r\n console.log('数字人视频生成完成,视频URL:', videoUrl);\r\n }\r\n } else {\r\n // 如果没有获取到视频URL,抛出错误\r\n throw new Error('未能获取到数字人视频URL');\r\n }\r\n\r\n } catch (error) {\r\n console.error('数字人视频生成失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'generateDigitalHumanVideo',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '数字人视频生成失败',\r\n });\r\n\r\n // 数字人视频生成失败时,取消等待状态并直接开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted) {\r\n console.log('数字人视频生成失败,直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n } finally {\r\n // 无论成功还是失败,都重置生成状态\r\n this.isGeneratingDigitalHumanVideo = false;\r\n }\r\n }\r\n\r\n /**\r\n * 轮询查询视频生成进度\r\n */\r\n private async pollVideoProgress(taskId: string): Promise<string | null> {\r\n const maxAttempts = 45;\r\n const pollInterval = 2000;\r\n\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/query-progress',\r\n method: 'POST',\r\n data: {\r\n TaskId: taskId\r\n }\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(`查询进度失败: ${response.message}`);\r\n }\r\n\r\n const payload = response.data.Payload;\r\n\r\n if (payload.Status === 'SUCCESS' && payload.Progress === 100) {\r\n return payload.MediaUrl;\r\n } else if (payload.Status === 'FAILED') {\r\n throw new Error(`视频生成失败: ${payload.FailMessage}`);\r\n }\r\n\r\n await new Promise(resolve => setTimeout(resolve, pollInterval));\r\n\r\n } catch (error) {\r\n console.error('轮询视频进度失败:', error);\r\n break;\r\n }\r\n }\r\n\r\n throw new Error('视频生成超时');\r\n }\r\n\r\n /**\r\n * 播放数字人视频\r\n */\r\n private async playDigitalHumanVideo(videoUrl: string, isWelcomeVideo: boolean = false) {\r\n console.log('开始播放数字人视频:', videoUrl, '是否为欢迎视频:', isWelcomeVideo);\r\n\r\n try {\r\n // 确保视频已预加载(如果未预加载则立即预加载)\r\n await this.preloadVideo(videoUrl);\r\n\r\n // 只通过状态来控制video元素\r\n this.digitalHumanVideoUrl = videoUrl;\r\n this.isPlayingDigitalHumanVideo = true;\r\n this.digitalHumanVideoReady = true;\r\n this.isPlayingWelcomeVideo = isWelcomeVideo;\r\n\r\n\r\n } catch (error) {\r\n console.error('播放数字人视频失败:', error);\r\n\r\n // 数字人视频播放失败时,取消等待状态并直接开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted) {\r\n console.log('数字人视频播放失败,直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 智能视频预加载管理器\r\n * 确保每个视频只预加载一次,避免重复请求\r\n */\r\n private async preloadVideo(videoUrl: string): Promise<void> {\r\n if (!videoUrl || !videoUrl.trim()) {\r\n return Promise.resolve();\r\n }\r\n\r\n const normalizedUrl = videoUrl.trim();\r\n const fileName = normalizedUrl.split('/').pop() || normalizedUrl;\r\n\r\n // 如果已经预加载过,直接返回\r\n if (this.preloadedVideos.has(normalizedUrl)) {\r\n console.log(`💾 视频已预加载,跳过: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`);\r\n return Promise.resolve();\r\n }\r\n\r\n // 如果正在预加载中,返回现有的Promise\r\n if (this.preloadingVideos.has(normalizedUrl)) {\r\n console.log(`🔄 视频正在预加载中,等待完成: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`);\r\n return this.preloadingVideos.get(normalizedUrl)!;\r\n }\r\n\r\n // 创建新的预加载Promise\r\n const preloadPromise = this.executeVideoPreload(normalizedUrl);\r\n this.preloadingVideos.set(normalizedUrl, preloadPromise);\r\n\r\n try {\r\n await preloadPromise;\r\n // 预加载成功,添加到已预加载集合\r\n this.preloadedVideos.add(normalizedUrl);\r\n console.log(`🎯 视频预加载成功: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`);\r\n } catch (error) {\r\n console.error(`💥 视频预加载失败: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`, error);\r\n // 预加载失败时不抛出错误,避免阻塞后续流程\r\n } finally {\r\n // 清理正在预加载的记录\r\n this.preloadingVideos.delete(normalizedUrl);\r\n }\r\n }\r\n\r\n /**\r\n * 执行实际的视频预加载操作\r\n */\r\n private async executeVideoPreload(videoUrl: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const preloadVideo = document.createElement('video');\r\n preloadVideo.preload = 'auto';\r\n preloadVideo.src = videoUrl;\r\n preloadVideo.muted = true; // 确保可以自动播放\r\n preloadVideo.crossOrigin = 'anonymous'; // 处理跨域问题\r\n\r\n let isResolved = false;\r\n\r\n const handleSuccess = () => {\r\n if (isResolved) return;\r\n isResolved = true;\r\n cleanup();\r\n console.log('视频预加载完成:', videoUrl);\r\n resolve();\r\n };\r\n\r\n const handleError = (event?: any) => {\r\n if (isResolved) return;\r\n isResolved = true;\r\n cleanup();\r\n console.error('视频预加载失败:', videoUrl, event);\r\n reject(new Error('视频预加载失败'));\r\n };\r\n\r\n const cleanup = () => {\r\n preloadVideo.removeEventListener('canplaythrough', handleSuccess);\r\n preloadVideo.removeEventListener('loadeddata', handleSuccess);\r\n preloadVideo.removeEventListener('error', handleError);\r\n preloadVideo.removeEventListener('abort', handleError);\r\n preloadVideo.src = '';\r\n };\r\n\r\n // 监听多种成功事件,提高兼容性\r\n preloadVideo.addEventListener('canplaythrough', handleSuccess);\r\n preloadVideo.addEventListener('loadeddata', handleSuccess);\r\n\r\n // 监听错误事件\r\n preloadVideo.addEventListener('error', handleError);\r\n preloadVideo.addEventListener('abort', handleError);\r\n\r\n // 设置超时机制,避免长时间等待\r\n setTimeout(() => {\r\n if (!isResolved) {\r\n console.warn('视频预加载超时:', videoUrl);\r\n handleError('timeout');\r\n }\r\n }, 15000); // 15秒超时\r\n\r\n // 开始加载\r\n preloadVideo.load();\r\n });\r\n }\r\n\r\n /**\r\n * 顺序预加载多个视频\r\n * 上一个视频加载完毕后立刻加载下一个视频\r\n */\r\n private async sequentialPreloadVideos(videoUrls: string[]): Promise<void> {\r\n if (!videoUrls || videoUrls.length === 0) {\r\n return;\r\n }\r\n\r\n const validUrls = videoUrls.filter(url => url && url.trim());\r\n if (validUrls.length === 0) {\r\n return;\r\n }\r\n\r\n console.log('🎬 开始顺序预加载视频:', validUrls);\r\n console.log('📋 预加载计划:');\r\n validUrls.forEach((url, index) => {\r\n const fileName = url.split('/').pop() || url;\r\n console.log(` ${index + 1}. ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`);\r\n });\r\n\r\n for (let i = 0; i < validUrls.length; i++) {\r\n const url = validUrls[i];\r\n const fileName = url.split('/').pop() || url;\r\n\r\n try {\r\n console.log(`⏳ [${i + 1}/${validUrls.length}] 正在预加载: ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`);\r\n const startTime = Date.now();\r\n\r\n await this.preloadVideo(url);\r\n\r\n const duration = Date.now() - startTime;\r\n console.log(`✅ [${i + 1}/${validUrls.length}] 预加载完成 (${duration}ms): ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`);\r\n } catch (error) {\r\n console.warn(`❌ [${i + 1}/${validUrls.length}] 预加载失败: ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`, error);\r\n // 即使单个视频失败,也继续加载下一个\r\n }\r\n }\r\n\r\n console.log('🎉 所有视频顺序预加载处理完成');\r\n }\r\n\r\n\r\n /**\r\n * 顺序视频URL处理器\r\n * 一旦获得视频URL,按顺序预加载\r\n */\r\n private handleVideoUrlReceivedSequential(videoUrls: string[], context: string = ''): void {\r\n if (!videoUrls || videoUrls.length === 0) return;\r\n\r\n const validUrls = videoUrls.filter(url => url && url.trim());\r\n if (validUrls.length === 0) return;\r\n\r\n console.log(`📥 收到${validUrls.length}个视频URL,将按顺序预加载 (${context})`);\r\n\r\n // 异步顺序预加载,不阻塞主流程\r\n this.sequentialPreloadVideos(validUrls).catch(error => {\r\n console.warn(`⚠️ 顺序预加载视频失败 (${context}):`, error);\r\n });\r\n }\r\n\r\n /**\r\n * 处理数字人视频播放结束\r\n */\r\n private handleVideoElementEnded = async () => {\r\n if (this.isPlayingDigitalHumanVideo) {\r\n console.log('数字人视频播放完成,是否为欢迎视频:', this.isPlayingWelcomeVideo);\r\n\r\n // 只通过状态来控制video元素,恢复默认视频\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n this.isPlayingDigitalHumanVideo = false;\r\n const wasWelcomeVideo = this.isPlayingWelcomeVideo;\r\n this.isPlayingWelcomeVideo = false;\r\n\r\n // 如果是开场白视频播放完成,检查是否有待播放的生成视频\r\n if (wasWelcomeVideo && this.pendingGeneratedVideoUrl) {\r\n console.log('开场白视频播放完成,开始播放生成的视频:', this.pendingGeneratedVideoUrl);\r\n const videoUrl = this.pendingGeneratedVideoUrl;\r\n this.pendingGeneratedVideoUrl = ''; // 清空待播放视频URL\r\n await this.playDigitalHumanVideo(videoUrl);\r\n return; // 播放生成的视频,不执行后续的录制流程\r\n }\r\n\r\n // 只有非欢迎视频播放完成后,才开始录制流程\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted && !this.isEndingInterview && !wasWelcomeVideo) {\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * 处理面试结束按钮点击 - 显示二次确认模态框\r\n */\r\n private handleInterviewEnd = () => {\r\n // 如果已经在结束流程中或任务已完成,不允许再次点击\r\n if (this.isEndingInterview || this.isTaskCompleted) {\r\n console.log('已在结束流程中或任务已完成,忽略点击');\r\n return;\r\n }\r\n\r\n console.log('点击结束面试按钮,显示确认模态框');\r\n this.showEndInterviewConfirmModal = true;\r\n };\r\n\r\n /**\r\n * 确认结束面试\r\n */\r\n private handleConfirmEndInterview = async () => {\r\n try {\r\n console.log('用户确认结束面试');\r\n this.showEndInterviewConfirmModal = false;\r\n\r\n // 设置结束面试标志\r\n this.isEndingInterview = true;\r\n\r\n // 停止所有可能正在进行的流程\r\n // 1. 清除等待录制计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n this.waitingToRecord = false;\r\n\r\n // 2. 清除等待数字人标志\r\n this.waitingForDigitalHuman = false;\r\n\r\n // 3. 如果正在录制,直接停止录制(不显示确认框)\r\n if (this.isRecording) {\r\n console.log('正在录制,直接停止录制并上传视频');\r\n this.stopRecording(); // 直接调用 stopRecording,不通过 handleStopRecording\r\n // uploadRecordedVideo 会在上传完成后检查 isEndingInterview 标志\r\n // 并发送结束面试消息\r\n } else {\r\n // 如果没有录制,直接发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n }\r\n\r\n } catch (error) {\r\n console.error('点击结束发送消息失败:', error);\r\n this.isEndingInterview = false;\r\n SentryReporter.captureError(error, {\r\n action: 'handleConfirmEndInterview',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '点击结束发送消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '点击结束发送消息失败',\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * 发送结束面试消息\r\n */\r\n private sendEndInterviewMessage = async () => {\r\n try {\r\n const endMessage = '请结束面试';\r\n console.log('面试结束消息已发送:', {\r\n conversation_id: this.conversationId,\r\n message: endMessage,\r\n });\r\n\r\n // 发送消息到API\r\n await this.sendMessageToAPI(endMessage);\r\n\r\n // 重置标志\r\n this.isEndingInterview = false;\r\n } catch (error) {\r\n console.error('发送结束面试消息失败:', error);\r\n this.isEndingInterview = false;\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * 取消结束面试\r\n */\r\n private handleCancelEndInterview = () => {\r\n console.log('用户取消结束面试');\r\n this.showEndInterviewConfirmModal = false;\r\n };\r\n\r\n /**\r\n * 计算已回答的题数\r\n */\r\n private getAnsweredQuestionCount = (): number => {\r\n // 统计用户已经回答的问题数量(有answer的消息)\r\n return this.messages.filter(msg => msg.answer && msg.answer.trim()).length;\r\n };\r\n\r\n private renderChatHistory() {\r\n // 如果正在播放欢迎视频,优先显示欢迎语\r\n if (this.isPlayingWelcomeVideo) {\r\n // 验证并调整开场白索引\r\n const validIndex = Math.max(0, Math.min(2, this.openingIndex || 0)); // 限制索引范围0-2\r\n const selectedOpeningContent = this.digitalHumanOpeningContents[validIndex] || this.digitalHumanOpeningContents[0];\r\n const welcomeText = selectedOpeningContent.text;\r\n\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\">{welcomeText}</div>\r\n </div>\r\n );\r\n }\r\n\r\n // 如果正在生成数字人视频,显示查看面试信息的提示\r\n if (this.isGeneratingDigitalHumanVideo || this.isLoading) {\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\">请稍等,我查看一下本次面试的信息...</div>\r\n </div>\r\n );\r\n }\r\n\r\n // 优先显示正在流式输出的消息\r\n if (this.currentStreamingMessage && this.currentStreamingMessage.answer) {\r\n return (\r\n <div class=\"ai-message-item streaming\">\r\n <div class=\"ai-message-content\" innerHTML={this.currentStreamingMessage.answer}></div>\r\n {this.currentStreamingMessage.isStreaming && (\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // 找到最后一条有AI回复的消息\r\n const lastMessageWithAnswer = [...this.messages].reverse().find(msg => msg.answer && msg.answer.trim());\r\n\r\n if (lastMessageWithAnswer) {\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\" innerHTML={lastMessageWithAnswer.answer}></div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\">请稍等,我查看一下本次面试的信息...</div>\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'digital-human-mode': !!this.digitalId,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {/* 关闭按钮 */}\r\n <button class=\"close-button\" onClick={this.handleCloseClick}>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n </button>\r\n\r\n {/* 数字人全屏背景视频层 */}\r\n {this.digitalId && this.digitalHumanVideoUrl && (\r\n <div class=\"digital-human-background\">\r\n <video\r\n autoplay\r\n playsinline\r\n loop={!this.isPlayingDigitalHumanVideo}\r\n muted={!this.isPlayingDigitalHumanVideo}\r\n src={this.digitalHumanVideoUrl}\r\n class=\"digital-human-background-video\"\r\n onEnded={this.handleVideoElementEnded}\r\n ref={el => {\r\n if (el) {\r\n // 只有非默认占位视频才应用语速控制\r\n const isDefaultVideo = this.digitalHumanVideoUrl === this.digitalHumanDefaultVideoUrl;\r\n el.playbackRate = isDefaultVideo ? 1.0 : this.playbackRate;\r\n\r\n // 微信环境下,确保视频URL变化时重新加载\r\n // 如果src已经设置但视频未加载,手动触发load\r\n if (el.src && el.readyState === 0) {\r\n el.load();\r\n }\r\n }\r\n }}\r\n // onLoadedData={() => console.log('视频数据加载完成:', this.digitalHumanVideoUrl)}\r\n // onPlay={() => console.log('视频开始播放:', this.digitalHumanVideoUrl, '静音:', !this.isPlayingDigitalHumanVideo)}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.renderVideoPreview()}\r\n\r\n {/* 内容层 */}\r\n <div class=\"modal-content-layer\">\r\n <div class=\"main-content\">\r\n {/* 聊天历史记录 */}\r\n <div class=\"chat-history-section\">{this.renderChatHistory()}</div>\r\n {/* 结束面试按钮 */}\r\n {this.showEndInterviewButton && !this.isTaskCompleted && this.conversationId && (\r\n <div class=\"end-interview-button-container\">\r\n <button\r\n class=\"end-interview-button\"\r\n onClick={this.handleInterviewEnd}\r\n disabled={this.isEndingInterview || !this.isRecording}\r\n title={this.isEndingInterview ? '正在结束面试...' : !this.isRecording ? '请在录制时点击' : '结束面试'}\r\n >\r\n {this.isEndingInterview ? '正在结束...' : '结束面试'}\r\n </button>\r\n </div>\r\n )}\r\n {this.renderRecordingStatusBar()}\r\n </div>\r\n </div>\r\n\r\n {/* 二次确认模态框 */}\r\n <div style={{ position: 'relative', zIndex: '100' }}>\r\n <pcm-confirm-modal\r\n isOpen={this.showConfirmModal}\r\n modalTitle=\"确认完成回答?\"\r\n okText=\"确认完成\"\r\n cancelText=\"继续录制\"\r\n okType=\"danger\"\r\n onOk={this.handleConfirmModalOk}\r\n onCancel={this.handleConfirmModalCancelEvent}\r\n onClosed={this.handleConfirmModalCancel}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n 当前录制时长:\r\n {(() => {\r\n const elapsedSeconds = this.recordingStartTime > 0 ? Math.floor((Date.now() - this.recordingStartTime) / 1000) : 0;\r\n const minutes = Math.floor(elapsedSeconds / 60);\r\n const seconds = elapsedSeconds % 60;\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n })()}\r\n </div>\r\n\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff7e6',\r\n border: '1px solid #ffec99',\r\n borderRadius: '6px',\r\n color: '#d46b08',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>注意:录制仍在进行中</span>\r\n </div>\r\n\r\n <div\r\n style={{\r\n fontSize: '16px',\r\n color: '#595959',\r\n lineHeight: '1.5',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n 点击\"确认完成\"将结束本题回答\r\n </div>\r\n\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n cursor: 'pointer',\r\n padding: '8px 0',\r\n userSelect: 'none',\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n style={{\r\n width: '16px',\r\n height: '16px',\r\n accentColor: '#1890ff',\r\n cursor: 'pointer',\r\n margin: '0',\r\n }}\r\n checked={this.skipConfirmThisInterview}\r\n onChange={this.handleSkipConfirmChange}\r\n />\r\n <span\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n cursor: 'pointer',\r\n lineHeight: '1.4',\r\n }}\r\n >\r\n 本次面试不再提醒\r\n </span>\r\n </label>\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n\r\n {/* 关闭确认模态框 */}\r\n <div style={{ position: 'relative', zIndex: '100' }}>\r\n <pcm-confirm-modal\r\n isOpen={this.showCloseConfirmModal}\r\n modalTitle=\"确认关闭?\"\r\n okText=\"确认关闭\"\r\n cancelText=\"取消\"\r\n okType=\"danger\"\r\n onOk={this.handleCloseConfirmOk}\r\n onCancel={this.handleCloseConfirmCancel}\r\n onClosed={this.handleCloseConfirmCancel}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n <div\r\n style={{\r\n fontSize: '16px',\r\n color: '#595959',\r\n lineHeight: '1.5',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n {this.isTaskCompleted ? '面试已结束,确认要关闭吗?' : '您的面试未完成,确认要关闭吗?'}\r\n </div>\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n <div style={{ position: 'relative', zIndex: '100' }}>\r\n {/* 结束面试确认模态框 */}\r\n <pcm-confirm-modal\r\n isOpen={this.showEndInterviewConfirmModal}\r\n modalTitle=\"确认结束面试?\"\r\n okText=\"确认结束\"\r\n cancelText=\"取消\"\r\n okType=\"danger\"\r\n onOk={this.handleConfirmEndInterview}\r\n onCancel={this.handleCancelEndInterview}\r\n onClosed={this.handleCancelEndInterview}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n {(() => {\r\n const answeredCount = this.getAnsweredQuestionCount();\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n 当前第 {answeredCount} 题\r\n </div>\r\n\r\n {answeredCount < 3 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff2e8',\r\n border: '1px solid #ffbb96',\r\n borderRadius: '6px',\r\n color: '#d4380d',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"currentColor\"\r\n style={{ flexShrink: '0', marginTop: '2px' }}\r\n >\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>\r\n <strong>警告:</strong>当前已回答题数小于 3 题,结束面试可能无法正常完成面试流程,建议继续完成更多题目后再结束面试。\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n lineHeight: '1.6',\r\n textAlign: 'center',\r\n }}\r\n >\r\n 确认要结束面试吗?结束后将生成面试报告。\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private renderVideoPreview() {\r\n if (!this.showRecordingUI) {\r\n return null;\r\n }\r\n return (\r\n <div class=\"recording-preview-top-right\">\r\n <video\r\n class=\"user-video-preview\"\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={el => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n }\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private renderRecordingStatusBar() {\r\n if (this.showRecordingUI) {\r\n const minutes = Math.floor(this.recordingTimeLeft / 60)\r\n .toString()\r\n .padStart(2, '0');\r\n const seconds = (this.recordingTimeLeft % 60).toString().padStart(2, '0');\r\n\r\n return (\r\n <div class=\"recording-status-bar\">\r\n <div class=\"audio-waveform\">\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n </div>\r\n <span class=\"recording-timer\">\r\n {minutes}:{seconds}\r\n </span>\r\n <button class=\"finish-recording-btn\" onClick={() => this.handleStopRecording()}>\r\n <img\r\n src=\"https://pcm-resource-1312611446.cos.ap-guangzhou.myqcloud.com/sdk/icon/gou.png\"\r\n width=\"16\"\r\n height=\"16\"\r\n alt=\"完成\"\r\n style={{ filter: 'brightness(0) invert(1)' }}\r\n />\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return <div class=\"recording-status-bar\">{this.renderStatusIndicator()}</div>;\r\n }\r\n\r\n private renderStatusIndicator() {\r\n // 优先显示设备错误\r\n if (this.deviceError) {\r\n return (\r\n <div class=\"status-indicator-text error\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>{this.deviceError}</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 任务完成\r\n if (this.isTaskCompleted) {\r\n return (\r\n <div class=\"status-indicator-text\">\r\n <span>面试已完成</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在生成数字人视频\r\n if (this.waitingForDigitalHuman && this.digitalId) {\r\n return (\r\n <div class=\"status-indicator-text loading\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <span>AI正在查看面试信息...</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 上传视频中\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"status-indicator-text loading\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <span>正在分析...</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待题目\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"status-indicator-text loading\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <span>等待题目...</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"status-indicator-text\">\r\n <span>{this.waitingTimeLeft} 秒后开始您的回答</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 准备就绪\r\n return (\r\n <div class=\"status-indicator-text ready\">\r\n <img\r\n src=\"https://pcm-resource-1312611446.cos.ap-guangzhou.myqcloud.com/sdk/icon/gou.png\"\r\n width=\"16\"\r\n height=\"16\"\r\n alt=\"准备就绪\"\r\n />\r\n <span>准备就绪</span>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"pcm-virtual-chat-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element, Watch, Method } from '@stencil/core';\r\nimport { sendSSERequest, sendHttpRequest, uploadFileToBackend, fetchAgentInfo, getSupportedMimeType, convertAudioToText } from '../../utils/utils';\r\nimport { showMessage } from '../../utils/message-utils';\r\nimport { ChatMessage } from '../../interfaces/chat';\r\nimport { StreamCompleteEventData, ConversationStartEventData, InterviewCompleteEventData, RecordingErrorEventData, RecordingStatusChangeEventData } from '../../interfaces/events';\r\nimport { ErrorEventBus } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store'; // 导入 authStore\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\n\r\n@Component({\r\n tag: 'pcm-virtual-chat-modal',\r\n styleUrls: ['pcm-virtual-chat-modal.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class ChatVirtualAPPModal {\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token?: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop({ mutable: true }) zIndex?: number;\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * 默认发送文本\r\n */\r\n @Prop() defaultQuery: string = '你好!聘才猫';\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n\r\n private _visibilityChangeHandler: (() => void) | null = null;\r\n @State() waitingTimeLeft: number = 10; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<InterviewCompleteEventData>;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n /**\r\n * 数字人视频相关状态\r\n */\r\n @State() digitalHumanVideoUrl: string = '';\r\n @State() digitalHumanDefaultVideoUrl: string = '';\r\n @State() virtualmanKey: string = '';\r\n @State() isPlayingDigitalHumanVideo: boolean = false;\r\n @State() digitalHumanVideoReady: boolean = false;\r\n @State() digitalHumanOpeningContents: Array<{ text: string, video_url: string }> = [];\r\n @State() isPlayingWelcomeVideo: boolean = false;\r\n @State() isGeneratingDigitalHumanVideo: boolean = false;\r\n\r\n /**\r\n * 待播放的生成视频URL(当开场白视频播放时,暂存生成的视频URL)\r\n */\r\n @State() pendingGeneratedVideoUrl: string = '';\r\n\r\n // 视频预加载缓存管理\r\n private preloadedVideos: Set<string> = new Set();\r\n private preloadingVideos: Map<string, Promise<void>> = new Map();\r\n\r\n /**\r\n * 是否正在等待数字人视频播放完成\r\n */\r\n @State() waitingForDigitalHuman: boolean = false;\r\n\r\n /**\r\n * 虚拟数字人ID,指定则开启虚拟数字人功能\r\n */\r\n @Prop() digitalId?: string;\r\n\r\n /**\r\n * 数字人开场白索引,用于选择开场白和开场视频(可选:0, 1, 2)\r\n * 0、您好,我是聘才猫 AI 面试助手。很高兴为你主持这场面试!在开始前,请确保:身处安静、光线充足的环境。网络顺畅,摄像头和麦克风工作正常。现在我正在查看本次面试的相关信息,为您生成专属面试题,马上就好,请稍等片刻。</br>\r\n * 1、您好,我是您的 AI 面试助手。欢迎参加本次AI面试!为了获得最佳效果,请确认:您在安静、明亮的环境中。您的网络稳定,摄像头和麦克风已开启。我们正在后台为您准备本次专属面试内容,很快开始,请稍候。<br>\r\n * 2、您好,我是您的 AI 面试助手。面试马上开始。趁此片刻,请快速确认:周围安静吗?光线足够吗?网络没问题?摄像头和麦克风准备好了吗?我们正在为您加载个性化的面试环节,稍等就好!\r\n */\r\n @Prop() openingIndex: number = 0;\r\n\r\n /**\r\n * 等待录制时间(秒)默认10\r\n */\r\n @Prop() waitingTime: number = 10;\r\n\r\n /**\r\n * 数字人视频播放速率(0.5-2.0之间),默认1.0\r\n */\r\n @Prop() playbackRate: number = 1.0;\r\n\r\n /**\r\n * 是否显示结束面试按钮\r\n */\r\n @Prop() showEndInterviewButton: boolean = false;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<RecordingErrorEventData>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<RecordingStatusChangeEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop({ mutable: true }) customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n /**\r\n * 智能体头像URL(从后端获取)\r\n */\r\n @State() agentLogo: string = '';\r\n\r\n // 添加新的状态属性来跟踪任务是否已完成\r\n @State() isTaskCompleted: boolean = false;\r\n\r\n private tokenInvalidListener: () => void;\r\n\r\n\r\n @State() deviceError: string | null = null;\r\n\r\n /**\r\n * 面试流程状态管理说明:\r\n *\r\n * 核心状态:\r\n * - isTaskCompleted: 任务是否已完成(面试正常结束)\r\n * - isEndingInterview: 是否正在执行结束面试流程(用户主动结束)\r\n * - isRecording: 是否正在录制视频\r\n * - waitingToRecord: 是否正在等待开始录制\r\n * - waitingForDigitalHuman: 是否正在等待数字人视频播放完成\r\n * - isLoading: 是否正在等待AI回复\r\n * - isUploadingVideo: 是否正在上传视频\r\n * - isGeneratingDigitalHumanVideo: 是否正在生成数字人视频\r\n *\r\n * 流程控制原则:\r\n * 1. 一旦 isTaskCompleted 或 isEndingInterview 为 true,所有录制和等待流程都应停止\r\n * 2. isEndingInterview 设置为 true 后,只允许发送结束面试消息\r\n * 3. 结束面试按钮在 isTaskCompleted 或 isEndingInterview 为 true 时置灰禁用\r\n * 4. 所有可能触发新录制的地方都需要检查这两个状态\r\n */\r\n\r\n // 添加二次确认相关状态\r\n @State() showConfirmModal: boolean = false;\r\n @State() skipConfirmThisInterview: boolean = false;\r\n\r\n // 添加关闭确认相关状态\r\n @State() showCloseConfirmModal: boolean = false;\r\n\r\n // 添加结束面试确认相关状态\r\n @State() showEndInterviewConfirmModal: boolean = false;\r\n\r\n /**\r\n * 标记是否正在执行结束面试流程\r\n */\r\n @State() isEndingInterview: boolean = false;\r\n\r\n // 添加内部状态标志,用于控制异步操作的执行\r\n @State() private isComponentActive: boolean = true;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * 公共方法:设置组件活动状态\r\n * 可被外部调用来控制组件是否继续执行异步操作\r\n */\r\n @Method()\r\n async setComponentActive(active: boolean): Promise<void> {\r\n console.log('设置组件活动状态:', active);\r\n this.isComponentActive = active;\r\n }\r\n\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n } else {\r\n // 如果没有提供 zIndex,尝试从缓存中读取\r\n const cachedZIndex = configStore.getItem<number>('modal-zIndex');\r\n if (cachedZIndex) {\r\n this.zIndex = cachedZIndex;\r\n } else {\r\n this.zIndex = 1000;\r\n configStore.setItem('modal-zIndex', 1000);\r\n }\r\n }\r\n\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 监听页面可见性变化,处理关屏/切后台回来后流程卡住的问题\r\n this._visibilityChangeHandler = () => {\r\n if (document.visibilityState === 'visible') {\r\n this.handlePageResume();\r\n }\r\n };\r\n document.addEventListener('visibilitychange', this._visibilityChangeHandler);\r\n\r\n // 确保 customInputs 是一个对象\r\n if (!this.customInputs) {\r\n this.customInputs = {};\r\n }\r\n\r\n // 如果没有设置助手头像,尝试获取智能体头像\r\n if (this.botId) {\r\n this.fetchAgentLogo();\r\n }\r\n\r\n // 添加数字人初始化日志\r\n console.log('componentWillLoad - 数字人相关状态:', {\r\n digitalId: this.digitalId,\r\n isOpen: this.isOpen,\r\n conversationId: this.conversationId,\r\n virtualmanKey: this.virtualmanKey,\r\n });\r\n\r\n\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 初始化数字人功能\r\n if (this.digitalId) {\r\n console.log('准备初始化数字人功能...');\r\n this.initializeDigitalHuman();\r\n }\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => {\r\n this.sendMessageToAPI(this.defaultQuery);\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n\r\n // 添加获取智能体信息的方法\r\n private async fetchAgentLogo() {\r\n if (!this.botId) return;\r\n\r\n try {\r\n const agentInfo = await fetchAgentInfo(this.botId);\r\n\r\n if (agentInfo && agentInfo.logo) {\r\n this.agentLogo = agentInfo.logo;\r\n }\r\n } catch (error) {\r\n SentryReporter.captureError(error, {\r\n action: 'fetchAgentLogo',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '获取智能体信息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取智能体信息失败',\r\n });\r\n }\r\n }\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n // 如果任务已完成或正在结束面试,不允许发送消息\r\n if (this.isTaskCompleted && !this.isEndingInterview) {\r\n console.log('任务已完成,不允许发送消息');\r\n return;\r\n }\r\n\r\n // 发送新消息时重置状态\r\n this.waitingForDigitalHuman = false;\r\n this.digitalHumanVideoReady = false;\r\n\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = '';\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || '请开始';\r\n\r\n // 如果有视频URL,添加到customInputs中\r\n if (videoUrl) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n video_url: videoUrl,\r\n };\r\n }\r\n // 如果没有设置url_callback,则使用默认值\r\n if (!this.customInputs.url_callback) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n url_callback: 'https://tagents.ylzhaopin.com/agents/api/test/callback',\r\n };\r\n }\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 临时ID,将被服务器返回的ID替换\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: this.customInputs || {}, // 输入参数\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // 初始为空\r\n message_files: [], // 消息附件\r\n feedback: {}, // 反馈\r\n retriever_resources: [], // 检索资源\r\n created_at: Math.floor(Date.now() / 1000).toString(), // 创建时间\r\n agent_thoughts: [], // 代理思考过程\r\n status: 'normal', // 消息状态\r\n error: null, // 错误信息\r\n // 添加组件内部使用的字段\r\n time: time, // 消息时间(显示用)\r\n isStreaming: true, // 是否正在流式输出\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId, // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs,\r\n };\r\n\r\n await sendSSERequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n data: requestData,\r\n onMessage: data => {\r\n console.log(new Date().toLocaleString());\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n }\r\n\r\n // 添加对任务结束的判断\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫任务结束')) {\r\n console.log('检测到任务结束事件:', data);\r\n\r\n // 设置标志,表示任务已结束\r\n this.isTaskCompleted = true;\r\n\r\n // 获取当前AI回复内容,优先使用LLMText,否则使用answer\r\n const aiResponse = llmText || answer || this.currentStreamingMessage?.answer || '';\r\n\r\n // 触发面试完成事件\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n current_question_number: this.currentQuestionNumber,\r\n ai_response: aiResponse, // 添加AI回复内容\r\n });\r\n }\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫数字人题目')) {\r\n const digital_human_list = JSON.parse(data.data.process_data.digital_human_list);\r\n console.log('数字人题目:', digital_human_list);\r\n this.precreateDigitalHumanVideos(digital_human_list);\r\n }\r\n\r\n if (data.event === 'error') {\r\n const errorMessage = data.data?.message || data.message || '请求失败';\r\n this.messages = [\r\n ...this.messages,\r\n {\r\n ...newMessage,\r\n answer: errorMessage,\r\n error: data.data,\r\n isStreaming: false,\r\n },\r\n ];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n ErrorEventBus.emitError({\r\n error: data.data,\r\n message: errorMessage,\r\n });\r\n return;\r\n }\r\n\r\n if (data.event === 'message') {\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n // 更新消息时保持完整的消息结构\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n id: data.message_id || this.currentStreamingMessage.id,\r\n isStreaming: true,\r\n // 如果服务器返回了其他字段,也更新它们\r\n retriever_resources: data.retriever_resources || this.currentStreamingMessage.retriever_resources,\r\n agent_thoughts: data.agent_thoughts || this.currentStreamingMessage.agent_thoughts,\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n }\r\n }\r\n }\r\n if (data.event === 'message_end') {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: error => {\r\n console.error('发生错误:', error);\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '消息发送失败,请稍后再试',\r\n });\r\n SentryReporter.captureError(error, {\r\n action: 'sendMessageToAPI',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '消息发送失败',\r\n });\r\n\r\n this.messages = [\r\n ...this.messages,\r\n {\r\n ...newMessage,\r\n answer: '消息发送失败,请检查网络。',\r\n error: error,\r\n isStreaming: false,\r\n },\r\n ];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n // 根据currentQuestionNumber判断是否清空customInputs\r\n if (this.currentQuestionNumber === 0) {\r\n // 发送第一条消息后,清空指定的 customInputs 字段\r\n setTimeout(() => {\r\n if (this.customInputs) {\r\n // 只清除指定的字段,其他字段保留\r\n delete this.customInputs.job_info;\r\n delete this.customInputs.file_url;\r\n delete this.customInputs.file_name;\r\n }\r\n }, 1000); // 给一些时间让第一条消息处理完成\r\n }\r\n\r\n // 获取最新的AI回复内容\r\n const latestAIMessage = this.currentStreamingMessage;\r\n latestAIMessage.isStreaming = false;\r\n\r\n\r\n if (this.digitalId && latestAIMessage && latestAIMessage.answer) {\r\n // 如果开启了数字人功能,生成数字人视频\r\n console.log('生成数字人视频:', latestAIMessage.answer);\r\n this.generateDigitalHumanVideo(latestAIMessage.answer);\r\n }\r\n\r\n this.currentStreamingMessage = null;\r\n\r\n // 更新消息列表\r\n this.messages = [...this.messages, latestAIMessage];\r\n\r\n // 增加计数\r\n this.currentQuestionNumber++;\r\n\r\n // 如果任务已完成或正在结束面试,不执行后续流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,停止后续流程');\r\n return;\r\n }\r\n\r\n // 如果开启了数字人,等待数字人视频播放完成\r\n if (this.digitalId) {\r\n this.waitingForDigitalHuman = true;\r\n console.log('等待数字人视频播放完成...');\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 修改加载历史消息的方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n let conversationStatus = false;\r\n this.digitalHumanVideoReady = true\r\n\r\n try {\r\n // 首先获取会话状态\r\n const conversationStatusResponse = await sendHttpRequest({\r\n url: `/sdk/v1/chat/conversation`,\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n },\r\n });\r\n // 处理会话状态\r\n if (conversationStatusResponse.success && conversationStatusResponse.data && conversationStatusResponse.data.run_status == '结束') {\r\n conversationStatus = true;\r\n }\r\n\r\n // 获取历史消息\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(parseInt(msg.created_at) * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建完整的消息对象,保持统一结构\r\n return {\r\n id: msg.id,\r\n conversation_id: msg.conversation_id,\r\n inputs: msg.inputs || {},\r\n query: msg.query || '',\r\n answer: msg.answer || '',\r\n message_files: msg.message_files || [],\r\n feedback: msg.feedback || {},\r\n retriever_resources: msg.retriever_resources || [],\r\n created_at: msg.created_at,\r\n agent_thoughts: msg.agent_thoughts || [],\r\n status: msg.status || 'normal',\r\n error: msg.error,\r\n // 组件内部使用的字段\r\n time: timeStr,\r\n isStreaming: false,\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n\r\n // 根据历史消息数量设置currentQuestionNumber\r\n this.currentQuestionNumber = formattedMessages.length || 0;\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息或会话状态失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryMessages',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '加载历史消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '加载历史消息失败,请刷新重试',\r\n });\r\n } finally {\r\n this.isLoadingHistory = false;\r\n if (this.conversationId && this.messages.length > 0 && !conversationStatus && !this.isEndingInterview) {\r\n // 不播放欢迎视频\r\n this.isPlayingDigitalHumanVideo = false;\r\n this.isPlayingWelcomeVideo = false;\r\n this.digitalHumanVideoReady = true;\r\n\r\n // 先初始化数字人,等待获取到默认视频URL后再设置\r\n this.initializeDigitalHuman().then(() => {\r\n // 确保在初始化完成后设置视频URL\r\n if (this.digitalHumanDefaultVideoUrl) {\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n }\r\n });\r\n\r\n setTimeout(() => {\r\n // 开始等待录制\r\n this.startWaitingToRecord();\r\n }, 200);\r\n\r\n } else if (conversationStatus) {\r\n // 如果会话已结束,设置任务完成状态\r\n this.isTaskCompleted = true;\r\n\r\n // 确保数字人视频状态正确设置\r\n if (this.digitalId) {\r\n this.isPlayingDigitalHumanVideo = false;\r\n this.isPlayingWelcomeVideo = false;\r\n this.digitalHumanVideoReady = true;\r\n\r\n // 先初始化数字人,等待获取到默认视频URL后再设置\r\n this.initializeDigitalHuman().then(() => {\r\n // 确保在初始化完成后设置视频URL\r\n if (this.digitalHumanDefaultVideoUrl) {\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制流程');\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = this.waitingTime;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n // 如果任务已完成或正在结束面试,不开始录制\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制');\r\n return;\r\n }\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 },\r\n },\r\n });\r\n\r\n // 如果成功获取到媒体流,清除之前的设备错误\r\n this.deviceError = null;\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 800000, // 800kbps 视频比特率限制\r\n audioBitsPerSecond: 64000, // 64kbps 音频比特率限制\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n videoBitsPerSecond: 800000, // 即使降级也保持比特率限制\r\n audioBitsPerSecond: 64000,\r\n });\r\n } catch (recorderError) {\r\n // 最后的降级选项,不设置任何参数\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (finalError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: finalError,\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = event => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = event => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: '录制过程中发生错误',\r\n details: event,\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: '录制的视频为空',\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type,\r\n },\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: '处理录制视频时出错',\r\n details: error,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-hr-chat-modal',\r\n title: '处理录制视频时出错',\r\n });\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType,\r\n },\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(startError, {\r\n action: 'startRecording',\r\n component: 'pcm-hr-chat-modal',\r\n title: '开始录制失败',\r\n });\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n\r\n // 设置设备错误状态\r\n let errorMessage = '设备访问失败';\r\n\r\n if (error.name === 'NotAllowedError') {\r\n errorMessage = '请允许访问摄像头和麦克风权限';\r\n } else if (error.name === 'NotFoundError') {\r\n errorMessage = '未检测到摄像头或麦克风设备';\r\n } else if (error.name === 'NotReadableError') {\r\n errorMessage = '您的浏览器不支持视频录制,请切换到微信或Chrome、Edge使用';\r\n } else if (error.name === 'OverconstrainedError') {\r\n errorMessage = '摄像头不支持指定的配置';\r\n } else {\r\n errorMessage = '无法访问摄像头或麦克风,请检查设备连接';\r\n }\r\n\r\n this.deviceError = errorMessage;\r\n this.showRecordingUI = false;\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: errorMessage,\r\n });\r\n\r\n SentryReporter.captureError(error, {\r\n action: 'startRecording',\r\n component: 'pcm-virtual-chat-modal',\r\n title: errorMessage,\r\n });\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('.user-video-preview') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n SentryReporter.captureError(err, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '视频播放失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: err,\r\n message: '视频播放失败',\r\n });\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n SentryReporter.captureError(urlError, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '创建对象URL失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: urlError,\r\n message: '创建对象URL失败',\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n\r\n // 清理待播放的视频URL(即使没有正在录制,也需要清理待播放状态)\r\n this.pendingGeneratedVideoUrl = '';\r\n }\r\n\r\n // 处理停止录制按钮点击\r\n private handleStopRecording = () => {\r\n // 如果已经设置了跳过确认,直接停止录制\r\n if (this.skipConfirmThisInterview) {\r\n this.stopRecording();\r\n return;\r\n }\r\n\r\n // 否则显示确认模态框\r\n this.showConfirmModal = true;\r\n };\r\n\r\n // 处理\"本次面试不再提醒\"复选框变化\r\n private handleSkipConfirmChange = (event: Event) => {\r\n const checkbox = event.target as HTMLInputElement;\r\n this.skipConfirmThisInterview = checkbox.checked;\r\n };\r\n\r\n // 处理确认模态框的取消事件\r\n private handleConfirmModalCancel = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n // 处理确认模态框的OK事件\r\n private handleConfirmModalOk = () => {\r\n this.showConfirmModal = false;\r\n this.stopRecording();\r\n };\r\n\r\n // 处理确认模态框的Cancel事件\r\n private handleConfirmModalCancelEvent = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n\r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(\r\n file,\r\n {},\r\n {\r\n tags: ['other'],\r\n },\r\n );\r\n // 使用 cos_key 作为视频标识符\r\n // 调用音频转文字API\r\n const transcriptionText = await convertAudioToText(fileInfo.cos_key);\r\n\r\n // 检查是否是结束面试流程\r\n if (this.isEndingInterview) {\r\n console.log('视频上传完成,现在发送结束面试消息');\r\n // 如果是结束面试流程,发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n } else {\r\n // 正常流程:发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || '下一题', fileInfo.cos_key);\r\n }\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n this.isEndingInterview = false; // 出错时重置标志\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '视频上传或处理失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '视频上传或处理失败',\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n // 处理关闭按钮点击\r\n private handleCloseClick = () => {\r\n // 显示关闭确认对话框\r\n this.showCloseConfirmModal = true;\r\n };\r\n\r\n // 处理关闭确认对话框的确认事件\r\n private handleCloseConfirmOk = () => {\r\n this.showCloseConfirmModal = false;\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n // 处理关闭确认对话框的取消事件\r\n private handleCloseConfirmCancel = () => {\r\n this.showCloseConfirmModal = false;\r\n };\r\n\r\n // 确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 清理页面可见性监听器\r\n if (this._visibilityChangeHandler) {\r\n document.removeEventListener('visibilitychange', this._visibilityChangeHandler);\r\n this._visibilityChangeHandler = null;\r\n }\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n\r\n // 清理视频预加载缓存\r\n this.preloadedVideos.clear();\r\n this.preloadingVideos.clear();\r\n\r\n // 清理待播放的视频URL\r\n this.pendingGeneratedVideoUrl = '';\r\n }\r\n\r\n /**\r\n * 预创建数字人视频\r\n */\r\n private async precreateDigitalHumanVideos(digital_human_list: string[]) {\r\n if (!this.virtualmanKey) {\r\n console.warn('VirtualmanKey尚未加载,无法预创建视频。');\r\n // 可以在此处添加逻辑,等待virtualmanKey加载后再执行\r\n return;\r\n }\r\n\r\n for (const text of digital_human_list) {\r\n if (!text || !text.trim()) continue;\r\n try {\r\n // 注意:这里只创建任务,不等待视频生成完成\r\n await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/create-video',\r\n method: 'POST',\r\n data: {\r\n VirtualmanKey: this.virtualmanKey,\r\n InputSsml: text,\r\n SpeechParam: {\r\n Speed: 1,\r\n },\r\n VideoParam: {\r\n Format: 'TransparentWebm',\r\n },\r\n DriverType: 'Text',\r\n },\r\n });\r\n } catch (error) {\r\n console.error(`为文本 \"${text}\" 创建视频任务失败:`, error);\r\n // 可以选择性地报告错误\r\n SentryReporter.captureError(error, {\r\n action: 'precreateDigitalHumanVideos',\r\n component: 'pcm-virtual-chat-modal',\r\n title: `为文本 \"${text}\" 创建视频任务失败`,\r\n });\r\n }\r\n }\r\n console.log('数字人视频预创建任务已全部发送。');\r\n }\r\n\r\n\r\n /**\r\n * 初始化数字人功能\r\n */\r\n private async initializeDigitalHuman() {\r\n if (!this.digitalId) return;\r\n\r\n try {\r\n console.log('初始化数字人功能,digitalId:', this.digitalId);\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/avatar-detail',\r\n method: 'POST',\r\n data: {\r\n avatar_id: this.digitalId\r\n }\r\n });\r\n\r\n if (response.success) {\r\n const { placeholder_video_url, virtualman_key, opening_contents } = response.data;\r\n\r\n if (placeholder_video_url) {\r\n this.digitalHumanDefaultVideoUrl = placeholder_video_url;\r\n this.digitalHumanVideoUrl = placeholder_video_url;\r\n }\r\n\r\n if (virtualman_key) {\r\n this.virtualmanKey = virtualman_key;\r\n }\r\n\r\n // 处理开场白内容(JSON格式)\r\n if (opening_contents && Array.isArray(opening_contents) && opening_contents.length > 0) {\r\n this.digitalHumanOpeningContents = opening_contents;\r\n\r\n // 验证并调整开场白索引\r\n const validIndex = Math.max(0, Math.min(2, this.openingIndex || 0)); // 限制索引范围0-2\r\n const selectedOpeningContent = this.digitalHumanOpeningContents[validIndex] || this.digitalHumanOpeningContents[0];\r\n\r\n // 按顺序准备预加载列表:1.选择的欢迎视频 2.默认占位视频 3.其他视频\r\n const orderedVideosToPreload: string[] = [];\r\n\r\n // 1. 首先加载选择的欢迎视频\r\n if (selectedOpeningContent.video_url) {\r\n orderedVideosToPreload.push(selectedOpeningContent.video_url);\r\n }\r\n\r\n // 2. 然后加载默认占位视频(如果不同于选择的欢迎视频)\r\n if (placeholder_video_url && placeholder_video_url !== selectedOpeningContent.video_url) {\r\n orderedVideosToPreload.push(placeholder_video_url);\r\n }\r\n\r\n\r\n // 使用顺序预加载\r\n this.handleVideoUrlReceivedSequential(orderedVideosToPreload, '数字人初始化(顺序)');\r\n\r\n // 播放选择的欢迎视频 - 检查是否已经在继续对话模式下设置了状态\r\n if (selectedOpeningContent.video_url && !this.digitalHumanVideoReady) {\r\n console.log('播放数字人欢迎视频:', selectedOpeningContent.video_url, '索引:', validIndex);\r\n this.playDigitalHumanVideo(selectedOpeningContent.video_url, true);\r\n }\r\n } else {\r\n // 没有欢迎视频,只预加载默认占位视频\r\n if (placeholder_video_url) {\r\n this.handleVideoUrlReceivedSequential([placeholder_video_url], '数字人初始化(仅默认视频)');\r\n }\r\n }\r\n\r\n }\r\n } catch (error) {\r\n console.error('初始化数字人失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'initializeDigitalHuman',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '数字人初始化失败',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 生成数字人视频\r\n */\r\n private async generateDigitalHumanVideo(text: string) {\r\n // 如果组件已停用,直接跳过生成视频\r\n if (!this.isComponentActive) {\r\n console.warn('组件已停用,跳过数字人视频生成');\r\n return;\r\n }\r\n\r\n if (!text.trim() || !this.virtualmanKey) {\r\n\r\n // 条件不满足时,取消等待状态并直接开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted) {\r\n console.log('数字人视频生成条件不满足,直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n return;\r\n }\r\n\r\n console.log('开始生成数字人视频,文本内容:', text);\r\n\r\n // 设置正在生成视频的状态\r\n this.isGeneratingDigitalHumanVideo = true;\r\n\r\n try {\r\n // 创建视频任务\r\n const createResponse = await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/create-video',\r\n method: 'POST',\r\n data: {\r\n VirtualmanKey: this.virtualmanKey,\r\n InputSsml: text,\r\n SpeechParam: {\r\n Speed: 1\r\n },\r\n VideoParam: {\r\n Format: 'TransparentWebm',\r\n },\r\n DriverType: \"Text\",\r\n }\r\n });\r\n\r\n console.log('数字人视频创建响应:', createResponse);\r\n\r\n if (!createResponse.success) {\r\n showMessage(createResponse.message, 'error');\r\n throw new Error(`创建视频任务失败: ${createResponse.message}`);\r\n }\r\n\r\n const taskId = createResponse.data.Payload.TaskId;\r\n console.log('视频任务创建成功,TaskId:', taskId);\r\n\r\n // 轮询查询进度\r\n const videoUrl = await this.pollVideoProgress(taskId);\r\n // 轮询完成后,再次检查组件是否仍处于活动状态\r\n if (!this.isComponentActive) {\r\n console.warn('组件已停用,跳过视频播放');\r\n return;\r\n }\r\n\r\n if (videoUrl) {\r\n // 立即预加载新生成的视频(单个视频,不需要顺序处理)\r\n await this.preloadVideo(videoUrl);\r\n\r\n // 预加载后再次检查组件状态\r\n if (!this.isComponentActive) {\r\n console.warn('组件已停用,跳过视频播放');\r\n return;\r\n }\r\n\r\n // 检查是否正在播放开场白视频\r\n if (this.isPlayingWelcomeVideo) {\r\n // 如果正在播放开场白视频,保存生成的视频URL,等待开场白播放完成\r\n console.log('正在播放开场白视频,暂存生成的视频URL,等待开场白播放完成');\r\n this.pendingGeneratedVideoUrl = videoUrl;\r\n } else {\r\n // 否则立即播放生成的视频\r\n await this.playDigitalHumanVideo(videoUrl);\r\n console.log('数字人视频生成完成,视频URL:', videoUrl);\r\n }\r\n } else {\r\n // 如果没有获取到视频URL,抛出错误\r\n throw new Error('未能获取到数字人视频URL');\r\n }\r\n\r\n } catch (error) {\r\n console.error('数字人视频生成失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'generateDigitalHumanVideo',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '数字人视频生成失败',\r\n });\r\n\r\n // 数字人视频生成失败时,取消等待状态并直接开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted) {\r\n console.log('数字人视频生成失败,直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n } finally {\r\n // 无论成功还是失败,都重置生成状态\r\n this.isGeneratingDigitalHumanVideo = false;\r\n }\r\n }\r\n\r\n /**\r\n * 轮询查询视频生成进度\r\n */\r\n private async pollVideoProgress(taskId: string): Promise<string | null> {\r\n const maxAttempts = 45;\r\n const pollInterval = 2000;\r\n\r\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n try {\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/query-progress',\r\n method: 'POST',\r\n data: {\r\n TaskId: taskId\r\n }\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(`查询进度失败: ${response.message}`);\r\n }\r\n\r\n const payload = response.data.Payload;\r\n\r\n if (payload.Status === 'SUCCESS' && payload.Progress === 100) {\r\n return payload.MediaUrl;\r\n } else if (payload.Status === 'FAILED') {\r\n throw new Error(`视频生成失败: ${payload.FailMessage}`);\r\n }\r\n\r\n await new Promise(resolve => setTimeout(resolve, pollInterval));\r\n\r\n } catch (error) {\r\n console.error('轮询视频进度失败:', error);\r\n break;\r\n }\r\n }\r\n\r\n throw new Error('视频生成超时');\r\n }\r\n\r\n /**\r\n * 播放数字人视频\r\n */\r\n private async playDigitalHumanVideo(videoUrl: string, isWelcomeVideo: boolean = false) {\r\n console.log('开始播放数字人视频:', videoUrl, '是否为欢迎视频:', isWelcomeVideo);\r\n\r\n try {\r\n // 确保视频已预加载(如果未预加载则立即预加载)\r\n await this.preloadVideo(videoUrl);\r\n\r\n // 只通过状态来控制video元素\r\n this.digitalHumanVideoUrl = videoUrl;\r\n this.isPlayingDigitalHumanVideo = true;\r\n this.digitalHumanVideoReady = true;\r\n this.isPlayingWelcomeVideo = isWelcomeVideo;\r\n\r\n\r\n } catch (error) {\r\n console.error('播放数字人视频失败:', error);\r\n\r\n // 数字人视频播放失败时,取消等待状态并直接开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted) {\r\n console.log('数字人视频播放失败,直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 智能视频预加载管理器\r\n * 确保每个视频只预加载一次,避免重复请求\r\n */\r\n private async preloadVideo(videoUrl: string): Promise<void> {\r\n if (!videoUrl || !videoUrl.trim()) {\r\n return Promise.resolve();\r\n }\r\n\r\n const normalizedUrl = videoUrl.trim();\r\n const fileName = normalizedUrl.split('/').pop() || normalizedUrl;\r\n\r\n // 如果已经预加载过,直接返回\r\n if (this.preloadedVideos.has(normalizedUrl)) {\r\n console.log(`💾 视频已预加载,跳过: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`);\r\n return Promise.resolve();\r\n }\r\n\r\n // 如果正在预加载中,返回现有的Promise\r\n if (this.preloadingVideos.has(normalizedUrl)) {\r\n console.log(`🔄 视频正在预加载中,等待完成: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`);\r\n return this.preloadingVideos.get(normalizedUrl)!;\r\n }\r\n\r\n // 创建新的预加载Promise\r\n const preloadPromise = this.executeVideoPreload(normalizedUrl);\r\n this.preloadingVideos.set(normalizedUrl, preloadPromise);\r\n\r\n try {\r\n await preloadPromise;\r\n // 预加载成功,添加到已预加载集合\r\n this.preloadedVideos.add(normalizedUrl);\r\n console.log(`🎯 视频预加载成功: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`);\r\n } catch (error) {\r\n console.error(`💥 视频预加载失败: ${fileName.substring(0, 30)}${fileName.length > 30 ? '...' : ''}`, error);\r\n // 预加载失败时不抛出错误,避免阻塞后续流程\r\n } finally {\r\n // 清理正在预加载的记录\r\n this.preloadingVideos.delete(normalizedUrl);\r\n }\r\n }\r\n\r\n /**\r\n * 执行实际的视频预加载操作\r\n */\r\n private async executeVideoPreload(videoUrl: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const preloadVideo = document.createElement('video');\r\n preloadVideo.preload = 'auto';\r\n preloadVideo.src = videoUrl;\r\n preloadVideo.muted = true; // 确保可以自动播放\r\n preloadVideo.crossOrigin = 'anonymous'; // 处理跨域问题\r\n\r\n let isResolved = false;\r\n\r\n const handleSuccess = () => {\r\n if (isResolved) return;\r\n isResolved = true;\r\n cleanup();\r\n console.log('视频预加载完成:', videoUrl);\r\n resolve();\r\n };\r\n\r\n const handleError = (event?: any) => {\r\n if (isResolved) return;\r\n isResolved = true;\r\n cleanup();\r\n console.error('视频预加载失败:', videoUrl, event);\r\n reject(new Error('视频预加载失败'));\r\n };\r\n\r\n const cleanup = () => {\r\n preloadVideo.removeEventListener('canplaythrough', handleSuccess);\r\n preloadVideo.removeEventListener('loadeddata', handleSuccess);\r\n preloadVideo.removeEventListener('error', handleError);\r\n preloadVideo.removeEventListener('abort', handleError);\r\n preloadVideo.src = '';\r\n };\r\n\r\n // 监听多种成功事件,提高兼容性\r\n preloadVideo.addEventListener('canplaythrough', handleSuccess);\r\n preloadVideo.addEventListener('loadeddata', handleSuccess);\r\n\r\n // 监听错误事件\r\n preloadVideo.addEventListener('error', handleError);\r\n preloadVideo.addEventListener('abort', handleError);\r\n\r\n // 设置超时机制,避免长时间等待\r\n setTimeout(() => {\r\n if (!isResolved) {\r\n console.warn('视频预加载超时:', videoUrl);\r\n handleError('timeout');\r\n }\r\n }, 15000); // 15秒超时\r\n\r\n // 开始加载\r\n preloadVideo.load();\r\n });\r\n }\r\n\r\n /**\r\n * 顺序预加载多个视频\r\n * 上一个视频加载完毕后立刻加载下一个视频\r\n */\r\n private async sequentialPreloadVideos(videoUrls: string[]): Promise<void> {\r\n if (!videoUrls || videoUrls.length === 0) {\r\n return;\r\n }\r\n\r\n const validUrls = videoUrls.filter(url => url && url.trim());\r\n if (validUrls.length === 0) {\r\n return;\r\n }\r\n\r\n console.log('🎬 开始顺序预加载视频:', validUrls);\r\n console.log('📋 预加载计划:');\r\n validUrls.forEach((url, index) => {\r\n const fileName = url.split('/').pop() || url;\r\n console.log(` ${index + 1}. ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`);\r\n });\r\n\r\n for (let i = 0; i < validUrls.length; i++) {\r\n const url = validUrls[i];\r\n const fileName = url.split('/').pop() || url;\r\n\r\n try {\r\n console.log(`⏳ [${i + 1}/${validUrls.length}] 正在预加载: ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`);\r\n const startTime = Date.now();\r\n\r\n await this.preloadVideo(url);\r\n\r\n const duration = Date.now() - startTime;\r\n console.log(`✅ [${i + 1}/${validUrls.length}] 预加载完成 (${duration}ms): ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`);\r\n } catch (error) {\r\n console.warn(`❌ [${i + 1}/${validUrls.length}] 预加载失败: ${fileName.substring(0, 50)}${fileName.length > 50 ? '...' : ''}`, error);\r\n // 即使单个视频失败,也继续加载下一个\r\n }\r\n }\r\n\r\n console.log('🎉 所有视频顺序预加载处理完成');\r\n }\r\n\r\n\r\n /**\r\n * 顺序视频URL处理器\r\n * 一旦获得视频URL,按顺序预加载\r\n */\r\n private handleVideoUrlReceivedSequential(videoUrls: string[], context: string = ''): void {\r\n if (!videoUrls || videoUrls.length === 0) return;\r\n\r\n const validUrls = videoUrls.filter(url => url && url.trim());\r\n if (validUrls.length === 0) return;\r\n\r\n console.log(`📥 收到${validUrls.length}个视频URL,将按顺序预加载 (${context})`);\r\n\r\n // 异步顺序预加载,不阻塞主流程\r\n this.sequentialPreloadVideos(validUrls).catch(error => {\r\n console.warn(`⚠️ 顺序预加载视频失败 (${context}):`, error);\r\n });\r\n }\r\n\r\n /**\r\n * 处理页面从后台恢复(关屏/切后台回来)\r\n * 检测并恢复可能卡住的流程\r\n */\r\n private handlePageResume() {\r\n // 如果任务已完成或未打开,不需要处理\r\n if (this.isTaskCompleted || !this.isOpen || this.isEndingInterview) {\r\n return;\r\n }\r\n\r\n console.log('页面恢复可见,检查流程状态:', {\r\n waitingForDigitalHuman: this.waitingForDigitalHuman,\r\n isPlayingDigitalHumanVideo: this.isPlayingDigitalHumanVideo,\r\n waitingToRecord: this.waitingToRecord,\r\n isRecording: this.isRecording,\r\n showRecordingUI: this.showRecordingUI,\r\n });\r\n\r\n // 场景1: 数字人视频正在播放但可能被浏览器暂停/中断\r\n // 尝试恢复视频播放,如果3秒后仍未结束则跳过\r\n if (this.isPlayingDigitalHumanVideo) {\r\n const videoEl = this.hostElement.shadowRoot?.querySelector('.digital-human-background-video') as HTMLVideoElement;\r\n if (videoEl) {\r\n // 尝试恢复播放\r\n const playPromise = videoEl.play();\r\n if (playPromise) {\r\n playPromise.catch(() => {\r\n console.warn('恢复数字人视频播放失败,跳过视频');\r\n this.skipDigitalHumanVideo();\r\n });\r\n }\r\n\r\n // 设置安全超时:如果3秒后视频还没结束,直接跳过\r\n setTimeout(() => {\r\n if (this.isPlayingDigitalHumanVideo) {\r\n console.warn('数字人视频恢复后3秒仍未结束,强制跳过');\r\n this.skipDigitalHumanVideo();\r\n }\r\n }, 3000);\r\n } else {\r\n // 视频元素不存在,直接跳过\r\n this.skipDigitalHumanVideo();\r\n }\r\n return;\r\n }\r\n\r\n // 场景2: 等待数字人但视频已经不在播放状态(ended事件丢失)\r\n if (this.waitingForDigitalHuman && !this.isPlayingDigitalHumanVideo) {\r\n console.warn('检测到waitingForDigitalHuman卡住(视频未在播放),直接开始录制流程');\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n return;\r\n }\r\n\r\n // 场景3: 正在录制中,检查MediaStream是否仍然有效\r\n if (this.isRecording && this.recordingStream) {\r\n const tracks = this.recordingStream.getTracks();\r\n const allEnded = tracks.length > 0 && tracks.every(track => track.readyState === 'ended');\r\n if (allEnded) {\r\n console.warn('检测到录制的MediaStream已被系统回收,停止录制');\r\n this.deviceError = '设备被系统中断,请重新录制';\r\n this.stopRecording();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 跳过当前数字人视频播放,直接进入录制流程\r\n */\r\n private skipDigitalHumanVideo() {\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n this.isPlayingDigitalHumanVideo = false;\r\n this.isPlayingWelcomeVideo = false;\r\n\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted && !this.isEndingInterview) {\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n\r\n /**\r\n * 处理数字人视频播放结束\r\n */\r\n private handleVideoElementEnded = async () => {\r\n if (this.isPlayingDigitalHumanVideo) {\r\n console.log('数字人视频播放完成,是否为欢迎视频:', this.isPlayingWelcomeVideo);\r\n\r\n // 只通过状态来控制video元素,恢复默认视频\r\n this.digitalHumanVideoUrl = this.digitalHumanDefaultVideoUrl;\r\n this.isPlayingDigitalHumanVideo = false;\r\n const wasWelcomeVideo = this.isPlayingWelcomeVideo;\r\n this.isPlayingWelcomeVideo = false;\r\n\r\n // 如果是开场白视频播放完成,检查是否有待播放的生成视频\r\n if (wasWelcomeVideo && this.pendingGeneratedVideoUrl) {\r\n console.log('开场白视频播放完成,开始播放生成的视频:', this.pendingGeneratedVideoUrl);\r\n const videoUrl = this.pendingGeneratedVideoUrl;\r\n this.pendingGeneratedVideoUrl = ''; // 清空待播放视频URL\r\n await this.playDigitalHumanVideo(videoUrl);\r\n return; // 播放生成的视频,不执行后续的录制流程\r\n }\r\n\r\n // 只有非欢迎视频播放完成后,才开始录制流程\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.waitingForDigitalHuman && !this.isTaskCompleted && !this.isEndingInterview && !wasWelcomeVideo) {\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * 处理面试结束按钮点击 - 显示二次确认模态框\r\n */\r\n private handleInterviewEnd = () => {\r\n // 如果已经在结束流程中或任务已完成,不允许再次点击\r\n if (this.isEndingInterview || this.isTaskCompleted) {\r\n console.log('已在结束流程中或任务已完成,忽略点击');\r\n return;\r\n }\r\n\r\n console.log('点击结束面试按钮,显示确认模态框');\r\n this.showEndInterviewConfirmModal = true;\r\n };\r\n\r\n /**\r\n * 确认结束面试\r\n */\r\n private handleConfirmEndInterview = async () => {\r\n try {\r\n console.log('用户确认结束面试');\r\n this.showEndInterviewConfirmModal = false;\r\n\r\n // 设置结束面试标志\r\n this.isEndingInterview = true;\r\n\r\n // 停止所有可能正在进行的流程\r\n // 1. 清除等待录制计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n this.waitingToRecord = false;\r\n\r\n // 2. 清除等待数字人标志\r\n this.waitingForDigitalHuman = false;\r\n\r\n // 3. 如果正在录制,直接停止录制(不显示确认框)\r\n if (this.isRecording) {\r\n console.log('正在录制,直接停止录制并上传视频');\r\n this.stopRecording(); // 直接调用 stopRecording,不通过 handleStopRecording\r\n // uploadRecordedVideo 会在上传完成后检查 isEndingInterview 标志\r\n // 并发送结束面试消息\r\n } else {\r\n // 如果没有录制,直接发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n }\r\n\r\n } catch (error) {\r\n console.error('点击结束发送消息失败:', error);\r\n this.isEndingInterview = false;\r\n SentryReporter.captureError(error, {\r\n action: 'handleConfirmEndInterview',\r\n component: 'pcm-virtual-chat-modal',\r\n title: '点击结束发送消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '点击结束发送消息失败',\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * 发送结束面试消息\r\n */\r\n private sendEndInterviewMessage = async () => {\r\n try {\r\n const endMessage = '请结束面试';\r\n console.log('面试结束消息已发送:', {\r\n conversation_id: this.conversationId,\r\n message: endMessage,\r\n });\r\n\r\n // 发送消息到API\r\n await this.sendMessageToAPI(endMessage);\r\n\r\n // 重置标志\r\n this.isEndingInterview = false;\r\n } catch (error) {\r\n console.error('发送结束面试消息失败:', error);\r\n this.isEndingInterview = false;\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * 取消结束面试\r\n */\r\n private handleCancelEndInterview = () => {\r\n console.log('用户取消结束面试');\r\n this.showEndInterviewConfirmModal = false;\r\n };\r\n\r\n /**\r\n * 计算已回答的题数\r\n */\r\n private getAnsweredQuestionCount = (): number => {\r\n // 统计用户已经回答的问题数量(有answer的消息)\r\n return this.messages.filter(msg => msg.answer && msg.answer.trim()).length;\r\n };\r\n\r\n private renderChatHistory() {\r\n // 如果正在播放欢迎视频,优先显示欢迎语\r\n if (this.isPlayingWelcomeVideo) {\r\n // 验证并调整开场白索引\r\n const validIndex = Math.max(0, Math.min(2, this.openingIndex || 0)); // 限制索引范围0-2\r\n const selectedOpeningContent = this.digitalHumanOpeningContents[validIndex] || this.digitalHumanOpeningContents[0];\r\n const welcomeText = selectedOpeningContent.text;\r\n\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\">{welcomeText}</div>\r\n </div>\r\n );\r\n }\r\n\r\n // 如果正在生成数字人视频,显示查看面试信息的提示\r\n if (this.isGeneratingDigitalHumanVideo || this.isLoading) {\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\">请稍等,我查看一下本次面试的信息...</div>\r\n </div>\r\n );\r\n }\r\n\r\n // 优先显示正在流式输出的消息\r\n if (this.currentStreamingMessage && this.currentStreamingMessage.answer) {\r\n return (\r\n <div class=\"ai-message-item streaming\">\r\n <div class=\"ai-message-content\" innerHTML={this.currentStreamingMessage.answer}></div>\r\n {this.currentStreamingMessage.isStreaming && (\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // 找到最后一条有AI回复的消息\r\n const lastMessageWithAnswer = [...this.messages].reverse().find(msg => msg.answer && msg.answer.trim());\r\n\r\n if (lastMessageWithAnswer) {\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\" innerHTML={lastMessageWithAnswer.answer}></div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div class=\"ai-message-item\">\r\n <div class=\"ai-message-content\">请稍等,我查看一下本次面试的信息...</div>\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'digital-human-mode': !!this.digitalId,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {/* 关闭按钮 */}\r\n <button class=\"close-button\" onClick={this.handleCloseClick}>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n </button>\r\n\r\n {/* 数字人全屏背景视频层 */}\r\n {this.digitalId && this.digitalHumanVideoUrl && (\r\n <div class=\"digital-human-background\">\r\n <video\r\n autoplay\r\n playsinline\r\n loop={!this.isPlayingDigitalHumanVideo}\r\n muted={!this.isPlayingDigitalHumanVideo}\r\n src={this.digitalHumanVideoUrl}\r\n class=\"digital-human-background-video\"\r\n onEnded={this.handleVideoElementEnded}\r\n ref={el => {\r\n if (el) {\r\n // 只有非默认占位视频才应用语速控制\r\n const isDefaultVideo = this.digitalHumanVideoUrl === this.digitalHumanDefaultVideoUrl;\r\n el.playbackRate = isDefaultVideo ? 1.0 : this.playbackRate;\r\n\r\n // 微信环境下,确保视频URL变化时重新加载\r\n // 如果src已经设置但视频未加载,手动触发load\r\n if (el.src && el.readyState === 0) {\r\n el.load();\r\n }\r\n }\r\n }}\r\n // onLoadedData={() => console.log('视频数据加载完成:', this.digitalHumanVideoUrl)}\r\n // onPlay={() => console.log('视频开始播放:', this.digitalHumanVideoUrl, '静音:', !this.isPlayingDigitalHumanVideo)}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.renderVideoPreview()}\r\n\r\n {/* 内容层 */}\r\n <div class=\"modal-content-layer\">\r\n <div class=\"main-content\">\r\n {/* 聊天历史记录 */}\r\n <div class=\"chat-history-section\">{this.renderChatHistory()}</div>\r\n {/* 结束面试按钮 */}\r\n {this.showEndInterviewButton && !this.isTaskCompleted && this.conversationId && (\r\n <div class=\"end-interview-button-container\">\r\n <button\r\n class=\"end-interview-button\"\r\n onClick={this.handleInterviewEnd}\r\n disabled={this.isEndingInterview || !this.isRecording}\r\n title={this.isEndingInterview ? '正在结束面试...' : !this.isRecording ? '请在录制时点击' : '结束面试'}\r\n >\r\n {this.isEndingInterview ? '正在结束...' : '结束面试'}\r\n </button>\r\n </div>\r\n )}\r\n {this.renderRecordingStatusBar()}\r\n </div>\r\n </div>\r\n\r\n {/* 二次确认模态框 */}\r\n <div style={{ position: 'relative', zIndex: '100' }}>\r\n <pcm-confirm-modal\r\n isOpen={this.showConfirmModal}\r\n modalTitle=\"确认完成回答?\"\r\n okText=\"确认完成\"\r\n cancelText=\"继续录制\"\r\n okType=\"danger\"\r\n onOk={this.handleConfirmModalOk}\r\n onCancel={this.handleConfirmModalCancelEvent}\r\n onClosed={this.handleConfirmModalCancel}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n 当前录制时长:\r\n {(() => {\r\n const elapsedSeconds = this.recordingStartTime > 0 ? Math.floor((Date.now() - this.recordingStartTime) / 1000) : 0;\r\n const minutes = Math.floor(elapsedSeconds / 60);\r\n const seconds = elapsedSeconds % 60;\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n })()}\r\n </div>\r\n\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff7e6',\r\n border: '1px solid #ffec99',\r\n borderRadius: '6px',\r\n color: '#d46b08',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>注意:录制仍在进行中</span>\r\n </div>\r\n\r\n <div\r\n style={{\r\n fontSize: '16px',\r\n color: '#595959',\r\n lineHeight: '1.5',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n 点击\"确认完成\"将结束本题回答\r\n </div>\r\n\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n cursor: 'pointer',\r\n padding: '8px 0',\r\n userSelect: 'none',\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n style={{\r\n width: '16px',\r\n height: '16px',\r\n accentColor: '#1890ff',\r\n cursor: 'pointer',\r\n margin: '0',\r\n }}\r\n checked={this.skipConfirmThisInterview}\r\n onChange={this.handleSkipConfirmChange}\r\n />\r\n <span\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n cursor: 'pointer',\r\n lineHeight: '1.4',\r\n }}\r\n >\r\n 本次面试不再提醒\r\n </span>\r\n </label>\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n\r\n {/* 关闭确认模态框 */}\r\n <div style={{ position: 'relative', zIndex: '100' }}>\r\n <pcm-confirm-modal\r\n isOpen={this.showCloseConfirmModal}\r\n modalTitle=\"确认关闭?\"\r\n okText=\"确认关闭\"\r\n cancelText=\"取消\"\r\n okType=\"danger\"\r\n onOk={this.handleCloseConfirmOk}\r\n onCancel={this.handleCloseConfirmCancel}\r\n onClosed={this.handleCloseConfirmCancel}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n <div\r\n style={{\r\n fontSize: '16px',\r\n color: '#595959',\r\n lineHeight: '1.5',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n {this.isTaskCompleted ? '面试已结束,确认要关闭吗?' : '您的面试未完成,确认要关闭吗?'}\r\n </div>\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n <div style={{ position: 'relative', zIndex: '100' }}>\r\n {/* 结束面试确认模态框 */}\r\n <pcm-confirm-modal\r\n isOpen={this.showEndInterviewConfirmModal}\r\n modalTitle=\"确认结束面试?\"\r\n okText=\"确认结束\"\r\n cancelText=\"取消\"\r\n okType=\"danger\"\r\n onOk={this.handleConfirmEndInterview}\r\n onCancel={this.handleCancelEndInterview}\r\n onClosed={this.handleCancelEndInterview}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n {(() => {\r\n const answeredCount = this.getAnsweredQuestionCount();\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n 当前第 {answeredCount} 题\r\n </div>\r\n\r\n {answeredCount < 3 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff2e8',\r\n border: '1px solid #ffbb96',\r\n borderRadius: '6px',\r\n color: '#d4380d',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"currentColor\"\r\n style={{ flexShrink: '0', marginTop: '2px' }}\r\n >\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>\r\n <strong>警告:</strong>当前已回答题数小于 3 题,结束面试可能无法正常完成面试流程,建议继续完成更多题目后再结束面试。\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n lineHeight: '1.6',\r\n textAlign: 'center',\r\n }}\r\n >\r\n 确认要结束面试吗?结束后将生成面试报告。\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private renderVideoPreview() {\r\n if (!this.showRecordingUI) {\r\n return null;\r\n }\r\n return (\r\n <div class=\"recording-preview-top-right\">\r\n <video\r\n class=\"user-video-preview\"\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={el => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n }\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private renderRecordingStatusBar() {\r\n if (this.showRecordingUI) {\r\n const minutes = Math.floor(this.recordingTimeLeft / 60)\r\n .toString()\r\n .padStart(2, '0');\r\n const seconds = (this.recordingTimeLeft % 60).toString().padStart(2, '0');\r\n\r\n return (\r\n <div class=\"recording-status-bar\">\r\n <div class=\"audio-waveform\">\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n <div class=\"waveform-bar\"></div>\r\n </div>\r\n <span class=\"recording-timer\">\r\n {minutes}:{seconds}\r\n </span>\r\n <button class=\"finish-recording-btn\" onClick={() => this.handleStopRecording()}>\r\n <img\r\n src=\"https://pcm-resource-1312611446.cos.ap-guangzhou.myqcloud.com/sdk/icon/gou.png\"\r\n width=\"16\"\r\n height=\"16\"\r\n alt=\"完成\"\r\n style={{ filter: 'brightness(0) invert(1)' }}\r\n />\r\n </button>\r\n </div>\r\n );\r\n }\r\n\r\n return <div class=\"recording-status-bar\">{this.renderStatusIndicator()}</div>;\r\n }\r\n\r\n private renderStatusIndicator() {\r\n // 优先显示设备错误\r\n if (this.deviceError) {\r\n return (\r\n <div class=\"status-indicator-text error\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>{this.deviceError}</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 任务完成\r\n if (this.isTaskCompleted) {\r\n return (\r\n <div class=\"status-indicator-text\">\r\n <span>面试已完成</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在生成数字人视频\r\n if (this.waitingForDigitalHuman && this.digitalId) {\r\n return (\r\n <div class=\"status-indicator-text loading\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <span>面试官思考中...</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 上传视频中\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"status-indicator-text loading\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <span>正在提交回答...</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待题目\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"status-indicator-text loading\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <span>题目生成中...</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"status-indicator-text\">\r\n <span>{this.waitingTimeLeft} 秒后开始您的回答</span>\r\n </div>\r\n );\r\n }\r\n\r\n // 准备就绪\r\n return (\r\n <div class=\"status-indicator-text ready\">\r\n <img\r\n src=\"https://pcm-resource-1312611446.cos.ap-guangzhou.myqcloud.com/sdk/icon/gou.png\"\r\n width=\"16\"\r\n height=\"16\"\r\n alt=\"准备就绪\"\r\n />\r\n <span>准备就绪</span>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}