mediasfu-angular 1.0.2 → 2.0.1

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 (281) hide show
  1. package/README.md +686 -578
  2. package/dist/README.md +677 -578
  3. package/dist/fesm2022/mediasfu-angular.mjs +5551 -2944
  4. package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
  5. package/dist/lib/@types/types.d.ts +22 -1
  6. package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +1 -0
  7. package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +153 -61
  8. package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +154 -66
  9. package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +190 -76
  10. package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +184 -70
  11. package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +192 -78
  12. package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +6 -1
  13. package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +5 -2
  14. package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +4 -2
  15. package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +71 -66
  16. package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +5 -1
  17. package/dist/lib/consumers/connect-local-ips.service.d.ts +81 -0
  18. package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +43 -11
  19. package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +87 -46
  20. package/dist/lib/consumers/connect-send-transport-video.service.d.ts +89 -43
  21. package/dist/lib/consumers/connect-send-transport.service.d.ts +5 -1
  22. package/dist/lib/consumers/create-send-transport.service.d.ts +130 -40
  23. package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +77 -40
  24. package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +48 -14
  25. package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +81 -44
  26. package/dist/lib/consumers/get-piped-producers-alt.service.d.ts +5 -1
  27. package/dist/lib/consumers/receive-all-piped-transports.service.d.ts +5 -1
  28. package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +54 -21
  29. package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +124 -40
  30. package/dist/lib/consumers/trigger.service.d.ts +3 -0
  31. package/dist/lib/methods/exit-methods/confirm-exit.service.d.ts +5 -1
  32. package/dist/lib/methods/recording-methods/start-recording.service.d.ts +3 -0
  33. package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +4 -1
  34. package/dist/lib/methods/recording-methods/update-recording.service.d.ts +3 -0
  35. package/dist/lib/methods/stream-methods/click-audio.service.d.ts +3 -0
  36. package/dist/lib/methods/utils/check-limits-and-make-request.service.d.ts +23 -0
  37. package/dist/lib/methods/utils/create-response-join-room.util.d.ts +33 -0
  38. package/dist/lib/methods/utils/create-room-on-media-sfu.service.d.ts +25 -0
  39. package/dist/lib/methods/utils/initial-values.util.d.ts +6 -0
  40. package/dist/lib/methods/utils/join-room-on-media-sfu.service.d.ts +52 -0
  41. package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +37 -20
  42. package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +125 -0
  43. package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +7 -2
  44. package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +7 -2
  45. package/dist/lib/producers/socket-receive-methods/disconnect-user-self.service.d.ts +5 -1
  46. package/dist/lib/sockets/socket-manager.service.d.ts +90 -0
  47. package/dist/public-api.d.ts +11 -1
  48. package/package.json +17 -20
  49. package/dist/esm2022/lib/@types/types.mjs +0 -2
  50. package/dist/esm2022/lib/components/background-components/background-modal/background-modal.component.mjs +0 -799
  51. package/dist/esm2022/lib/components/breakout-components/breakout-rooms-modal.component.mjs +0 -366
  52. package/dist/esm2022/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.mjs +0 -143
  53. package/dist/esm2022/lib/components/breakout-components/room-list/room-list.component.mjs +0 -40
  54. package/dist/esm2022/lib/components/co-host-components/co-host-modal/co-host-modal.component.mjs +0 -245
  55. package/dist/esm2022/lib/components/display-components/alert-component/alert.component.component.mjs +0 -79
  56. package/dist/esm2022/lib/components/display-components/audio-card/audio-card.component.mjs +0 -356
  57. package/dist/esm2022/lib/components/display-components/audio-grid/audio-grid.component.mjs +0 -80
  58. package/dist/esm2022/lib/components/display-components/card-video-display/card-video-display.component.mjs +0 -129
  59. package/dist/esm2022/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.mjs +0 -138
  60. package/dist/esm2022/lib/components/display-components/control-buttons-component/control-buttons-component.component.mjs +0 -231
  61. package/dist/esm2022/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.mjs +0 -282
  62. package/dist/esm2022/lib/components/display-components/control-widgets/menu-participants-widget.component.mjs +0 -82
  63. package/dist/esm2022/lib/components/display-components/control-widgets/menu-record-widget.component.mjs +0 -65
  64. package/dist/esm2022/lib/components/display-components/control-widgets/menu-widget.component.mjs +0 -137
  65. package/dist/esm2022/lib/components/display-components/control-widgets/message-widget.component.mjs +0 -137
  66. package/dist/esm2022/lib/components/display-components/control-widgets/record-timer-widget.component.mjs +0 -51
  67. package/dist/esm2022/lib/components/display-components/control-widgets/screenshare-widget.component.mjs +0 -101
  68. package/dist/esm2022/lib/components/display-components/flexible-grid/flexible-grid.component.mjs +0 -151
  69. package/dist/esm2022/lib/components/display-components/flexible-video/flexible-video.component.mjs +0 -250
  70. package/dist/esm2022/lib/components/display-components/loading-modal/loading-modal.component.mjs +0 -102
  71. package/dist/esm2022/lib/components/display-components/main-aspect-component/main-aspect-component.component.mjs +0 -140
  72. package/dist/esm2022/lib/components/display-components/main-container-component/main-container-component.component.mjs +0 -131
  73. package/dist/esm2022/lib/components/display-components/main-grid-component/main-grid-component.component.mjs +0 -120
  74. package/dist/esm2022/lib/components/display-components/main-screen-component/main-screen-component.component.mjs +0 -201
  75. package/dist/esm2022/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.mjs +0 -115
  76. package/dist/esm2022/lib/components/display-components/mini-audio/mini-audio.component.mjs +0 -319
  77. package/dist/esm2022/lib/components/display-components/mini-card/mini-card.component.mjs +0 -161
  78. package/dist/esm2022/lib/components/display-components/mini-card-audio/mini-card-audio.component.mjs +0 -230
  79. package/dist/esm2022/lib/components/display-components/other-grid-component/other-grid-component.component.mjs +0 -126
  80. package/dist/esm2022/lib/components/display-components/pagination/pagination.component.mjs +0 -334
  81. package/dist/esm2022/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.mjs +0 -112
  82. package/dist/esm2022/lib/components/display-components/video-card/video-card.component.mjs +0 -392
  83. package/dist/esm2022/lib/components/display-settings-components/display-settings-modal.component.mjs +0 -106
  84. package/dist/esm2022/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.mjs +0 -199
  85. package/dist/esm2022/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.mjs +0 -132
  86. package/dist/esm2022/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.mjs +0 -220
  87. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-broadcast.component.mjs +0 -4238
  88. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-chat.component.mjs +0 -3754
  89. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-conference.component.mjs +0 -5071
  90. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-generic.component.mjs +0 -5380
  91. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-webinar.component.mjs +0 -5068
  92. package/dist/esm2022/lib/components/menu-components/custom-buttons/custom-buttons.component.mjs +0 -83
  93. package/dist/esm2022/lib/components/menu-components/meeting-id-component/meeting-id-component.component.mjs +0 -27
  94. package/dist/esm2022/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.mjs +0 -27
  95. package/dist/esm2022/lib/components/menu-components/menu-modal/menu-modal.component.mjs +0 -125
  96. package/dist/esm2022/lib/components/menu-components/share-buttons-component/share-buttons-component.component.mjs +0 -106
  97. package/dist/esm2022/lib/components/message-components/message-panel/message-panel.component.mjs +0 -228
  98. package/dist/esm2022/lib/components/message-components/messages-modal/messages-modal.component.mjs +0 -277
  99. package/dist/esm2022/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.mjs +0 -130
  100. package/dist/esm2022/lib/components/misc-components/pre-join-page/pre-join-page.component.mjs +0 -343
  101. package/dist/esm2022/lib/components/misc-components/share-event-modal/share-event-modal.component.mjs +0 -127
  102. package/dist/esm2022/lib/components/misc-components/welcome-page/welcome-page.component.mjs +0 -241
  103. package/dist/esm2022/lib/components/participants-components/participant-list/participant-list.component.mjs +0 -82
  104. package/dist/esm2022/lib/components/participants-components/participant-list-item/participant-list-item.component.mjs +0 -139
  105. package/dist/esm2022/lib/components/participants-components/participant-list-others/participant-list-others.component.mjs +0 -40
  106. package/dist/esm2022/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.mjs +0 -60
  107. package/dist/esm2022/lib/components/participants-components/participants-modal/participants-modal.component.mjs +0 -124
  108. package/dist/esm2022/lib/components/polls-components/poll-modal/poll-modal.component.mjs +0 -201
  109. package/dist/esm2022/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.mjs +0 -92
  110. package/dist/esm2022/lib/components/recording-components/recording-modal/recording-modal.component.mjs +0 -133
  111. package/dist/esm2022/lib/components/recording-components/standard-panel-component/standard-panel-component.component.mjs +0 -90
  112. package/dist/esm2022/lib/components/requests-components/render-request-component/render-request-component.component.mjs +0 -81
  113. package/dist/esm2022/lib/components/requests-components/requests-modal/requests-modal.component.mjs +0 -147
  114. package/dist/esm2022/lib/components/screenboard-components/screenboard/screenboard.component.mjs +0 -627
  115. package/dist/esm2022/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.mjs +0 -391
  116. package/dist/esm2022/lib/components/waiting-components/waiting-room-modal.component.mjs +0 -201
  117. package/dist/esm2022/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.mjs +0 -286
  118. package/dist/esm2022/lib/components/whiteboard-components/whiteboard/whiteboard.component.mjs +0 -1833
  119. package/dist/esm2022/lib/consumers/add-videos-grid.service.mjs +0 -345
  120. package/dist/esm2022/lib/consumers/auto-adjust.service.mjs +0 -109
  121. package/dist/esm2022/lib/consumers/calculate-rows-and-columns.service.mjs +0 -60
  122. package/dist/esm2022/lib/consumers/change-vids.service.mjs +0 -551
  123. package/dist/esm2022/lib/consumers/check-grid.service.mjs +0 -93
  124. package/dist/esm2022/lib/consumers/check-permission.service.mjs +0 -105
  125. package/dist/esm2022/lib/consumers/check-screen-share.service.mjs +0 -106
  126. package/dist/esm2022/lib/consumers/close-and-resize.service.mjs +0 -331
  127. package/dist/esm2022/lib/consumers/compare-active-names.service.mjs +0 -106
  128. package/dist/esm2022/lib/consumers/compare-screen-states.service.mjs +0 -98
  129. package/dist/esm2022/lib/consumers/connect-ips.service.mjs +0 -154
  130. package/dist/esm2022/lib/consumers/connect-recv-transport.service.mjs +0 -146
  131. package/dist/esm2022/lib/consumers/connect-send-transport-audio.service.mjs +0 -84
  132. package/dist/esm2022/lib/consumers/connect-send-transport-screen.service.mjs +0 -102
  133. package/dist/esm2022/lib/consumers/connect-send-transport-video.service.mjs +0 -99
  134. package/dist/esm2022/lib/consumers/connect-send-transport.service.mjs +0 -140
  135. package/dist/esm2022/lib/consumers/consumer-resume.service.mjs +0 -368
  136. package/dist/esm2022/lib/consumers/control-media.service.mjs +0 -113
  137. package/dist/esm2022/lib/consumers/create-send-transport.service.mjs +0 -172
  138. package/dist/esm2022/lib/consumers/disconnect-send-transport-audio.service.mjs +0 -108
  139. package/dist/esm2022/lib/consumers/disconnect-send-transport-screen.service.mjs +0 -84
  140. package/dist/esm2022/lib/consumers/disconnect-send-transport-video.service.mjs +0 -101
  141. package/dist/esm2022/lib/consumers/disp-streams.service.mjs +0 -513
  142. package/dist/esm2022/lib/consumers/generate-page-content.service.mjs +0 -106
  143. package/dist/esm2022/lib/consumers/get-estimate.service.mjs +0 -120
  144. package/dist/esm2022/lib/consumers/get-piped-producers-alt.service.mjs +0 -82
  145. package/dist/esm2022/lib/consumers/get-producers-piped.service.mjs +0 -79
  146. package/dist/esm2022/lib/consumers/get-videos.service.mjs +0 -91
  147. package/dist/esm2022/lib/consumers/mix-streams.service.mjs +0 -95
  148. package/dist/esm2022/lib/consumers/on-screen-changes.service.mjs +0 -103
  149. package/dist/esm2022/lib/consumers/prepopulate-user-media.service.mjs +0 -541
  150. package/dist/esm2022/lib/consumers/process-consumer-transports-audio.service.mjs +0 -101
  151. package/dist/esm2022/lib/consumers/process-consumer-transports.service.mjs +0 -128
  152. package/dist/esm2022/lib/consumers/re-port.service.mjs +0 -114
  153. package/dist/esm2022/lib/consumers/re-update-inter.service.mjs +0 -239
  154. package/dist/esm2022/lib/consumers/readjust.service.mjs +0 -173
  155. package/dist/esm2022/lib/consumers/receive-all-piped-transports.service.mjs +0 -87
  156. package/dist/esm2022/lib/consumers/receive-room-messages.service.mjs +0 -69
  157. package/dist/esm2022/lib/consumers/reorder-streams.service.mjs +0 -239
  158. package/dist/esm2022/lib/consumers/request-screen-share.service.mjs +0 -101
  159. package/dist/esm2022/lib/consumers/resume-pause-audio-streams.service.mjs +0 -150
  160. package/dist/esm2022/lib/consumers/resume-pause-streams.service.mjs +0 -103
  161. package/dist/esm2022/lib/consumers/resume-send-transport-audio.service.mjs +0 -91
  162. package/dist/esm2022/lib/consumers/signal-new-consumer-transport.service.mjs +0 -136
  163. package/dist/esm2022/lib/consumers/socket-receive-methods/join-consume-room.service.mjs +0 -96
  164. package/dist/esm2022/lib/consumers/socket-receive-methods/new-pipe-producer.service.mjs +0 -100
  165. package/dist/esm2022/lib/consumers/socket-receive-methods/producer-closed.service.mjs +0 -78
  166. package/dist/esm2022/lib/consumers/start-share-screen.service.mjs +0 -120
  167. package/dist/esm2022/lib/consumers/stop-share-screen.service.mjs +0 -175
  168. package/dist/esm2022/lib/consumers/stream-success-audio-switch.service.mjs +0 -185
  169. package/dist/esm2022/lib/consumers/stream-success-audio.service.mjs +0 -210
  170. package/dist/esm2022/lib/consumers/stream-success-screen.service.mjs +0 -193
  171. package/dist/esm2022/lib/consumers/stream-success-video.service.mjs +0 -260
  172. package/dist/esm2022/lib/consumers/switch-user-audio.service.mjs +0 -120
  173. package/dist/esm2022/lib/consumers/switch-user-video-alt.service.mjs +0 -260
  174. package/dist/esm2022/lib/consumers/switch-user-video.service.mjs +0 -172
  175. package/dist/esm2022/lib/consumers/trigger.service.mjs +0 -210
  176. package/dist/esm2022/lib/consumers/update-mini-cards-grid.service.mjs +0 -135
  177. package/dist/esm2022/lib/consumers/update-participant-audio-decibels.service.mjs +0 -84
  178. package/dist/esm2022/lib/methods/background-methods/launch-background.service.mjs +0 -48
  179. package/dist/esm2022/lib/methods/breakout-room-methods/breakout-room-updated.service.mjs +0 -183
  180. package/dist/esm2022/lib/methods/breakout-room-methods/launch-breakout-rooms.service.mjs +0 -46
  181. package/dist/esm2022/lib/methods/co-host-methods/launch-co-host.service.mjs +0 -46
  182. package/dist/esm2022/lib/methods/co-host-methods/modify-co-host-settings.service.mjs +0 -104
  183. package/dist/esm2022/lib/methods/display-settings-methods/launch-display-settings.service.mjs +0 -46
  184. package/dist/esm2022/lib/methods/display-settings-methods/modify-display-settings.service.mjs +0 -194
  185. package/dist/esm2022/lib/methods/exit-methods/confirm-exit.service.mjs +0 -52
  186. package/dist/esm2022/lib/methods/exit-methods/launch-confirm-exit.service.mjs +0 -42
  187. package/dist/esm2022/lib/methods/media-settings-methods/launch-media-settings.service.mjs +0 -85
  188. package/dist/esm2022/lib/methods/menu-methods/launch-menu-modal.service.mjs +0 -44
  189. package/dist/esm2022/lib/methods/message-methods/launch-messages.service.mjs +0 -45
  190. package/dist/esm2022/lib/methods/message-methods/send-message.service.mjs +0 -143
  191. package/dist/esm2022/lib/methods/participants-methods/launch-participants.service.mjs +0 -47
  192. package/dist/esm2022/lib/methods/participants-methods/message-participants.service.mjs +0 -98
  193. package/dist/esm2022/lib/methods/participants-methods/mute-participants.service.mjs +0 -96
  194. package/dist/esm2022/lib/methods/participants-methods/remove-participants.service.mjs +0 -107
  195. package/dist/esm2022/lib/methods/polls-methods/handle-create-poll.service.mjs +0 -75
  196. package/dist/esm2022/lib/methods/polls-methods/handle-end-poll.service.mjs +0 -72
  197. package/dist/esm2022/lib/methods/polls-methods/handle-vote-poll.service.mjs +0 -83
  198. package/dist/esm2022/lib/methods/polls-methods/launch-poll.service.mjs +0 -43
  199. package/dist/esm2022/lib/methods/polls-methods/poll-updated.service.mjs +0 -95
  200. package/dist/esm2022/lib/methods/recording-methods/check-pause-state.service.mjs +0 -69
  201. package/dist/esm2022/lib/methods/recording-methods/check-resume-state.service.mjs +0 -56
  202. package/dist/esm2022/lib/methods/recording-methods/confirm-recording.service.mjs +0 -278
  203. package/dist/esm2022/lib/methods/recording-methods/launch-recording.service.mjs +0 -125
  204. package/dist/esm2022/lib/methods/recording-methods/record-pause-timer.service.mjs +0 -67
  205. package/dist/esm2022/lib/methods/recording-methods/record-resume-timer.service.mjs +0 -130
  206. package/dist/esm2022/lib/methods/recording-methods/record-start-timer.service.mjs +0 -134
  207. package/dist/esm2022/lib/methods/recording-methods/record-update-timer.service.mjs +0 -80
  208. package/dist/esm2022/lib/methods/recording-methods/start-recording.service.mjs +0 -197
  209. package/dist/esm2022/lib/methods/recording-methods/stop-recording.service.mjs +0 -112
  210. package/dist/esm2022/lib/methods/recording-methods/update-recording.service.mjs +0 -272
  211. package/dist/esm2022/lib/methods/requests-methods/launch-requests.service.mjs +0 -51
  212. package/dist/esm2022/lib/methods/requests-methods/respond-to-requests.service.mjs +0 -84
  213. package/dist/esm2022/lib/methods/settings-methods/launch-settings.service.mjs +0 -51
  214. package/dist/esm2022/lib/methods/settings-methods/modify-settings.service.mjs +0 -109
  215. package/dist/esm2022/lib/methods/stream-methods/click-audio.service.mjs +0 -275
  216. package/dist/esm2022/lib/methods/stream-methods/click-chat.service.mjs +0 -75
  217. package/dist/esm2022/lib/methods/stream-methods/click-screen-share.service.mjs +0 -178
  218. package/dist/esm2022/lib/methods/stream-methods/click-video.service.mjs +0 -271
  219. package/dist/esm2022/lib/methods/stream-methods/switch-audio.service.mjs +0 -80
  220. package/dist/esm2022/lib/methods/stream-methods/switch-video-alt.service.mjs +0 -116
  221. package/dist/esm2022/lib/methods/stream-methods/switch-video.service.mjs +0 -132
  222. package/dist/esm2022/lib/methods/utils/format-number.service.mjs +0 -57
  223. package/dist/esm2022/lib/methods/utils/generate-random-messages.service.mjs +0 -120
  224. package/dist/esm2022/lib/methods/utils/generate-random-participants.service.mjs +0 -126
  225. package/dist/esm2022/lib/methods/utils/generate-random-polls.service.mjs +0 -78
  226. package/dist/esm2022/lib/methods/utils/generate-random-request-list.service.mjs +0 -90
  227. package/dist/esm2022/lib/methods/utils/generate-random-waiting-room-list.service.mjs +0 -59
  228. package/dist/esm2022/lib/methods/utils/get-modal-position.util.mjs +0 -32
  229. package/dist/esm2022/lib/methods/utils/get-overlay-position.util.mjs +0 -31
  230. package/dist/esm2022/lib/methods/utils/initial-values.util.mjs +0 -379
  231. package/dist/esm2022/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.mjs +0 -96
  232. package/dist/esm2022/lib/methods/utils/mini-audio-player/mini-audio-player.component.mjs +0 -315
  233. package/dist/esm2022/lib/methods/utils/producer/a-params.service.mjs +0 -58
  234. package/dist/esm2022/lib/methods/utils/producer/h-params.service.mjs +0 -87
  235. package/dist/esm2022/lib/methods/utils/producer/screen-params.service.mjs +0 -61
  236. package/dist/esm2022/lib/methods/utils/producer/v-params.service.mjs +0 -87
  237. package/dist/esm2022/lib/methods/utils/producer/video-capture-constraints.service.mjs +0 -84
  238. package/dist/esm2022/lib/methods/utils/sleep.util.mjs +0 -17
  239. package/dist/esm2022/lib/methods/utils/sound-player.service.mjs +0 -63
  240. package/dist/esm2022/lib/methods/utils/validate-alphanumeric.service.mjs +0 -49
  241. package/dist/esm2022/lib/methods/waiting-methods/launch-waiting.service.mjs +0 -41
  242. package/dist/esm2022/lib/methods/waiting-methods/respond-to-waiting.service.mjs +0 -69
  243. package/dist/esm2022/lib/methods/whiteboard-methods/capture-canvas-stream.service.mjs +0 -98
  244. package/dist/esm2022/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.mjs +0 -44
  245. package/dist/esm2022/lib/producer-client/producer-client-emits/create-device-client.service.mjs +0 -74
  246. package/dist/esm2022/lib/producer-client/producer-client-emits/join-room-client.service.mjs +0 -96
  247. package/dist/esm2022/lib/producer-client/producer-client-emits/update-room-parameters-client.service.mjs +0 -276
  248. package/dist/esm2022/lib/producers/producer-emits/join-con-room.service.mjs +0 -152
  249. package/dist/esm2022/lib/producers/producer-emits/join-room.service.mjs +0 -152
  250. package/dist/esm2022/lib/producers/socket-receive-methods/all-members-rest.service.mjs +0 -228
  251. package/dist/esm2022/lib/producers/socket-receive-methods/all-members.service.mjs +0 -218
  252. package/dist/esm2022/lib/producers/socket-receive-methods/all-waiting-room-members.service.mjs +0 -57
  253. package/dist/esm2022/lib/producers/socket-receive-methods/ban-participant.service.mjs +0 -76
  254. package/dist/esm2022/lib/producers/socket-receive-methods/control-media-host.service.mjs +0 -183
  255. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect-user-self.service.mjs +0 -50
  256. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect.service.mjs +0 -64
  257. package/dist/esm2022/lib/producers/socket-receive-methods/get-domains.service.mjs +0 -78
  258. package/dist/esm2022/lib/producers/socket-receive-methods/host-request-response.service.mjs +0 -150
  259. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-ended.service.mjs +0 -73
  260. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-still-there.service.mjs +0 -47
  261. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-time-remaining.service.mjs +0 -63
  262. package/dist/esm2022/lib/producers/socket-receive-methods/participant-requested.service.mjs +0 -63
  263. package/dist/esm2022/lib/producers/socket-receive-methods/person-joined.service.mjs +0 -54
  264. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-closed.service.mjs +0 -129
  265. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-paused.service.mjs +0 -152
  266. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-resumed.service.mjs +0 -99
  267. package/dist/esm2022/lib/producers/socket-receive-methods/re-initiate-recording.service.mjs +0 -67
  268. package/dist/esm2022/lib/producers/socket-receive-methods/receive-message.service.mjs +0 -134
  269. package/dist/esm2022/lib/producers/socket-receive-methods/recording-notice.service.mjs +0 -233
  270. package/dist/esm2022/lib/producers/socket-receive-methods/room-record-params.service.mjs +0 -121
  271. package/dist/esm2022/lib/producers/socket-receive-methods/screen-producer-id.service.mjs +0 -86
  272. package/dist/esm2022/lib/producers/socket-receive-methods/start-records.service.mjs +0 -60
  273. package/dist/esm2022/lib/producers/socket-receive-methods/stopped-recording.service.mjs +0 -62
  274. package/dist/esm2022/lib/producers/socket-receive-methods/time-left-recording.service.mjs +0 -57
  275. package/dist/esm2022/lib/producers/socket-receive-methods/update-consuming-domains.service.mjs +0 -105
  276. package/dist/esm2022/lib/producers/socket-receive-methods/update-media-settings.service.mjs +0 -66
  277. package/dist/esm2022/lib/producers/socket-receive-methods/updated-co-host.service.mjs +0 -96
  278. package/dist/esm2022/lib/producers/socket-receive-methods/user-waiting.service.mjs +0 -52
  279. package/dist/esm2022/lib/sockets/socket-manager.service.mjs +0 -113
  280. package/dist/esm2022/mediasfu-angular.mjs +0 -5
  281. package/dist/esm2022/public-api.mjs +0 -187
