@webex/plugin-meetings 3.8.1 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/README.md +26 -13
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/constants.js +32 -3
  5. package/dist/constants.js.map +1 -1
  6. package/dist/controls-options-manager/enums.js +1 -0
  7. package/dist/controls-options-manager/enums.js.map +1 -1
  8. package/dist/controls-options-manager/types.js.map +1 -1
  9. package/dist/controls-options-manager/util.js +26 -0
  10. package/dist/controls-options-manager/util.js.map +1 -1
  11. package/dist/interpretation/index.js +1 -1
  12. package/dist/interpretation/siLanguage.js +1 -1
  13. package/dist/locus-info/controlsUtils.js +11 -3
  14. package/dist/locus-info/controlsUtils.js.map +1 -1
  15. package/dist/locus-info/index.js +68 -84
  16. package/dist/locus-info/index.js.map +1 -1
  17. package/dist/media/index.js +2 -2
  18. package/dist/media/index.js.map +1 -1
  19. package/dist/meeting/brbState.js +17 -14
  20. package/dist/meeting/brbState.js.map +1 -1
  21. package/dist/meeting/in-meeting-actions.js +11 -1
  22. package/dist/meeting/in-meeting-actions.js.map +1 -1
  23. package/dist/meeting/index.js +428 -253
  24. package/dist/meeting/index.js.map +1 -1
  25. package/dist/meeting/request.js +19 -0
  26. package/dist/meeting/request.js.map +1 -1
  27. package/dist/meeting/request.type.js.map +1 -1
  28. package/dist/{rtcMetrics/constants.js → meeting/type.js} +1 -5
  29. package/dist/meeting/type.js.map +1 -0
  30. package/dist/meeting/util.js +68 -2
  31. package/dist/meeting/util.js.map +1 -1
  32. package/dist/meetings/index.js +35 -33
  33. package/dist/meetings/index.js.map +1 -1
  34. package/dist/members/index.js +11 -9
  35. package/dist/members/index.js.map +1 -1
  36. package/dist/members/request.js +3 -3
  37. package/dist/members/request.js.map +1 -1
  38. package/dist/members/util.js +18 -6
  39. package/dist/members/util.js.map +1 -1
  40. package/dist/metrics/constants.js +1 -0
  41. package/dist/metrics/constants.js.map +1 -1
  42. package/dist/multistream/mediaRequestManager.js +1 -1
  43. package/dist/multistream/mediaRequestManager.js.map +1 -1
  44. package/dist/multistream/remoteMedia.js +34 -5
  45. package/dist/multistream/remoteMedia.js.map +1 -1
  46. package/dist/multistream/remoteMediaGroup.js +42 -2
  47. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  48. package/dist/multistream/sendSlotManager.js +32 -2
  49. package/dist/multistream/sendSlotManager.js.map +1 -1
  50. package/dist/reachability/index.js +5 -10
  51. package/dist/reachability/index.js.map +1 -1
  52. package/dist/types/constants.d.ts +28 -0
  53. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  54. package/dist/types/controls-options-manager/types.d.ts +4 -1
  55. package/dist/types/locus-info/index.d.ts +0 -9
  56. package/dist/types/meeting/brbState.d.ts +0 -1
  57. package/dist/types/meeting/in-meeting-actions.d.ts +10 -0
  58. package/dist/types/meeting/index.d.ts +47 -19
  59. package/dist/types/meeting/request.d.ts +9 -1
  60. package/dist/types/meeting/request.type.d.ts +74 -0
  61. package/dist/types/meeting/type.d.ts +9 -0
  62. package/dist/types/meeting/util.d.ts +3 -0
  63. package/dist/types/members/index.d.ts +10 -7
  64. package/dist/types/members/request.d.ts +1 -1
  65. package/dist/types/members/util.d.ts +7 -3
  66. package/dist/types/metrics/constants.d.ts +1 -0
  67. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  68. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  69. package/dist/types/multistream/sendSlotManager.d.ts +16 -0
  70. package/dist/types/reachability/index.d.ts +2 -2
  71. package/dist/webinar/index.js +1 -1
  72. package/package.json +24 -25
  73. package/src/constants.ts +32 -2
  74. package/src/controls-options-manager/enums.ts +1 -0
  75. package/src/controls-options-manager/types.ts +6 -1
  76. package/src/controls-options-manager/util.ts +31 -0
  77. package/src/locus-info/controlsUtils.ts +15 -0
  78. package/src/locus-info/index.ts +88 -82
  79. package/src/media/index.ts +2 -2
  80. package/src/meeting/brbState.ts +13 -9
  81. package/src/meeting/in-meeting-actions.ts +21 -0
  82. package/src/meeting/index.ts +254 -71
  83. package/src/meeting/request.ts +16 -0
  84. package/src/meeting/request.type.ts +64 -0
  85. package/src/meeting/type.ts +9 -0
  86. package/src/meeting/util.ts +73 -2
  87. package/src/meetings/index.ts +3 -2
  88. package/src/members/index.ts +13 -10
  89. package/src/members/request.ts +2 -2
  90. package/src/members/util.ts +16 -4
  91. package/src/metrics/constants.ts +1 -0
  92. package/src/multistream/mediaRequestManager.ts +7 -7
  93. package/src/multistream/remoteMedia.ts +34 -4
  94. package/src/multistream/remoteMediaGroup.ts +37 -2
  95. package/src/multistream/sendSlotManager.ts +34 -2
  96. package/src/reachability/index.ts +5 -13
  97. package/test/unit/spec/controls-options-manager/util.js +58 -0
  98. package/test/unit/spec/locus-info/controlsUtils.js +52 -0
  99. package/test/unit/spec/locus-info/index.js +218 -82
  100. package/test/unit/spec/media/index.ts +107 -0
  101. package/test/unit/spec/meeting/brbState.ts +23 -4
  102. package/test/unit/spec/meeting/in-meeting-actions.ts +10 -0
  103. package/test/unit/spec/meeting/index.js +901 -84
  104. package/test/unit/spec/meeting/request.js +71 -0
  105. package/test/unit/spec/meeting/utils.js +122 -1
  106. package/test/unit/spec/meetings/index.js +2 -0
  107. package/test/unit/spec/members/index.js +68 -9
  108. package/test/unit/spec/members/request.js +2 -2
  109. package/test/unit/spec/members/utils.js +27 -7
  110. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  111. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  112. package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
  113. package/test/unit/spec/reachability/index.ts +2 -6
  114. package/dist/annotation/annotation.types.d.ts +0 -42
  115. package/dist/annotation/constants.d.ts +0 -31
  116. package/dist/annotation/index.d.ts +0 -117
  117. package/dist/breakouts/breakout.d.ts +0 -8
  118. package/dist/breakouts/collection.d.ts +0 -5
  119. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  120. package/dist/breakouts/events.d.ts +0 -8
  121. package/dist/breakouts/index.d.ts +0 -5
  122. package/dist/breakouts/request.d.ts +0 -22
  123. package/dist/breakouts/utils.d.ts +0 -15
  124. package/dist/common/browser-detection.d.ts +0 -9
  125. package/dist/common/collection.d.ts +0 -48
  126. package/dist/common/config.d.ts +0 -2
  127. package/dist/common/errors/captcha-error.d.ts +0 -15
  128. package/dist/common/errors/intent-to-join.d.ts +0 -16
  129. package/dist/common/errors/join-meeting.d.ts +0 -17
  130. package/dist/common/errors/media.d.ts +0 -15
  131. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  132. package/dist/common/errors/parameter.d.ts +0 -15
  133. package/dist/common/errors/password-error.d.ts +0 -15
  134. package/dist/common/errors/permission.d.ts +0 -14
  135. package/dist/common/errors/reclaim-host-role-error.d.ts +0 -60
  136. package/dist/common/errors/reclaim-host-role-error.js +0 -158
  137. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  138. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  139. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  140. package/dist/common/errors/reconnection-in-progress.js +0 -35
  141. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  142. package/dist/common/errors/reconnection.d.ts +0 -15
  143. package/dist/common/errors/stats.d.ts +0 -15
  144. package/dist/common/errors/webex-errors.d.ts +0 -81
  145. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  146. package/dist/common/events/events-scope.d.ts +0 -17
  147. package/dist/common/events/events.d.ts +0 -12
  148. package/dist/common/events/trigger-proxy.d.ts +0 -2
  149. package/dist/common/events/util.d.ts +0 -2
  150. package/dist/common/logs/logger-config.d.ts +0 -2
  151. package/dist/common/logs/logger-proxy.d.ts +0 -2
  152. package/dist/common/logs/request.d.ts +0 -34
  153. package/dist/common/queue.d.ts +0 -32
  154. package/dist/config.d.ts +0 -73
  155. package/dist/constants.d.ts +0 -952
  156. package/dist/controls-options-manager/constants.d.ts +0 -4
  157. package/dist/controls-options-manager/enums.d.ts +0 -5
  158. package/dist/controls-options-manager/index.d.ts +0 -120
  159. package/dist/controls-options-manager/types.d.ts +0 -43
  160. package/dist/controls-options-manager/util.d.ts +0 -7
  161. package/dist/index.d.ts +0 -4
  162. package/dist/interceptors/index.d.ts +0 -2
  163. package/dist/interceptors/locusRetry.d.ts +0 -27
  164. package/dist/interpretation/collection.d.ts +0 -5
  165. package/dist/interpretation/index.d.ts +0 -5
  166. package/dist/interpretation/siLanguage.d.ts +0 -5
  167. package/dist/locus-info/controlsUtils.d.ts +0 -2
  168. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  169. package/dist/locus-info/fullState.d.ts +0 -2
  170. package/dist/locus-info/hostUtils.d.ts +0 -2
  171. package/dist/locus-info/index.d.ts +0 -269
  172. package/dist/locus-info/infoUtils.d.ts +0 -2
  173. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  174. package/dist/locus-info/parser.d.ts +0 -212
  175. package/dist/locus-info/selfUtils.d.ts +0 -2
  176. package/dist/media/index.d.ts +0 -32
  177. package/dist/media/properties.d.ts +0 -108
  178. package/dist/media/util.d.ts +0 -2
  179. package/dist/mediaQualityMetrics/config.d.ts +0 -233
  180. package/dist/mediaQualityMetrics/config.js +0 -513
  181. package/dist/mediaQualityMetrics/config.js.map +0 -1
  182. package/dist/meeting/effectsState.d.ts +0 -42
  183. package/dist/meeting/effectsState.js +0 -260
  184. package/dist/meeting/effectsState.js.map +0 -1
  185. package/dist/meeting/in-meeting-actions.d.ts +0 -79
  186. package/dist/meeting/index.d.ts +0 -1622
  187. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  188. package/dist/meeting/muteState.d.ts +0 -116
  189. package/dist/meeting/request.d.ts +0 -257
  190. package/dist/meeting/request.type.d.ts +0 -11
  191. package/dist/meeting/state.d.ts +0 -9
  192. package/dist/meeting/util.d.ts +0 -2
  193. package/dist/meeting/voicea-meeting.d.ts +0 -16
  194. package/dist/meeting-info/collection.d.ts +0 -20
  195. package/dist/meeting-info/index.d.ts +0 -57
  196. package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
  197. package/dist/meeting-info/request.d.ts +0 -22
  198. package/dist/meeting-info/util.d.ts +0 -2
  199. package/dist/meeting-info/utilv2.d.ts +0 -2
  200. package/dist/meetings/collection.d.ts +0 -23
  201. package/dist/meetings/index.d.ts +0 -296
  202. package/dist/meetings/meetings.types.d.ts +0 -4
  203. package/dist/meetings/request.d.ts +0 -27
  204. package/dist/meetings/util.d.ts +0 -18
  205. package/dist/member/index.d.ts +0 -148
  206. package/dist/member/member.types.d.ts +0 -11
  207. package/dist/member/member.types.js +0 -18
  208. package/dist/member/member.types.js.map +0 -1
  209. package/dist/member/types.d.ts +0 -32
  210. package/dist/member/util.d.ts +0 -2
  211. package/dist/members/collection.d.ts +0 -24
  212. package/dist/members/index.d.ts +0 -308
  213. package/dist/members/request.d.ts +0 -58
  214. package/dist/members/types.d.ts +0 -25
  215. package/dist/members/util.d.ts +0 -2
  216. package/dist/metrics/config.d.ts +0 -169
  217. package/dist/metrics/config.js +0 -289
  218. package/dist/metrics/config.js.map +0 -1
  219. package/dist/metrics/constants.d.ts +0 -59
  220. package/dist/metrics/index.d.ts +0 -152
  221. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  222. package/dist/multistream/receiveSlot.d.ts +0 -68
  223. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  224. package/dist/multistream/remoteMedia.d.ts +0 -72
  225. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  226. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  227. package/dist/multistream/sendSlotManager.d.ts +0 -69
  228. package/dist/networkQualityMonitor/index.d.ts +0 -70
  229. package/dist/networkQualityMonitor/index.js +0 -226
  230. package/dist/networkQualityMonitor/index.js.map +0 -1
  231. package/dist/peer-connection-manager/index.d.ts +0 -6
  232. package/dist/peer-connection-manager/index.js +0 -671
  233. package/dist/peer-connection-manager/index.js.map +0 -1
  234. package/dist/peer-connection-manager/util.d.ts +0 -6
  235. package/dist/peer-connection-manager/util.js +0 -110
  236. package/dist/peer-connection-manager/util.js.map +0 -1
  237. package/dist/personal-meeting-room/index.d.ts +0 -47
  238. package/dist/personal-meeting-room/request.d.ts +0 -14
  239. package/dist/personal-meeting-room/util.d.ts +0 -2
  240. package/dist/reachability/clusterReachability.d.ts +0 -109
  241. package/dist/reachability/index.d.ts +0 -139
  242. package/dist/reachability/request.d.ts +0 -35
  243. package/dist/reachability/util.d.ts +0 -8
  244. package/dist/reactions/constants.d.ts +0 -3
  245. package/dist/reactions/reactions.d.ts +0 -4
  246. package/dist/reactions/reactions.type.d.ts +0 -32
  247. package/dist/reconnection-manager/index.d.ts +0 -112
  248. package/dist/recording-controller/enums.d.ts +0 -7
  249. package/dist/recording-controller/index.d.ts +0 -193
  250. package/dist/recording-controller/util.d.ts +0 -13
  251. package/dist/roap/collection.d.ts +0 -10
  252. package/dist/roap/collection.js +0 -63
  253. package/dist/roap/collection.js.map +0 -1
  254. package/dist/roap/handler.d.ts +0 -47
  255. package/dist/roap/handler.js +0 -279
  256. package/dist/roap/handler.js.map +0 -1
  257. package/dist/roap/index.d.ts +0 -116
  258. package/dist/roap/request.d.ts +0 -35
  259. package/dist/roap/state.d.ts +0 -9
  260. package/dist/roap/state.js +0 -127
  261. package/dist/roap/state.js.map +0 -1
  262. package/dist/roap/turnDiscovery.d.ts +0 -81
  263. package/dist/roap/util.d.ts +0 -2
  264. package/dist/roap/util.js +0 -76
  265. package/dist/roap/util.js.map +0 -1
  266. package/dist/rtcMetrics/constants.d.ts +0 -4
  267. package/dist/rtcMetrics/constants.js.map +0 -1
  268. package/dist/rtcMetrics/index.d.ts +0 -61
  269. package/dist/rtcMetrics/index.js +0 -197
  270. package/dist/rtcMetrics/index.js.map +0 -1
  271. package/dist/statsAnalyzer/global.d.ts +0 -118
  272. package/dist/statsAnalyzer/global.js +0 -127
  273. package/dist/statsAnalyzer/global.js.map +0 -1
  274. package/dist/statsAnalyzer/index.d.ts +0 -193
  275. package/dist/statsAnalyzer/index.js +0 -1019
  276. package/dist/statsAnalyzer/index.js.map +0 -1
  277. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
  278. package/dist/statsAnalyzer/mqaUtil.js +0 -181
  279. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  280. package/dist/transcription/index.d.ts +0 -64
  281. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  282. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  283. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  284. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  285. package/dist/types/rtcMetrics/index.d.ts +0 -71
  286. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  287. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  288. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  289. package/dist/webinar/collection.d.ts +0 -16
  290. package/dist/webinar/index.d.ts +0 -5
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_eventsScope","_constants2","_metrics","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","_inherits2","_super","webex","_this","_classCallCheck2","_assertThisInitialized2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","LoggerProxy","logger","error","concat","stop","_x","_x2","isSubnetReachable","mediaServerIp","subnetFirstOctet","split","info","matchingReachedClusters","_values","reduce","acc","cluster","reachedSubnetsArray","_from","reachedSubnets","logMessage","name","i","subnet","reachedSubnetFirstOctet","add","_set","size","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","config","meetings","enableReachabilityChecks","Error","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","natType","clusterType","outcome","localStorageResult","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_callee7$","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_callee8$","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_callee9$","_context9","tested","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","getNumberOfReachableClusters","count","_ref3","_ref4","logUnreachableClusters","list","_ref5","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","_this$reachabilityDef","checkMinRequiredClusters","performance","now","startTime","clearTimer","resolve","numReachableClusters","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee10","aborted","_args10","_callee10$","_context10","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee11","_callee11$","_context11","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee15","clusterList","_this4","isFirstResult","_callee15$","_context15","experimental","enableTcpReachability","enableTlsReachability","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","natTypeUpdated","_ref8","_callee14","_callee14$","_context14","_x8","start","_x5","_getClientMediaPreferences","_callee16","isMultistream","_callee16$","_context16","t1","t2","preferTranscoding","getClientMediaPreferences","_x9","_x10","_getReachabilityReportToAttachToRoap","_callee17","_callee17$","_context17","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n NatType,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n NatTypeUpdatedEventData,\n ResultEventData,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n natType = NatType.Unknown;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Checks if the given subnet is reachable\n * @param {string} mediaServerIp - media server ip\n * @returns {boolean | null} true if reachable, false if not reachable, null if mediaServerIp is not provided\n * @public\n * @memberof Reachability\n */\n public isSubnetReachable(mediaServerIp?: string): boolean | null {\n if (!mediaServerIp) {\n LoggerProxy.logger.error(`Reachability:index#isSubnetReachable --> mediaServerIp is null`);\n\n return null;\n }\n\n const subnetFirstOctet = mediaServerIp.split('.')[0];\n\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Looking for subnet: ${subnetFirstOctet}.X.X.X`\n );\n\n const matchingReachedClusters = Object.values(this.clusterReachability).reduce(\n (acc, cluster) => {\n const reachedSubnetsArray = Array.from(cluster.reachedSubnets);\n\n let logMessage = `Reachability:index#isSubnetReachable --> Cluster ${cluster.name} reached [`;\n for (let i = 0; i < reachedSubnetsArray.length; i += 1) {\n const subnet = reachedSubnetsArray[i];\n const reachedSubnetFirstOctet = subnet.split('.')[0];\n\n if (subnetFirstOctet === reachedSubnetFirstOctet) {\n acc.add(cluster.name);\n }\n\n logMessage += `${subnet}`;\n if (i < reachedSubnetsArray.length - 1) {\n logMessage += ',';\n }\n }\n logMessage += `]`;\n\n LoggerProxy.logger.info(logMessage);\n\n return acc;\n },\n new Set<string>()\n );\n\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Found ${matchingReachedClusters.size} clusters that use the subnet ${subnetFirstOctet}.X.X.X`\n );\n\n return matchingReachedClusters.size > 0;\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // @ts-ignore\n if (!this.webex.config.meetings.enableReachabilityChecks) {\n throw new Error('enableReachabilityChecks is disabled in config');\n }\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise(false);\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n natType: this.natType,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @param {boolean} aborted true if the reachability checks were aborted\n * @returns {void}\n */\n protected async sendMetric(aborted = false) {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n aborted,\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].on(\n Events.natTypeUpdated,\n async (data: NatTypeUpdatedEventData) => {\n this.natType = data.natType;\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_eventsScope","_constants2","_metrics","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","_inherits2","_super","webex","_this","_classCallCheck2","_assertThisInitialized2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","LoggerProxy","logger","error","concat","stop","_x","_x2","isSubnetReachable","selectedSubnetFirstOctet","info","matchingReachedClusters","_values","reduce","acc","cluster","reachedSubnetsArray","_from","reachedSubnets","logMessage","name","i","subnet","reachedSubnetFirstOctet","split","add","_set","size","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","config","meetings","enableReachabilityChecks","Error","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","natType","clusterType","outcome","localStorageResult","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_callee7$","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_callee8$","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_callee9$","_context9","tested","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","getNumberOfReachableClusters","count","_ref3","_ref4","logUnreachableClusters","list","_ref5","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","_this$reachabilityDef","checkMinRequiredClusters","performance","now","startTime","clearTimer","resolve","numReachableClusters","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee10","aborted","_args10","_callee10$","_context10","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee11","_callee11$","_context11","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee15","clusterList","_this4","isFirstResult","_callee15$","_context15","experimental","enableTcpReachability","enableTlsReachability","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","natTypeUpdated","_ref8","_callee14","_callee14$","_context14","_x8","start","_x5","_getClientMediaPreferences","_callee16","isMultistream","_callee16$","_context16","t1","t2","preferTranscoding","getClientMediaPreferences","_x9","_x10","_getReachabilityReportToAttachToRoap","_callee17","_callee17$","_context17","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n NatType,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n NatTypeUpdatedEventData,\n ResultEventData,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n natType = NatType.Unknown;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Checks if the given subnet is reachable\n * @param {string} selectedSubnetFirstOctet - selected subnet first octet, e.g. \"10\" for \"10.X.X.X\"\n * @returns {boolean | null} true if reachable, false if not reachable, null if mediaServerIp is not provided\n * @public\n * @memberof Reachability\n */\n public isSubnetReachable(selectedSubnetFirstOctet: string): boolean | null {\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Looking for subnet: ${selectedSubnetFirstOctet}.X.X.X`\n );\n\n const matchingReachedClusters = Object.values(this.clusterReachability).reduce(\n (acc, cluster) => {\n const reachedSubnetsArray = Array.from(cluster.reachedSubnets);\n\n let logMessage = `Reachability:index#isSubnetReachable --> Cluster ${cluster.name} reached [`;\n for (let i = 0; i < reachedSubnetsArray.length; i += 1) {\n const subnet = reachedSubnetsArray[i];\n const reachedSubnetFirstOctet = subnet.split('.')[0];\n\n if (selectedSubnetFirstOctet === reachedSubnetFirstOctet) {\n acc.add(cluster.name);\n }\n\n logMessage += `${subnet}`;\n if (i < reachedSubnetsArray.length - 1) {\n logMessage += ',';\n }\n }\n logMessage += `]`;\n\n LoggerProxy.logger.info(logMessage);\n\n return acc;\n },\n new Set<string>()\n );\n\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Found ${matchingReachedClusters.size} clusters that use the subnet ${selectedSubnetFirstOctet}.X.X.X`\n );\n\n return matchingReachedClusters.size > 0;\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // @ts-ignore\n if (!this.webex.config.meetings.enableReachabilityChecks) {\n throw new Error('enableReachabilityChecks is disabled in config');\n }\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise(false);\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n natType: this.natType,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @param {boolean} aborted true if the reachability checks were aborted\n * @returns {void}\n */\n protected async sendMetric(aborted = false) {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n aborted,\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].on(\n Events.natTypeUpdated,\n async (data: NatTypeUpdatedEventData) => {\n this.natType = data.natType;\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,KAAA,GAAAD,sBAAA,CAAAH,OAAA;AAEA,IAAAK,UAAA,GAAAL,OAAA;AAEA,IAAAM,QAAA,GAAAH,sBAAA,CAAAH,OAAA;AACA,IAAAO,aAAA,GAAAP,OAAA;AAaA,IAAAQ,oBAAA,GAAAR,OAAA;AAOA,IAAAS,YAAA,GAAAN,sBAAA,CAAAH,OAAA;AACA,IAAAU,WAAA,GAAAP,sBAAA,CAAAH,OAAA;AACA,IAAAW,QAAA,GAAAR,sBAAA,CAAAH,OAAA;AAAiC,SAAAY,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,aAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAV,OAAA,EAAAK,OAAA,GAAAM,MAAA,MAAAL,yBAAA,QAAAM,SAAA,OAAAF,gBAAA,CAAAV,OAAA,QAAAa,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAL,KAAA,EAAAd,SAAA,EAAAiB,SAAA,YAAAD,MAAA,GAAAF,KAAA,CAAAhB,KAAA,OAAAE,SAAA,gBAAAoB,2BAAA,CAAAf,OAAA,QAAAW,MAAA;AAAA,SAAAJ,0BAAA,eAAAS,OAAA,qBAAAF,kBAAA,oBAAAA,kBAAA,CAAAG,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAR,kBAAA,CAAAK,OAAA,8CAAApC,CAAA,sBApCjC;AACA;AACA,GAFA,CAIA;AAkCA;AACA,IAAMwC,eAAe,GAAG,CAAC;AACzB,IAAMC,kBAAkB,GAAG,CAAC;AAC5B,IAAMC,eAAe,GAAG,EAAE;;AAE1B;AACA;AACA;AACA;AAHA,IAIqBC,YAAY,GAAAC,OAAA,CAAA3B,OAAA,0BAAA4B,YAAA;EAAA,IAAAC,UAAA,CAAA7B,OAAA,EAAA0B,YAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA1B,YAAA,CAAAsB,YAAA;EAyB/B;AACF;AACA;AACA;AACA;EACE,SAAAA,aAAYK,KAAa,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,CAAAjC,OAAA,QAAA0B,YAAA;IACzBM,KAAA,GAAAF,MAAA,CAAAR,IAAA;IAAQ,IAAAvB,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,gBA9BEG,uBAAY,CAACC,SAAS;IAAA,IAAArC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,2BAgBX;MAACK,SAAS,EAAE;QAACC,GAAG,EAAE;MAAC,CAAC;MAAEC,MAAM,EAAE;QAACD,GAAG,EAAE,CAAC;QAAEE,GAAG,EAAE,CAAC;QAAEC,IAAI,EAAE;MAAC;IAAC,CAAC;IAAA,IAAA1C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,mBAChE;MAACK,SAAS,EAAE;QAACC,GAAG,EAAE;MAAC,CAAC;MAAEC,MAAM,EAAE;QAACD,GAAG,EAAE,CAAC;QAAEE,GAAG,EAAE,CAAC;QAAEC,IAAI,EAAE;MAAC;IAAC,CAAC;IAAA,IAAA1C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,gBAC3DU,SAAS;IAAA,IAAA3C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,oBACLU,SAAS;IAAA,IAAA3C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,cACfW,qBAAO,CAACC,OAAO;IAAA,IAAA7C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAWvBA,KAAA,CAAKD,KAAK,GAAGA,KAAK;;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,KAAA,CAAKa,mBAAmB,GAAG,IAAIC,gBAAmB,CAACd,KAAA,CAAKD,KAAK,CAAC;IAE9DC,KAAA,CAAKe,mBAAmB,GAAG,CAAC,CAAC;IAAC,OAAAf,KAAA;EAChC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE,IAAAgB,aAAA,CAAAhD,OAAA,EAAA0B,YAAA;IAAAuB,GAAA;IAAAC,KAAA;MAAA,IAAAC,YAAA,OAAAC,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAQA,SAAAC,QACEC,OAA2B,EAC3BC,cAAoB;QAAA,IAAAC,OAAA;UAAAC,qBAAA;UAAAC,QAAA;UAAAC,UAAA;UAAAC,gBAAA;UAAAC,KAAA,GAAApE,SAAA;QAAA,OAAA0D,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cACpBV,OAAO,GAAAK,KAAA,CAAAnE,MAAA,QAAAmE,KAAA,QAAArB,SAAA,GAAAqB,KAAA,MAAG,KAAK;cAAAG,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAE,IAAA;cAAA,OAM0C,IAAI,CAACvB,mBAAmB,CAACwB,WAAW,CACzFb,OAAO,EACPc,aAAW,CAACC,YAAY,CAAC,IAAI,CAACxC,KAAK,CAAC,EACpC0B,cACF,CAAC;YAAA;cAAAE,qBAAA,GAAAO,QAAA,CAAAM,IAAA;cAJMZ,QAAQ,GAAAD,qBAAA,CAARC,QAAQ;cAAEC,UAAU,GAAAF,qBAAA,CAAVE,UAAU;cAAEC,gBAAgB,GAAAH,qBAAA,CAAhBG,gBAAgB;cAM7C,IAAI,CAACW,mBAAmB,GAAGX,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAG,yBAAyB,CAAC;cACxE,IAAI,CAACY,iBAAiB,GAAGZ,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAG,gBAAgB,CAAC;;cAE7D;cAAAI,QAAA,CAAAE,IAAA;cAAA,OACM,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CAACC,GAAG,CACjC,IAAI,CAACxC,SAAS,EACdD,uBAAY,CAAC0C,sBAAsB,EACnC,IAAAC,UAAA,CAAA9E,OAAA,EAAe6D,UAAU,CAC3B,CAAC;YAAA;cAAA,OAAAK,QAAA,CAAAa,MAAA,WAEM;gBAACnB,QAAQ,EAARA,QAAQ;gBAAEC,UAAU,EAAVA;cAAU,CAAC;YAAA;cAAAK,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAc,EAAA,GAAAd,QAAA;cAAA,KAEzBR,OAAO;gBAAAQ,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,MAAAF,QAAA,CAAAc,EAAA;YAAA;cAIXC,oBAAW,CAACC,MAAM,CAACC,KAAK,0DAAAC,MAAA,CAAAlB,QAAA,CAAAc,EAAA,kBAExB,CAAC;cAAC,OAAAd,QAAA,CAAAa,MAAA,WAEK,IAAI,CAACV,WAAW,CAACb,OAAO,EAAEC,cAAc,EAAE,IAAI,CAAC;YAAA;YAAA;cAAA,OAAAS,QAAA,CAAAmB,IAAA;UAAA;QAAA,GAAA9B,OAAA;MAAA,CAEzD;MAAA,SAAAc,YAAAiB,EAAA,EAAAC,GAAA;QAAA,OAAApC,YAAA,CAAA1D,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA0E,WAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANE;EAAA;IAAApB,GAAA;IAAAC,KAAA,EAOA,SAAAsC,kBAAyBC,wBAAgC,EAAkB;MACzER,oBAAW,CAACC,MAAM,CAACQ,IAAI,iEAAAN,MAAA,CAC2CK,wBAAwB,WAC1F,CAAC;MAED,IAAME,uBAAuB,GAAG,IAAAC,OAAA,CAAA5F,OAAA,EAAc,IAAI,CAAC+C,mBAAmB,CAAC,CAAC8C,MAAM,CAC5E,UAACC,GAAG,EAAEC,OAAO,EAAK;QAChB,IAAMC,mBAAmB,GAAG,IAAAC,KAAA,CAAAjG,OAAA,EAAW+F,OAAO,CAACG,cAAc,CAAC;QAE9D,IAAIC,UAAU,uDAAAf,MAAA,CAAuDW,OAAO,CAACK,IAAI,eAAY;QAC7F,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,mBAAmB,CAACpG,MAAM,EAAEyG,CAAC,IAAI,CAAC,EAAE;UACtD,IAAMC,MAAM,GAAGN,mBAAmB,CAACK,CAAC,CAAC;UACrC,IAAME,uBAAuB,GAAGD,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;UAEpD,IAAIf,wBAAwB,KAAKc,uBAAuB,EAAE;YACxDT,GAAG,CAACW,GAAG,CAACV,OAAO,CAACK,IAAI,CAAC;UACvB;UAEAD,UAAU,OAAAf,MAAA,CAAOkB,MAAM,CAAE;UACzB,IAAID,CAAC,GAAGL,mBAAmB,CAACpG,MAAM,GAAG,CAAC,EAAE;YACtCuG,UAAU,IAAI,GAAG;UACnB;QACF;QACAA,UAAU,OAAO;QAEjBlB,oBAAW,CAACC,MAAM,CAACQ,IAAI,CAACS,UAAU,CAAC;QAEnC,OAAOL,GAAG;MACZ,CAAC,EACD,IAAAY,IAAA,CAAA1G,OAAA,CAAgB,CAClB,CAAC;MAEDiF,oBAAW,CAACC,MAAM,CAACQ,IAAI,mDAAAN,MAAA,CAC6BO,uBAAuB,CAACgB,IAAI,oCAAAvB,MAAA,CAAiCK,wBAAwB,WACzI,CAAC;MAED,OAAOE,uBAAuB,CAACgB,IAAI,GAAG,CAAC;IACzC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA1D,GAAA;IAAAC,KAAA;MAAA,IAAA0D,mBAAA,OAAAxD,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAOA,SAAAuD,SAAgCrD,OAAe;QAAA,IAAAsD,qBAAA,EAAAlD,QAAA;QAAA,OAAAP,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAA+C,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA7C,IAAA,GAAA6C,SAAA,CAAA5C,IAAA;YAAA;cAAA,IAExC,IAAI,CAACrC,KAAK,CAACkF,MAAM,CAACC,QAAQ,CAACC,wBAAwB;gBAAAH,SAAA,CAAA5C,IAAA;gBAAA;cAAA;cAAA,MAChD,IAAIgD,KAAK,CAAC,gDAAgD,CAAC;YAAA;cAAAJ,SAAA,CAAA7C,IAAA;cAIjE,IAAI,CAACkD,WAAW,GAAG7D,OAAO;;cAE1B;cACA;cACA;cACA,IAAI,CAACzB,KAAK,CAACuF,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAACC,MAAM,CAAC,IAAI,CAAC;cAACT,SAAA,CAAA5C,IAAA;cAAA,OAEjC,IAAI,CAACC,WAAW,CAAC,SAAS,CAAC;YAAA;cAAAyC,qBAAA,GAAAE,SAAA,CAAAxC,IAAA;cAA7CZ,QAAQ,GAAAkD,qBAAA,CAARlD,QAAQ;cAEf,IAAI,CAAC8D,iBAAiB,GAAG,IAAIC,aAAK,CAAC,CAAC;;cAEpC;cAAAX,SAAA,CAAA5C,IAAA;cAAA,OACM,IAAI,CAACwD,yBAAyB,CAAChE,QAAQ,CAAC;YAAA;cAAA,OAAAoD,SAAA,CAAAjC,MAAA,WAEvC,IAAI,CAAC2C,iBAAiB,CAACG,OAAO;YAAA;cAAAb,SAAA,CAAA7C,IAAA;cAAA6C,SAAA,CAAAhC,EAAA,GAAAgC,SAAA;cAErC/B,oBAAW,CAACC,MAAM,CAACC,KAAK,qDAAA6B,SAAA,CAAAhC,EAA0D,CAAC;cAAC,OAAAgC,SAAA,CAAAjC,MAAA,WAE7E,CAAC,CAAC;YAAA;YAAA;cAAA,OAAAiC,SAAA,CAAA3B,IAAA;UAAA;QAAA,GAAAwB,QAAA;MAAA,CAEZ;MAAA,SAAAiB,mBAAAC,GAAA;QAAA,OAAAnB,mBAAA,CAAAnH,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAmI,kBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAA7E,GAAA;IAAAC,KAAA;MAAA,IAAA8E,cAAA,OAAA5E,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAKA,SAAA2E,SAAA;QAAA,IAAAC,aAAA,EAAArE,UAAA;QAAA,OAAAR,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAmE,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAjE,IAAA,GAAAiE,SAAA,CAAAhE,IAAA;YAAA;cAAAgE,SAAA,CAAAhE,IAAA;cAAA,OAE8B,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CAClD0D,GAAG,CAAClG,uBAAY,CAACC,SAAS,EAAED,uBAAY,CAAC0C,sBAAsB,CAAC,CAChEyD,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZJ,aAAa,GAAAE,SAAA,CAAA5D,IAAA;cAMnB,IAAI0D,aAAa,EAAE;gBACjB,IAAI;kBACFrE,UAAU,GAAG0E,IAAI,CAACC,KAAK,CAACN,aAAa,CAAC;gBACxC,CAAC,CAAC,OAAOnJ,CAAC,EAAE;kBACVkG,oBAAW,CAACC,MAAM,CAACC,KAAK,sEAAAC,MAAA,CAC+CrG,CAAC,CACxE,CAAC;gBACH;cACF;cAAC,OAAAqJ,SAAA,CAAArD,MAAA,WAEMlB,UAAU;YAAA;YAAA;cAAA,OAAAuE,SAAA,CAAA/C,IAAA;UAAA;QAAA,GAAA4C,QAAA;MAAA,CAClB;MAAA,SAAAQ,cAAA;QAAA,OAAAT,cAAA,CAAAvI,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA8I,aAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAAxF,GAAA;IAAAC,KAAA;MAAA,IAAAwF,sBAAA,OAAAtF,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAMA,SAAAqF,SAAA;QAAA,IAAAC,kBAAA,EAAA/E,UAAA;QAAA,OAAAR,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAA6E,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA3E,IAAA,GAAA2E,SAAA,CAAA1E,IAAA;YAAA;cAAA0E,SAAA,CAAA1E,IAAA;cAAA,OASmC,IAAI,CAAC2E,sBAAsB,CAAC,CAAC;YAAA;cAAxDH,kBAAkB,GAAAE,SAAA,CAAAtE,IAAA;cAAAsE,SAAA,CAAA1E,IAAA;cAAA,OACC,IAAI,CAACqE,aAAa,CAAC,CAAC;YAAA;cAAvC5E,UAAU,GAAAiF,SAAA,CAAAtE,IAAA;cAAA,IAGX,IAAI,CAACE,iBAAiB;gBAAAoE,SAAA,CAAA1E,IAAA;gBAAA;cAAA;cAAA,OAAA0E,SAAA,CAAA/D,MAAA,WAClB;gBACLiE,YAAY,EAAEJ;cAChB,CAAC;YAAA;cAAA,OAAAE,SAAA,CAAA/D,MAAA,WAII;gBACLiE,YAAY,EAAE;kBACZC,OAAO,EAAE,CAAC;kBACVtI,MAAM,EAAE;oBACNuI,oBAAoB,EAAE;sBACpB,yBAAyB,EAAE,IAAI,CAACzE;oBAClC,CAAC;oBACD0E,OAAO,EAAE;sBACP,mBAAmB,EAAE,IAAI,CAACC;oBAC5B,CAAC;oBACDC,KAAK,EAAET;kBACT;gBACF,CAAC;gBACD/E,UAAU,EAAVA;cACF,CAAC;YAAA;YAAA;cAAA,OAAAiF,SAAA,CAAAzD,IAAA;UAAA;QAAA,GAAAsD,QAAA;MAAA,CACF;MAAA,SAAAW,sBAAA;QAAA,OAAAZ,sBAAA,CAAAjJ,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA2J,qBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANE;EAAA;IAAArG,GAAA;IAAAC,KAAA;MAAA,IAAAqG,2BAAA,OAAAnG,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAOA,SAAAkG,SAAA;QAAA,IAAAC,kBAAA,EAAAC,sBAAA,EAAA9F,QAAA;QAAA,OAAAP,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAA2F,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAzF,IAAA,GAAAyF,SAAA,CAAAxF,IAAA;YAAA;cAAAwF,SAAA,CAAAzF,IAAA;cAAAyF,SAAA,CAAAxF,IAAA;cAAA,OAEqC,IAAI,CAACkF,qBAAqB,CAAC,CAAC;YAAA;cAAvDG,kBAAkB,GAAAG,SAAA,CAAApF,IAAA;cAAAoF,SAAA,CAAAxF,IAAA;cAAA,OAEC,IAAI,CAACC,WAAW,CAAC,2BAA2B,EAAEoF,kBAAkB,CAAC;YAAA;cAAAC,sBAAA,GAAAE,SAAA,CAAApF,IAAA;cAAnFZ,QAAQ,GAAA8F,sBAAA,CAAR9F,QAAQ;cAEf;cACA,IAAI,CAACiG,kBAAkB,CAAC,CAAC;;cAEzB;cAAAD,SAAA,CAAAxF,IAAA;cAAA,OACM,IAAI,CAACwD,yBAAyB,CAAChE,QAAQ,CAAC;YAAA;cAAAgG,SAAA,CAAAxF,IAAA;cAAA;YAAA;cAAAwF,SAAA,CAAAzF,IAAA;cAAAyF,SAAA,CAAA5E,EAAA,GAAA4E,SAAA;cAE9C3E,oBAAW,CAACC,MAAM,CAACC,KAAK,6DAAAyE,SAAA,CAAA5E,EAAkE,CAAC;YAAC;YAAA;cAAA,OAAA4E,SAAA,CAAAvE,IAAA;UAAA;QAAA,GAAAmE,QAAA;MAAA,CAE/F;MAAA,SAAAM,2BAAA;QAAA,OAAAP,2BAAA,CAAA9J,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAmK,0BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAA7G,GAAA;IAAAC,KAAA,EAMA,SAAA6G,iBAAA,EAA0B;MACxB;MACA,IAAI,IAAI,CAACC,YAAY,EAAE;QACrB/E,oBAAW,CAACC,MAAM,CAAC+E,GAAG,CACpB,sEACF,CAAC;QACD,IAAI,CAACJ,kBAAkB,CAAC,CAAC;QACzB,IAAI,CAACK,IAAI,CACP;UACEC,IAAI,EAAE,cAAc;UACpBC,QAAQ,EAAE;QACZ,CAAC,EACD,sBAAsB,EACtB,CAAC,CACH,CAAC;QACD,IAAI,CAACC,UAAU,CAAC,IAAI,CAAC;QACrB,IAAI,CAACC,0BAA0B,CAAC,KAAK,CAAC;MACxC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAArH,GAAA;IAAAC,KAAA;MAAA,IAAAqH,uBAAA,OAAAnH,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAMA,SAAAkH,SAAA;QAAA,IAAAC,KAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,OAAA;QAAA,OAAAvH,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAA6G,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA3G,IAAA,GAAA2G,SAAA,CAAA1G,IAAA;YAAA;cACQqG,KAA0B,GAAG;gBACjCM,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,gCAAgC,EAAE,CAAC;gBACnCC,+BAA+B,EAAE,CAAC;gBAClCC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,6BAA6B,EAAE,CAAC;gBAChCC,4BAA4B,EAAE,CAAC;gBAC/BC,OAAO,EAAE,IAAI,CAACA;cAChB,CAAC;cAEKjB,WAAW,GAAG,SAAdA,WAAWA,CAAIkB,WAA6B,EAAEjL,MAAiC,EAAK;gBACxF,IAAIA,MAAM,CAAC2B,GAAG,IAAI3B,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAMkL,OAAO,GAAGlL,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxE8J,KAAK,iBAAArF,MAAA,CAAiBwG,WAAW,WAAAxG,MAAA,CAAQyG,OAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAIlL,MAAM,CAAC6B,GAAG,IAAI7B,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAMkL,QAAO,GAAGlL,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxE8J,KAAK,iBAAArF,MAAA,CAAiBwG,WAAW,WAAAxG,MAAA,CAAQyG,QAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAIlL,MAAM,CAAC8B,IAAI,IAAI9B,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,UAAU,EAAE;kBACpD,IAAMkL,SAAO,GAAGlL,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACzE8J,KAAK,iBAAArF,MAAA,CAAiBwG,WAAW,YAAAxG,MAAA,CAASyG,SAAO,EAAG,IAAI,CAAC;gBAC3D;cACF,CAAC;cAAAf,SAAA,CAAA3G,IAAA;cAAA2G,SAAA,CAAA1G,IAAA;cAAA,OAI2B,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CAAC0D,GAAG,CACrDlG,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAAC2J,kBACf,CAAC;YAAA;cAHKnB,WAAW,GAAAG,SAAA,CAAAtG,IAAA;cAKXoG,OAA4B,GAAGrC,IAAI,CAACC,KAAK,CAACmC,WAAW,CAAC;cAE5D,IAAA/E,OAAA,CAAA5F,OAAA,EAAc4K,OAAO,CAAC,CAAC9K,OAAO,CAAC,UAACa,MAAM,EAAK;gBACzC+J,WAAW,CAAC/J,MAAM,CAACoL,WAAW,GAAG,KAAK,GAAG,QAAQ,EAAEpL,MAAM,CAAC;cAC5D,CAAC,CAAC;cAACmK,SAAA,CAAA1G,IAAA;cAAA;YAAA;cAAA0G,SAAA,CAAA3G,IAAA;cAAA2G,SAAA,CAAA9F,EAAA,GAAA8F,SAAA;cAEH;cACA7F,oBAAW,CAACC,MAAM,CAAC8G,IAAI,CACrB,2EAA2E,EAAAlB,SAAA,CAAA9F,EAE7E,CAAC;YAAC;cAAA,OAAA8F,SAAA,CAAA/F,MAAA,WAGG0F,KAAK;YAAA;YAAA;cAAA,OAAAK,SAAA,CAAAzF,IAAA;UAAA;QAAA,GAAAmF,QAAA;MAAA,CACb;MAAA,SAAAyB,uBAAA;QAAA,OAAA1B,uBAAA,CAAA9K,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAsM,sBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAAhJ,GAAA;IAAAC,KAAA,EAKA,SAAAgJ,sCACEC,eAAgC,EACL;MAC3B,IAAMC,MAAiC,GAAG,CAAC,CAAC;MAE5C,SAAAC,EAAA,MAAAC,eAAA,GAA2B,IAAAC,QAAA,CAAAvM,OAAA,EAAemM,eAAe,CAAC,EAAAE,EAAA,GAAAC,eAAA,CAAA1M,MAAA,EAAAyM,EAAA,IAAE;QAAvD,IAAAG,kBAAA,OAAAC,eAAA,CAAAzM,OAAA,EAAAsM,eAAA,CAAAD,EAAA;UAAOpJ,IAAG,GAAAuJ,kBAAA;UAAEtJ,KAAK,GAAAsJ,kBAAA;QACpB,QAAQvJ,IAAG;UACT,KAAK,QAAQ;YACX,QAAQC,KAAK;cACX,KAAK,WAAW;gBACdkJ,MAAM,CAACM,SAAS,GAAG,MAAM;gBACzB;cACF,KAAK,aAAa;gBAChBN,MAAM,CAACM,SAAS,GAAG,OAAO;gBAC1B;cACF,KAAK,UAAU;gBACbN,MAAM,CAACO,QAAQ,GAAG,MAAM;gBACxB;YACJ;YACA;UACF,KAAK,uBAAuB;YAC1BP,MAAM,CAACQ,qBAAqB,GAAG1J,KAAK,CAAC2J,QAAQ,CAAC,CAAC;YAC/C;UACF;YACET,MAAM,CAACnJ,IAAG,CAAC,GAAGC,KAAK;QACvB;MACF;MAEA,OAAOkJ,MAAM;IACf;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAnJ,GAAA;IAAAC,KAAA;MAAA,IAAA4J,uBAAA,OAAA1J,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAKA,SAAAyJ,SAAA;QAAA,IAAAC,MAAA;QAAA,IAAApC,OAAA,EAAAD,WAAA,EAAAsC,iBAAA;QAAA,OAAA5J,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAkJ,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAhJ,IAAA,GAAAgJ,SAAA,CAAA/I,IAAA;YAAA;cAAA+I,SAAA,CAAAhJ,IAAA;cAAAgJ,SAAA,CAAA/I,IAAA;cAAA,OAK8B,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CAAC0D,GAAG,CACrDlG,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAAC2J,kBACf,CAAC;YAAA;cAHKnB,WAAW,GAAAwC,SAAA,CAAA3I,IAAA;cAKXyI,iBAAsC,GAAG1E,IAAI,CAACC,KAAK,CAACmC,WAAW,CAAC;cAEtEC,OAAO,GAAG,IAAAwC,iBAAS,EAACH,iBAAiB,EAAE,UAACI,aAAa;gBAAA,OAAM;kBACzD/K,GAAG,EAAE0K,MAAI,CAACd,qCAAqC,CAACmB,aAAa,CAAC/K,GAAG,IAAI;oBAAC3B,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1F6B,GAAG,EAAEwK,MAAI,CAACd,qCAAqC,CAACmB,aAAa,CAAC7K,GAAG,IAAI;oBAAC7B,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1F8B,IAAI,EAAEuK,MAAI,CAACd,qCAAqC,CAC9CmB,aAAa,CAAC5K,IAAI,IAAI;oBAAC9B,MAAM,EAAE;kBAAU,CAC3C;gBACF,CAAC;cAAA,CAAC,CAAC;cAACwM,SAAA,CAAA/I,IAAA;cAAA;YAAA;cAAA+I,SAAA,CAAAhJ,IAAA;cAAAgJ,SAAA,CAAAnI,EAAA,GAAAmI,SAAA;cAEJ;cACAlI,oBAAW,CAACC,MAAM,CAAC8G,IAAI,CACrB,iFAAiF,EAAAmB,SAAA,CAAAnI,EAEnF,CAAC;YAAC;cAAA,OAAAmI,SAAA,CAAApI,MAAA,WAGG6F,OAAO;YAAA;YAAA;cAAA,OAAAuC,SAAA,CAAA9H,IAAA;UAAA;QAAA,GAAA0H,QAAA;MAAA,CACf;MAAA,SAAAhE,uBAAA;QAAA,OAAA+D,uBAAA,CAAArN,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAoJ,sBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAA9F,GAAA;IAAAC,KAAA;MAAA,IAAAoK,4BAAA,OAAAlK,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAMA,SAAAiK,SAAA;QAAA,IAAAb,SAAA,EAAAc,gBAAA,EAAAC,mBAAA;QAAA,OAAApK,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAA0J,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAxJ,IAAA,GAAAwJ,SAAA,CAAAvJ,IAAA;YAAA;cACMsI,SAAS,GAAG,KAAK,EACrB;cAAAiB,SAAA,CAAAvJ,IAAA;cAAA,OAC+B,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CACrD0D,GAAG,CAAC,IAAI,CAACjG,SAAS,EAAED,uBAAY,CAAC2J,kBAAkB,CAAC,CACpDxD,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZkF,gBAAgB,GAAAG,SAAA,CAAAnJ,IAAA;cAItB,IAAIgJ,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAGlF,IAAI,CAACC,KAAK,CAACgF,gBAAgB,CAAC;kBAE7Ed,SAAS,GAAG,IAAA9G,OAAA,CAAA5F,OAAA,EAAcyN,mBAAmB,CAAC,CAACG,IAAI,CACjD,UAACjN,MAAM;oBAAA,IAAAkN,WAAA,EAAAC,WAAA;oBAAA,OACL,CAACnN,MAAM,CAACoL,WAAW,KAClB,EAAA8B,WAAA,GAAAlN,MAAM,CAAC2B,GAAG,cAAAuL,WAAA,uBAAVA,WAAA,CAAYlN,MAAM,MAAK,WAAW,IAAI,EAAAmN,WAAA,GAAAnN,MAAM,CAAC6B,GAAG,cAAAsL,WAAA,uBAAVA,WAAA,CAAYnN,MAAM,MAAK,WAAW,CAAC;kBAAA,CAC9E,CAAC;gBACH,CAAC,CAAC,OAAO5B,CAAC,EAAE;kBACVkG,oBAAW,CAACC,MAAM,CAACC,KAAK,2FAAAC,MAAA,CACoErG,CAAC,CAC7F,CAAC;gBACH;cACF;cAAC,OAAA4O,SAAA,CAAA5I,MAAA,WAEM2H,SAAS;YAAA;YAAA;cAAA,OAAAiB,SAAA,CAAAtI,IAAA;UAAA;QAAA,GAAAkI,QAAA;MAAA,CACjB;MAAA,SAAAQ,4BAAA;QAAA,OAAAT,4BAAA,CAAA7N,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAoO,2BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATE;EAAA;IAAA9K,GAAA;IAAAC,KAAA;MAAA,IAAA8K,+BAAA,OAAA5K,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAUA,SAAA2K,SAAA;QAAA,IAAAC,WAAA,EAAAV,gBAAA,EAAAC,mBAAA,EAAAU,SAAA;QAAA,OAAA9K,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAoK,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAlK,IAAA,GAAAkK,SAAA,CAAAjK,IAAA;YAAA;cACM8J,WAAW,GAAG,KAAK,EAEvB;cAAAG,SAAA,CAAAjK,IAAA;cAAA,OAC+B,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CACrD0D,GAAG,CAAC,IAAI,CAACjG,SAAS,EAAED,uBAAY,CAAC2J,kBAAkB,CAAC,CACpDxD,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZkF,gBAAgB,GAAAa,SAAA,CAAA7J,IAAA;cAItB,IAAIgJ,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAGlF,IAAI,CAACC,KAAK,CAACgF,gBAAgB,CAAC;kBAEvEW,SAAS,GAAG;oBAChB7L,GAAG,EAAE;sBAACgM,MAAM,EAAE,KAAK;sBAAE5B,SAAS,EAAEhK;oBAAS,CAAC;oBAC1CF,GAAG,EAAE;sBAAC8L,MAAM,EAAE,KAAK;sBAAE5B,SAAS,EAAEhK;oBAAS,CAAC;oBAC1CD,IAAI,EAAE;sBAAC6L,MAAM,EAAE,KAAK;sBAAE5B,SAAS,EAAEhK;oBAAS;kBAC5C,CAAC;kBAED,IAAAkD,OAAA,CAAA5F,OAAA,EAAcyN,mBAAmB,CAAC,CAAC3N,OAAO,CAAC,UAACa,MAAM,EAAK;oBACrD,IAAA4N,KAAA,CAAAvO,OAAA,EAAYmO,SAAS,CAAC,CAACrO,OAAO,CAAC,UAAC0O,QAAQ,EAAK;sBAAA,IAAAC,gBAAA,EAAAC,iBAAA;sBAC3C,IACE,EAAAD,gBAAA,GAAA9N,MAAM,CAAC6N,QAAQ,CAAC,cAAAC,gBAAA,uBAAhBA,gBAAA,CAAkB9N,MAAM,MAAK,WAAW,IACxC,EAAA+N,iBAAA,GAAA/N,MAAM,CAAC6N,QAAQ,CAAC,cAAAE,iBAAA,uBAAhBA,iBAAA,CAAkB/N,MAAM,MAAK,aAAa,EAC1C;wBACAwN,SAAS,CAACK,QAAQ,CAAC,CAACF,MAAM,GAAG,IAAI;;wBAEjC;wBACA,IAAI3N,MAAM,CAAC6N,QAAQ,CAAC,CAAC7N,MAAM,KAAK,WAAW,EAAE;0BAC3CwN,SAAS,CAACK,QAAQ,CAAC,CAAC9B,SAAS,GAAG,IAAI;wBACtC;sBACF;oBACF,CAAC,CAAC;kBACJ,CAAC,CAAC;kBAEFwB,WAAW,GAAG,IAAAtI,OAAA,CAAA5F,OAAA,EAAcmO,SAAS,CAAC,CAACQ,KAAK,CAC1C,UAACH,QAAQ;oBAAA,OAAKA,QAAQ,CAACF,MAAM,IAAI,CAACE,QAAQ,CAAC9B,SAAS;kBAAA,CACtD,CAAC;gBACH,CAAC,CAAC,OAAO3N,CAAC,EAAE;kBACVkG,oBAAW,CAACC,MAAM,CAACC,KAAK,8FAAAC,MAAA,CACuErG,CAAC,CAChG,CAAC;gBACH;cACF;cAAC,OAAAsP,SAAA,CAAAtJ,MAAA,WAEMmJ,WAAW;YAAA;YAAA;cAAA,OAAAG,SAAA,CAAAhJ,IAAA;UAAA;QAAA,GAAA4I,QAAA;MAAA,CACnB;MAAA,SAAAW,+BAAA;QAAA,OAAAZ,+BAAA,CAAAvO,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAiP,8BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAA3L,GAAA;IAAAC,KAAA,EAMA,SAAA2L,uBAAA,EAA0E;MACxE,IAAMC,eAAe,GAAG,EAAE;MAE1B,IAAAvC,QAAA,CAAAvM,OAAA,EAAe,IAAI,CAAC+C,mBAAmB,CAAC,CAACjD,OAAO,CAAC,UAAAiP,IAAA,EAAgC;QAAA,IAAAC,KAAA,OAAAvC,eAAA,CAAAzM,OAAA,EAAA+O,IAAA;UAA9B9L,GAAG,GAAA+L,KAAA;UAAEjM,mBAAmB,GAAAiM,KAAA;QACzE,IAAMrO,MAAM,GAAGoC,mBAAmB,CAACkM,SAAS,CAAC,CAAC;QAE9C,IAAItO,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,aAAa,EAAE;UACvCmO,eAAe,CAACtP,IAAI,CAAC;YAAC4G,IAAI,EAAEnD,GAAG;YAAEuL,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAI7N,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,aAAa,EAAE;UACvCmO,eAAe,CAACtP,IAAI,CAAC;YAAC4G,IAAI,EAAEnD,GAAG;YAAEuL,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAI7N,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,aAAa,EAAE;UACxCmO,eAAe,CAACtP,IAAI,CAAC;YAAC4G,IAAI,EAAEnD,GAAG;YAAEuL,QAAQ,EAAE;UAAM,CAAC,CAAC;QACrD;MACF,CAAC,CAAC;MAEF,OAAOM,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA7L,GAAA;IAAAC,KAAA,EAMA,SAAAgM,6BAAA,EAA+C;MAC7C,IAAIC,KAAK,GAAG,CAAC;MAEb,IAAA5C,QAAA,CAAAvM,OAAA,EAAe,IAAI,CAAC+C,mBAAmB,CAAC,CAACjD,OAAO,CAAC,UAAAsP,KAAA,EAAgC;QAAA,IAAAC,KAAA,OAAA5C,eAAA,CAAAzM,OAAA,EAAAoP,KAAA;UAA9BnM,GAAG,GAAAoM,KAAA;UAAEtM,mBAAmB,GAAAsM,KAAA;QACzE,IAAM1O,MAAM,GAAGoC,mBAAmB,CAACkM,SAAS,CAAC,CAAC;QAE9C,IACEtO,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,WAAW,IACjCA,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,WAAW,IACjCA,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,WAAW,EAClC;UACAwO,KAAK,IAAI,CAAC;QACZ;MACF,CAAC,CAAC;MAEF,OAAOA,KAAK;IACd;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAlM,GAAA;IAAAC,KAAA,EAMA,SAAAoM,uBAAA,EAAiC;MAC/B,IAAMC,IAAI,GAAG,IAAI,CAACV,sBAAsB,CAAC,CAAC;MAE1CU,IAAI,CAACzP,OAAO,CAAC,UAAA0P,KAAA,EAAsB;QAAA,IAApBpJ,IAAI,GAAAoJ,KAAA,CAAJpJ,IAAI;UAAEoI,QAAQ,GAAAgB,KAAA,CAARhB,QAAQ;QAC3BvJ,oBAAW,CAACC,MAAM,CAAC+E,GAAG,kEAAA7E,MAAA,CAC6CgB,IAAI,YAAAhB,MAAA,CAASoJ,QAAQ,CACxF,CAAC;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAvL,GAAA;IAAAC,KAAA,EAOA,SAAAuM,gCAAA,EAA0C;MACxC,OAAO,IAAAC,eAAO,EAAC,IAAI,CAACC,oBAAoB,CAACpN,MAAM,EAAE,IAAI,CAACqN,YAAY,CAACrN,MAAM,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAU,GAAA;IAAAC,KAAA,EAKA,SAAA2M,mBAAA,EAA6B;MAC3B,OAAO,IAAAH,eAAO,EAAC,IAAI,CAACC,oBAAoB,EAAE,IAAI,CAACC,YAAY,CAAC;IAC9D;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA3M,GAAA;IAAAC,KAAA,EAKA,SAAAoH,2BAAA,EAAoE;MAAA,IAAAwF,qBAAA;MAAA,IAAjCC,wBAAwB,GAAApQ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAA+C,SAAA,GAAA/C,SAAA,MAAG,IAAI;MAChE,IAAI,CAACyJ,aAAa,GAAG4G,WAAW,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAACC,SAAS;MAEvD,IAAI,CAACC,UAAU,CAAC,UAAU,CAAC;MAC3B,IAAI,CAACA,UAAU,CAAC,kBAAkB,CAAC;MAEnC,IAAI,CAACb,sBAAsB,CAAC,CAAC;MAC7B,CAAAQ,qBAAA,OAAI,CAACpI,iBAAiB,cAAAoI,qBAAA,uBAAtBA,qBAAA,CAAwBM,OAAO,CAAC,CAAC;MAEjC,IAAIL,wBAAwB,EAAE;QAC5B,IAAMM,oBAAoB,GAAG,IAAI,CAACnB,4BAA4B,CAAC,CAAC;QAChE,IAAI,IAAI,CAACzK,mBAAmB,IAAI4L,oBAAoB,GAAG,IAAI,CAAC5L,mBAAmB,EAAE;UAC/EQ,oBAAW,CAACC,MAAM,CAAC+E,GAAG,uFAAA7E,MAAA,CACkEiL,oBAAoB,SAAAjL,MAAA,CAAM,IAAI,CAACX,mBAAmB,mCAC1I,CAAC;UACD,IAAI,CAACqF,0BAA0B,CAAC,CAAC;QACnC;MACF;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA7G,GAAA;IAAAC,KAAA,EAKA,SAAAoN,yBAAA,EAAmC;MACjC,IAAA1K,OAAA,CAAA5F,OAAA,EAAc,IAAI,CAAC+C,mBAAmB,CAAC,CAACjD,OAAO,CAAC,UAACiD,mBAAmB,EAAK;QACvEA,mBAAmB,CAACwN,KAAK,CAAC,CAAC;MAC7B,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAtN,GAAA;IAAAC,KAAA,EAQA,SAAAsN,cACE5F,OAAkE,EAClE4D,QAAgC,EAChCzC,WAAoB,EACpB;MACA,IAAM0E,MAAM,GAAG7F,OAAO,CACnBvL,MAAM,CAAC,UAACsB,MAAM;QAAA,OAAKA,MAAM,CAACoL,WAAW,KAAKA,WAAW;MAAA,EAAC,CACtD1M,MAAM,CAAC,UAACsB,MAAM;QAAA,OAAKA,MAAM,CAAC6N,QAAQ,CAAC,CAAC7N,MAAM,KAAK,WAAW;MAAA,EAAC,CAC3D+P,GAAG,CAAC,UAAC/P,MAAM;QAAA,OAAKA,MAAM,CAAC6N,QAAQ,CAAC,CAAC5B,qBAAqB;MAAA,EAAC;MAE1D,IAAI6D,MAAM,CAAC7Q,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO;UACL+Q,GAAG,EAAE,CAAC,CAAC;UACPC,GAAG,EAAE,CAAC,CAAC;UACPC,OAAO,EAAE,CAAC;QACZ,CAAC;MACH;MAEA,OAAO;QACLF,GAAG,EAAEG,IAAI,CAACH,GAAG,CAAAlR,KAAA,CAARqR,IAAI,MAAAC,mBAAA,CAAA/Q,OAAA,EAAQyQ,MAAM,EAAC;QACxBG,GAAG,EAAEE,IAAI,CAACF,GAAG,CAAAnR,KAAA,CAARqR,IAAI,MAAAC,mBAAA,CAAA/Q,OAAA,EAAQyQ,MAAM,EAAC;QACxBI,OAAO,EAAE,IAAAG,YAAI,EAACP,MAAM;MACtB,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAxN,GAAA;IAAAC,KAAA;MAAA,IAAA+N,WAAA,OAAA7N,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAMA,SAAA4N,UAAA;QAAA,IAAAC,OAAA;UAAAvG,OAAA;UAAAH,KAAA;UAAA2G,OAAA,GAAAzR,SAAA;QAAA,OAAA0D,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAqN,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAnN,IAAA,GAAAmN,UAAA,CAAAlN,IAAA;YAAA;cAA2B+M,OAAO,GAAAC,OAAA,CAAAxR,MAAA,QAAAwR,OAAA,QAAA1O,SAAA,GAAA0O,OAAA,MAAG,KAAK;cAClCxG,OAAO,GAAG,EAAE;cAElB,IAAAhF,OAAA,CAAA5F,OAAA,EAAc,IAAI,CAAC+C,mBAAmB,CAAC,CAACjD,OAAO,CAAC,UAACiD,mBAAmB,EAAK;gBACvE6H,OAAO,CAACpL,IAAI,CAAAE,aAAA,CAAAA,aAAA,KACPqD,mBAAmB,CAACkM,SAAS,CAAC,CAAC;kBAClClD,WAAW,EAAEhJ,mBAAmB,CAACgJ;gBAAW,EAC7C,CAAC;cACJ,CAAC,CAAC;cAEItB,KAAK,GAAG;gBACZ0G,OAAO,EAAPA,OAAO;gBACPI,GAAG,EAAE;kBACHjP,GAAG,EAAE,IAAI,CAACkO,aAAa,CAAC5F,OAAO,EAAE,KAAK,EAAE,IAAI;gBAC9C,CAAC;gBACDrI,MAAM,EAAE;kBACND,GAAG,EAAE,IAAI,CAACkO,aAAa,CAAC5F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;kBAC9CpI,GAAG,EAAE,IAAI,CAACgO,aAAa,CAAC5F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;kBAC9CnI,IAAI,EAAE,IAAI,CAAC+N,aAAa,CAAC5F,OAAO,EAAE,MAAM,EAAE,KAAK;gBACjD,CAAC;gBACD4G,KAAK,EAAE;kBACL;kBACAC,SAAS,EAAE,IAAI,CAAC1P,KAAK,CAACuF,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAACiK,SAAS;kBACjE;kBACAC,SAAS,EAAE,IAAI,CAAC3P,KAAK,CAACuF,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAACkK,SAAS;kBACjE;kBACAC,SAAS,EAAE,IAAI,CAAC5P,KAAK,CAACuF,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAACmK,SAAS;kBACjE;kBACAC,SAAS,EAAE,IAAI,CAAC7P,KAAK,CAACuF,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAACoK;gBAC1D,CAAC;gBACDpO,OAAO,EAAE,IAAI,CAAC6D;cAChB,CAAC;cACDwK,gBAAO,CAACC,oBAAoB,CAC1BC,mBAAkB,CAACC,sBAAsB,EACzCH,gBAAO,CAACI,mBAAmB,CAACxH,KAAK,CACnC,CAAC;YAAC;YAAA;cAAA,OAAA6G,UAAA,CAAAjM,IAAA;UAAA;QAAA,GAAA6L,SAAA;MAAA,CACH;MAAA,SAAA7G,WAAA;QAAA,OAAA4G,WAAA,CAAAxR,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA0K,UAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAApH,GAAA;IAAAC,KAAA,EAKA,SAAAgP,YAAA,EAAsB;MAAA,IAAAC,MAAA;MACpB,IAAI,CAACC,QAAQ,GAAGC,UAAU,CAAC,YAAM;QAC/BF,MAAI,CAACC,QAAQ,GAAG1P,SAAS;QACzB;QACA;QACA,IAAIyP,MAAI,CAAC1C,+BAA+B,CAAC,CAAC,EAAE;UAC1CxK,oBAAW,CAACC,MAAM,CAAC+E,GAAG,CACpB,gFACF,CAAC;UAEDkI,MAAI,CAAC7H,0BAA0B,CAAC,CAAC;QACnC;MACF,CAAC,EAAE9I,kBAAkB,GAAG,IAAI,CAAC;MAE7B,IAAI,CAAC8Q,gBAAgB,GAAGD,UAAU,CAAC,YAAM;QACvCF,MAAI,CAACG,gBAAgB,GAAG5P,SAAS;QAEjCuC,oBAAW,CAACC,MAAM,CAAC+E,GAAG,sEAAA7E,MAAA,CACiD7D,eAAe,OACtF,CAAC;;QAED;;QAEA;QACA4Q,MAAI,CAAC7H,0BAA0B,CAAC,CAAC;MACnC,CAAC,EAAE/I,eAAe,GAAG,IAAI,CAAC;MAE1B,IAAI,CAACyI,YAAY,GAAGqI,UAAU,CAAC,YAAM;QACnCF,MAAI,CAACnI,YAAY,GAAGtH,SAAS;QAC7ByP,MAAI,CAAC7B,wBAAwB,CAAC,CAAC;QAC/B6B,MAAI,CAACjI,IAAI,CACP;UACEC,IAAI,EAAE,cAAc;UACpBC,QAAQ,EAAE;QACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;QACD+H,MAAI,CAAC9H,UAAU,CAAC,CAAC;QAEjBpF,oBAAW,CAACC,MAAM,CAAC+E,GAAG,4EAAA7E,MAAA,CACuD3D,eAAe,OAC5F,CAAC;MACH,CAAC,EAAEA,eAAe,GAAG,IAAI,CAAC;IAC5B;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAwB,GAAA;IAAAC,KAAA;MAAA,IAAAqP,aAAA,OAAAnP,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAMA,SAAAkP,UAA2B5H,OAA4B;QAAA,OAAAvH,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAyO,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAvO,IAAA,GAAAuO,UAAA,CAAAtO,IAAA;YAAA;cAAAsO,UAAA,CAAAtO,IAAA;cAAA,OAE/C,IAAI,CAACrC,KAAK,CAAC4C,cAAc,CAACC,GAAG,CACjC,IAAI,CAACxC,SAAS,EACdD,uBAAY,CAAC2J,kBAAkB,EAC/B,IAAAhH,UAAA,CAAA9E,OAAA,EAAe4K,OAAO,CACxB,CAAC;YAAA;YAAA;cAAA,OAAA8H,UAAA,CAAArN,IAAA;UAAA;QAAA,GAAAmN,SAAA;MAAA,CACF;MAAA,SAAAG,aAAAC,GAAA;QAAA,OAAAL,aAAA,CAAA9S,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAgT,YAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAA1P,GAAA;IAAAC,KAAA,EAKA,SAAA2P,oBAAA,EAA8B;MAC5B,IAAI,CAAClD,oBAAoB,CAACtN,SAAS,CAACC,GAAG,GAAG,CAAC;MAC3C,IAAI,CAACqN,oBAAoB,CAACpN,MAAM,CAACD,GAAG,GAAG,CAAC;MACxC,IAAI,CAACqN,oBAAoB,CAACpN,MAAM,CAACC,GAAG,GAAG,CAAC;MACxC,IAAI,CAACmN,oBAAoB,CAACpN,MAAM,CAACE,IAAI,GAAG,CAAC;MAEzC,IAAI,CAACmN,YAAY,CAACvN,SAAS,CAACC,GAAG,GAAG,CAAC;MACnC,IAAI,CAACsN,YAAY,CAACrN,MAAM,CAACD,GAAG,GAAG,CAAC;MAChC,IAAI,CAACsN,YAAY,CAACrN,MAAM,CAACC,GAAG,GAAG,CAAC;MAChC,IAAI,CAACoN,YAAY,CAACrN,MAAM,CAACE,IAAI,GAAG,CAAC;IACnC;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAQ,GAAA;IAAAC,KAAA,EAMA,SAAAiN,WAAmB2C,KAAa,EAAE;MAChC,IAAI,IAAI,CAACA,KAAK,CAAC,EAAE;QACfC,YAAY,CAAC,IAAI,CAACD,KAAK,CAAC,CAAC;QACzB,IAAI,CAACA,KAAK,CAAC,GAAGpQ,SAAS;MACzB;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAO,GAAA;IAAAC,KAAA,EAKA,SAAA2G,mBAAA,EAA6B;MAC3B,IAAI,CAACsG,UAAU,CAAC,UAAU,CAAC;MAC3B,IAAI,CAACA,UAAU,CAAC,kBAAkB,CAAC;MACnC,IAAI,CAACA,UAAU,CAAC,cAAc,CAAC;MAE/B,IAAI,CAACG,wBAAwB,CAAC,CAAC;IACjC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAArN,GAAA;IAAAC,KAAA;MAAA,IAAA8P,0BAAA,OAAA5P,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAKA,SAAA2P,UAAwCC,WAAwB;QAAA,IAAAC,MAAA;QAAA,IAAAvI,OAAA,EAAAwI,aAAA;QAAA,OAAA/P,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAqP,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAnP,IAAA,GAAAmP,UAAA,CAAAlP,IAAA;YAAA;cACxDwG,OAA4B,GAAG,CAAC,CAAC;cAEvC,IAAI,CAAC7H,mBAAmB,GAAG,CAAC,CAAC;cAE7B,IAAI,CAACmN,SAAS,GAAGF,WAAW,CAACC,GAAG,CAAC,CAAC;cAElChL,oBAAW,CAACC,MAAM,CAAC+E,GAAG,8DAAA7E,MAAA;cAElB;cACA,IAAI,CAACrD,KAAK,CAACkF,MAAM,CAACC,QAAQ,CAACqM,YAAY,CAACC,qBAAqB,GAAG,MAAM,GAAG,EAAE,EAAApO,MAAA;cAE3E;cACA,IAAI,CAACrD,KAAK,CAACkF,MAAM,CAACC,QAAQ,CAACqM,YAAY,CAACE,qBAAqB,GAAG,MAAM,GAAG,EAAE,yBAE/E,CAAC;cAED,IAAI,CAACZ,mBAAmB,CAAC,CAAC;;cAE1B;cACA,IAAAtE,KAAA,CAAAvO,OAAA,EAAYkT,WAAW,CAAC,CAACpT,OAAO,CAAC,UAACmD,GAAG,EAAK;gBACxC,IAAM8C,OAAO,GAAGmN,WAAW,CAACjQ,GAAG,CAAC;;gBAEhC;gBACA,IAAMyQ,sBAAsB;gBAC1B;gBACAP,MAAI,CAACpR,KAAK,CAACkF,MAAM,CAACC,QAAQ,CAACqM,YAAY,CAACC,qBAAqB,IAAI,CAACzN,OAAO,CAACgG,WAAW;gBAEvF,IAAI,CAAC2H,sBAAsB,EAAE;kBAC3B3N,OAAO,CAACvD,GAAG,GAAG,EAAE;gBAClB;;gBAEA;gBACA,IAAMmR,sBAAsB;gBAC1B;gBACAR,MAAI,CAACpR,KAAK,CAACkF,MAAM,CAACC,QAAQ,CAACqM,YAAY,CAACE,qBAAqB,IAAI,CAAC1N,OAAO,CAACgG,WAAW;gBAEvF,IAAI,CAAC4H,sBAAsB,EAAE;kBAC3B5N,OAAO,CAACtD,IAAI,GAAG,EAAE;gBACnB;;gBAEA;gBACAmI,OAAO,CAAC3H,GAAG,CAAC,GAAG;kBACbX,GAAG,EAAE;oBAAC3B,MAAM,EAAEoF,OAAO,CAACzD,GAAG,CAAC1C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBAClE4C,GAAG,EAAE;oBAAC7B,MAAM,EAAEoF,OAAO,CAACvD,GAAG,CAAC5C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBAClE6C,IAAI,EAAE;oBAAC9B,MAAM,EAAEoF,OAAO,CAACtD,IAAI,CAAC7C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBACpEmM,WAAW,EAAEhG,OAAO,CAACgG;gBACvB,CAAC;;gBAED;gBACAoH,MAAI,CAACxD,oBAAoB,CAAC5J,OAAO,CAACgG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAACzJ,GAAG,IACzEyD,OAAO,CAACzD,GAAG,CAAC1C,MAAM;gBACpB,IAAI,CAACmG,OAAO,CAACgG,WAAW,EAAE;kBACxBoH,MAAI,CAACxD,oBAAoB,CAACpN,MAAM,CAACC,GAAG,IAAIuD,OAAO,CAACvD,GAAG,CAAC5C,MAAM;kBAC1DuT,MAAI,CAACxD,oBAAoB,CAACpN,MAAM,CAACE,IAAI,IAAIsD,OAAO,CAACtD,IAAI,CAAC7C,MAAM;gBAC9D;cACF,CAAC,CAAC;cAEIwT,aAAa,GAAG;gBACpB9Q,GAAG,EAAE,IAAI;gBACTE,GAAG,EAAE,IAAI;gBACTC,IAAI,EAAE;cACR,CAAC,EAED;cAAA6Q,UAAA,CAAAlP,IAAA;cAAA,OACM,IAAI,CAACuO,YAAY,CAAC/H,OAAO,CAAC;YAAA;cAAA,MAE5B,CAACsI,WAAW,IAAI,CAAC,IAAA3E,KAAA,CAAAvO,OAAA,EAAYkT,WAAW,CAAC,CAACtT,MAAM;gBAAA0T,UAAA,CAAAlP,IAAA;gBAAA;cAAA;cAClD;cACA,IAAI,CAACkG,0BAA0B,CAAC,KAAK,CAAC;cAEtC,IAAI,CAACJ,IAAI,CACP;gBACEC,IAAI,EAAE,cAAc;gBACpBC,QAAQ,EAAE;cACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;cAAC,OAAAkJ,UAAA,CAAAvO,MAAA;YAAA;cAKJ,IAAI,CAACmN,WAAW,CAAC,CAAC;;cAElB;cACA,IAAA3D,KAAA,CAAAvO,OAAA,EAAYkT,WAAW,CAAC,CAACpT,OAAO,CAAC,UAACmD,GAAG,EAAK;gBACxC,IAAM8C,OAAO,GAAGmN,WAAW,CAACjQ,GAAG,CAAC;gBAEhCkQ,MAAI,CAACpQ,mBAAmB,CAACE,GAAG,CAAC,GAAG,IAAI2Q,wCAAmB,CAAC3Q,GAAG,EAAE8C,OAAO,CAAC;gBACrEoN,MAAI,CAACpQ,mBAAmB,CAACE,GAAG,CAAC,CAAC4Q,EAAE,CAACC,2BAAM,CAACC,WAAW;kBAAA,IAAAC,KAAA,OAAA5Q,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAAE,SAAA2Q,UAAOC,IAAqB;oBAAA,IAAA1F,QAAA,EAAA7N,MAAA,EAAAwT,cAAA,EAAAvH,qBAAA,EAAAiD,kBAAA;oBAAA,OAAAxM,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAoQ,WAAAC,UAAA;sBAAA,kBAAAA,UAAA,CAAAlQ,IAAA,GAAAkQ,UAAA,CAAAjQ,IAAA;wBAAA;0BACxEoK,QAAQ,GAAmD0F,IAAI,CAA/D1F,QAAQ,EAAE7N,MAAM,GAA2CuT,IAAI,CAArDvT,MAAM,EAAEwT,cAAc,GAA2BD,IAAI,CAA7CC,cAAc,EAAEvH,qBAAqB,GAAIsH,IAAI,CAA7BtH,qBAAqB;0BAE9D,IAAIwG,aAAa,CAAC5E,QAAQ,CAAC,EAAE;4BAC3B2E,MAAI,CAACjJ,IAAI,CACP;8BACEC,IAAI,EAAE,cAAc;8BACpBC,QAAQ,EAAE;4BACZ,CAAC,EACD,mCAAmC,EACnC;8BACEoE,QAAQ,EAARA;4BACF,CACF,CAAC;4BACD4E,aAAa,CAAC5E,QAAQ,CAAC,GAAG,KAAK;0BACjC;0BACA2E,MAAI,CAACvD,YAAY,CAAC7J,OAAO,CAACgG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAACyC,QAAQ,CAAC,IAAI,CAAC;0BAExEqB,kBAAkB,GAAGsD,MAAI,CAACtD,kBAAkB,CAAC,CAAC;0BAEpDjF,OAAO,CAAC3H,GAAG,CAAC,CAACuL,QAAQ,CAAC,CAAC7N,MAAM,GAAGA,MAAM;0BACtCiK,OAAO,CAAC3H,GAAG,CAAC,CAACuL,QAAQ,CAAC,CAAC2F,cAAc,GAAGA,cAAc;0BACtDvJ,OAAO,CAAC3H,GAAG,CAAC,CAACuL,QAAQ,CAAC,CAAC5B,qBAAqB,GAAGA,qBAAqB;0BAACyH,UAAA,CAAAjQ,IAAA;0BAAA,OAE/D+O,MAAI,CAACR,YAAY,CAAC/H,OAAO,CAAC;wBAAA;0BAEhC,IAAIiF,kBAAkB,EAAE;4BACtBsD,MAAI,CAAChD,UAAU,CAAC,cAAc,CAAC;4BAC/BgD,MAAI,CAACjJ,IAAI,CACP;8BACEC,IAAI,EAAE,cAAc;8BACpBC,QAAQ,EAAE;4BACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;4BACD+I,MAAI,CAAC9I,UAAU,CAAC,CAAC;4BAEjBpF,oBAAW,CAACC,MAAM,CAAC+E,GAAG,gFAEtB,CAAC;4BACDkJ,MAAI,CAAC7I,0BAA0B,CAAC,CAAC;0BACnC;wBAAC;wBAAA;0BAAA,OAAA+J,UAAA,CAAAhP,IAAA;sBAAA;oBAAA,GAAA4O,SAAA;kBAAA,CACF;kBAAA,iBAAAK,GAAA;oBAAA,OAAAN,KAAA,CAAAvU,KAAA,OAAAE,SAAA;kBAAA;gBAAA,IAAC;;gBAEF;gBACAwT,MAAI,CAACpQ,mBAAmB,CAACE,GAAG,CAAC,CAAC4Q,EAAE,CAC9BC,2BAAM,CAACS,qBAAqB;kBAAA,IAAAC,KAAA,OAAApR,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAC5B,SAAAmR,UAAOP,IAAoC;oBAAA,OAAA7Q,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAA0Q,WAAAC,UAAA;sBAAA,kBAAAA,UAAA,CAAAxQ,IAAA,GAAAwQ,UAAA,CAAAvQ,IAAA;wBAAA;0BACzCwG,OAAO,CAAC3H,GAAG,CAAC,CAACiR,IAAI,CAAC1F,QAAQ,CAAC,CAAC2F,cAAc,GAAGD,IAAI,CAACC,cAAc;0BAACQ,UAAA,CAAAvQ,IAAA;0BAAA,OAE3D+O,MAAI,CAACR,YAAY,CAAC/H,OAAO,CAAC;wBAAA;wBAAA;0BAAA,OAAA+J,UAAA,CAAAtP,IAAA;sBAAA;oBAAA,GAAAoP,SAAA;kBAAA,CACjC;kBAAA,iBAAAG,GAAA;oBAAA,OAAAJ,KAAA,CAAA/U,KAAA,OAAAE,SAAA;kBAAA;gBAAA,GACH,CAAC;gBAEDwT,MAAI,CAACpQ,mBAAmB,CAACE,GAAG,CAAC,CAAC4Q,EAAE,CAC9BC,2BAAM,CAACe,cAAc;kBAAA,IAAAC,KAAA,OAAA1R,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CACrB,SAAAyR,UAAOb,IAA6B;oBAAA,OAAA7Q,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAgR,WAAAC,UAAA;sBAAA,kBAAAA,UAAA,CAAA9Q,IAAA,GAAA8Q,UAAA,CAAA7Q,IAAA;wBAAA;0BAClC+O,MAAI,CAACxH,OAAO,GAAGuI,IAAI,CAACvI,OAAO;wBAAC;wBAAA;0BAAA,OAAAsJ,UAAA,CAAA5P,IAAA;sBAAA;oBAAA,GAAA0P,SAAA;kBAAA,CAC7B;kBAAA,iBAAAG,GAAA;oBAAA,OAAAJ,KAAA,CAAArV,KAAA,OAAAE,SAAA;kBAAA;gBAAA,GACH,CAAC;gBAEDwT,MAAI,CAACpQ,mBAAmB,CAACE,GAAG,CAAC,CAACkS,KAAK,CAAC,CAAC,CAAC,CAAC;cACzC,CAAC,CAAC;YAAC;YAAA;cAAA,OAAA7B,UAAA,CAAAjO,IAAA;UAAA;QAAA,GAAA4N,SAAA;MAAA,CACJ;MAAA,SAAArL,0BAAAwN,GAAA;QAAA,OAAApC,0BAAA,CAAAvT,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAiI,yBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;IAPE;EAAA;IAAA3E,GAAA;IAAAC,KAAA;MAAA,IAAAmS,0BAAA,OAAAjS,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAQA,SAAAgS,UACEC,aAAsB,EACtB/D,KAAkB;QAAA,IAAA/H,kBAAA;QAAA,OAAApG,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAwR,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAtR,IAAA,GAAAsR,UAAA,CAAArR,IAAA;YAAA;cAAA,IAGb,IAAI,CAACM,iBAAiB;gBAAA+Q,UAAA,CAAArR,IAAA;gBAAA;cAAA;cAAAqR,UAAA,CAAAzQ,EAAA,GAEvBwM,KAAK;cAAAiE,UAAA,CAAArR,IAAA;cAAA,OACa,IAAI,CAACqE,aAAa,CAAC,CAAC;YAAA;cAAAgN,UAAA,CAAAC,EAAA,GAAAD,UAAA,CAAAjR,IAAA;cAAAiR,UAAA,CAAAE,EAAA,GACnB,CAACJ,aAAa;cAAA,OAAAE,UAAA,CAAA1Q,MAAA;gBAFjCyM,KAAK,EAAAiE,UAAA,CAAAzQ,EAAA;gBACLnB,UAAU,EAAA4R,UAAA,CAAAC,EAAA;gBACVE,iBAAiB,EAAAH,UAAA,CAAAE;cAAA;YAAA;cAAAF,UAAA,CAAArR,IAAA;cAAA,OAOa,IAAI,CAACkF,qBAAqB,CAAC,CAAC;YAAA;cAAxDG,kBAAkB,GAAAgM,UAAA,CAAAjR,IAAA;cAAA,OAAAiR,UAAA,CAAA1Q,MAAA,WAAArF,aAAA;gBAMtB8R,KAAK,EAALA,KAAK;gBACLoE,iBAAiB,EAAE,CAACL;cAAa,GAC9B9L,kBAAkB;YAAA;YAAA;cAAA,OAAAgM,UAAA,CAAApQ,IAAA;UAAA;QAAA,GAAAiQ,SAAA;MAAA,CAExB;MAAA,SAAAO,0BAAAC,GAAA,EAAAC,IAAA;QAAA,OAAAV,0BAAA,CAAA5V,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAkW,yBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANE;EAAA;IAAA5S,GAAA;IAAAC,KAAA;MAAA,IAAA8S,oCAAA,OAAA5S,kBAAA,CAAApD,OAAA,gBAAAqD,YAAA,CAAArD,OAAA,CAAAsD,IAAA,CAOA,SAAA2S,UAAA;QAAA,OAAA5S,YAAA,CAAArD,OAAA,CAAAgE,IAAA,UAAAkS,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAhS,IAAA,GAAAgS,UAAA,CAAA/R,IAAA;YAAA;cAAA,IAEO,IAAI,CAACM,iBAAiB;gBAAAyR,UAAA,CAAA/R,IAAA;gBAAA;cAAA;cAAA,OAAA+R,UAAA,CAAApR,MAAA,WAClB,IAAI,CAACgE,sBAAsB,CAAC,CAAC;YAAA;cAAA,OAAAoN,UAAA,CAAApR,MAAA,WAM/BrC,SAAS;YAAA;YAAA;cAAA,OAAAyT,UAAA,CAAA9Q,IAAA;UAAA;QAAA,GAAA4Q,SAAA;MAAA,CACjB;MAAA,SAAAG,oCAAA;QAAA,OAAAJ,oCAAA,CAAAvW,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAyW,mCAAA;IAAA;EAAA;EAAA,OAAA1U,YAAA;AAAA,EA5gCuC2U,oBAAW"}
@@ -145,6 +145,7 @@ export declare const DIALER_REGEX: {
145
145
  SIP_ADDRESS: RegExp;
146
146
  PHONE_NUMBER: RegExp;
147
147
  E164_FORMAT: RegExp;
148
+ INTERNAL_NUMBER: RegExp;
148
149
  };
149
150
  export declare const IPV4_REGEX: RegExp;
150
151
  export declare const VALID_EMAIL_ADDRESS: RegExp;
@@ -277,11 +278,13 @@ export declare const EVENT_TRIGGERS: {
277
278
  MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
278
279
  MEETING_CONTROLS_ANNOTATION_UPDATED: string;
279
280
  MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED: string;
281
+ MEETING_CONTROLS_POLLING_QA_UPDATED: string;
280
282
  MEETING_LOCUS_URL_UPDATE: string;
281
283
  MEETING_STREAM_PUBLISH_STATE_CHANGED: string;
282
284
  MEETING_TRANSCRIPTION_CONNECTED: string;
283
285
  MEETING_STARTED_RECEIVING_TRANSCRIPTION: string;
284
286
  MEETING_STOPPED_RECEIVING_TRANSCRIPTION: string;
287
+ MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: string;
285
288
  MEETING_MANUAL_CAPTION_UPDATED: string;
286
289
  MEETING_CAPTION_RECEIVED: string;
287
290
  MEETING_PARTICIPANT_REASON_CHANGED: string;
@@ -565,6 +568,7 @@ export declare const LOCUSINFO: {
565
568
  CONTROLS_MEETING_LAYOUT_UPDATED: string;
566
569
  CONTROLS_RECORDING_UPDATED: string;
567
570
  CONTROLS_MEETING_TRANSCRIBE_UPDATED: string;
571
+ CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: string;
568
572
  CONTROLS_MEETING_MANUAL_CAPTION_UPDATED: string;
569
573
  CONTROLS_MEETING_BREAKOUT_UPDATED: string;
570
574
  CONTROLS_MEETING_CONTAINER_UPDATED: string;
@@ -583,6 +587,7 @@ export declare const LOCUSINFO: {
583
587
  CONTROLS_STAGE_VIEW_UPDATED: string;
584
588
  CONTROLS_ANNOTATION_CHANGED: string;
585
589
  CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED: string;
590
+ CONTROLS_POLLING_QA_CHANGED: string;
586
591
  SELF_UNADMITTED_GUEST: string;
587
592
  SELF_ADMITTED_GUEST: string;
588
593
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: string;
@@ -774,6 +779,9 @@ export declare const DISPLAY_HINTS: {
774
779
  PREMISE_RECORDING_CONTROL_PAUSE: string;
775
780
  PREMISE_RECORDING_CONTROL_STOP: string;
776
781
  PREMISE_RECORDING_CONTROL_RESUME: string;
782
+ LOCAL_RECORDING_STATUS_STARTED: string;
783
+ LOCAL_RECORDING_STATUS_STOPPED: string;
784
+ LOCAL_RECORDING_STATUS_PAUSED: string;
777
785
  LOCK_CONTROL_UNLOCK: string;
778
786
  LOCK_CONTROL_LOCK: string;
779
787
  LOCK_STATUS_LOCKED: string;
@@ -852,6 +860,8 @@ export declare const DISPLAY_HINTS: {
852
860
  DISABLE_ANNOTATION_MEETING_OPTION: string;
853
861
  ENABLE_RDC_MEETING_OPTION: string;
854
862
  DISABLE_RDC_MEETING_OPTION: string;
863
+ ENABLE_ATTENDEE_START_POLLING_QA: string;
864
+ DISABLE_ATTENDEE_START_POLLING_QA: string;
855
865
  };
856
866
  export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
857
867
  export declare const SELF_ROLES: {
@@ -966,6 +976,7 @@ export declare const QUALITY_LEVELS: {
966
976
  HIGH: string;
967
977
  '360p': string;
968
978
  '480p': string;
979
+ '540p': string;
969
980
  '720p': string;
970
981
  '1080p': string;
971
982
  };
@@ -994,6 +1005,18 @@ export declare const AVAILABLE_RESOLUTIONS: {
994
1005
  };
995
1006
  };
996
1007
  };
1008
+ '540p': {
1009
+ video: {
1010
+ width: {
1011
+ max: number;
1012
+ ideal: number;
1013
+ };
1014
+ height: {
1015
+ max: number;
1016
+ ideal: number;
1017
+ };
1018
+ };
1019
+ };
997
1020
  '720p': {
998
1021
  video: {
999
1022
  width: {
@@ -1111,3 +1134,8 @@ export declare const INITIAL_REGISTRATION_STATUS: {
1111
1134
  mercuryConnect: boolean;
1112
1135
  checkH264Support: boolean;
1113
1136
  };
1137
+ export declare const STAGE_MANAGER_TYPE: {
1138
+ LOGO: number;
1139
+ BACKGROUND: number;
1140
+ NAME_LABEL: number;
1141
+ };
@@ -12,7 +12,8 @@ declare enum Control {
12
12
  video = "video",
13
13
  viewTheParticipantList = "viewTheParticipantList",
14
14
  annotation = "annotation",
15
- rdc = "rdc"
15
+ rdc = "rdc",
16
+ pollingQA = "pollingQA"
16
17
  }
17
18
  export { Control, Setting };
18
19
  export default Setting;
@@ -38,7 +38,10 @@ export interface AnnotationProperties {
38
38
  export interface RemoteDesktopControlProperties {
39
39
  enabled?: boolean;
40
40
  }
41
- export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties | AnnotationProperties | RemoteDesktopControlProperties;
41
+ export interface PollingQAProperties {
42
+ enabled?: boolean;
43
+ }
44
+ export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties | AnnotationProperties | RemoteDesktopControlProperties | PollingQAProperties;
42
45
  export interface ControlConfig<Props = Properties> {
43
46
  /**
44
47
  * The scope of the control within this object.
@@ -16,7 +16,6 @@ export default class LocusInfo extends EventsScope {
16
16
  aclUrl: any;
17
17
  baseSequence: any;
18
18
  created: any;
19
- deltaParticipants: any;
20
19
  identities: any;
21
20
  membership: any;
22
21
  participants: any;
@@ -148,14 +147,6 @@ export default class LocusInfo extends EventsScope {
148
147
  * @memberof LocusInfo
149
148
  */
150
149
  compareSelfAndHost(): void;
151
- /**
152
- * Update the deltaParticipants property of this object based on a list of
153
- * provided participants.
154
- *
155
- * @param {Array} [participants] - The participants to update against.
156
- * @returns {void}
157
- */
158
- updateParticipantDeltas(participants?: Array<any>): void;
159
150
  /**
160
151
  * update meeting's members
161
152
  * @param {Object} participants new participants object
@@ -40,7 +40,6 @@ export declare class BrbState {
40
40
  /**
41
41
  * Send the local brb state to the server
42
42
  *
43
- * @param {SendSlotManager} sendSlotManager
44
43
  * @returns {Promise}
45
44
  */
46
45
  private sendLocalBrbStateToServer;
@@ -34,6 +34,9 @@ interface IInMeetingActions {
34
34
  isClosedCaptionActive?: boolean;
35
35
  canStartManualCaption?: boolean;
36
36
  canStopManualCaption?: boolean;
37
+ isLocalRecordingStarted?: boolean;
38
+ isLocalRecordingStopped?: boolean;
39
+ isLocalRecordingPaused?: boolean;
37
40
  isManualCaptionActive?: boolean;
38
41
  isSaveTranscriptsEnabled?: boolean;
39
42
  isWebexAssistantActive?: boolean;
@@ -103,6 +106,8 @@ interface IInMeetingActions {
103
106
  canEnableRemoteDesktopControl?: boolean;
104
107
  canDisableRemoteDesktopControl?: boolean;
105
108
  canMoveToLobby?: boolean;
109
+ canEnablePollingQA?: boolean;
110
+ canDisablePollingQA?: boolean;
106
111
  }
107
112
  /**
108
113
  * @class InMeetingActions
@@ -137,6 +142,9 @@ export default class InMeetingActions implements IInMeetingActions {
137
142
  isClosedCaptionActive: any;
138
143
  canStartManualCaption: any;
139
144
  canStopManualCaption: any;
145
+ isLocalRecordingStopped: any;
146
+ isLocalRecordingStarted: any;
147
+ isLocalRecordingPaused: any;
140
148
  isManualCaptionActive: any;
141
149
  isSaveTranscriptsEnabled: any;
142
150
  isWebexAssistantActive: any;
@@ -206,6 +214,8 @@ export default class InMeetingActions implements IInMeetingActions {
206
214
  canEnableRemoteDesktopControl: any;
207
215
  canDisableRemoteDesktopControl: any;
208
216
  canMoveToLobby: any;
217
+ canEnablePollingQA: any;
218
+ canDisablePollingQA: any;
209
219
  /**
210
220
  * Returns all meeting action options
211
221
  * @returns {Object}