@@ -1,201 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-empty-function */
2
- import { Component, Input } from '@angular/core';
3
- import { faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';
4
- import { CommonModule } from '@angular/common';
5
- import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
6
- import { FormsModule } from '@angular/forms';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../methods/waiting-methods/respond-to-waiting.service";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "@fortawesome/angular-fontawesome";
11
- /**
12
- * Component representing a modal for managing participants in a waiting room.
13
- *
14
- * @component
15
- * @selector app-waiting-room-modal
16
- * @standalone true
17
- * @imports CommonModule, FontAwesomeModule, FormsModule
18
- * @templateUrl ./waiting-room-modal.component.html
19
- * @styleUrls ['./waiting-room-modal.component.css']
20
- *
21
- * @property {boolean} isWaitingModalVisible - Visibility state of the modal.
22
- * @property {number} waitingRoomCounter - Counter for the number of participants in the waiting room.
23
- * @property {WaitingRoomParticipant[]} waitingRoomList - List of participants in the waiting room.
24
- * @property {string} roomName - Name of the room.
25
- * @property {Socket} socket - Socket instance for communication.
26
- * @property {string} position - Position of the modal on the screen.
27
- * @property {string} backgroundColor - Background color of the modal.
28
- * @property {WaitingRoomModalParameters} parameters - Parameters for the waiting room modal.
29
- * @property {function} onWaitingRoomClose - Function to call when the modal is closed.
30
- * @property {function} onWaitingRoomFilterChange - Function to call when the filter value changes.
31
- * @property {function} updateWaitingList - Function to update the waiting list.
32
- * @property {function} onWaitingRoomItemPress - Function to call when an item in the waiting room is pressed.
33
- *
34
- * @property {IconDefinition} faTimes - FontAwesome icon for the close button.
35
- * @property {IconDefinition} faCheck - FontAwesome icon for the check button.
36
- * @property {WaitingRoomParticipant[]} waitingRoomList_s - Filtered list of participants in the waiting room.
37
- * @property {number} waitingRoomCounter_s - Counter for the filtered list of participants in the waiting room.
38
- * @property {boolean} reRender - Flag to trigger re-rendering of the component.
39
- *
40
- * @method ngOnInit - Lifecycle hook that is called after data-bound properties are initialized.
41
- * @method ngOnChanges - Lifecycle hook that is called when any data-bound property of a directive changes.
42
- * @method updateParameters - Updates the parameters for the waiting room modal.
43
- * @method handleModalClose - Handles the closing of the modal.
44
- * @method handleFilterChange - Handles the change in the filter input.
45
- * @method handleItemPress - Handles the pressing of an item in the waiting room.
46
- *
47
- * @getter modalContainerStyle - Returns the style object for the modal container.
48
- * @getter modalContentStyle - Returns the style object for the modal content.
49
- * @getter inputStyle - Returns the style object for the input field.
50
- *
51
- * @example
52
- * ```html
53
- * <app-waiting-room-modal
54
- * [isWaitingModalVisible]="true"
55
- * [waitingRoomCounter]="waitingRoomCounter"
56
- * [waitingRoomList]="waitingRoomList"
57
- * [roomName]="roomName"
58
- * [socket]="socket"
59
- * [position]="'topRight'"
60
- * [backgroundColor]="'#83c0e9'"
61
- * [parameters]="waitingRoomModalParams"
62
- * [onWaitingRoomClose]="closeWaitingRoomModal"
63
- * [onWaitingRoomFilterChange]="filterWaitingRoom"
64
- * [updateWaitingList]="updateWaitingList"
65
- * [onWaitingRoomItemPress]="handleWaitingRoomItemPress"
66
- * ></app-waiting-room-modal>
67
- * ```
68
- *
69
- */
70
- export class WaitingRoomModal {
71
- respondToWaitingService;
72
- constructor(respondToWaitingService) {
73
- this.respondToWaitingService = respondToWaitingService;
74
- }
75
- isWaitingModalVisible = false;
76
- waitingRoomCounter = 0;
77
- waitingRoomList = [];
78
- roomName = '';
79
- socket = {};
80
- position = 'topRight';
81
- backgroundColor = '#83c0e9';
82
- parameters = {};
83
- onWaitingRoomClose = () => { };
84
- onWaitingRoomFilterChange = () => { };
85
- updateWaitingList = () => { };
86
- onWaitingRoomItemPress;
87
- faTimes = faTimes;
88
- faCheck = faCheck;
89
- waitingRoomList_s = [];
90
- waitingRoomCounter_s = 0;
91
- reRender = false;
92
- ngOnInit() {
93
- if (!this.onWaitingRoomItemPress) {
94
- this.onWaitingRoomItemPress = (data) => this.respondToWaitingService.respondToWaiting(data);
95
- }
96
- }
97
- ngOnChanges(changes) {
98
- if (changes['waitingRoomList'] || changes['reRender']) {
99
- this.updateParameters();
100
- }
101
- }
102
- updateParameters() {
103
- let { getUpdatedAllParams } = this.parameters;
104
- this.parameters = getUpdatedAllParams();
105
- this.waitingRoomList_s = this.parameters.filteredWaitingRoomList;
106
- this.waitingRoomCounter_s = this.parameters.filteredWaitingRoomList.length;
107
- }
108
- handleModalClose() {
109
- this.onWaitingRoomClose();
110
- }
111
- handleFilterChange(event) {
112
- const inputElement = event.target;
113
- const value = inputElement?.value || '';
114
- this.onWaitingRoomFilterChange(value);
115
- this.reRender = !this.reRender;
116
- }
117
- handleItemPress(participant, type) {
118
- this.onWaitingRoomItemPress({
119
- participantId: participant.id,
120
- participantName: participant.name,
121
- updateWaitingList: this.updateWaitingList,
122
- waitingList: this.waitingRoomList,
123
- roomName: this.roomName,
124
- type: type, // true for accepted, false for rejected
125
- socket: this.socket,
126
- });
127
- }
128
- get modalContainerStyle() {
129
- return {
130
- position: 'fixed',
131
- top: '0',
132
- left: '0',
133
- width: '100%',
134
- height: '100%',
135
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
136
- display: this.isWaitingModalVisible ? 'block' : 'none',
137
- zIndex: '999',
138
- };
139
- }
140
- get modalContentStyle() {
141
- const screenWidth = window.innerWidth;
142
- let modalWidth = 0.8 * screenWidth;
143
- if (modalWidth > 350) {
144
- modalWidth = 350;
145
- }
146
- return {
147
- position: 'fixed',
148
- backgroundColor: this.backgroundColor,
149
- borderRadius: '10px',
150
- padding: '10px',
151
- width: `${modalWidth}px`,
152
- maxHeight: '65%',
153
- overflowY: 'auto',
154
- top: this.position.includes('top') ? '10px' : 'auto',
155
- bottom: this.position.includes('bottom') ? '10px' : 'auto',
156
- left: this.position.includes('Left') ? '10px' : 'auto',
157
- right: this.position.includes('Right') ? '10px' : 'auto',
158
- };
159
- }
160
- get inputStyle() {
161
- return {
162
- width: '90%',
163
- padding: '10px',
164
- borderRadius: '5px',
165
- border: '1px solid #000',
166
- fontSize: '16px',
167
- marginBottom: '10px',
168
- };
169
- }
170
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: WaitingRoomModal, deps: [{ token: i1.RespondToWaiting }], target: i0.ɵɵFactoryTarget.Component });
171
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: WaitingRoomModal, isStandalone: true, selector: "app-waiting-room-modal", inputs: { isWaitingModalVisible: "isWaitingModalVisible", waitingRoomCounter: "waitingRoomCounter", waitingRoomList: "waitingRoomList", roomName: "roomName", socket: "socket", position: "position", backgroundColor: "backgroundColor", parameters: "parameters", onWaitingRoomClose: "onWaitingRoomClose", onWaitingRoomFilterChange: "onWaitingRoomFilterChange", updateWaitingList: "updateWaitingList", onWaitingRoomItemPress: "onWaitingRoomItemPress" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isWaitingModalVisible\" [ngStyle]=\"modalContainerStyle\">\r\n <div [ngStyle]=\"modalContentStyle\">\r\n <div class=\"modal-header\">\r\n <div class=\"modal-title\">\r\n Waiting <span class=\"badge\">{{ waitingRoomCounter_s }}</span>\r\n </div>\r\n <div (click)=\"handleModalClose()\" class=\"btn-close-waitings\">\r\n <fa-icon [icon]=\"faTimes\" class=\"icon\"></fa-icon>\r\n </div>\r\n </div>\r\n <hr class=\"hr\" />\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <input\r\n class=\"form-control\"\r\n [ngStyle]=\"inputStyle\"\r\n placeholder=\"Search ...\"\r\n (input)=\"handleFilterChange($event)\"\r\n />\r\n </div>\r\n <div class=\"waiting-list\">\r\n <div\r\n *ngFor=\"let participant of waitingRoomList_s\"\r\n class=\"waiting-item\"\r\n >\r\n <div class=\"col7\">{{ participant.name }}</div>\r\n <div class=\"col2\">\r\n <button (click)=\"handleItemPress(participant, true)\">\r\n <fa-icon [icon]=\"faCheck\" size=\"lg\" color=\"green\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"col2\">\r\n <button (click)=\"handleItemPress(participant, false)\">\r\n <fa-icon [icon]=\"faTimes\" size=\"lg\" color=\"red\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"col1\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".modal-container{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:block;z-index:999}.modal-content{position:fixed;border-radius:10px;padding:10px;max-height:65%;overflow-y:auto;top:10px;right:10px;width:80vw;max-width:350px}.form-control{width:90%;padding:10px;border-radius:5px;border:1px solid #000;font-size:16px;margin-bottom:10px}.modal-header{display:flex;justify-content:space-between;align-items:center}.modal-title{font-size:1.2em}.badge{background-color:#fff;color:#000;border-radius:10px;padding:5px}.btn-close-waitings{cursor:pointer}.waiting-list{display:flex;flex-direction:column}.waiting-item{display:flex;flex-direction:row;margin-top:5px}.col7{flex:5;display:flex;align-items:center}.col2{flex:2;display:flex;align-items:center;justify-content:center}.col1{flex:1}.hr{margin:.5em 0;border:0;border-top:1px solid #ccc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i3.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "ngmodule", type: FormsModule }] });
172
- }
173
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: WaitingRoomModal, decorators: [{
174
- type: Component,
175
- args: [{ selector: 'app-waiting-room-modal', standalone: true, imports: [CommonModule, FontAwesomeModule, FormsModule], template: "<div *ngIf=\"isWaitingModalVisible\" [ngStyle]=\"modalContainerStyle\">\r\n <div [ngStyle]=\"modalContentStyle\">\r\n <div class=\"modal-header\">\r\n <div class=\"modal-title\">\r\n Waiting <span class=\"badge\">{{ waitingRoomCounter_s }}</span>\r\n </div>\r\n <div (click)=\"handleModalClose()\" class=\"btn-close-waitings\">\r\n <fa-icon [icon]=\"faTimes\" class=\"icon\"></fa-icon>\r\n </div>\r\n </div>\r\n <hr class=\"hr\" />\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <input\r\n class=\"form-control\"\r\n [ngStyle]=\"inputStyle\"\r\n placeholder=\"Search ...\"\r\n (input)=\"handleFilterChange($event)\"\r\n />\r\n </div>\r\n <div class=\"waiting-list\">\r\n <div\r\n *ngFor=\"let participant of waitingRoomList_s\"\r\n class=\"waiting-item\"\r\n >\r\n <div class=\"col7\">{{ participant.name }}</div>\r\n <div class=\"col2\">\r\n <button (click)=\"handleItemPress(participant, true)\">\r\n <fa-icon [icon]=\"faCheck\" size=\"lg\" color=\"green\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"col2\">\r\n <button (click)=\"handleItemPress(participant, false)\">\r\n <fa-icon [icon]=\"faTimes\" size=\"lg\" color=\"red\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"col1\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".modal-container{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:block;z-index:999}.modal-content{position:fixed;border-radius:10px;padding:10px;max-height:65%;overflow-y:auto;top:10px;right:10px;width:80vw;max-width:350px}.form-control{width:90%;padding:10px;border-radius:5px;border:1px solid #000;font-size:16px;margin-bottom:10px}.modal-header{display:flex;justify-content:space-between;align-items:center}.modal-title{font-size:1.2em}.badge{background-color:#fff;color:#000;border-radius:10px;padding:5px}.btn-close-waitings{cursor:pointer}.waiting-list{display:flex;flex-direction:column}.waiting-item{display:flex;flex-direction:row;margin-top:5px}.col7{flex:5;display:flex;align-items:center}.col2{flex:2;display:flex;align-items:center;justify-content:center}.col1{flex:1}.hr{margin:.5em 0;border:0;border-top:1px solid #ccc}\n"] }]
176
- }], ctorParameters: () => [{ type: i1.RespondToWaiting }], propDecorators: { isWaitingModalVisible: [{
177
- type: Input
178
- }], waitingRoomCounter: [{
179
- type: Input
180
- }], waitingRoomList: [{
181
- type: Input
182
- }], roomName: [{
183
- type: Input
184
- }], socket: [{
185
- type: Input
186
- }], position: [{
187
- type: Input
188
- }], backgroundColor: [{
189
- type: Input
190
- }], parameters: [{
191
- type: Input
192
- }], onWaitingRoomClose: [{
193
- type: Input
194
- }], onWaitingRoomFilterChange: [{
195
- type: Input
196
- }], updateWaitingList: [{
197
- type: Input
198
- }], onWaitingRoomItemPress: [{
199
- type: Input
200
- }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdGluZy1yb29tLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhc2Z1LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3dhaXRpbmctY29tcG9uZW50cy93YWl0aW5nLXJvb20tbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWFzZnUtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvd2FpdGluZy1jb21wb25lbnRzL3dhaXRpbmctcm9vbS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFvQzdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERHO0FBUUgsTUFBTSxPQUFPLGdCQUFnQjtJQUNQO0lBQXBCLFlBQW9CLHVCQUF5QztRQUF6Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQWtCO0lBQUcsQ0FBQztJQUV4RCxxQkFBcUIsR0FBRyxLQUFLLENBQUM7SUFDOUIsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLGVBQWUsR0FBNkIsRUFBRSxDQUFDO0lBQy9DLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDZCxNQUFNLEdBQVcsRUFBWSxDQUFDO0lBQzlCLFFBQVEsR0FBRyxV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OzJGQUFoQixnQkFBZ0IseWlCQzNHN0IsZ2lEQTBDQSxtNkJENkRZLFlBQVksb1ZBQUUsaUJBQWlCLDRQQUFFLFdBQVc7OzJGQUkzQyxnQkFBZ0I7a0JBUDVCLFNBQVM7K0JBQ0Usd0JBQXdCLGNBQ3RCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxXQUFXLENBQUM7cUZBTzlDLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmYVRpbWVzLCBmYUNoZWNrIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb250QXdlc29tZU1vZHVsZSB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgV2FpdGluZ1Jvb21QYXJ0aWNpcGFudCB9IGZyb20gJy4uLy4uL0B0eXBlcy90eXBlcyc7XG5pbXBvcnQge1xuICBSZXNwb25kVG9XYWl0aW5nLFxuICBSZXNwb25kVG9XYWl0aW5nT3B0aW9ucyxcbiAgUmVzcG9uZFRvV2FpdGluZ1R5cGUsXG59IGZyb20gJy4uLy4uL21ldGhvZHMvd2FpdGluZy1tZXRob2RzL3Jlc3BvbmQtdG8td2FpdGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gJ3NvY2tldC5pby1jbGllbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRpbmdSb29tTW9kYWxQYXJhbWV0ZXJzIHtcbiAgZmlsdGVyZWRXYWl0aW5nUm9vbUxpc3Q6IFdhaXRpbmdSb29tUGFydGljaXBhbnRbXTtcblxuICAvLyBtZWRpYXNmdSBmdW5jdGlvbnNcbiAgZ2V0VXBkYXRlZEFsbFBhcmFtczogKCkgPT4gV2FpdGluZ1Jvb21Nb2RhbFBhcmFtZXRlcnM7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWl0aW5nUm9vbU1vZGFsT3B0aW9ucyB7XG4gIGlzV2FpdGluZ01vZGFsVmlzaWJsZTogYm9vbGVhbjtcbiAgb25XYWl0aW5nUm9vbUNsb3NlOiAoKSA9PiB2b2lkO1xuICB3YWl0aW5nUm9vbUNvdW50ZXI6IG51bWJlcjtcbiAgb25XYWl0aW5nUm9vbUZpbHRlckNoYW5nZTogKGZpbHRlcjogc3RyaW5nKSA9PiB2b2lkO1xuICB3YWl0aW5nUm9vbUxpc3Q6IFdhaXRpbmdSb29tUGFydGljaXBhbnRbXTtcbiAgdXBkYXRlV2FpdGluZ0xpc3Q6ICh1cGRhdGVkTGlzdDogV2FpdGluZ1Jvb21QYXJ0aWNpcGFudFtdKSA9PiB2b2lkO1xuICByb29tTmFtZTogc3RyaW5nO1xuICBzb2NrZXQ6IFNvY2tldDtcbiAgcG9zaXRpb24/OiBzdHJpbmc7XG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZztcbiAgcGFyYW1ldGVyczogV2FpdGluZ1Jvb21Nb2RhbFBhcmFtZXRlcnM7XG5cbiAgLy8gbWVkaWFzZnUgZnVuY3Rpb25zXG4gIG9uV2FpdGluZ1Jvb21JdGVtUHJlc3M/OiBSZXNwb25kVG9XYWl0aW5nVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgV2FpdGluZ1Jvb21Nb2RhbFR5cGUgPSAob3B0aW9uczogV2FpdGluZ1Jvb21Nb2RhbE9wdGlvbnMpID0+IEhUTUxFbGVtZW50O1xuXG4vKipcbiAqIENvbXBvbmVudCByZXByZXNlbnRpbmcgYSBtb2RhbCBmb3IgbWFuYWdpbmcgcGFydGljaXBhbnRzIGluIGEgd2FpdGluZyByb29tLlxuICpcbiAqIEBjb21wb25lbnRcbiAqIEBzZWxlY3RvciBhcHAtd2FpdGluZy1yb29tLW1vZGFsXG4gKiBAc3RhbmRhbG9uZSB0cnVlXG4gKiBAaW1wb3J0cyBDb21tb25Nb2R1bGUsIEZvbnRBd2Vzb21lTW9kdWxlLCBGb3Jtc01vZHVsZVxuICogQHRlbXBsYXRlVXJsIC4vd2FpdGluZy1yb29tLW1vZGFsLmNvbXBvbmVudC5odG1sXG4gKiBAc3R5bGVVcmxzIFsnLi93YWl0aW5nLXJvb20tbW9kYWwuY29tcG9uZW50LmNzcyddXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1dhaXRpbmdNb2RhbFZpc2libGUgLSBWaXNpYmlsaXR5IHN0YXRlIG9mIHRoZSBtb2RhbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3YWl0aW5nUm9vbUNvdW50ZXIgLSBDb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiB0aGUgd2FpdGluZyByb29tLlxuICogQHByb3BlcnR5IHtXYWl0aW5nUm9vbVBhcnRpY2lwYW50W119IHdhaXRpbmdSb29tTGlzdCAtIExpc3Qgb2YgcGFydGljaXBhbnRzIGluIHRoZSB3YWl0aW5nIHJvb20uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9vbU5hbWUgLSBOYW1lIG9mIHRoZSByb29tLlxuICogQHByb3BlcnR5IHtTb2NrZXR9IHNvY2tldCAtIFNvY2tldCBpbnN0YW5jZSBmb3IgY29tbXVuaWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwb3NpdGlvbiAtIFBvc2l0aW9uIG9mIHRoZSBtb2RhbCBvbiB0aGUgc2NyZWVuLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJhY2tncm91bmRDb2xvciAtIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIG1vZGFsLlxuICogQHByb3BlcnR5IHtXYWl0aW5nUm9vbU1vZGFsUGFyYW1ldGVyc30gcGFyYW1ldGVycyAtIFBhcmFtZXRlcnMgZm9yIHRoZSB3YWl0aW5nIHJvb20gbW9kYWwuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBvbldhaXRpbmdSb29tQ2xvc2UgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG1vZGFsIGlzIGNsb3NlZC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uV2FpdGluZ1Jvb21GaWx0ZXJDaGFuZ2UgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGZpbHRlciB2YWx1ZSBjaGFuZ2VzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gdXBkYXRlV2FpdGluZ0xpc3QgLSBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHdhaXRpbmcgbGlzdC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uV2FpdGluZ1Jvb21JdGVtUHJlc3MgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gaXRlbSBpbiB0aGUgd2FpdGluZyByb29tIGlzIHByZXNzZWQuXG4gKlxuICogQHByb3BlcnR5IHtJY29uRGVmaW5pdGlvbn0gZmFUaW1lcyAtIEZvbnRBd2Vzb21lIGljb24gZm9yIHRoZSBjbG9zZSBidXR0b24uXG4gKiBAcHJvcGVydHkge0ljb25EZWZpbml0aW9ufSBmYUNoZWNrIC0gRm9udEF3ZXNvbWUgaWNvbiBmb3IgdGhlIGNoZWNrIGJ1dHRvbi5cbiAqIEBwcm9wZXJ0eSB7V2FpdGluZ1Jvb21QYXJ0aWNpcGFudFtdfSB3YWl0aW5nUm9vbUxpc3RfcyAtIEZpbHRlcmVkIGxpc3Qgb2YgcGFydGljaXBhbnRzIGluIHRoZSB3YWl0aW5nIHJvb20uXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2FpdGluZ1Jvb21Db3VudGVyX3MgLSBDb3VudGVyIGZvciB0aGUgZmlsdGVyZWQgbGlzdCBvZiBwYXJ0aWNpcGFudHMgaW4gdGhlIHdhaXRpbmcgcm9vbS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVSZW5kZXIgLSBGbGFnIHRvIHRyaWdnZXIgcmUtcmVuZGVyaW5nIG9mIHRoZSBjb21wb25lbnQuXG4gKlxuICogQG1ldGhvZCBuZ09uSW5pdCAtIExpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGFmdGVyIGRhdGEtYm91bmQgcHJvcGVydGllcyBhcmUgaW5pdGlhbGl6ZWQuXG4gKiBAbWV0aG9kIG5nT25DaGFuZ2VzIC0gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhbnkgZGF0YS1ib3VuZCBwcm9wZXJ0eSBvZiBhIGRpcmVjdGl2ZSBjaGFuZ2VzLlxuICogQG1ldGhvZCB1cGRhdGVQYXJhbWV0ZXJzIC0gVXBkYXRlcyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHdhaXRpbmcgcm9vbSBtb2RhbC5cbiAqIEBtZXRob2QgaGFuZGxlTW9kYWxDbG9zZSAtIEhhbmRsZXMgdGhlIGNsb3Npbmcgb2YgdGhlIG1vZGFsLlxuICogQG1ldGhvZCBoYW5kbGVGaWx0ZXJDaGFuZ2UgLSBIYW5kbGVzIHRoZSBjaGFuZ2UgaW4gdGhlIGZpbHRlciBpbnB1dC5cbiAqIEBtZXRob2QgaGFuZGxlSXRlbVByZXNzIC0gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgYW4gaXRlbSBpbiB0aGUgd2FpdGluZyByb29tLlxuICpcbiAqIEBnZXR0ZXIgbW9kYWxDb250YWluZXJTdHlsZSAtIFJldHVybnMgdGhlIHN0eWxlIG9iamVjdCBmb3IgdGhlIG1vZGFsIGNvbnRhaW5lci5cbiAqIEBnZXR0ZXIgbW9kYWxDb250ZW50U3R5bGUgLSBSZXR1cm5zIHRoZSBzdHlsZSBvYmplY3QgZm9yIHRoZSBtb2RhbCBjb250ZW50LlxuICogQGdldHRlciBpbnB1dFN0eWxlIC0gUmV0dXJucyB0aGUgc3R5bGUgb2JqZWN0IGZvciB0aGUgaW5wdXQgZmllbGQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxhcHAtd2FpdGluZy1yb29tLW1vZGFsXG4gKiAgW2lzV2FpdGluZ01vZGFsVmlzaWJsZV09XCJ0cnVlXCJcbiAqIFt3YWl0aW5nUm9vbUNvdW50ZXJdPVwid2FpdGluZ1Jvb21Db3VudGVyXCJcbiAqIFt3YWl0aW5nUm9vbUxpc3RdPVwid2FpdGluZ1Jvb21MaXN0XCJcbiAqIFtyb29tTmFtZV09XCJyb29tTmFtZVwiXG4gKiBbc29ja2V0XT1cInNvY2tldFwiXG4gKiBbcG9zaXRpb25dPVwiJ3RvcFJpZ2h0J1wiXG4gKiBbYmFja2dyb3VuZENvbG9yXT1cIicjODNjMGU5J1wiXG4gKiBbcGFyYW1ldGVyc109XCJ3YWl0aW5nUm9vbU1vZGFsUGFyYW1zXCJcbiAqIFtvbldhaXRpbmdSb29tQ2xvc2VdPVwiY2xvc2VXYWl0aW5nUm9vbU1vZGFsXCJcbiAqIFtvbldhaXRpbmdSb29tRmlsdGVyQ2hhbmdlXT1cImZpbHRlcldhaXRpbmdSb29tXCJcbiAqIFt1cGRhdGVXYWl0aW5nTGlzdF09XCJ1cGRhdGVXYWl0aW5nTGlzdFwiXG4gKiBbb25XYWl0aW5nUm9vbUl0ZW1QcmVzc109XCJoYW5kbGVXYWl0aW5nUm9vbUl0ZW1QcmVzc1wiXG4gKiA+PC9hcHAtd2FpdGluZy1yb29tLW1vZGFsPlxuICogYGBgXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtd2FpdGluZy1yb29tLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9udEF3ZXNvbWVNb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3dhaXRpbmctcm9vbS1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dhaXRpbmctcm9vbS1tb2RhbC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFdhaXRpbmdSb29tTW9kYWwgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVzcG9uZFRvV2FpdGluZ1NlcnZpY2U6IFJlc3BvbmRUb1dhaXRpbmcpIHt9XG5cbiAgQElucHV0KCkgaXNXYWl0aW5nTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdhaXRpbmdSb29tQ291bnRlciA9IDA7XG4gIEBJbnB1dCgpIHdhaXRpbmdSb29tTGlzdDogV2FpdGluZ1Jvb21QYXJ0aWNpcGFudFtdID0gW107XG4gIEBJbnB1dCgpIHJvb21OYW1lID0gJyc7XG4gIEBJbnB1dCgpIHNvY2tldDogU29ja2V0ID0ge30gYXMgU29ja2V0O1xuICBASW5wdXQoKSBwb3NpdGlvbiA9ICd0b3BSaWdodCc7XG4gIEBJbnB1dCgpIGJhY2tncm91bmRDb2xvciA9ICcjODNjMGU5JztcbiAgQElucHV0KCkgcGFyYW1ldGVyczogV2FpdGluZ1Jvb21Nb2RhbFBhcmFtZXRlcnMgPSB7fSBhcyBXYWl0aW5nUm9vbU1vZGFsUGFyYW1ldGVycztcbiAgQElucHV0KCkgb25XYWl0aW5nUm9vbUNsb3NlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIEBJbnB1dCgpIG9uV2FpdGluZ1Jvb21GaWx0ZXJDaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIEBJbnB1dCgpIHVwZGF0ZVdhaXRpbmdMaXN0OiAoZGF0YTogV2FpdGluZ1Jvb21QYXJ0aWNpcGFudFtdKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIEBJbnB1dCgpIG9uV2FpdGluZ1Jvb21JdGVtUHJlc3MhOiAoZGF0YTogUmVzcG9uZFRvV2FpdGluZ09wdGlvbnMpID0+IHZvaWQ7XG5cbiAgZmFUaW1lcyA9IGZhVGltZXM7XG4gIGZhQ2hlY2sgPSBmYUNoZWNrO1xuICB3YWl0aW5nUm9vbUxpc3RfczogV2FpdGluZ1Jvb21QYXJ0aWNpcGFudFtdID0gW107XG4gIHdhaXRpbmdSb29tQ291bnRlcl9zID0gMDtcbiAgcmVSZW5kZXIgPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMub25XYWl0aW5nUm9vbUl0ZW1QcmVzcykge1xuICAgICAgdGhpcy5vbldhaXRpbmdSb29tSXRlbVByZXNzID0gKGRhdGE6IGFueSkgPT5cbiAgICAgICAgdGhpcy5yZXNwb25kVG9XYWl0aW5nU2VydmljZS5yZXNwb25kVG9XYWl0aW5nKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snd2FpdGluZ1Jvb21MaXN0J10gfHwgY2hhbmdlc1sncmVSZW5kZXInXSkge1xuICAgICAgdGhpcy51cGRhdGVQYXJhbWV0ZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUGFyYW1ldGVycygpIHtcbiAgICBsZXQgeyBnZXRVcGRhdGVkQWxsUGFyYW1zIH0gPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gZ2V0VXBkYXRlZEFsbFBhcmFtcygpO1xuXG4gICAgdGhpcy53YWl0aW5nUm9vbUxpc3RfcyA9IHRoaXMucGFyYW1ldGVycy5maWx0ZXJlZFdhaXRpbmdSb29tTGlzdDtcbiAgICB0aGlzLndhaXRpbmdSb29tQ291bnRlcl9zID0gdGhpcy5wYXJhbWV0ZXJzLmZpbHRlcmVkV2FpdGluZ1Jvb21MaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2UoKSB7XG4gICAgdGhpcy5vbldhaXRpbmdSb29tQ2xvc2UoKTtcbiAgfVxuXG4gIGhhbmRsZUZpbHRlckNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0RWxlbWVudD8udmFsdWUgfHwgJyc7XG4gICAgdGhpcy5vbldhaXRpbmdSb29tRmlsdGVyQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLnJlUmVuZGVyID0gIXRoaXMucmVSZW5kZXI7XG4gIH1cblxuICBoYW5kbGVJdGVtUHJlc3MocGFydGljaXBhbnQ6IFdhaXRpbmdSb29tUGFydGljaXBhbnQsIHR5cGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9uV2FpdGluZ1Jvb21JdGVtUHJlc3Moe1xuICAgICAgcGFydGljaXBhbnRJZDogcGFydGljaXBhbnQuaWQsXG4gICAgICBwYXJ0aWNpcGFudE5hbWU6IHBhcnRpY2lwYW50Lm5hbWUsXG4gICAgICB1cGRhdGVXYWl0aW5nTGlzdDogdGhpcy51cGRhdGVXYWl0aW5nTGlzdCxcbiAgICAgIHdhaXRpbmdMaXN0OiB0aGlzLndhaXRpbmdSb29tTGlzdCxcbiAgICAgIHJvb21OYW1lOiB0aGlzLnJvb21OYW1lLFxuICAgICAgdHlwZTogdHlwZSwgLy8gdHJ1ZSBmb3IgYWNjZXB0ZWQsIGZhbHNlIGZvciByZWplY3RlZFxuICAgICAgc29ja2V0OiB0aGlzLnNvY2tldCxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBtb2RhbENvbnRhaW5lclN0eWxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjUpJyxcbiAgICAgIGRpc3BsYXk6IHRoaXMuaXNXYWl0aW5nTW9kYWxWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyxcbiAgICAgIHpJbmRleDogJzk5OScsXG4gICAgfTtcbiAgfVxuXG4gIGdldCBtb2RhbENvbnRlbnRTdHlsZSgpIHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGxldCBtb2RhbFdpZHRoID0gMC44ICogc2NyZWVuV2lkdGg7XG4gICAgaWYgKG1vZGFsV2lkdGggPiAzNTApIHtcbiAgICAgIG1vZGFsV2lkdGggPSAzNTA7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBib3JkZXJSYWRpdXM6ICcxMHB4JyxcbiAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgIHdpZHRoOiBgJHttb2RhbFdpZHRofXB4YCxcbiAgICAgIG1heEhlaWdodDogJzY1JScsXG4gICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcbiAgICAgIHRvcDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgICBib3R0b206IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpID8gJzEwcHgnIDogJ2F1dG8nLFxuICAgICAgbGVmdDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnTGVmdCcpID8gJzEwcHgnIDogJ2F1dG8nLFxuICAgICAgcmlnaHQ6IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ1JpZ2h0JykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIGdldCBpbnB1dFN0eWxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogJzkwJScsXG4gICAgICBwYWRkaW5nOiAnMTBweCcsXG4gICAgICBib3JkZXJSYWRpdXM6ICc1cHgnLFxuICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICMwMDAnLFxuICAgICAgZm9udFNpemU6ICcxNnB4JyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzEwcHgnLFxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJpc1dhaXRpbmdNb2RhbFZpc2libGVcIiBbbmdTdHlsZV09XCJtb2RhbENvbnRhaW5lclN0eWxlXCI+XHJcbiAgPGRpdiBbbmdTdHlsZV09XCJtb2RhbENvbnRlbnRTdHlsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cclxuICAgICAgICBXYWl0aW5nIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIj57eyB3YWl0aW5nUm9vbUNvdW50ZXJfcyB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZU1vZGFsQ2xvc2UoKVwiIGNsYXNzPVwiYnRuLWNsb3NlLXdhaXRpbmdzXCI+XHJcbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFUaW1lc1wiIGNsYXNzPVwiaWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxociBjbGFzcz1cImhyXCIgLz5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJpbnB1dFN0eWxlXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIC4uLlwiXHJcbiAgICAgICAgICAoaW5wdXQpPVwiaGFuZGxlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2FpdGluZy1saXN0XCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhcnRpY2lwYW50IG9mIHdhaXRpbmdSb29tTGlzdF9zXCJcclxuICAgICAgICAgIGNsYXNzPVwid2FpdGluZy1pdGVtXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sN1wiPnt7IHBhcnRpY2lwYW50Lm5hbWUgfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUl0ZW1QcmVzcyhwYXJ0aWNpcGFudCwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUNoZWNrXCIgc2l6ZT1cImxnXCIgY29sb3I9XCJncmVlblwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUl0ZW1QcmVzcyhwYXJ0aWNpcGFudCwgZmFsc2UpXCI+XHJcbiAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFUaW1lc1wiIHNpemU9XCJsZ1wiIGNvbG9yPVwicmVkXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbDFcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,286 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
4
- import { faTimes, faCheck, faSyncAlt, faPlay, faSave } from '@fortawesome/free-solid-svg-icons';
5
- import { Socket } from 'socket.io-client';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- import * as i2 from "@fortawesome/angular-fontawesome";
9
- /**
10
- * @component ConfigureWhiteboardModal
11
- * @description A modal component to configure and manage whiteboard settings and participants.
12
- *
13
- * @selector app-configure-whiteboard-modal
14
- * @standalone true
15
- * @imports [CommonModule, FontAwesomeModule]
16
- * @templateUrl ./configure-whiteboard-modal.component.html
17
- * @styleUrls ./configure-whiteboard-modal.component.css
18
- *
19
- * @example
20
- * ```html
21
- * <app-configure-whiteboard-modal
22
- * [isVisible]="isWhiteboardModalVisible"
23
- * [parameters]="whiteboardParameters"
24
- * [backgroundColor]="'#83c0e9'"
25
- * [position]="'topRight'"
26
- * (onConfigureWhiteboardClose)="handleCloseModal()">
27
- * </app-configure-whiteboard-modal>
28
- * ```
29
- */
30
- export class ConfigureWhiteboardModal {
31
- isVisible = false;
32
- parameters = {};
33
- backgroundColor = '#83c0e9';
34
- position = 'topRight';
35
- onConfigureWhiteboardClose;
36
- faTimes = faTimes;
37
- faCheck = faCheck;
38
- faSyncAlt = faSyncAlt;
39
- faPlay = faPlay;
40
- faSave = faSave;
41
- participantsCopy = [];
42
- whiteboardLimit;
43
- isEditing = false;
44
- canStartWhiteboard = false;
45
- assignedParticipants = [];
46
- unassignedParticipants = [];
47
- whiteboardStarted = false;
48
- whiteboardEnded = false;
49
- socket = {};
50
- ngOnInit() {
51
- if (this.parameters && this.isVisible) {
52
- try {
53
- this.parameters = this.parameters.getUpdatedAllParams();
54
- }
55
- catch {
56
- /* handle error */
57
- }
58
- this.whiteboardLimit = this.parameters.itemPageLimit;
59
- this.whiteboardStarted = this.parameters.whiteboardStarted;
60
- this.whiteboardEnded = this.parameters.whiteboardEnded;
61
- this.checkCanStartWhiteboard();
62
- }
63
- if (this.parameters) {
64
- this.socket = this.parameters.socket;
65
- if (this.socket) {
66
- this.setupSocketListeners();
67
- }
68
- }
69
- }
70
- ngOnChanges(changes) {
71
- if (changes['parameters'] && this.parameters) {
72
- if (this.parameters && this.isVisible) {
73
- this.whiteboardLimit = this.parameters.itemPageLimit;
74
- this.whiteboardStarted = this.parameters.whiteboardStarted;
75
- this.whiteboardEnded = this.parameters.whiteboardEnded;
76
- this.checkCanStartWhiteboard();
77
- }
78
- this.socket = this.parameters.socket;
79
- if (this.socket) {
80
- this.setupSocketListeners();
81
- }
82
- }
83
- if (changes['isVisible'] && this.isVisible) {
84
- this.parameters = this.parameters.getUpdatedAllParams();
85
- if (!this.participantsCopy.length) {
86
- const filteredParticipants = this.parameters.participants.filter((participant) => participant.islevel != '2');
87
- this.participantsCopy = filteredParticipants;
88
- this.updateParticipantsLists();
89
- }
90
- this.checkCanStartWhiteboard();
91
- }
92
- }
93
- setupSocketListeners = () => {
94
- if (this.socket && this.socket instanceof Socket) {
95
- this.socket.on('whiteboardUpdated', async (data) => {
96
- if (this.parameters.islevel == '2' && data.members) {
97
- const filteredParticipants = data.members.filter((participant) => !participant.isBanned);
98
- this.participantsCopy = filteredParticipants;
99
- this.updateParticipantsLists();
100
- }
101
- this.parameters.updateWhiteboardUsers(data.whiteboardUsers);
102
- if (data.status == 'started') {
103
- this.whiteboardStarted = true;
104
- this.whiteboardEnded = false;
105
- this.parameters.updateWhiteboardStarted(true);
106
- this.parameters.updateWhiteboardEnded(false);
107
- if (this.parameters.islevel != '2') {
108
- this.parameters.shareScreenStarted = true;
109
- await this.parameters.onScreenChanges({ changed: true, parameters: this.parameters });
110
- }
111
- }
112
- else if (data.status == 'ended') {
113
- this.whiteboardEnded = true;
114
- this.whiteboardStarted = false;
115
- this.parameters.updateWhiteboardStarted(false);
116
- this.parameters.updateWhiteboardEnded(true);
117
- this.parameters.shareScreenStarted = false;
118
- await this.parameters.onScreenChanges({ changed: true, parameters: this.parameters });
119
- await this.parameters.prepopulateUserMedia({
120
- name: this.parameters.hostLabel,
121
- parameters: this.parameters,
122
- });
123
- await this.parameters.rePort({ restart: true, parameters: this.parameters });
124
- }
125
- });
126
- }
127
- };
128
- toggleParticipant = (participant, add) => {
129
- this.isEditing = true;
130
- const selectedParticipants = this.participantsCopy.filter((p) => p.useBoard);
131
- if (add && selectedParticipants.length >= this.whiteboardLimit - 1) {
132
- this.parameters.showAlert?.({
133
- message: `Participant limit exceeded - you can only add ${this.whiteboardLimit - 1} other participants`,
134
- type: 'danger',
135
- });
136
- return;
137
- }
138
- this.participantsCopy = this.participantsCopy.map((p) => p.name === participant.name ? { ...p, useBoard: add } : p);
139
- this.updateParticipantsLists();
140
- };
141
- validateWhiteboard() {
142
- const selectedParticipants = this.participantsCopy.filter((participant) => participant.useBoard);
143
- if (selectedParticipants.length > this.whiteboardLimit) {
144
- this.parameters.showAlert?.({ message: 'Participant limit exceeded', type: 'danger' });
145
- return false;
146
- }
147
- return true;
148
- }
149
- checkCanStartWhiteboard() {
150
- const isValid = this.validateWhiteboard();
151
- this.canStartWhiteboard = isValid;
152
- this.parameters.updateCanStartWhiteboard(isValid);
153
- }
154
- handleSaveWhiteboard() {
155
- if (this.validateWhiteboard()) {
156
- this.isEditing = false;
157
- this.canStartWhiteboard = true;
158
- this.parameters.updateCanStartWhiteboard(true);
159
- this.checkCanStartWhiteboard();
160
- this.parameters.showAlert?.({ message: 'Whiteboard saved successfully', type: 'success' });
161
- }
162
- else {
163
- this.parameters.showAlert?.({ message: 'Whiteboard validation failed', type: 'danger' });
164
- }
165
- }
166
- async handleStartWhiteboard() {
167
- const { shareScreenStarted, shared, breakOutRoomStarted, breakOutRoomEnded, roomName, socket, recordStarted, recordResumed, recordPaused, recordStopped, recordingMediaOptions, onScreenChanges, captureCanvasStream, showAlert, } = this.parameters;
168
- if ((shareScreenStarted || shared) && !this.whiteboardStarted) {
169
- showAlert?.({
170
- message: 'You cannot start whiteboard while screen sharing is active',
171
- type: 'danger',
172
- });
173
- return;
174
- }
175
- if (breakOutRoomStarted && !breakOutRoomEnded) {
176
- showAlert?.({
177
- message: 'You cannot start whiteboard while breakout rooms are active',
178
- type: 'danger',
179
- });
180
- return;
181
- }
182
- if (this.canStartWhiteboard) {
183
- const emitName = this.whiteboardStarted && !this.whiteboardEnded ? 'updateWhiteboard' : 'startWhiteboard';
184
- const filteredWhiteboardUsers = this.participantsCopy
185
- .filter((participant) => participant.useBoard)
186
- .map(({ name, useBoard }) => ({ name, useBoard }));
187
- socket.emit(emitName, { whiteboardUsers: filteredWhiteboardUsers, roomName }, async (response) => {
188
- if (response.success) {
189
- showAlert?.({ message: 'Whiteboard active', type: 'success' });
190
- this.parameters.whiteboardStarted = true;
191
- this.parameters.whiteboardEnded = false;
192
- this.parameters.updateWhiteboardStarted(true);
193
- this.parameters.updateWhiteboardEnded(false);
194
- this.parameters.updateIsConfigureWhiteboardModalVisible(false);
195
- if (this.parameters.islevel != '2') {
196
- this.parameters.shareScreenStarted = true;
197
- await onScreenChanges({ changed: true, parameters: this.parameters });
198
- }
199
- if (this.parameters.islevel == '2' && (recordStarted || recordResumed)) {
200
- if (!(recordPaused || recordStopped) && recordingMediaOptions == 'video') {
201
- await captureCanvasStream({ parameters: this.parameters });
202
- }
203
- }
204
- }
205
- else {
206
- showAlert?.({ message: response.reason, type: 'danger' });
207
- }
208
- });
209
- }
210
- }
211
- async handleStopWhiteboard() {
212
- const { roomName, socket, showAlert, updateWhiteboardStarted, updateWhiteboardEnded, updateIsConfigureWhiteboardModalVisible, onScreenChanges, prepopulateUserMedia, rePort, hostLabel, } = this.parameters;
213
- socket.emit('stopWhiteboard', { roomName }, async (response) => {
214
- if (response.success) {
215
- showAlert?.({ message: 'Whiteboard stopped', type: 'success' });
216
- this.parameters.whiteboardEnded = true;
217
- this.parameters.whiteboardStarted = false;
218
- updateWhiteboardStarted(false);
219
- updateWhiteboardEnded(true);
220
- updateIsConfigureWhiteboardModalVisible(false);
221
- this.parameters.shareScreenStarted = false;
222
- await onScreenChanges({ changed: true, parameters: this.parameters });
223
- await prepopulateUserMedia({ name: hostLabel, parameters: this.parameters });
224
- await rePort({ restart: true, parameters: this.parameters });
225
- }
226
- else {
227
- showAlert?.({ message: response.reason, type: 'danger' });
228
- }
229
- });
230
- }
231
- modalContainerStyle() {
232
- return {
233
- position: 'fixed',
234
- top: 0,
235
- left: 0,
236
- width: '100%',
237
- height: '100%',
238
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
239
- display: this.isVisible ? 'block' : 'none',
240
- zIndex: 999,
241
- };
242
- }
243
- modalContentStyle() {
244
- const screenWidth = window.innerWidth;
245
- let modalWidth = 0.7 * screenWidth;
246
- if (modalWidth > 400) {
247
- modalWidth = 400;
248
- }
249
- return {
250
- position: 'fixed',
251
- backgroundColor: this.backgroundColor,
252
- borderRadius: '10px',
253
- padding: '10px',
254
- width: modalWidth + 'px',
255
- maxWidth: modalWidth + 'px',
256
- maxHeight: '75%',
257
- overflowY: 'auto',
258
- overflowX: 'hidden',
259
- top: this.position.includes('top') ? '10px' : 'auto',
260
- bottom: this.position.includes('bottom') ? '10px' : 'auto',
261
- left: this.position.includes('Left') ? '10px' : 'auto',
262
- right: this.position.includes('Right') ? '10px' : 'auto',
263
- };
264
- }
265
- updateParticipantsLists = () => {
266
- this.assignedParticipants = this.participantsCopy.filter((p) => p.useBoard);
267
- this.unassignedParticipants = this.participantsCopy.filter((p) => !p.useBoard);
268
- };
269
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ConfigureWhiteboardModal, deps: [], target: i0.ɵɵFactoryTarget.Component });
270
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: ConfigureWhiteboardModal, isStandalone: true, selector: "app-configure-whiteboard-modal", inputs: { isVisible: "isVisible", parameters: "parameters", backgroundColor: "backgroundColor", position: "position", onConfigureWhiteboardClose: "onConfigureWhiteboardClose" }, usesOnChanges: true, ngImport: i0, template: "<div [ngStyle]=\"modalContainerStyle()\">\r\n <div [ngStyle]=\"modalContentStyle()\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\r\n <h2 style=\"font-size: x-large; font-weight: bold; color: black;\">\r\n Configure Whiteboard\r\n </h2>\r\n <button (click)=\"onConfigureWhiteboardClose()\" style=\"border: none; background: none; cursor: pointer;\">\r\n <fa-icon [icon]=\"faTimes\" size=\"xl\" style=\"font-size: 20px; color: black;\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6 mb-3\">\r\n <h6>Assigned</h6>\r\n <ul class=\"list-group\" style=\"max-height: 200px; overflow-y: auto; border: 1px solid #ccc;\">\r\n <ng-container *ngIf=\"assignedParticipants.length > 0; else noAssignedParticipants\">\r\n <li *ngFor=\"let participant of assignedParticipants\" class=\"list-group-item d-flex justify-content-between align-items-center text-dark mb-2 mr-2\">\r\n {{ participant.name }}\r\n <button class=\"btn btn-danger btn-sm mr-2 ml-2\" (click)=\"toggleParticipant(participant, false)\">\r\n <fa-icon [icon]=\"faTimes\"></fa-icon>\r\n </button>\r\n </li>\r\n </ng-container>\r\n <ng-template #noAssignedParticipants>\r\n <li class=\"list-group-item d-flex justify-content-between align-items-center text-dark\">\r\n None\r\n </li>\r\n </ng-template>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-6 mt-xs-3 mb-3\">\r\n <h6>Pending</h6>\r\n <ul class=\"list-group\" style=\"max-height: 200px; overflow-y: auto; border: 1px solid #ccc;\">\r\n <ng-container *ngIf=\"unassignedParticipants.length > 0; else noPendingParticipants\">\r\n <li *ngFor=\"let participant of unassignedParticipants\" class=\"list-group-item d-flex justify-content-between align-items-center text-dark mb-2 mr-2\">\r\n {{ participant.name }}\r\n <button class=\"btn btn-primary btn-sm mr-2 ml-2\" (click)=\"toggleParticipant(participant, true)\">\r\n <fa-icon [icon]=\"faCheck\"></fa-icon>\r\n </button>\r\n </li>\r\n </ng-container>\r\n <ng-template #noPendingParticipants>\r\n <li class=\"list-group-item d-flex justify-content-between align-items-center text-dark\">\r\n None\r\n </li>\r\n </ng-template>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-info\" (click)=\"handleSaveWhiteboard()\">\r\n Save <fa-icon [icon]=\"faSave\"></fa-icon>\r\n </button>\r\n </div>\r\n <hr />\r\n <div *ngIf=\"!isEditing\">\r\n <button *ngIf=\"canStartWhiteboard && whiteboardStarted && !whiteboardEnded\" class=\"btn btn-warning mb-2 mr-2\" (click)=\"handleStartWhiteboard()\">\r\n Update <fa-icon [icon]=\"faSyncAlt\"></fa-icon>\r\n </button>\r\n <button *ngIf=\"canStartWhiteboard && !whiteboardStarted\" class=\"btn btn-success mb-2 mr-2\" (click)=\"handleStartWhiteboard()\">\r\n Start <fa-icon [icon]=\"faPlay\"></fa-icon>\r\n </button>\r\n <button *ngIf=\"whiteboardStarted && !whiteboardEnded\" class=\"btn btn-danger mb-2 ml-2\" (click)=\"handleStopWhiteboard()\">\r\n Stop <fa-icon [icon]=\"faTimes\"></fa-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".modal-body{max-height:400px;overflow-y:auto}.list-group-item{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
271
- }
272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ConfigureWhiteboardModal, decorators: [{
273
- type: Component,
274
- args: [{ selector: 'app-configure-whiteboard-modal', standalone: true, imports: [CommonModule, FontAwesomeModule], template: "<div [ngStyle]=\"modalContainerStyle()\">\r\n <div [ngStyle]=\"modalContentStyle()\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;\">\r\n <h2 style=\"font-size: x-large; font-weight: bold; color: black;\">\r\n Configure Whiteboard\r\n </h2>\r\n <button (click)=\"onConfigureWhiteboardClose()\" style=\"border: none; background: none; cursor: pointer;\">\r\n <fa-icon [icon]=\"faTimes\" size=\"xl\" style=\"font-size: 20px; color: black;\"></fa-icon>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6 mb-3\">\r\n <h6>Assigned</h6>\r\n <ul class=\"list-group\" style=\"max-height: 200px; overflow-y: auto; border: 1px solid #ccc;\">\r\n <ng-container *ngIf=\"assignedParticipants.length > 0; else noAssignedParticipants\">\r\n <li *ngFor=\"let participant of assignedParticipants\" class=\"list-group-item d-flex justify-content-between align-items-center text-dark mb-2 mr-2\">\r\n {{ participant.name }}\r\n <button class=\"btn btn-danger btn-sm mr-2 ml-2\" (click)=\"toggleParticipant(participant, false)\">\r\n <fa-icon [icon]=\"faTimes\"></fa-icon>\r\n </button>\r\n </li>\r\n </ng-container>\r\n <ng-template #noAssignedParticipants>\r\n <li class=\"list-group-item d-flex justify-content-between align-items-center text-dark\">\r\n None\r\n </li>\r\n </ng-template>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-6 mt-xs-3 mb-3\">\r\n <h6>Pending</h6>\r\n <ul class=\"list-group\" style=\"max-height: 200px; overflow-y: auto; border: 1px solid #ccc;\">\r\n <ng-container *ngIf=\"unassignedParticipants.length > 0; else noPendingParticipants\">\r\n <li *ngFor=\"let participant of unassignedParticipants\" class=\"list-group-item d-flex justify-content-between align-items-center text-dark mb-2 mr-2\">\r\n {{ participant.name }}\r\n <button class=\"btn btn-primary btn-sm mr-2 ml-2\" (click)=\"toggleParticipant(participant, true)\">\r\n <fa-icon [icon]=\"faCheck\"></fa-icon>\r\n </button>\r\n </li>\r\n </ng-container>\r\n <ng-template #noPendingParticipants>\r\n <li class=\"list-group-item d-flex justify-content-between align-items-center text-dark\">\r\n None\r\n </li>\r\n </ng-template>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-info\" (click)=\"handleSaveWhiteboard()\">\r\n Save <fa-icon [icon]=\"faSave\"></fa-icon>\r\n </button>\r\n </div>\r\n <hr />\r\n <div *ngIf=\"!isEditing\">\r\n <button *ngIf=\"canStartWhiteboard && whiteboardStarted && !whiteboardEnded\" class=\"btn btn-warning mb-2 mr-2\" (click)=\"handleStartWhiteboard()\">\r\n Update <fa-icon [icon]=\"faSyncAlt\"></fa-icon>\r\n </button>\r\n <button *ngIf=\"canStartWhiteboard && !whiteboardStarted\" class=\"btn btn-success mb-2 mr-2\" (click)=\"handleStartWhiteboard()\">\r\n Start <fa-icon [icon]=\"faPlay\"></fa-icon>\r\n </button>\r\n <button *ngIf=\"whiteboardStarted && !whiteboardEnded\" class=\"btn btn-danger mb-2 ml-2\" (click)=\"handleStopWhiteboard()\">\r\n Stop <fa-icon [icon]=\"faTimes\"></fa-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".modal-body{max-height:400px;overflow-y:auto}.list-group-item{cursor:pointer}\n"] }]
275
- }], propDecorators: { isVisible: [{
276
- type: Input
277
- }], parameters: [{
278
- type: Input
279
- }], backgroundColor: [{
280
- type: Input
281
- }], position: [{
282
- type: Input
283
- }], onConfigureWhiteboardClose: [{
284
- type: Input
285
- }] } });
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLXdoaXRlYm9hcmQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWFzZnUtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvd2hpdGVib2FyZC1jb21wb25lbnRzL2NvbmZpZ3VyZS13aGl0ZWJvYXJkLW1vZGFsL2NvbmZpZ3VyZS13aGl0ZWJvYXJkLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhc2Z1LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3doaXRlYm9hcmQtY29tcG9uZW50cy9jb25maWd1cmUtd2hpdGVib2FyZC1tb2RhbC9jb25maWd1cmUtd2hpdGVib2FyZC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFnQmhHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQXVEMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBVUgsTUFBTSxPQUFPLHdCQUF3QjtJQUMxQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFVBQVUsR0FDakIsRUFBd0MsQ0FBQztJQUNsQyxlQUFlLEdBQUcsU0FBUyxDQUFDO0lBQzVCLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDdEIsMEJBQTBCLENBQWM7SUFFakQsT0FBTyxHQUFHLE9BQU8sQ0FB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Q0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUMxRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUN0RCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUN6RCxDQUFDO0lBQ0osQ0FBQztJQUVELHVCQUF1QixHQUFHLEdBQUcsRUFBRTtRQUM3QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRixDQUFDLENBQUM7dUdBaFRTLHdCQUF3QjsyRkFBeEIsd0JBQXdCLGlTQ3hHckMsNDBIQXVFQSx3SUQrQlksWUFBWSxvVkFBRSxpQkFBaUI7OzJGQUU5Qix3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0UsZ0NBQWdDLGNBQzlCLElBQUksV0FHUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQzs4QkFHakMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvbnRBd2Vzb21lTW9kdWxlIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgZmFUaW1lcywgZmFDaGVjaywgZmFTeW5jQWx0LCBmYVBsYXksIGZhU2F2ZSB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQge1xuICBDYXB0dXJlQ2FudmFzU3RyZWFtUGFyYW1ldGVycyxcbiAgQ2FwdHVyZUNhbnZhc1N0cmVhbVR5cGUsXG4gIEV2ZW50VHlwZSxcbiAgT25TY3JlZW5DaGFuZ2VzUGFyYW1ldGVycyxcbiAgT25TY3JlZW5DaGFuZ2VzVHlwZSxcbiAgUGFydGljaXBhbnQsXG4gIFByZXBvcHVsYXRlVXNlck1lZGlhUGFyYW1ldGVycyxcbiAgUHJlcG9wdWxhdGVVc2VyTWVkaWFUeXBlLFxuICBSZVBvcnRQYXJhbWV0ZXJzLFxuICBSZVBvcnRUeXBlLFxuICBTaG93QWxlcnQsXG4gIFdoaXRlYm9hcmRVcGRhdGVkRGF0YSxcbiAgV2hpdGVib2FyZFVzZXIsXG59IGZyb20gJy4uLy4uLy4uL0B0eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICdzb2NrZXQuaW8tY2xpZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmVXaGl0ZWJvYXJkTW9kYWxQYXJhbWV0ZXJzXG4gIGV4dGVuZHMgT25TY3JlZW5DaGFuZ2VzUGFyYW1ldGVycyxcbiAgICBDYXB0dXJlQ2FudmFzU3RyZWFtUGFyYW1ldGVycyxcbiAgICBQcmVwb3B1bGF0ZVVzZXJNZWRpYVBhcmFtZXRlcnMsXG4gICAgUmVQb3J0UGFyYW1ldGVycyB7XG4gIHBhcnRpY2lwYW50czogUGFydGljaXBhbnRbXTtcbiAgc2hvd0FsZXJ0PzogU2hvd0FsZXJ0O1xuICBzb2NrZXQ6IFNvY2tldDtcbiAgaXRlbVBhZ2VMaW1pdDogbnVtYmVyO1xuICBpc2xldmVsOiBzdHJpbmc7XG4gIHJvb21OYW1lOiBzdHJpbmc7XG4gIGV2ZW50VHlwZTogRXZlbnRUeXBlO1xuICBzaGFyZVNjcmVlblN0YXJ0ZWQ6IGJvb2xlYW47XG4gIHNoYXJlZDogYm9vbGVhbjtcbiAgYnJlYWtPdXRSb29tU3RhcnRlZDogYm9vbGVhbjtcbiAgYnJlYWtPdXRSb29tRW5kZWQ6IGJvb2xlYW47XG4gIHJlY29yZFN0YXJ0ZWQ6IGJvb2xlYW47XG4gIHJlY29yZFJlc3VtZWQ6IGJvb2xlYW47XG4gIHJlY29yZFBhdXNlZDogYm9vbGVhbjtcbiAgcmVjb3JkU3RvcHBlZDogYm9vbGVhbjtcbiAgcmVjb3JkaW5nTWVkaWFPcHRpb25zOiBzdHJpbmc7XG4gIGNhblN0YXJ0V2hpdGVib2FyZDogYm9vbGVhbjtcbiAgd2hpdGVib2FyZFN0YXJ0ZWQ6IGJvb2xlYW47XG4gIHdoaXRlYm9hcmRFbmRlZDogYm9vbGVhbjtcbiAgaG9zdExhYmVsOiBzdHJpbmc7XG4gIHVwZGF0ZVdoaXRlYm9hcmRTdGFydGVkOiAoc3RhcnRlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlV2hpdGVib2FyZEVuZGVkOiAoZW5kZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHVwZGF0ZVdoaXRlYm9hcmRVc2VyczogKHVzZXJzOiBXaGl0ZWJvYXJkVXNlcltdKSA9PiB2b2lkO1xuICB1cGRhdGVDYW5TdGFydFdoaXRlYm9hcmQ6IChjYW5TdGFydDogYm9vbGVhbikgPT4gdm9pZDtcbiAgdXBkYXRlSXNDb25maWd1cmVXaGl0ZWJvYXJkTW9kYWxWaXNpYmxlOiAoaXNWaXNpYmxlOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gIC8vIG1lZGlhc2Z1IGZ1bmN0aW9uc1xuICBvblNjcmVlbkNoYW5nZXM6IE9uU2NyZWVuQ2hhbmdlc1R5cGU7XG4gIGNhcHR1cmVDYW52YXNTdHJlYW06IENhcHR1cmVDYW52YXNTdHJlYW1UeXBlO1xuICBwcmVwb3B1bGF0ZVVzZXJNZWRpYTogUHJlcG9wdWxhdGVVc2VyTWVkaWFUeXBlO1xuICByZVBvcnQ6IFJlUG9ydFR5cGU7XG5cbiAgZ2V0VXBkYXRlZEFsbFBhcmFtczogKCkgPT4gQ29uZmlndXJlV2hpdGVib2FyZE1vZGFsUGFyYW1ldGVycztcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbE9wdGlvbnMge1xuICBpc0NvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbFZpc2libGU6IGJvb2xlYW47XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gIHBvc2l0aW9uPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIHBhcmFtZXRlcnM6IENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbFBhcmFtZXRlcnM7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbFR5cGUgPSAoXG4gIG9wdGlvbnM6IENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbE9wdGlvbnMsXG4pID0+IEhUTUxFbGVtZW50O1xuXG4vKipcbiAqIEBjb21wb25lbnQgQ29uZmlndXJlV2hpdGVib2FyZE1vZGFsXG4gKiBAZGVzY3JpcHRpb24gQSBtb2RhbCBjb21wb25lbnQgdG8gY29uZmlndXJlIGFuZCBtYW5hZ2Ugd2hpdGVib2FyZCBzZXR0aW5ncyBhbmQgcGFydGljaXBhbnRzLlxuICpcbiAqIEBzZWxlY3RvciBhcHAtY29uZmlndXJlLXdoaXRlYm9hcmQtbW9kYWxcbiAqIEBzdGFuZGFsb25lIHRydWVcbiAqIEBpbXBvcnRzIFtDb21tb25Nb2R1bGUsIEZvbnRBd2Vzb21lTW9kdWxlXVxuICogQHRlbXBsYXRlVXJsIC4vY29uZmlndXJlLXdoaXRlYm9hcmQtbW9kYWwuY29tcG9uZW50Lmh0bWxcbiAqIEBzdHlsZVVybHMgLi9jb25maWd1cmUtd2hpdGVib2FyZC1tb2RhbC5jb21wb25lbnQuY3NzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxhcHAtY29uZmlndXJlLXdoaXRlYm9hcmQtbW9kYWxcbiAqICAgW2lzVmlzaWJsZV09XCJpc1doaXRlYm9hcmRNb2RhbFZpc2libGVcIlxuICogICBbcGFyYW1ldGVyc109XCJ3aGl0ZWJvYXJkUGFyYW1ldGVyc1wiXG4gKiAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyM4M2MwZTknXCJcbiAqICAgW3Bvc2l0aW9uXT1cIid0b3BSaWdodCdcIlxuICogICAob25Db25maWd1cmVXaGl0ZWJvYXJkQ2xvc2UpPVwiaGFuZGxlQ2xvc2VNb2RhbCgpXCI+XG4gKiA8L2FwcC1jb25maWd1cmUtd2hpdGVib2FyZC1tb2RhbD5cbiAqIGBgYFxuICovXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNvbmZpZ3VyZS13aGl0ZWJvYXJkLW1vZGFsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpZ3VyZS13aGl0ZWJvYXJkLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29uZmlndXJlLXdoaXRlYm9hcmQtbW9kYWwuY29tcG9uZW50LmNzcyddLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb250QXdlc29tZU1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaXNWaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhcmFtZXRlcnM6IENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbFBhcmFtZXRlcnMgPVxuICAgIHt9IGFzIENvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbFBhcmFtZXRlcnM7XG4gIEBJbnB1dCgpIGJhY2tncm91bmRDb2xvciA9ICcjODNjMGU5JztcbiAgQElucHV0KCkgcG9zaXRpb24gPSAndG9wUmlnaHQnO1xuICBASW5wdXQoKSBvbkNvbmZpZ3VyZVdoaXRlYm9hcmRDbG9zZSE6ICgpID0+IHZvaWQ7XG5cbiAgZmFUaW1lcyA9IGZhVGltZXM7XG4gIGZhQ2hlY2sgPSBmYUNoZWNrO1xuICBmYVN5bmNBbHQgPSBmYVN5bmNBbHQ7XG4gIGZhUGxheSA9IGZhUGxheTtcbiAgZmFTYXZlID0gZmFTYXZlO1xuXG4gIHBhcnRpY2lwYW50c0NvcHk6IFBhcnRpY2lwYW50W10gPSBbXTtcbiAgd2hpdGVib2FyZExpbWl0ITogbnVtYmVyO1xuICBpc0VkaXRpbmcgPSBmYWxzZTtcbiAgY2FuU3RhcnRXaGl0ZWJvYXJkID0gZmFsc2U7XG4gIGFzc2lnbmVkUGFydGljaXBhbnRzOiBhbnlbXSA9IFtdO1xuICB1bmFzc2lnbmVkUGFydGljaXBhbnRzOiBhbnlbXSA9IFtdO1xuICB3aGl0ZWJvYXJkU3RhcnRlZCA9IGZhbHNlO1xuICB3aGl0ZWJvYXJkRW5kZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHNvY2tldDogU29ja2V0ID0ge30gYXMgU29ja2V0O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnBhcmFtZXRlcnMgJiYgdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycy5nZXRVcGRhdGVkQWxsUGFyYW1zKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaGFuZGxlIGVycm9yICovXG4gICAgICB9XG4gICAgICB0aGlzLndoaXRlYm9hcmRMaW1pdCA9IHRoaXMucGFyYW1ldGVycy5pdGVtUGFnZUxpbWl0O1xuICAgICAgdGhpcy53aGl0ZWJvYXJkU3RhcnRlZCA9IHRoaXMucGFyYW1ldGVycy53aGl0ZWJvYXJkU3RhcnRlZDtcbiAgICAgIHRoaXMud2hpdGVib2FyZEVuZGVkID0gdGhpcy5wYXJhbWV0ZXJzLndoaXRlYm9hcmRFbmRlZDtcbiAgICAgIHRoaXMuY2hlY2tDYW5TdGFydFdoaXRlYm9hcmQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLnNvY2tldCA9IHRoaXMucGFyYW1ldGVycy5zb2NrZXQ7XG4gICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zZXR1cFNvY2tldExpc3RlbmVycygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVycyddICYmIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgaWYgKHRoaXMucGFyYW1ldGVycyAmJiB0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLndoaXRlYm9hcmRMaW1pdCA9IHRoaXMucGFyYW1ldGVycy5pdGVtUGFnZUxpbWl0O1xuICAgICAgICB0aGlzLndoaXRlYm9hcmRTdGFydGVkID0gdGhpcy5wYXJhbWV0ZXJzLndoaXRlYm9hcmRTdGFydGVkO1xuICAgICAgICB0aGlzLndoaXRlYm9hcmRFbmRlZCA9IHRoaXMucGFyYW1ldGVycy53aGl0ZWJvYXJkRW5kZWQ7XG4gICAgICAgIHRoaXMuY2hlY2tDYW5TdGFydFdoaXRlYm9hcmQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQgPSB0aGlzLnBhcmFtZXRlcnMuc29ja2V0O1xuICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgIHRoaXMuc2V0dXBTb2NrZXRMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snaXNWaXNpYmxlJ10gJiYgdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycy5nZXRVcGRhdGVkQWxsUGFyYW1zKCk7XG4gICAgICBpZiAoIXRoaXMucGFydGljaXBhbnRzQ29weS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRQYXJ0aWNpcGFudHMgPSB0aGlzLnBhcmFtZXRlcnMucGFydGljaXBhbnRzLmZpbHRlcihcbiAgICAgICAgICAocGFydGljaXBhbnQ6IFBhcnRpY2lwYW50KSA9PiBwYXJ0aWNpcGFudC5pc2xldmVsICE9ICcyJyxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNpcGFudHNDb3B5ID0gZmlsdGVyZWRQYXJ0aWNpcGFudHM7XG4gICAgICAgIHRoaXMudXBkYXRlUGFydGljaXBhbnRzTGlzdHMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tDYW5TdGFydFdoaXRlYm9hcmQoKTtcbiAgICB9XG4gIH1cblxuICBzZXR1cFNvY2tldExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQgaW5zdGFuY2VvZiBTb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0Lm9uKCd3aGl0ZWJvYXJkVXBkYXRlZCcsIGFzeW5jIChkYXRhOiBXaGl0ZWJvYXJkVXBkYXRlZERhdGEpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycy5pc2xldmVsID09ICcyJyAmJiBkYXRhLm1lbWJlcnMpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZFBhcnRpY2lwYW50cyA9IGRhdGEubWVtYmVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFydGljaXBhbnQ6IGFueSkgPT4gIXBhcnRpY2lwYW50LmlzQmFubmVkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5wYXJ0aWNpcGFudHNDb3B5ID0gZmlsdGVyZWRQYXJ0aWNpcGFudHM7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYXJ0aWNpcGFudHNMaXN0cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZVdoaXRlYm9hcmRVc2VycyhkYXRhLndoaXRlYm9hcmRVc2Vycyk7XG5cbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09ICdzdGFydGVkJykge1xuICAgICAgICAgIHRoaXMud2hpdGVib2FyZFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMud2hpdGVib2FyZEVuZGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZVdoaXRlYm9hcmRTdGFydGVkKHRydWUpO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVycy51cGRhdGVXaGl0ZWJvYXJkRW5kZWQoZmFsc2UpO1xuXG4gICAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycy5pc2xldmVsICE9ICcyJykge1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNoYXJlU2NyZWVuU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFtZXRlcnMub25TY3JlZW5DaGFuZ2VzKHsgY2hhbmdlZDogdHJ1ZSwgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnN0YXR1cyA9PSAnZW5kZWQnKSB7XG4gICAgICAgICAgdGhpcy53aGl0ZWJvYXJkRW5kZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMud2hpdGVib2FyZFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMudXBkYXRlV2hpdGVib2FyZFN0YXJ0ZWQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVycy51cGRhdGVXaGl0ZWJvYXJkRW5kZWQodHJ1ZSk7XG5cbiAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2hhcmVTY3JlZW5TdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbWV0ZXJzLm9uU2NyZWVuQ2hhbmdlcyh7IGNoYW5nZWQ6IHRydWUsIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFtZXRlcnMucHJlcG9wdWxhdGVVc2VyTWVkaWEoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5wYXJhbWV0ZXJzLmhvc3RMYWJlbCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFtZXRlcnMucmVQb3J0KHsgcmVzdGFydDogdHJ1ZSwgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdG9nZ2xlUGFydGljaXBhbnQgPSAocGFydGljaXBhbnQ6IGFueSwgYWRkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHNlbGVjdGVkUGFydGljaXBhbnRzID0gdGhpcy5wYXJ0aWNpcGFudHNDb3B5LmZpbHRlcigocCkgPT4gcC51c2VCb2FyZCk7XG4gICAgaWYgKGFkZCAmJiBzZWxlY3RlZFBhcnRpY2lwYW50cy5sZW5ndGggPj0gdGhpcy53aGl0ZWJvYXJkTGltaXQgLSAxKSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMuc2hvd0FsZXJ0Py4oe1xuICAgICAgICBtZXNzYWdlOiBgUGFydGljaXBhbnQgbGltaXQgZXhjZWVkZWQgLSB5b3UgY2FuIG9ubHkgYWRkICR7XG4gICAgICAgICAgdGhpcy53aGl0ZWJvYXJkTGltaXQgLSAxXG4gICAgICAgIH0gb3RoZXIgcGFydGljaXBhbnRzYCxcbiAgICAgICAgdHlwZTogJ2RhbmdlcicsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhcnRpY2lwYW50c0NvcHkgPSB0aGlzLnBhcnRpY2lwYW50c0NvcHkubWFwKChwKSA9PlxuICAgICAgcC5uYW1lID09PSBwYXJ0aWNpcGFudC5uYW1lID8geyAuLi5wLCB1c2VCb2FyZDogYWRkIH0gOiBwLFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVQYXJ0aWNpcGFudHNMaXN0cygpO1xuICB9O1xuXG4gIHZhbGlkYXRlV2hpdGVib2FyZCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZFBhcnRpY2lwYW50cyA9IHRoaXMucGFydGljaXBhbnRzQ29weS5maWx0ZXIoXG4gICAgICAocGFydGljaXBhbnQpID0+IHBhcnRpY2lwYW50LnVzZUJvYXJkLFxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkUGFydGljaXBhbnRzLmxlbmd0aCA+IHRoaXMud2hpdGVib2FyZExpbWl0KSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMuc2hvd0FsZXJ0Py4oeyBtZXNzYWdlOiAnUGFydGljaXBhbnQgbGltaXQgZXhjZWVkZWQnLCB0eXBlOiAnZGFuZ2VyJyB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjaGVja0NhblN0YXJ0V2hpdGVib2FyZCgpIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVdoaXRlYm9hcmQoKTtcbiAgICB0aGlzLmNhblN0YXJ0V2hpdGVib2FyZCA9IGlzVmFsaWQ7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZUNhblN0YXJ0V2hpdGVib2FyZChpc1ZhbGlkKTtcbiAgfVxuXG4gIGhhbmRsZVNhdmVXaGl0ZWJvYXJkKCkge1xuICAgIGlmICh0aGlzLnZhbGlkYXRlV2hpdGVib2FyZCgpKSB7XG4gICAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYW5TdGFydFdoaXRlYm9hcmQgPSB0cnVlO1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZUNhblN0YXJ0V2hpdGVib2FyZCh0cnVlKTtcbiAgICAgIHRoaXMuY2hlY2tDYW5TdGFydFdoaXRlYm9hcmQoKTtcbiAgICAgIHRoaXMucGFyYW1ldGVycy5zaG93QWxlcnQ/Lih7IG1lc3NhZ2U6ICdXaGl0ZWJvYXJkIHNhdmVkIHN1Y2Nlc3NmdWxseScsIHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNob3dBbGVydD8uKHsgbWVzc2FnZTogJ1doaXRlYm9hcmQgdmFsaWRhdGlvbiBmYWlsZWQnLCB0eXBlOiAnZGFuZ2VyJyB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVTdGFydFdoaXRlYm9hcmQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2hhcmVTY3JlZW5TdGFydGVkLFxuICAgICAgc2hhcmVkLFxuICAgICAgYnJlYWtPdXRSb29tU3RhcnRlZCxcbiAgICAgIGJyZWFrT3V0Um9vbUVuZGVkLFxuICAgICAgcm9vbU5hbWUsXG4gICAgICBzb2NrZXQsXG4gICAgICByZWNvcmRTdGFydGVkLFxuICAgICAgcmVjb3JkUmVzdW1lZCxcbiAgICAgIHJlY29yZFBhdXNlZCxcbiAgICAgIHJlY29yZFN0b3BwZWQsXG4gICAgICByZWNvcmRpbmdNZWRpYU9wdGlvbnMsXG4gICAgICBvblNjcmVlbkNoYW5nZXMsXG4gICAgICBjYXB0dXJlQ2FudmFzU3RyZWFtLFxuICAgICAgc2hvd0FsZXJ0LFxuICAgIH0gPSB0aGlzLnBhcmFtZXRlcnM7XG5cbiAgICBpZiAoKHNoYXJlU2NyZWVuU3RhcnRlZCB8fCBzaGFyZWQpICYmICF0aGlzLndoaXRlYm9hcmRTdGFydGVkKSB7XG4gICAgICBzaG93QWxlcnQ/Lih7XG4gICAgICAgIG1lc3NhZ2U6ICdZb3UgY2Fubm90IHN0YXJ0IHdoaXRlYm9hcmQgd2hpbGUgc2NyZWVuIHNoYXJpbmcgaXMgYWN0aXZlJyxcbiAgICAgICAgdHlwZTogJ2RhbmdlcicsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYnJlYWtPdXRSb29tU3RhcnRlZCAmJiAhYnJlYWtPdXRSb29tRW5kZWQpIHtcbiAgICAgIHNob3dBbGVydD8uKHtcbiAgICAgICAgbWVzc2FnZTogJ1lvdSBjYW5ub3Qgc3RhcnQgd2hpdGVib2FyZCB3aGlsZSBicmVha291dCByb29tcyBhcmUgYWN0aXZlJyxcbiAgICAgICAgdHlwZTogJ2RhbmdlcicsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYW5TdGFydFdoaXRlYm9hcmQpIHtcbiAgICAgIGNvbnN0IGVtaXROYW1lID1cbiAgICAgICAgdGhpcy53aGl0ZWJvYXJkU3RhcnRlZCAmJiAhdGhpcy53aGl0ZWJvYXJkRW5kZWQgPyAndXBkYXRlV2hpdGVib2FyZCcgOiAnc3RhcnRXaGl0ZWJvYXJkJztcbiAgICAgIGNvbnN0IGZpbHRlcmVkV2hpdGVib2FyZFVzZXJzID0gdGhpcy5wYXJ0aWNpcGFudHNDb3B5XG4gICAgICAgIC5maWx0ZXIoKHBhcnRpY2lwYW50KSA9PiBwYXJ0aWNpcGFudC51c2VCb2FyZClcbiAgICAgICAgLm1hcCgoeyBuYW1lLCB1c2VCb2FyZCB9KSA9PiAoeyBuYW1lLCB1c2VCb2FyZCB9KSk7XG4gICAgICBzb2NrZXQuZW1pdChcbiAgICAgICAgZW1pdE5hbWUsXG4gICAgICAgIHsgd2hpdGVib2FyZFVzZXJzOiBmaWx0ZXJlZFdoaXRlYm9hcmRVc2Vycywgcm9vbU5hbWUgfSxcbiAgICAgICAgYXN5bmMgKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgc2hvd0FsZXJ0Py4oeyBtZXNzYWdlOiAnV2hpdGVib2FyZCBhY3RpdmUnLCB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMud2hpdGVib2FyZFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLndoaXRlYm9hcmRFbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZVdoaXRlYm9hcmRTdGFydGVkKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnVwZGF0ZVdoaXRlYm9hcmRFbmRlZChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMudXBkYXRlSXNDb25maWd1cmVXaGl0ZWJvYXJkTW9kYWxWaXNpYmxlKGZhbHNlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycy5pc2xldmVsICE9ICcyJykge1xuICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2hhcmVTY3JlZW5TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgb25TY3JlZW5DaGFuZ2VzKHsgY2hhbmdlZDogdHJ1ZSwgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzLmlzbGV2ZWwgPT0gJzInICYmIChyZWNvcmRTdGFydGVkIHx8IHJlY29yZFJlc3VtZWQpKSB7XG4gICAgICAgICAgICAgIGlmICghKHJlY29yZFBhdXNlZCB8fCByZWNvcmRTdG9wcGVkKSAmJiByZWNvcmRpbmdNZWRpYU9wdGlvbnMgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNhcHR1cmVDYW52YXNTdHJlYW0oeyBwYXJhbWV0ZXJzOiB0aGlzLnBhcmFtZXRlcnMgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hvd0FsZXJ0Py4oeyBtZXNzYWdlOiByZXNwb25zZS5yZWFzb24sIHR5cGU6ICdkYW5nZXInIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlU3RvcFdoaXRlYm9hcmQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbU5hbWUsXG4gICAgICBzb2NrZXQsXG4gICAgICBzaG93QWxlcnQsXG4gICAgICB1cGRhdGVXaGl0ZWJvYXJkU3RhcnRlZCxcbiAgICAgIHVwZGF0ZVdoaXRlYm9hcmRFbmRlZCxcbiAgICAgIHVwZGF0ZUlzQ29uZmlndXJlV2hpdGVib2FyZE1vZGFsVmlzaWJsZSxcbiAgICAgIG9uU2NyZWVuQ2hhbmdlcyxcbiAgICAgIHByZXBvcHVsYXRlVXNlck1lZGlhLFxuICAgICAgcmVQb3J0LFxuICAgICAgaG9zdExhYmVsLFxuICAgIH0gPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgc29ja2V0LmVtaXQoJ3N0b3BXaGl0ZWJvYXJkJywgeyByb29tTmFtZSB9LCBhc3luYyAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd0FsZXJ0Py4oeyBtZXNzYWdlOiAnV2hpdGVib2FyZCBzdG9wcGVkJywgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnMud2hpdGVib2FyZEVuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLndoaXRlYm9hcmRTdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHVwZGF0ZVdoaXRlYm9hcmRTdGFydGVkKGZhbHNlKTtcbiAgICAgICAgdXBkYXRlV2hpdGVib2FyZEVuZGVkKHRydWUpO1xuICAgICAgICB1cGRhdGVJc0NvbmZpZ3VyZVdoaXRlYm9hcmRNb2RhbFZpc2libGUoZmFsc2UpO1xuXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zaGFyZVNjcmVlblN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgb25TY3JlZW5DaGFuZ2VzKHsgY2hhbmdlZDogdHJ1ZSwgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzIH0pO1xuICAgICAgICBhd2FpdCBwcmVwb3B1bGF0ZVVzZXJNZWRpYSh7IG5hbWU6IGhvc3RMYWJlbCwgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzIH0pO1xuICAgICAgICBhd2FpdCByZVBvcnQoeyByZXN0YXJ0OiB0cnVlLCBwYXJhbWV0ZXJzOiB0aGlzLnBhcmFtZXRlcnMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93QWxlcnQ/Lih7IG1lc3NhZ2U6IHJlc3BvbnNlLnJlYXNvbiwgdHlwZTogJ2RhbmdlcicgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBtb2RhbENvbnRhaW5lclN0eWxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICAgICAgZGlzcGxheTogdGhpcy5pc1Zpc2libGUgPyAnYmxvY2snIDogJ25vbmUnLFxuICAgICAgekluZGV4OiA5OTksXG4gICAgfTtcbiAgfVxuXG4gIG1vZGFsQ29udGVudFN0eWxlKCkge1xuICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgbGV0IG1vZGFsV2lkdGggPSAwLjcgKiBzY3JlZW5XaWR0aDtcbiAgICBpZiAobW9kYWxXaWR0aCA+IDQwMCkge1xuICAgICAgbW9kYWxXaWR0aCA9IDQwMDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvcixcbiAgICAgIGJvcmRlclJhZGl1czogJzEwcHgnLFxuICAgICAgcGFkZGluZzogJzEwcHgnLFxuICAgICAgd2lkdGg6IG1vZGFsV2lkdGggKyAncHgnLFxuICAgICAgbWF4V2lkdGg6IG1vZGFsV2lkdGggKyAncHgnLFxuICAgICAgbWF4SGVpZ2h0OiAnNzUlJyxcbiAgICAgIG92ZXJmbG93WTogJ2F1dG8nLFxuICAgICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICAgIHRvcDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygndG9wJykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgICBib3R0b206IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpID8gJzEwcHgnIDogJ2F1dG8nLFxuICAgICAgbGVmdDogdGhpcy5wb3NpdGlvbi5pbmNsdWRlcygnTGVmdCcpID8gJzEwcHgnIDogJ2F1dG8nLFxuICAgICAgcmlnaHQ6IHRoaXMucG9zaXRpb24uaW5jbHVkZXMoJ1JpZ2h0JykgPyAnMTBweCcgOiAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVBhcnRpY2lwYW50c0xpc3RzID0gKCkgPT4ge1xuICAgIHRoaXMuYXNzaWduZWRQYXJ0aWNpcGFudHMgPSB0aGlzLnBhcnRpY2lwYW50c0NvcHkuZmlsdGVyKChwKSA9PiBwLnVzZUJvYXJkKTtcbiAgICB0aGlzLnVuYXNzaWduZWRQYXJ0aWNpcGFudHMgPSB0aGlzLnBhcnRpY2lwYW50c0NvcHkuZmlsdGVyKChwKSA9PiAhcC51c2VCb2FyZCk7XG4gIH07XG59XG4iLCI8ZGl2IFtuZ1N0eWxlXT1cIm1vZGFsQ29udGFpbmVyU3R5bGUoKVwiPlxyXG4gIDxkaXYgW25nU3R5bGVdPVwibW9kYWxDb250ZW50U3R5bGUoKVwiPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDE1cHg7XCI+XHJcbiAgICAgICAgPGgyIHN0eWxlPVwiZm9udC1zaXplOiB4LWxhcmdlOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6IGJsYWNrO1wiPlxyXG4gICAgICAgICAgQ29uZmlndXJlIFdoaXRlYm9hcmRcclxuICAgICAgICA8L2gyPlxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uQ29uZmlndXJlV2hpdGVib2FyZENsb3NlKClcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogbm9uZTsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFUaW1lc1wiIHNpemU9XCJ4bFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBjb2xvcjogYmxhY2s7XCI+PC9mYS1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDY+QXNzaWduZWQ8L2g2PlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3cteTogYXV0bzsgYm9yZGVyOiAxcHggc29saWQgI2NjYztcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWduZWRQYXJ0aWNpcGFudHMubGVuZ3RoID4gMDsgZWxzZSBub0Fzc2lnbmVkUGFydGljaXBhbnRzXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHBhcnRpY2lwYW50IG9mIGFzc2lnbmVkUGFydGljaXBhbnRzXCIgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWRhcmsgbWItMiBtci0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHBhcnRpY2lwYW50Lm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIGJ0bi1zbSBtci0yIG1sLTJcIiAoY2xpY2spPVwidG9nZ2xlUGFydGljaXBhbnQocGFydGljaXBhbnQsIGZhbHNlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhVGltZXNcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vQXNzaWduZWRQYXJ0aWNpcGFudHM+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgTm9uZVxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgbXQteHMtMyBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxoNj5QZW5kaW5nPC9oNj5cclxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiIHN0eWxlPVwibWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93LXk6IGF1dG87IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVuYXNzaWduZWRQYXJ0aWNpcGFudHMubGVuZ3RoID4gMDsgZWxzZSBub1BlbmRpbmdQYXJ0aWNpcGFudHNcIj5cclxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgcGFydGljaXBhbnQgb2YgdW5hc3NpZ25lZFBhcnRpY2lwYW50c1wiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1kYXJrIG1iLTIgbXItMlwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBwYXJ0aWNpcGFudC5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIG1yLTIgbWwtMlwiIChjbGljayk9XCJ0b2dnbGVQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUNoZWNrXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub1BlbmRpbmdQYXJ0aWNpcGFudHM+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgTm9uZVxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWluZm9cIiAoY2xpY2spPVwiaGFuZGxlU2F2ZVdoaXRlYm9hcmQoKVwiPlxyXG4gICAgICAgICAgU2F2ZSA8ZmEtaWNvbiBbaWNvbl09XCJmYVNhdmVcIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8aHIgLz5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFpc0VkaXRpbmdcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY2FuU3RhcnRXaGl0ZWJvYXJkICYmIHdoaXRlYm9hcmRTdGFydGVkICYmICF3aGl0ZWJvYXJkRW5kZWRcIiBjbGFzcz1cImJ0biBidG4td2FybmluZyBtYi0yIG1yLTJcIiAoY2xpY2spPVwiaGFuZGxlU3RhcnRXaGl0ZWJvYXJkKClcIj5cclxuICAgICAgICAgIFVwZGF0ZSA8ZmEtaWNvbiBbaWNvbl09XCJmYVN5bmNBbHRcIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNhblN0YXJ0V2hpdGVib2FyZCAmJiAhd2hpdGVib2FyZFN0YXJ0ZWRcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBtYi0yIG1yLTJcIiAoY2xpY2spPVwiaGFuZGxlU3RhcnRXaGl0ZWJvYXJkKClcIj5cclxuICAgICAgICAgIFN0YXJ0IDxmYS1pY29uIFtpY29uXT1cImZhUGxheVwiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwid2hpdGVib2FyZFN0YXJ0ZWQgJiYgIXdoaXRlYm9hcmRFbmRlZFwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgbWItMiBtbC0yXCIgKGNsaWNrKT1cImhhbmRsZVN0b3BXaGl0ZWJvYXJkKClcIj5cclxuICAgICAgICAgIFN0b3AgPGZhLWljb24gW2ljb25dPVwiZmFUaW1lc1wiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==