在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → Anapher:开源视频会议平台源码下载

Anapher:开源视频会议平台源码下载

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:2.96M
  • 下载次数:3
  • 浏览次数:41
  • 发布时间:2024-04-01
  • 实例类别:一般编程问题
  • 发 布 人:chenxiaolan
  • 文件格式:.zip
  • 所需积分:2
 相关标签:

实例介绍

【实例简介】
Strive是一款新兴的开源视频会议平台,旨在提供一个更加流畅和高效的在线沟通体验。该项目起源于作者在大学担任导师期间,对现有视频会议系统BigBlueButton的不满意,从而启动了Strive项目。

主要特点:
  • 灵活的权限系统
  • 分组讨论室
  • 屏幕共享
  • 多场景支持(网格视图、活跃发言人)
  • 演讲者模式
  • 房间聊天&全局聊天,匿名聊天消息
  • 设备支持/使用智能手机作为摄像头通过扫描二维码
  • 话筒控制/有序发言
  • 使用WebRTC simulcast减少流量
  • 响应式UI设计
  • 公告/向所有参与者显示消息,包括分组讨论室内的
  • 横向和纵向可扩展性
  • 投票(单选、多选、数字、标签云)
  • 白板

架构简介:项目采用微服务架构,包括前端WebSPA(React/TypeScript编写),身份认证微服务,选择性转发单元(SFU)以及会议管理等核心部分。

快速开始:本地部署可以通过Docker Compose和Traefik轻松完成,生产环境部署请参考安装说明。开发者可以专注于单个微服务的开发,首先需要设置基础设施,如RabbitMQ服务器和MongoDB数据库。

【实例截图】
【核心代码】
文件清单
└── Strive-56f40312740d47cba03bf722ea268a4a0fc32f86
    ├── advantages_over_bbb.md
    ├── codecov.yml
    ├── img
    │   ├── architecture.drawio
    │   ├── architecture.png
    │   └── preview_breakout_room.jpg
    ├── installation.md
    ├── LICENSE
    ├── package.json
    ├── performance.md
    ├── README.md
    ├── src
    │   ├── compose.ps1
    │   ├── compose.sh
    │   ├── docker-compose.dcproj
    │   ├── docker-compose.dev.yml
    │   ├── docker-compose.e2e.yml
    │   ├── docker-compose.override.yml
    │   ├── docker-compose.prod.yml
    │   ├── docker-compose.traefik.yml
    │   ├── docker-compose.yml
    │   ├── language.props
    │   ├── Libs
    │   │   ├── JsonPatchGenerator
    │   │   │   ├── Handlers
    │   │   │   │   ├── ArrayPatchTypeHandler.cs
    │   │   │   │   ├── ObjectPatchTypeHandler.cs
    │   │   │   │   └── ReplaceValuePatchTypeHandler.cs
    │   │   │   ├── IPatchContext.cs
    │   │   │   ├── IPatchTypeHandler.cs
    │   │   │   ├── JsonPatchFactory.cs
    │   │   │   ├── JsonPatchGenerator.csproj
    │   │   │   ├── JsonPatchOptions.cs
    │   │   │   ├── JsonPatchPath.cs
    │   │   │   └── RootPatcher.cs
    │   │   └── JsonPatchGenerator.Tests
    │   │       ├── Handlers
    │   │       │   ├── ArrayPatchTypeHandlerTests.cs
    │   │       │   ├── ObjectPatchTypeHandlerTests.cs
    │   │       │   └── TypeHandlerTestBase.cs
    │   │       ├── JsonPatchFactoryTests.cs
    │   │       ├── JsonPatchGenerator.Tests.csproj
    │   │       ├── Resources
    │   │       │   └── tests.json
    │   │       └── _Utils
    │   │           ├── AssertHelper.cs
    │   │           └── EmbeddedResourceUtils.cs
    │   ├── run_prod.sh
    │   ├── Services
    │   │   ├── ConferenceManagement
    │   │   │   ├── language.props
    │   │   │   ├── Strive
    │   │   │   │   ├── AppRoles.cs
    │   │   │   │   ├── appsettings.Development.json
    │   │   │   │   ├── appsettings.json
    │   │   │   │   ├── appsettings.Production.json
    │   │   │   │   ├── Auth
    │   │   │   │   │   ├── Operations.cs
    │   │   │   │   │   └── UserIsModeratorOfConferenceHandler.cs
    │   │   │   │   ├── Config
    │   │   │   │   │   ├── AuthOptions.cs
    │   │   │   │   │   ├── KeyValueDatabaseConfig.cs
    │   │   │   │   │   ├── RabbitMqOptions.cs
    │   │   │   │   │   └── SfuOptions.cs
    │   │   │   │   ├── Controllers
    │   │   │   │   │   ├── ConferenceController.cs
    │   │   │   │   │   ├── ConferenceLinkController.cs
    │   │   │   │   │   └── SfuController.cs
    │   │   │   │   ├── Dockerfile
    │   │   │   │   ├── Extensions
    │   │   │   │   │   ├── ApiBehaviorExtensions.cs
    │   │   │   │   │   ├── ExceptionExtensions.cs
    │   │   │   │   │   ├── JwtBearerExtensions.cs
    │   │   │   │   │   ├── RabbitMqConfiguratorExtensions.cs
    │   │   │   │   │   ├── RabbitMqExtensions.cs
    │   │   │   │   │   └── ResponseExtensions.cs
    │   │   │   │   ├── Hubs
    │   │   │   │   │   ├── Core
    │   │   │   │   │   │   ├── ClientControl
    │   │   │   │   │   │   │   └── EnableParticipantMessagingRequestHandler.cs
    │   │   │   │   │   │   ├── CoreHubClientProxyExtensions.cs
    │   │   │   │   │   │   ├── CoreHubConnections.cs
    │   │   │   │   │   │   ├── CoreHub.cs
    │   │   │   │   │   │   ├── CoreHubGroups.cs
    │   │   │   │   │   │   ├── CoreHubMessages.cs
    │   │   │   │   │   │   ├── Dtos
    │   │   │   │   │   │   │   ├── CreatePollDto.cs
    │   │   │   │   │   │   │   ├── DeletePollAnswerDto.cs
    │   │   │   │   │   │   │   ├── DeletePollDto.cs
    │   │   │   │   │   │   │   ├── FetchChatMessagesDto.cs
    │   │   │   │   │   │   │   ├── KickParticipantRequestDto.cs
    │   │   │   │   │   │   │   ├── OpenBreakoutRoomsDto.cs
    │   │   │   │   │   │   │   ├── SendChatMessageDto.cs
    │   │   │   │   │   │   │   ├── SendEquipmentCommandDto.cs
    │   │   │   │   │   │   │   ├── SetTemporaryPermissionDto.cs
    │   │   │   │   │   │   │   ├── SetUserTypingDto.cs
    │   │   │   │   │   │   │   ├── SubmitPollAnswerDto.cs
    │   │   │   │   │   │   │   ├── SwitchRoomDto.cs
    │   │   │   │   │   │   │   ├── UpdatePollStateDto.cs
    │   │   │   │   │   │   │   ├── WhiteboardLiveActionDto.cs
    │   │   │   │   │   │   │   ├── WhiteboardPushActionDto.cs
    │   │   │   │   │   │   │   └── WhiteboardUpdateSettingsDto.cs
    │   │   │   │   │   │   ├── ICoreHubConnections.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ChatMessageReceivedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── EquipmentErrorNotificationHandler.cs
    │   │   │   │   │   │   │   ├── LiveActionPushedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantKickedNotificationHandler.cs
    │   │   │   │   │   │   │   └── SynchronizedObjectUpdatedNotificationHandler.cs
    │   │   │   │   │   │   ├── ParticipantConnection.cs
    │   │   │   │   │   │   ├── Responses
    │   │   │   │   │   │   │   ├── ChatMessageDto.cs
    │   │   │   │   │   │   │   ├── EquipmentErrorDto.cs
    │   │   │   │   │   │   │   ├── RequestDisconnectDto.cs
    │   │   │   │   │   │   │   └── WhiteboardLiveUpdateDto.cs
    │   │   │   │   │   │   ├── Services
    │   │   │   │   │   │   │   ├── IServiceInvoker.cs
    │   │   │   │   │   │   │   ├── IServiceRequestBuilder.cs
    │   │   │   │   │   │   │   ├── Middlewares
    │   │   │   │   │   │   │   │   ├── ServiceInvokerChatMiddleware.cs
    │   │   │   │   │   │   │   │   ├── ServiceInvokerConferenceMiddleware.cs
    │   │   │   │   │   │   │   │   ├── ServiceInvokerPermissionMiddleware.cs
    │   │   │   │   │   │   │   │   └── ServiceInvokerValidationMiddleware.cs
    │   │   │   │   │   │   │   ├── ServiceInvokerContext.cs
    │   │   │   │   │   │   │   ├── ServiceInvoker.cs
    │   │   │   │   │   │   │   ├── ServiceMiddleware.cs
    │   │   │   │   │   │   │   ├── ServiceRequestBuilderBase.cs
    │   │   │   │   │   │   │   ├── ServiceRequestBuilder.cs
    │   │   │   │   │   │   │   └── ServiceRequestBuilderSuccessOrError.cs
    │   │   │   │   │   │   ├── SyncObjPayload.cs
    │   │   │   │   │   │   └── Validators
    │   │   │   │   │   │       ├── CreatePollDtoValidator.cs
    │   │   │   │   │   │       ├── DeletePollAnswerDtoValidator.cs
    │   │   │   │   │   │       ├── DeletePollDtoValidator.cs
    │   │   │   │   │   │       ├── Extensions
    │   │   │   │   │   │       │   └── ChatValidationExtensions.cs
    │   │   │   │   │   │       ├── KickParticipantRequestDtoValidator.cs
    │   │   │   │   │   │       ├── OpenBreakoutRoomsDtoValidator.cs
    │   │   │   │   │   │       ├── RoomCreationInfosValidator.cs
    │   │   │   │   │   │       ├── SendChatMessageDtoValidator.cs
    │   │   │   │   │   │       ├── SendEquipmentCommandDtoValidator.cs
    │   │   │   │   │   │       ├── SetTemporaryPermissionDtoValidator.cs
    │   │   │   │   │   │       ├── SubmitPollAnswerDtoValidator.cs
    │   │   │   │   │   │       ├── SwitchRoomDtoValidator.cs
    │   │   │   │   │   │       └── UpdatePollStateDtoValidator.cs
    │   │   │   │   │   ├── Equipment
    │   │   │   │   │   │   ├── Dtos
    │   │   │   │   │   │   │   └── InitializeEquipmentDto.cs
    │   │   │   │   │   │   ├── EquipmentGroups.cs
    │   │   │   │   │   │   ├── EquipmentHubClientProxyExtensions.cs
    │   │   │   │   │   │   ├── EquipmentHub.cs
    │   │   │   │   │   │   ├── EquipmentHubMessages.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   │   └── SendEquipmentCommandNotificationHandler.cs
    │   │   │   │   │   │   ├── Responses
    │   │   │   │   │   │   │   ├── EquipmentCommandDto.cs
    │   │   │   │   │   │   │   ├── EquipmentKickedReason.cs
    │   │   │   │   │   │   │   └── RequestDisconnectDto.cs
    │   │   │   │   │   │   └── Validators
    │   │   │   │   │   │       └── InitializeEquipmentDtoValidator.cs
    │   │   │   │   │   ├── HubExtensions.cs
    │   │   │   │   │   ├── ISfuConnectionHub.cs
    │   │   │   │   │   └── ScopedHub.cs
    │   │   │   │   ├── Messaging
    │   │   │   │   │   ├── Consumers
    │   │   │   │   │   │   ├── NotifyConnectionConsumer.cs
    │   │   │   │   │   │   ├── ParticipantKickedConsumer.cs
    │   │   │   │   │   │   └── StreamsUpdatedConsumer.cs
    │   │   │   │   │   ├── Contracts
    │   │   │   │   │   │   └── ParticipantKicked.cs
    │   │   │   │   │   └── SFU
    │   │   │   │   │       ├── CachedSfuNotifier.cs
    │   │   │   │   │       ├── Dto
    │   │   │   │   │       │   ├── ChangeParticipantProducerDto.cs
    │   │   │   │   │       │   ├── SendHubMessageDto.cs
    │   │   │   │   │       │   ├── SfuConferenceInfo.cs
    │   │   │   │   │       │   ├── SfuConferenceInfoUpdate.cs
    │   │   │   │   │       │   └── SfuParticipantPermissions.cs
    │   │   │   │   │       ├── NotificationHandlers
    │   │   │   │   │       │   ├── ConferenceOpenedNotificationHandler.cs
    │   │   │   │   │       │   ├── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │       │   ├── ParticipantPermissionsUpdatedNotificationHandler.cs
    │   │   │   │   │       │   └── ParticipantsRoomChangedNotificationHandler.cs
    │   │   │   │   │       ├── ReceiveContracts
    │   │   │   │   │       │   ├── SendMessageToConnection.cs
    │   │   │   │   │       │   └── StreamsUpdated.cs
    │   │   │   │   │       ├── SendContracts
    │   │   │   │   │       │   ├── ChangeParticipantProducer.cs
    │   │   │   │   │       │   ├── MediaStateChanged.cs
    │   │   │   │   │       │   └── ParticipantLeft.cs
    │   │   │   │   │       ├── SfuConferenceInfoRepo.cs
    │   │   │   │   │       ├── SfuConferenceInfoUpdateAggregator.cs
    │   │   │   │   │       ├── SfuMessage.cs
    │   │   │   │   │       ├── SfuNotifier.cs
    │   │   │   │   │       ├── UseCase
    │   │   │   │   │       │   └── ChangeParticipantProducerUseCase.cs
    │   │   │   │   │       └── Utils
    │   │   │   │   │           └── SfuPermissionUtils.cs
    │   │   │   │   ├── Models
    │   │   │   │   │   ├── Request
    │   │   │   │   │   │   ├── ChangeConferenceLinkStarDto.cs
    │   │   │   │   │   │   └── CreateConferenceRequestDto.cs
    │   │   │   │   │   ├── Response
    │   │   │   │   │   │   ├── ConferenceCreatedResponseDto.cs
    │   │   │   │   │   │   └── ConferenceLinkDto.cs
    │   │   │   │   │   └── Validation
    │   │   │   │   │       └── CreateConferenceRequestValidator.cs
    │   │   │   │   ├── PerformanceModule.cs
    │   │   │   │   ├── PresentationModule.cs
    │   │   │   │   ├── Presenters
    │   │   │   │   │   └── ConferenceLinkPresenter.cs
    │   │   │   │   ├── Program.cs
    │   │   │   │   ├── Properties
    │   │   │   │   │   └── launchSettings.json
    │   │   │   │   ├── Services
    │   │   │   │   │   └── MongoDbBuilder.cs
    │   │   │   │   ├── Startup.cs
    │   │   │   │   ├── Strive.csproj
    │   │   │   │   └── Utilities
    │   │   │   │       └── LoggingBehavior.cs
    │   │   │   ├── Strive.Core
    │   │   │   │   ├── ConcurrencyOptions.cs
    │   │   │   │   ├── ConferenceError.cs
    │   │   │   │   ├── CoreModule.cs
    │   │   │   │   ├── Domain
    │   │   │   │   │   ├── Entities
    │   │   │   │   │   │   ├── ConferenceConfiguration.cs
    │   │   │   │   │   │   ├── Conference.cs
    │   │   │   │   │   │   ├── ConferenceLink.cs
    │   │   │   │   │   │   └── PermissionType.cs
    │   │   │   │   │   ├── IScheduleInfo.cs
    │   │   │   │   │   └── Roles.cs
    │   │   │   │   ├── Dto
    │   │   │   │   │   └── Error.cs
    │   │   │   │   ├── Errors
    │   │   │   │   │   ├── BadRequestError.cs
    │   │   │   │   │   ├── ConflictError.cs
    │   │   │   │   │   ├── DomainError.cs
    │   │   │   │   │   ├── ErrorCode.cs
    │   │   │   │   │   ├── ErrorsProvider.cs
    │   │   │   │   │   ├── ErrorType.cs
    │   │   │   │   │   ├── FieldValidationError.cs
    │   │   │   │   │   ├── ForbiddenError.cs
    │   │   │   │   │   ├── InternalServerError.cs
    │   │   │   │   │   └── NotFound.cs
    │   │   │   │   ├── Extensions
    │   │   │   │   │   ├── EnumerableExtensions.cs
    │   │   │   │   │   ├── ErrorExtensions.cs
    │   │   │   │   │   ├── LoggerExtensions.cs
    │   │   │   │   │   ├── ObjectExtensions.cs
    │   │   │   │   │   └── PermissionDescriptorExtensions.cs
    │   │   │   │   ├── Interfaces
    │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   ├── EntityPage.cs
    │   │   │   │   │   │   ├── IAcquiredLock.cs
    │   │   │   │   │   │   ├── IStateRepository.cs
    │   │   │   │   │   │   ├── OptimisticUpdateResult.cs
    │   │   │   │   │   │   └── Repositories
    │   │   │   │   │   │       ├── ConcurrencyException.cs
    │   │   │   │   │   │       └── IConferenceLinkRepo.cs
    │   │   │   │   │   ├── IScheduledNotification.cs
    │   │   │   │   │   ├── ISuccessOrError.cs
    │   │   │   │   │   ├── Services
    │   │   │   │   │   │   ├── IScheduledMediator.cs
    │   │   │   │   │   │   └── ITokenFactory.cs
    │   │   │   │   │   └── SuccessOrError{T}.cs
    │   │   │   │   ├── Services
    │   │   │   │   │   ├── BreakoutRooms
    │   │   │   │   │   │   ├── BreakoutRoomError.cs
    │   │   │   │   │   │   ├── BreakoutRoomInternalState.cs
    │   │   │   │   │   │   ├── BreakoutRoomsConfig.cs
    │   │   │   │   │   │   ├── BreakoutRoomsOptions.cs
    │   │   │   │   │   │   ├── BreakoutRoomsPermissionLayerProvider.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── IBreakoutRoomRepository.cs
    │   │   │   │   │   │   ├── Internal
    │   │   │   │   │   │   │   ├── ApplyBreakoutRoomRequest.cs
    │   │   │   │   │   │   │   └── ApplyBreakoutRoomUseCase.cs
    │   │   │   │   │   │   ├── Naming
    │   │   │   │   │   │   │   ├── IRoomNamingStrategy.cs
    │   │   │   │   │   │   │   └── NatoRoomNamingStrategy.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── BreakoutRoomTimerElapsedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ConferenceClosedNotificationHandler.cs
    │   │   │   │   │   │   │   └── ParticipantsRoomChangedNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   └── BreakoutRoomTimerElapsedNotification.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── ChangeBreakoutRoomsRequest.cs
    │   │   │   │   │   │   │   ├── CloseBreakoutRoomsRequest.cs
    │   │   │   │   │   │   │   └── OpenBreakoutRoomsRequest.cs
    │   │   │   │   │   │   ├── SynchronizedBreakoutRooms.cs
    │   │   │   │   │   │   ├── SynchronizedBreakoutRoomsProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── ChangeBreakoutRoomsUseCase.cs
    │   │   │   │   │   │       ├── CloseBreakoutRoomsUseCase.cs
    │   │   │   │   │   │       └── OpenBreakoutRoomsUseCase.cs
    │   │   │   │   │   ├── Chat
    │   │   │   │   │   │   ├── Channels
    │   │   │   │   │   │   │   ├── ChannelSerializer.cs
    │   │   │   │   │   │   │   ├── ChatChannel.cs
    │   │   │   │   │   │   │   ├── ChatChannelType.cs
    │   │   │   │   │   │   │   ├── GlobalChatChannel.cs
    │   │   │   │   │   │   │   ├── PrivateChatChannel.cs
    │   │   │   │   │   │   │   └── RoomChatChannel.cs
    │   │   │   │   │   │   ├── ChatChannelSelector.cs
    │   │   │   │   │   │   ├── ChatError.cs
    │   │   │   │   │   │   ├── ChatMessage.cs
    │   │   │   │   │   │   ├── ChatOptions.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── IChatRepository.cs
    │   │   │   │   │   │   ├── IChatChannelSelector.cs
    │   │   │   │   │   │   ├── IParticipantTypingTimer.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferenceClosedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantsRoomChangedNotificationHandler.cs
    │   │   │   │   │   │   │   └── RoomsRemovedNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   └── ChatMessageReceivedNotification.cs
    │   │   │   │   │   │   ├── ParticipantTypingTimer.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── FetchMessagesRequest.cs
    │   │   │   │   │   │   │   ├── SendChatMessageRequest.cs
    │   │   │   │   │   │   │   └── SetParticipantTypingRequest.cs
    │   │   │   │   │   │   ├── SynchronizedChat.cs
    │   │   │   │   │   │   ├── SynchronizedChatProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── FetchMessagesUseCase.cs
    │   │   │   │   │   │       ├── SendChatMessageUseCase.cs
    │   │   │   │   │   │       └── SetParticipantTypingUseCase.cs
    │   │   │   │   │   ├── CommonError.cs
    │   │   │   │   │   ├── ConferenceControl
    │   │   │   │   │   │   ├── ClientControl
    │   │   │   │   │   │   │   └── EnableParticipantMessagingRequest.cs
    │   │   │   │   │   │   ├── ConferenceScheduler.cs
    │   │   │   │   │   │   ├── ConferenceSchedulerOptions.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   ├── IJoinedParticipantsRepository.cs
    │   │   │   │   │   │   │   ├── IOpenConferenceRepository.cs
    │   │   │   │   │   │   │   └── PreviousParticipantState.cs
    │   │   │   │   │   │   ├── IConferenceScheduler.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferenceClosedStateRepositoryCleanupHandler.cs
    │   │   │   │   │   │   │   ├── ConferenceStateUpdatedNotificationHandler.cs
    │   │   │   │   │   │   │   └── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   ├── ConferenceClosedNotification.cs
    │   │   │   │   │   │   │   ├── ConferenceOpenedNotification.cs
    │   │   │   │   │   │   │   ├── ConferenceStateUpdatedNotification.cs
    │   │   │   │   │   │   │   ├── FinalizeConferenceCleanupNotification.cs
    │   │   │   │   │   │   │   ├── ParticipantInitializedNotification.cs
    │   │   │   │   │   │   │   ├── ParticipantJoinedNotification.cs
    │   │   │   │   │   │   │   ├── ParticipantKickedNotification.cs
    │   │   │   │   │   │   │   └── ParticipantLeftNotification.cs
    │   │   │   │   │   │   ├── ParticipantMetadata.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── CheckIsParticipantJoinedRequest.cs
    │   │   │   │   │   │   │   ├── CloseConferenceRequest.cs
    │   │   │   │   │   │   │   ├── JoinConferenceRequest.cs
    │   │   │   │   │   │   │   ├── KickParticipantRequest.cs
    │   │   │   │   │   │   │   └── OpenConferenceRequest.cs
    │   │   │   │   │   │   ├── ScheduleUtils.cs
    │   │   │   │   │   │   ├── SynchronizedConferenceInfo.cs
    │   │   │   │   │   │   ├── SynchronizedConferenceInfoProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── CheckIsParticipantJoinedUseCase.cs
    │   │   │   │   │   │       ├── CloseConferenceHandler.cs
    │   │   │   │   │   │       ├── JoinConferenceRequestHandler.cs
    │   │   │   │   │   │       ├── KickParticipantHandler.cs
    │   │   │   │   │   │       └── OpenConferenceHandler.cs
    │   │   │   │   │   ├── ConferenceLink
    │   │   │   │   │   │   └── NotificationHandlers
    │   │   │   │   │   │       ├── ConferenceJoinedUpdateLinkHandler.cs
    │   │   │   │   │   │       └── ConferenceUpdatedUpdateLinkHandler.cs
    │   │   │   │   │   ├── ConferenceManagement
    │   │   │   │   │   │   ├── ConferenceData.cs
    │   │   │   │   │   │   ├── ConferenceDataValidator.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── IConferenceRepo.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   └── ConferencePatchedNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   └── ConferencePatchedNotification.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── CreateConferenceRequest.cs
    │   │   │   │   │   │   │   ├── FindConferenceByIdRequest.cs
    │   │   │   │   │   │   │   └── PatchConferenceRequest.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── CreateConferenceRequestHandler.cs
    │   │   │   │   │   │       ├── FindConferenceByIdRequestHandler.cs
    │   │   │   │   │   │       └── PatchConferenceRequestHandler.cs
    │   │   │   │   │   ├── ConferenceNotFoundException.cs
    │   │   │   │   │   ├── Equipment
    │   │   │   │   │   │   ├── CurrentStreamInfo.cs
    │   │   │   │   │   │   ├── DeviceType.cs
    │   │   │   │   │   │   ├── EquipmentCommandType.cs
    │   │   │   │   │   │   ├── EquipmentConnection.cs
    │   │   │   │   │   │   ├── EquipmentDevice.cs
    │   │   │   │   │   │   ├── EquipmentError.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   ├── IEquipmentConnectionRepository.cs
    │   │   │   │   │   │   │   └── IEquipmentTokenRepository.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── EquipmentDisconnectedNotificationHandler.cs
    │   │   │   │   │   │   │   └── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   ├── EquipmentDisconnectedNotification.cs
    │   │   │   │   │   │   │   ├── EquipmentErrorNotification.cs
    │   │   │   │   │   │   │   └── SendEquipmentCommandNotification.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── AuthenticateEquipmentRequest.cs
    │   │   │   │   │   │   │   ├── FetchEquipmentTokenRequest.cs
    │   │   │   │   │   │   │   ├── InitializeEquipmentRequest.cs
    │   │   │   │   │   │   │   ├── SendEquipmentCommandRequest.cs
    │   │   │   │   │   │   │   └── UpdateStatusRequest.cs
    │   │   │   │   │   │   ├── SynchronizedEquipment.cs
    │   │   │   │   │   │   ├── SynchronizedEquipmentProvider.cs
    │   │   │   │   │   │   ├── UseCases
    │   │   │   │   │   │   │   ├── AuthenticateEquipmentUseCase.cs
    │   │   │   │   │   │   │   ├── FetchEquipmentTokenUseCase.cs
    │   │   │   │   │   │   │   ├── InitializeEquipmentUseCase.cs
    │   │   │   │   │   │   │   ├── SendEquipmentCommandUseCase.cs
    │   │   │   │   │   │   │   └── UpdateStatusUseCase.cs
    │   │   │   │   │   │   └── UseMediaStateInfo.cs
    │   │   │   │   │   ├── IdErrorException.cs
    │   │   │   │   │   ├── ITaskDelay.cs
    │   │   │   │   │   ├── Media
    │   │   │   │   │   │   ├── Dtos
    │   │   │   │   │   │   │   ├── ConsumerInfo.cs
    │   │   │   │   │   │   │   ├── MediaStreamAction.cs
    │   │   │   │   │   │   │   ├── MediaStreamType.cs
    │   │   │   │   │   │   │   ├── ParticipantStreams.cs
    │   │   │   │   │   │   │   ├── ProducerInfo.cs
    │   │   │   │   │   │   │   └── ProducerSource.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   ├── IMediaStateRepository.cs
    │   │   │   │   │   │   │   └── ISfuAuthTokenFactory.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── ApplyMediaStateRequest.cs
    │   │   │   │   │   │   │   ├── ChangeParticipantProducerRequest.cs
    │   │   │   │   │   │   │   └── FetchSfuConnectionInfoRequest.cs
    │   │   │   │   │   │   ├── SfuConnectionInfo.cs
    │   │   │   │   │   │   ├── SfuConnectionOptions.cs
    │   │   │   │   │   │   ├── SynchronizedMediaState.cs
    │   │   │   │   │   │   ├── SynchronizedMediaStateProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── ApplyMediaStateUseCase.cs
    │   │   │   │   │   │       └── FetchSfuConnectionInfoUseCase.cs
    │   │   │   │   │   ├── Participant.cs
    │   │   │   │   │   ├── ParticipantNotFoundException.cs
    │   │   │   │   │   ├── ParticipantsList
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── IParticipantMetadataRepository.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferencePatchedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantJoinedNotificationHandler.cs
    │   │   │   │   │   │   │   └── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   ├── ParticipantData.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   └── FetchParticipantsMetadataRequest.cs
    │   │   │   │   │   │   ├── SynchronizedParticipants.cs
    │   │   │   │   │   │   ├── SynchronizedParticipantsProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       └── FetchParticipantMetadataUseCase.cs
    │   │   │   │   │   ├── Permissions
    │   │   │   │   │   │   ├── CachedPermissionStack.cs
    │   │   │   │   │   │   ├── CommonPermissionLayers.cs
    │   │   │   │   │   │   ├── DefinedPermissions.cs
    │   │   │   │   │   │   ├── DefinedPermissionsProvider.cs
    │   │   │   │   │   │   ├── DefinedPermissionValidator.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   ├── IAggregatedPermissionRepository.cs
    │   │   │   │   │   │   │   └── ITemporaryPermissionRepository.cs
    │   │   │   │   │   │   ├── IParticipantPermissions.cs
    │   │   │   │   │   │   ├── IPermissionLayerProvider.cs
    │   │   │   │   │   │   ├── IPermissionLayersAggregator.cs
    │   │   │   │   │   │   ├── IPermissionStack.cs
    │   │   │   │   │   │   ├── IPermissionValidator.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferencePatchedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantInitializedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   │   └── ParticipantPermissionsUpdatedNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   └── ParticipantPermissionsUpdatedNotification.cs
    │   │   │   │   │   │   ├── Options
    │   │   │   │   │   │   │   └── DefaultPermissionOptions.cs
    │   │   │   │   │   │   ├── ParticipantPermissions.cs
    │   │   │   │   │   │   ├── PermissionDescriptor.cs
    │   │   │   │   │   │   ├── PermissionDescriptor{T}.cs
    │   │   │   │   │   │   ├── PermissionLayer.cs
    │   │   │   │   │   │   ├── PermissionLayers
    │   │   │   │   │   │   │   ├── ConferencePermissionLayerProvider.cs
    │   │   │   │   │   │   │   ├── DefaultPermissionLayerProvider.cs
    │   │   │   │   │   │   │   └── TemporaryPermissionLayerProvider.cs
    │   │   │   │   │   │   ├── PermissionLayersAggregator.cs
    │   │   │   │   │   │   ├── PermissionsError.cs
    │   │   │   │   │   │   ├── PermissionValueType.cs
    │   │   │   │   │   │   ├── RepositoryPermissionStack.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── FetchPermissionsRequest.cs
    │   │   │   │   │   │   │   ├── SetTemporaryPermissionRequest.cs
    │   │   │   │   │   │   │   └── UpdateParticipantsPermissionsRequest.cs
    │   │   │   │   │   │   ├── Responses
    │   │   │   │   │   │   │   └── ParticipantPermissionResponse.cs
    │   │   │   │   │   │   ├── SynchronizedParticipantPermissions.cs
    │   │   │   │   │   │   ├── SynchronizedParticipantPermissionsProvider.cs
    │   │   │   │   │   │   ├── SynchronizedTemporaryPermissions.cs
    │   │   │   │   │   │   ├── SynchronizedTemporaryPermissionsProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── FetchPermissionsHandler.cs
    │   │   │   │   │   │       ├── SetTemporaryPermissionHandler.cs
    │   │   │   │   │   │       └── UpdateParticipantsPermissionsHandler.cs
    │   │   │   │   │   ├── Poll
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── IPollRepository.cs
    │   │   │   │   │   │   ├── IPollAnswerAggregator.cs
    │   │   │   │   │   │   ├── IPollAnswerValidator.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferenceClosedNotificationHandler.cs
    │   │   │   │   │   │   │   └── RoomsRemovedNotificationHandler.cs
    │   │   │   │   │   │   ├── PollAnswer.cs
    │   │   │   │   │   │   ├── PollAnswerWithKey.cs
    │   │   │   │   │   │   ├── PollConfig.cs
    │   │   │   │   │   │   ├── Poll.cs
    │   │   │   │   │   │   ├── PollError.cs
    │   │   │   │   │   │   ├── PollInstruction.cs
    │   │   │   │   │   │   ├── PollResults.cs
    │   │   │   │   │   │   ├── PollState.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── CreatePollRequest.cs
    │   │   │   │   │   │   │   ├── DeletePollRequest.cs
    │   │   │   │   │   │   │   ├── FetchParticipantPollsRequest.cs
    │   │   │   │   │   │   │   ├── FetchPollResultsRequest.cs
    │   │   │   │   │   │   │   ├── FetchPollsOfRoomRequest.cs
    │   │   │   │   │   │   │   ├── SubmitAnswerRequest.cs
    │   │   │   │   │   │   │   ├── UpdateParticipantSubscriptionsOfPollRequest.cs
    │   │   │   │   │   │   │   └── UpdatePollStateRequest.cs
    │   │   │   │   │   │   ├── SanitizedPollResult.cs
    │   │   │   │   │   │   ├── SynchronizedPollAnswers.cs
    │   │   │   │   │   │   ├── SynchronizedPollAnswersProvider.cs
    │   │   │   │   │   │   ├── SynchronizedPoll.cs
    │   │   │   │   │   │   ├── SynchronizedPollProvider.cs
    │   │   │   │   │   │   ├── SynchronizedPollResult.cs
    │   │   │   │   │   │   ├── SynchronizedPollResultProvider.cs
    │   │   │   │   │   │   ├── Types
    │   │   │   │   │   │   │   ├── MultipleChoice
    │   │   │   │   │   │   │   │   ├── MultipleChoiceAggregator.cs
    │   │   │   │   │   │   │   │   ├── MultipleChoiceAnswer.cs
    │   │   │   │   │   │   │   │   ├── MultipleChoiceAnswerValidator.cs
    │   │   │   │   │   │   │   │   └── MultipleChoiceInstruction.cs
    │   │   │   │   │   │   │   ├── Numeric
    │   │   │   │   │   │   │   │   ├── NumericAggregator.cs
    │   │   │   │   │   │   │   │   ├── NumericAnswer.cs
    │   │   │   │   │   │   │   │   ├── NumericAnswerValidator.cs
    │   │   │   │   │   │   │   │   ├── NumericInstruction.cs
    │   │   │   │   │   │   │   │   └── NumericPollResults.cs
    │   │   │   │   │   │   │   ├── SelectionPollAggregator.cs
    │   │   │   │   │   │   │   ├── SelectionPollResults.cs
    │   │   │   │   │   │   │   ├── SingleChoice
    │   │   │   │   │   │   │   │   ├── SingleChoiceAggregator.cs
    │   │   │   │   │   │   │   │   ├── SingleChoiceAnswer.cs
    │   │   │   │   │   │   │   │   ├── SingleChoiceAnswerValidator.cs
    │   │   │   │   │   │   │   │   └── SingleChoiceInstruction.cs
    │   │   │   │   │   │   │   └── TagCloud
    │   │   │   │   │   │   │       ├── Clustering
    │   │   │   │   │   │   │       │   ├── ClusterBucket.cs
    │   │   │   │   │   │   │       │   ├── IClusterAlgorithm.cs
    │   │   │   │   │   │   │       │   ├── IDistanceAlgorithm.cs
    │   │   │   │   │   │   │       │   ├── NaiveClusterAlgorithm.cs
    │   │   │   │   │   │   │       │   └── NormalizedLevenshteinDistance.cs
    │   │   │   │   │   │   │       ├── TagCloudAggregator.cs
    │   │   │   │   │   │   │       ├── TagCloudAnswer.cs
    │   │   │   │   │   │   │       ├── TagCloudAnswerValidator.cs
    │   │   │   │   │   │   │       ├── TagCloudClusterMode.cs
    │   │   │   │   │   │   │       ├── TagCloudGrouper.cs
    │   │   │   │   │   │   │       ├── TagCloudInstruction.cs
    │   │   │   │   │   │   │       ├── TagCloudPollResults.cs
    │   │   │   │   │   │   │       └── TagCloudTag.cs
    │   │   │   │   │   │   ├── UseCase
    │   │   │   │   │   │   │   ├── CreatePollUseCase.cs
    │   │   │   │   │   │   │   ├── DeletePollUseCase.cs
    │   │   │   │   │   │   │   ├── FetchParticipantPollsUseCase.cs
    │   │   │   │   │   │   │   ├── FetchPollResultsUseCase.cs
    │   │   │   │   │   │   │   ├── FetchPollsOfRoomUseCase.cs
    │   │   │   │   │   │   │   ├── SubmitAnswerUseCase.cs
    │   │   │   │   │   │   │   ├── UpdateParticipantSubscriptionsOfPollUseCase.cs
    │   │   │   │   │   │   │   └── UpdatePollStateUseCase.cs
    │   │   │   │   │   │   └── Utilities
    │   │   │   │   │   │       ├── PollAnswerAggregatorWrapper.cs
    │   │   │   │   │   │       ├── PollAnswerValidatorWrapper.cs
    │   │   │   │   │   │       └── SceneUpdater.cs
    │   │   │   │   │   ├── Rooms
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── IRoomRepository.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferenceClosedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ConferenceOpenedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantJoinedNotificationHandler.cs
    │   │   │   │   │   │   │   └── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   ├── Base
    │   │   │   │   │   │   │   │   └── RoomsChangedNotificationBase.cs
    │   │   │   │   │   │   │   ├── ParticipantsRoomChangedNotification.cs
    │   │   │   │   │   │   │   ├── RoomsCreatedNotification.cs
    │   │   │   │   │   │   │   └── RoomsRemovedNotification.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── CreateRoomsRequest.cs
    │   │   │   │   │   │   │   ├── RemoveRoomsRequest.cs
    │   │   │   │   │   │   │   └── SetParticipantRoomRequest.cs
    │   │   │   │   │   │   ├── RoomCreationInfo.cs
    │   │   │   │   │   │   ├── Room.cs
    │   │   │   │   │   │   ├── RoomOptions.cs
    │   │   │   │   │   │   ├── SynchronizedRooms.cs
    │   │   │   │   │   │   ├── SynchronizedRoomsProvider.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── CreateRoomsUseCase.cs
    │   │   │   │   │   │       ├── RemoveRoomsUseCase.cs
    │   │   │   │   │   │       └── SetParticipantRoomUseCase.cs
    │   │   │   │   │   ├── Scenes
    │   │   │   │   │   │   ├── ActiveScene.cs
    │   │   │   │   │   │   ├── ContentSceneProvider.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   └── ISceneRepository.cs
    │   │   │   │   │   │   ├── IScene.cs
    │   │   │   │   │   │   ├── ISceneProvider.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ConferenceConfigurationChangedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── RoomsAddedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── RoomsRemovedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ScenePermissionChangedNotificationHandler.cs
    │   │   │   │   │   │   │   └── SynchronizedObjectUpdatedNotificationHandler.cs
    │   │   │   │   │   │   ├── Providers
    │   │   │   │   │   │   │   ├── AutonomousSceneProvider.cs
    │   │   │   │   │   │   │   ├── BreakoutRoomSceneProvider.cs
    │   │   │   │   │   │   │   ├── DefaultScenesProvider.cs
    │   │   │   │   │   │   │   ├── PollSceneProvider.cs
    │   │   │   │   │   │   │   ├── PresenterSceneProvider.cs
    │   │   │   │   │   │   │   ├── ScreenShareSceneProvider.cs
    │   │   │   │   │   │   │   ├── TalkingStick
    │   │   │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   │   │   └── ITalkingStickRepository.cs
    │   │   │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   │   │   ├── ParticipantRoomChangeNotificationHandler.cs
    │   │   │   │   │   │   │   │   │   └── RoomsRemovedNotificationHandler.cs
    │   │   │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   │   │   ├── TalkingStickEnqueueRequest.cs
    │   │   │   │   │   │   │   │   │   ├── TalkingStickPassRequest.cs
    │   │   │   │   │   │   │   │   │   └── TalkingStickReturnRequest.cs
    │   │   │   │   │   │   │   │   ├── SceneModeHandler.cs
    │   │   │   │   │   │   │   │   ├── SynchronizedSceneTalkingStick.cs
    │   │   │   │   │   │   │   │   ├── SynchronizedSceneTalkingStickProvider.cs
    │   │   │   │   │   │   │   │   ├── TalkingStickSceneProvider.cs
    │   │   │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │   │   │       ├── TalkingStickEnqueueUseCase.cs
    │   │   │   │   │   │   │   │       ├── TalkingStickPassUseCase.cs
    │   │   │   │   │   │   │   │       └── TalkingStickReturnUseCase.cs
    │   │   │   │   │   │   │   └── WhiteboardSceneProvider.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── FetchAvailableScenesRequest.cs
    │   │   │   │   │   │   │   ├── SetOverwrittenContentSceneRequest.cs
    │   │   │   │   │   │   │   ├── SetSceneRequest.cs
    │   │   │   │   │   │   │   └── UpdateScenesRequest.cs
    │   │   │   │   │   │   ├── SceneBuilderContext.cs
    │   │   │   │   │   │   ├── SceneError.cs
    │   │   │   │   │   │   ├── SceneOptions.cs
    │   │   │   │   │   │   ├── ScenePermissionLayer.cs
    │   │   │   │   │   │   ├── Scenes
    │   │   │   │   │   │   │   ├── ActiveSpeakerScene.cs
    │   │   │   │   │   │   │   ├── AutonomousScene.cs
    │   │   │   │   │   │   │   ├── BreakoutRoomScene.cs
    │   │   │   │   │   │   │   ├── GridScene.cs
    │   │   │   │   │   │   │   ├── PollScene.cs
    │   │   │   │   │   │   │   ├── PresenterScene.cs
    │   │   │   │   │   │   │   ├── ScreenShareScene.cs
    │   │   │   │   │   │   │   ├── TalkingStickScene.cs
    │   │   │   │   │   │   │   └── WhiteboardScene.cs
    │   │   │   │   │   │   ├── SceneState.cs
    │   │   │   │   │   │   ├── SynchronizedScene.cs
    │   │   │   │   │   │   ├── SynchronizedSceneProvider.cs
    │   │   │   │   │   │   ├── UseCases
    │   │   │   │   │   │   │   ├── FetchAvailableScenesUseCase.cs
    │   │   │   │   │   │   │   ├── SetOverwrittenContentSceneUseCase.cs
    │   │   │   │   │   │   │   ├── SetSceneUseCase.cs
    │   │   │   │   │   │   │   └── UpdateScenesUseCase.cs
    │   │   │   │   │   │   └── Utilities
    │   │   │   │   │   │       ├── PatchSceneTransaction.cs
    │   │   │   │   │   │       └── SceneUtilities.cs
    │   │   │   │   │   ├── ServiceErrorCode.cs
    │   │   │   │   │   ├── Synchronization
    │   │   │   │   │   │   ├── Extensions
    │   │   │   │   │   │   │   └── MediatorSyncObjExtensions.cs
    │   │   │   │   │   │   ├── Gateways
    │   │   │   │   │   │   │   ├── ISynchronizedObjectRepository.cs
    │   │   │   │   │   │   │   └── ISynchronizedObjectSubscriptionsRepository.cs
    │   │   │   │   │   │   ├── ISynchronizedObjectProvider.cs
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   ├── ParticipantJoinedNotificationHandler.cs
    │   │   │   │   │   │   │   ├── ParticipantLeftNotificationHandler.cs
    │   │   │   │   │   │   │   ├── SynchronizedObjectGarbageCollector.cs
    │   │   │   │   │   │   │   └── UpdateSynchronizedSubscriptionsHandler.cs
    │   │   │   │   │   │   ├── Notifications
    │   │   │   │   │   │   │   ├── ParticipantSubscriptionsUpdatedNotification.cs
    │   │   │   │   │   │   │   └── SynchronizedObjectUpdatedNotification.cs
    │   │   │   │   │   │   ├── Requests
    │   │   │   │   │   │   │   ├── ClearCacheRequest.cs
    │   │   │   │   │   │   │   ├── FetchParticipantSubscriptionsRequest.cs
    │   │   │   │   │   │   │   ├── FetchSubscribedParticipantsRequest.cs
    │   │   │   │   │   │   │   ├── FetchSynchronizedObjectRequest.cs
    │   │   │   │   │   │   │   ├── UpdateSubscriptionsRequest.cs
    │   │   │   │   │   │   │   └── UpdateSynchronizedObjectRequest.cs
    │   │   │   │   │   │   ├── SynchronizedObjectId.cs
    │   │   │   │   │   │   ├── SynchronizedObjectProvider.cs
    │   │   │   │   │   │   ├── SynchronizedObjectProviderForAll.cs
    │   │   │   │   │   │   ├── SynchronizedObjectProviderForRoom.cs
    │   │   │   │   │   │   ├── SynchronizedSubscriptions.cs
    │   │   │   │   │   │   ├── SynchronizedSubscriptionsProvider.cs
    │   │   │   │   │   │   ├── UseCases
    │   │   │   │   │   │   │   ├── ClearCacheRequestHandler.cs
    │   │   │   │   │   │   │   ├── FetchParticipantSubscriptionsUseCase.cs
    │   │   │   │   │   │   │   ├── FetchSubscribedParticipantsUseCase.cs
    │   │   │   │   │   │   │   ├── FetchSynchronizedObjectUseCase.cs
    │   │   │   │   │   │   │   ├── UpdateSubscriptionsUseCase.cs
    │   │   │   │   │   │   │   └── UpdateSynchronizedObjectUseCase.cs
    │   │   │   │   │   │   └── Utilities
    │   │   │   │   │   │       └── ConferenceSubscriptionHelper.cs
    │   │   │   │   │   ├── SynchronizedObjectIds.cs
    │   │   │   │   │   └── WhiteboardService
    │   │   │   │   │       ├── Actions
    │   │   │   │   │       │   ├── AddCanvasAction.cs
    │   │   │   │   │       │   ├── DeleteCanvasAction.cs
    │   │   │   │   │       │   ├── PanCanvasAction.cs
    │   │   │   │   │       │   └── UpateCanvasAction.cs
    │   │   │   │   │       ├── CanvasAction.cs
    │   │   │   │   │       ├── CanvasData
    │   │   │   │   │       │   ├── CanvasLine.cs
    │   │   │   │   │       │   ├── CanvasObject.cs
    │   │   │   │   │       │   ├── CanvasPath.cs
    │   │   │   │   │       │   └── CanvasText.cs
    │   │   │   │   │       ├── CanvasLiveAction.cs
    │   │   │   │   │       ├── CanvasObjectRef.cs
    │   │   │   │   │       ├── CanvasPoint.cs
    │   │   │   │   │       ├── CanvasPushAction.cs
    │   │   │   │   │       ├── Gateways
    │   │   │   │   │       │   └── IWhiteboardRepository.cs
    │   │   │   │   │       ├── ICanvasActionUtils.cs
    │   │   │   │   │       ├── LiveActions
    │   │   │   │   │       │   ├── DrawingLineCanvasLiveAction.cs
    │   │   │   │   │       │   ├── EndCanvasLiveAction.cs
    │   │   │   │   │       │   ├── FreeDrawingCanvasLiveAction.cs
    │   │   │   │   │       │   ├── ModifyingCanvasLiveAction.cs
    │   │   │   │   │       │   └── PanningCanvasLiveAction.cs
    │   │   │   │   │       ├── NotificationHandlers
    │   │   │   │   │       │   └── RoomsRemovedNotificationHandler.cs
    │   │   │   │   │       ├── Notifications
    │   │   │   │   │       │   └── LiveActionPushedNotification.cs
    │   │   │   │   │       ├── ParticipantWhiteboardState.cs
    │   │   │   │   │       ├── PushActions
    │   │   │   │   │       │   ├── AddCanvasPushAction.cs
    │   │   │   │   │       │   ├── DeleteCanvasPushAction.cs
    │   │   │   │   │       │   ├── PanCanvasPushAction.cs
    │   │   │   │   │       │   └── UpdateCanvasPushAction.cs
    │   │   │   │   │       ├── Requests
    │   │   │   │   │       │   ├── CreateWhiteboardRequest.cs
    │   │   │   │   │       │   ├── DeleteWhiteboardRequest.cs
    │   │   │   │   │       │   ├── PushActionRequest.cs
    │   │   │   │   │       │   ├── PushLiveActionRequest.cs
    │   │   │   │   │       │   ├── RedoRequest.cs
    │   │   │   │   │       │   ├── UndoRequest.cs
    │   │   │   │   │       │   ├── UpdateWhiteboardRequest.cs
    │   │   │   │   │       │   └── UpdateWhiteboardSettingsRequest.cs
    │   │   │   │   │       ├── Responses
    │   │   │   │   │       │   └── WhiteboardUpdatedResponse.cs
    │   │   │   │   │       ├── StoredCanvasObject.cs
    │   │   │   │   │       ├── SynchronizedParticipantState.cs
    │   │   │   │   │       ├── SynchronizedWhiteboardInfo.cs
    │   │   │   │   │       ├── SynchronizedWhiteboards.cs
    │   │   │   │   │       ├── SynchronizedWhiteboardsProvider.cs
    │   │   │   │   │       ├── UseCases
    │   │   │   │   │       │   ├── CreateWhiteboardUseCase.cs
    │   │   │   │   │       │   ├── DeleteWhiteboardUseCase.cs
    │   │   │   │   │       │   ├── PushActionUseCase.cs
    │   │   │   │   │       │   ├── PushLiveActionUseCase.cs
    │   │   │   │   │       │   ├── RedoUseCase.cs
    │   │   │   │   │       │   ├── UndoUseCase.cs
    │   │   │   │   │       │   ├── UpdateWhiteboardSettingsUseCase.cs
    │   │   │   │   │       │   └── UpdateWhiteboardUseCase.cs
    │   │   │   │   │       ├── Utilities
    │   │   │   │   │       │   ├── RoomUtils.cs
    │   │   │   │   │       │   └── WhiteboardUtils.cs
    │   │   │   │   │       ├── VersionedAction.cs
    │   │   │   │   │       ├── VersionedCanvasObject.cs
    │   │   │   │   │       ├── WhiteboardCanvas.cs
    │   │   │   │   │       ├── WhiteboardCanvasUpdate.cs
    │   │   │   │   │       ├── Whiteboard.cs
    │   │   │   │   │       ├── WhiteboardError.cs
    │   │   │   │   │       ├── WhiteboardOptions.cs
    │   │   │   │   │       └── WhiteboardSettings.cs
    │   │   │   │   ├── Specifications
    │   │   │   │   │   ├── ConferenceLinkByConference.cs
    │   │   │   │   │   └── ConferenceLinkByParticipant.cs
    │   │   │   │   ├── Strive.Core.csproj
    │   │   │   │   └── Utilities
    │   │   │   │       ├── CronYearParser.cs
    │   │   │   │       ├── IndexUtils.cs
    │   │   │   │       └── Memorized.cs
    │   │   │   ├── Strive.Core.IntegrationTests
    │   │   │   │   ├── Services
    │   │   │   │   │   ├── Base
    │   │   │   │   │   │   ├── ServiceIntegrationTest.cs
    │   │   │   │   │   │   ├── TestData.cs
    │   │   │   │   │   │   └── TestParticipantConnection.cs
    │   │   │   │   │   ├── ChatTests.cs
    │   │   │   │   │   ├── ConferenceControlTests.cs
    │   │   │   │   │   ├── MediaTests.cs
    │   │   │   │   │   ├── ParticipantsListTests.cs
    │   │   │   │   │   ├── PermissionTests.cs
    │   │   │   │   │   ├── RoomTests.cs
    │   │   │   │   │   ├── SceneTalkingStickTests.cs
    │   │   │   │   │   ├── SceneTests.cs
    │   │   │   │   │   └── SynchronizationTests.cs
    │   │   │   │   ├── Strive.Core.IntegrationTests.csproj
    │   │   │   │   └── _TestHelpers
    │   │   │   │       ├── SynchronizedObjectListener.cs
    │   │   │   │       └── TestEqualityHelper.cs
    │   │   │   ├── Strive.Core.Tests
    │   │   │   │   ├── Extensions
    │   │   │   │   │   ├── EnumerableExtensionsTests.cs
    │   │   │   │   │   └── ObjectExtensionsTests.cs
    │   │   │   │   ├── Services
    │   │   │   │   │   ├── BreakoutRooms
    │   │   │   │   │   │   ├── BreakoutRoomsPermissionLayerProviderTests.cs
    │   │   │   │   │   │   ├── Internal
    │   │   │   │   │   │   │   └── ApplyBreakoutRoomUseCaseTests.cs
    │   │   │   │   │   │   ├── Naming
    │   │   │   │   │   │   │   └── NatoRoomNamingStrategyTest.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── ChangeBreakoutRoomsUseCaseTests.cs
    │   │   │   │   │   │       ├── CloseBreakoutRoomsUseCaseTests.cs
    │   │   │   │   │   │       └── OpenBreakoutRoomsUseCaseTests.cs
    │   │   │   │   │   ├── Chat
    │   │   │   │   │   │   ├── Channels
    │   │   │   │   │   │   │   └── ChannelSerializerTests.cs
    │   │   │   │   │   │   ├── ChatChannelSelectorTests.cs
    │   │   │   │   │   │   └── ParticipantTypingTimerTests.cs
    │   │   │   │   │   ├── ConferenceControl
    │   │   │   │   │   │   ├── ConferenceSchedulerTests.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── CloseConferenceHandlerTests.cs
    │   │   │   │   │   │       ├── JoinConferenceRequestHandlerTests.cs
    │   │   │   │   │   │       ├── KickParticipantHandlerTests.cs
    │   │   │   │   │   │       └── OpenConferenceHandlerTests.cs
    │   │   │   │   │   ├── ConferenceManagement
    │   │   │   │   │   │   ├── ConferenceDataValidatorTests.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       └── PatchConferenceRequestHandlerTests.cs
    │   │   │   │   │   ├── Equipment
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── AuthenticateEquipmentUseCaseTests.cs
    │   │   │   │   │   │       ├── FetchEquipmentTokenUseCaseTests.cs
    │   │   │   │   │   │       ├── InitializeEquipmentUseCaseTests.cs
    │   │   │   │   │   │       ├── SendEquipmentCommandUseCaseTests.cs
    │   │   │   │   │   │       └── UpdateStatusUseCaseTests.cs
    │   │   │   │   │   ├── Media
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── ApplyMediaStateUseCaseTests.cs
    │   │   │   │   │   │       └── FetchSfuConnectionInfoUseCaseTests.cs
    │   │   │   │   │   ├── Permissions
    │   │   │   │   │   │   ├── CachedPermissionStackTests.cs
    │   │   │   │   │   │   ├── PermissionLayersAggregatorTests.cs
    │   │   │   │   │   │   ├── PermissionsListUtilTests.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── FetchPermissionsHandlerTests.cs
    │   │   │   │   │   │       ├── SetTemporaryPermissionHandlerTests.cs
    │   │   │   │   │   │       └── UpdateParticipantsPermissionsHandlerTests.cs
    │   │   │   │   │   ├── Poll
    │   │   │   │   │   │   ├── SynchronizedPollResultProviderTests.cs
    │   │   │   │   │   │   ├── Types
    │   │   │   │   │   │   │   ├── MultipleChoice
    │   │   │   │   │   │   │   │   ├── MultipleChoiceAggregatorTests.cs
    │   │   │   │   │   │   │   │   └── MultipleChoiceAnswerValidatorTests.cs
    │   │   │   │   │   │   │   ├── Numeric
    │   │   │   │   │   │   │   │   └── NumericAnswerValidatorTests.cs
    │   │   │   │   │   │   │   ├── SingleChoice
    │   │   │   │   │   │   │   │   ├── SingleChoiceAggregatorTests.cs
    │   │   │   │   │   │   │   │   └── SingleChoiceAnswerValidatorTests.cs
    │   │   │   │   │   │   │   └── TagCloud
    │   │   │   │   │   │   │       ├── Clustering
    │   │   │   │   │   │   │       │   ├── NaiveClusterAlgorithmTests.cs
    │   │   │   │   │   │   │       │   └── NormalizedLevenshteinDistanceTests.cs
    │   │   │   │   │   │   │       ├── TagCloudAggregatorTests.cs
    │   │   │   │   │   │   │       └── TagCloudAnswerValidatorTests.cs
    │   │   │   │   │   │   ├── UseCase
    │   │   │   │   │   │   │   ├── FetchParticipantPollsUseCaseTests.cs
    │   │   │   │   │   │   │   └── SubmitAnswerUseCaseTests.cs
    │   │   │   │   │   │   └── Utilities
    │   │   │   │   │   │       ├── PollAnswerAggregatorWrapperTests.cs
    │   │   │   │   │   │       └── PollAnswerValidatorWrapperTests.cs
    │   │   │   │   │   ├── Rooms
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   └── ConferenceOpenedNotificationHandlerTests.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── CreateRoomsUseCaseTests.cs
    │   │   │   │   │   │       ├── RemoveRoomsUseCaseTests.cs
    │   │   │   │   │   │       └── SetParticipantRoomUseCaseTests.cs
    │   │   │   │   │   ├── Scenes
    │   │   │   │   │   │   ├── NotificationHandlers
    │   │   │   │   │   │   │   └── SynchronizedObjectUpdatedNotificationHandlerTests.cs
    │   │   │   │   │   │   ├── Providers
    │   │   │   │   │   │   │   ├── AutonomousSceneProviderTests.cs
    │   │   │   │   │   │   │   ├── BreakoutRoomSceneProviderTests.cs
    │   │   │   │   │   │   │   ├── PresenterSceneProviderTests.cs
    │   │   │   │   │   │   │   └── ScreenShareSceneProviderTests.cs
    │   │   │   │   │   │   ├── UseCases
    │   │   │   │   │   │   │   ├── FetchAvailableScenesUseCaseTests.cs
    │   │   │   │   │   │   │   ├── SetOverwrittenContentSceneUseCase.cs
    │   │   │   │   │   │   │   ├── SetSceneUseCaseTests.cs
    │   │   │   │   │   │   │   └── UpdateScenesUseCaseTests.cs
    │   │   │   │   │   │   └── Utilities
    │   │   │   │   │   │       └── SceneUtilitiesTests.cs
    │   │   │   │   │   ├── Synchronization
    │   │   │   │   │   │   ├── SynchronizedObjectIdTests.cs
    │   │   │   │   │   │   └── UseCases
    │   │   │   │   │   │       ├── FetchSynchronizedObjectUseCaseTests.cs
    │   │   │   │   │   │       ├── UpdateSubscriptionsUseCaseTests.cs
    │   │   │   │   │   │       └── UpdateSynchronizedObjectUseCaseTests.cs
    │   │   │   │   │   └── WhiteboardService
    │   │   │   │   │       ├── ActionRequestTestBase.cs
    │   │   │   │   │       ├── Actions
    │   │   │   │   │       │   ├── AddCanvasActionTests.cs
    │   │   │   │   │       │   ├── DeleteCanvasActionTests.cs
    │   │   │   │   │       │   ├── PanCanvasActionTests.cs
    │   │   │   │   │       │   └── UpdateCanvasActionTests.cs
    │   │   │   │   │       └── UseCases
    │   │   │   │   │           ├── CreateWhiteboardUseCaseTests.cs
    │   │   │   │   │           ├── PushActionUseCaseTests.cs
    │   │   │   │   │           ├── RedoUseCaseTests.cs
    │   │   │   │   │           ├── UndoUseCaseTests.cs
    │   │   │   │   │           └── UpdateWhiteboardUseCaseTests.cs
    │   │   │   │   ├── Strive.Core.Tests.csproj
    │   │   │   │   ├── _TestHelpers
    │   │   │   │   │   ├── ConferenceManagementHelper.cs
    │   │   │   │   │   ├── JoinedParticipantsRepositoryMock.cs
    │   │   │   │   │   └── SynchronizedObjectMediatorExtensions.cs
    │   │   │   │   └── Utilities
    │   │   │   │       ├── CronYearParserTests.cs
    │   │   │   │       ├── IndexUtilsTests.cs
    │   │   │   │       └── MemorizedTests.cs
    │   │   │   ├── Strive.Infrastructure
    │   │   │   │   ├── Auth
    │   │   │   │   │   └── TokenFactory.cs
    │   │   │   │   ├── Data
    │   │   │   │   │   ├── IMongoIndexBuilder.cs
    │   │   │   │   │   ├── MongoDbOptions.cs
    │   │   │   │   │   ├── MongoRepo.cs
    │   │   │   │   │   └── Repos
    │   │   │   │   │       ├── CachedConferenceRepo.cs
    │   │   │   │   │       ├── ConferenceLinkRepo.cs
    │   │   │   │   │       └── ConferenceRepo.cs
    │   │   │   │   ├── Extensions
    │   │   │   │   │   ├── StringExtensions.cs
    │   │   │   │   │   └── UserExtensions.cs
    │   │   │   │   ├── InfrastructureModule.cs
    │   │   │   │   ├── KeyValue
    │   │   │   │   │   ├── Abstractions
    │   │   │   │   │   │   ├── IKeyValueDatabaseActions.cs
    │   │   │   │   │   │   ├── IKeyValueDatabase.cs
    │   │   │   │   │   │   └── IKeyValueDatabaseTransaction.cs
    │   │   │   │   │   ├── DatabaseKeyBuilder.cs
    │   │   │   │   │   ├── Extensions
    │   │   │   │   │   │   └── KeyValueDatabaseExtensions.cs
    │   │   │   │   │   ├── IKeyValueRepo.cs
    │   │   │   │   │   ├── InMemory
    │   │   │   │   │   │   ├── IInMemoryKeyLock.cs
    │   │   │   │   │   │   ├── InMemoryAcquiredLock.cs
    │   │   │   │   │   │   ├── InMemoryDatabaseActions.cs
    │   │   │   │   │   │   ├── InMemoryDatabaseTransaction.cs
    │   │   │   │   │   │   ├── InMemoryKeyLock.cs
    │   │   │   │   │   │   ├── InMemoryKeyValueDatabase.cs
    │   │   │   │   │   │   ├── InMemoryKeyValueData.cs
    │   │   │   │   │   │   └── NoLockInMemoryDatabaseActions.cs
    │   │   │   │   │   ├── KeyValueDatabaseOptions.cs
    │   │   │   │   │   ├── KeyValueSerializer.cs
    │   │   │   │   │   ├── Redis
    │   │   │   │   │   │   ├── RedisAcquiredLockWrapper.cs
    │   │   │   │   │   │   ├── RedisActions.cs
    │   │   │   │   │   │   ├── RedisKeyValueDatabase.cs
    │   │   │   │   │   │   ├── RedisTransaction.cs
    │   │   │   │   │   │   └── Scripts
    │   │   │   │   │   │       ├── JoinedParticipantsRepository_RemoveParticipant.lua
    │   │   │   │   │   │       ├── JoinedParticipantsRepository_RemoveParticipantSafe.lua
    │   │   │   │   │   │       ├── RedisScriptLoader.cs
    │   │   │   │   │   │       └── RoomRepository_SetParticipantRoom.lua
    │   │   │   │   │   └── Repos
    │   │   │   │   │       ├── AggregatedPermissionRepository.cs
    │   │   │   │   │       ├── BreakoutRoomRepository.cs
    │   │   │   │   │       ├── ChatRepository.cs
    │   │   │   │   │       ├── EquipmentConnectionRepository.cs
    │   │   │   │   │       ├── EquipmentTokenRepository.cs
    │   │   │   │   │       ├── JoinedParticipantsRepository.cs
    │   │   │   │   │       ├── MediaStateRepository.cs
    │   │   │   │   │       ├── OpenConferenceRepository.cs
    │   │   │   │   │       ├── ParticipantMetadataRepository.cs
    │   │   │   │   │       ├── PollRepository.cs
    │   │   │   │   │       ├── RoomRepository.cs
    │   │   │   │   │       ├── SceneRepository.cs
    │   │   │   │   │       ├── ScenesTalkingStickRepository.cs
    │   │   │   │   │       ├── SynchronizedObjectRepository.cs
    │   │   │   │   │       ├── SynchronizedObjectSubscriptionsRepository.cs
    │   │   │   │   │       ├── TemporaryPermissionRepository.cs
    │   │   │   │   │       └── WhiteboardRepository.cs
    │   │   │   │   ├── Scheduler
    │   │   │   │   │   ├── IScheduledNotificationWrapper.cs
    │   │   │   │   │   ├── MediatrNotificationConsumer.cs
    │   │   │   │   │   └── ScheduledMediator.cs
    │   │   │   │   ├── Serialization
    │   │   │   │   │   ├── DictionaryStringKeyPreserveCasingConverter.cs
    │   │   │   │   │   ├── ErrorConverter.cs
    │   │   │   │   │   ├── JsonConfig.cs
    │   │   │   │   │   └── JTokenBsonSerializer.cs
    │   │   │   │   ├── Sfu
    │   │   │   │   │   ├── JwtSfuAuthTokenFactory.cs
    │   │   │   │   │   ├── SfuClaimTypes.cs
    │   │   │   │   │   └── SfuJwtOptions.cs
    │   │   │   │   ├── Strive.Infrastructure.csproj
    │   │   │   │   └── Utilities
    │   │   │   │       ├── CanvasActionUtils.cs
    │   │   │   │       ├── CopyUtils.cs
    │   │   │   │       ├── EmbeddedResourceUtils.cs
    │   │   │   │       └── MongoConcurrencyExtensions.cs
    │   │   │   ├── Strive.Infrastructure.Redis.Tests
    │   │   │   │   ├── Redis
    │   │   │   │   │   ├── JoinedParticipantsRepositoryTests.cs
    │   │   │   │   │   ├── KeyValueDatabaseFactory.cs
    │   │   │   │   │   ├── RoomRepositoryTests.cs
    │   │   │   │   │   └── Scripts
    │   │   │   │   │       ├── JoinedParticipantsRepository_RemoveParticipant_Redis.cs
    │   │   │   │   │       ├── JoinedParticipantsRepository_RemoveParticipantSafe_Redis.cs
    │   │   │   │   │       └── RoomRepository_SetParticipantRoom_Redis.cs
    │   │   │   │   ├── RedisDbConnector.cs
    │   │   │   │   └── Strive.Infrastructure.Redis.Tests.csproj
    │   │   │   ├── Strive.Infrastructure.Tests
    │   │   │   │   ├── Auth
    │   │   │   │   │   └── TokenFactoryTests.cs
    │   │   │   │   ├── Extensions
    │   │   │   │   │   └── StringExtensionsTests.cs
    │   │   │   │   ├── KeyValue
    │   │   │   │   │   ├── InMemory
    │   │   │   │   │   │   ├── InMemoryAcquiredLockTests.cs
    │   │   │   │   │   │   ├── InMemoryKeyLockTests.cs
    │   │   │   │   │   │   ├── InMemoryKeyValueDatabaseTests.cs
    │   │   │   │   │   │   └── InMemoryTransactionTests.cs
    │   │   │   │   │   └── Scripts
    │   │   │   │   │       ├── Base
    │   │   │   │   │       │   ├── JoinedParticipantsRepository_RemoveParticipantSafe_Tests.cs
    │   │   │   │   │       │   ├── JoinedParticipantsRepository_RemoveParticipant_Tests.cs
    │   │   │   │   │       │   └── RoomRepository_SetParticipantRoom_Tests.cs
    │   │   │   │   │       ├── JoinedParticipantsRepository_RemoveParticipant_InMemoryTests.cs
    │   │   │   │   │       ├── JoinedParticipantsRepository_RemoveParticipantSafe_InMemoryTests.cs
    │   │   │   │   │       ├── RedisScriptLoaderTests.cs
    │   │   │   │   │       └── RoomRepository_SetParticipantRoom_InMemory.cs
    │   │   │   │   ├── Serialization
    │   │   │   │   │   └── JsonConfigTests.cs
    │   │   │   │   ├── Sfu
    │   │   │   │   │   └── JwtSfuAuthTokenFactoryTests.cs
    │   │   │   │   ├── Strive.Infrastructure.Tests.csproj
    │   │   │   │   └── Utilities
    │   │   │   │       └── CopyUtilsTests.cs
    │   │   │   ├── Strive.IntegrationTests
    │   │   │   │   ├── appsettings.IntegrationTest.json
    │   │   │   │   ├── Controllers
    │   │   │   │   │   ├── ConferenceLinkTest.cs
    │   │   │   │   │   ├── CreateConferenceTest.cs
    │   │   │   │   │   ├── PatchConferenceTest.cs
    │   │   │   │   │   └── SfuTest.cs
    │   │   │   │   ├── CustomWebApplicationFactory.cs
    │   │   │   │   ├── Extensions
    │   │   │   │   │   ├── ConfigurationExtensions.cs
    │   │   │   │   │   └── TaskExtensions.cs
    │   │   │   │   ├── _Helpers
    │   │   │   │   │   ├── IntegrationTestBase.cs
    │   │   │   │   │   ├── JsonNetContent.cs
    │   │   │   │   │   ├── MockJwtTokens.cs
    │   │   │   │   │   ├── ServiceIntegrationTest.cs
    │   │   │   │   │   ├── SynchronizedObjectListener.cs
    │   │   │   │   │   └── WaitTimeoutExtensions.cs
    │   │   │   │   ├── IntegrationTestCollection.cs
    │   │   │   │   ├── Messaging
    │   │   │   │   │   └── SFU
    │   │   │   │   │       ├── _Helpers
    │   │   │   │   │       │   └── SfuConferenceInfoEndpoint.cs
    │   │   │   │   │       └── SfuMessagesTest.cs
    │   │   │   │   ├── MongoDbFixture.cs
    │   │   │   │   ├── Services
    │   │   │   │   │   ├── BreakoutRoomTests.cs
    │   │   │   │   │   ├── ChatTests.cs
    │   │   │   │   │   ├── ConferenceControlTests.cs
    │   │   │   │   │   ├── EquipmentTests.cs
    │   │   │   │   │   ├── MediaTests.cs
    │   │   │   │   │   ├── ParticipantsListTests.cs
    │   │   │   │   │   ├── PermissionTests.cs
    │   │   │   │   │   ├── PollTests.cs
    │   │   │   │   │   ├── RoomTests.cs
    │   │   │   │   │   ├── SceneTests.cs
    │   │   │   │   │   ├── SynchronizedObjectTests.cs
    │   │   │   │   │   └── WhiteboardTests.cs
    │   │   │   │   └── Strive.IntegrationTests.csproj
    │   │   │   ├── Strive.Tests
    │   │   │   │   ├── Hubs
    │   │   │   │   │   └── Core
    │   │   │   │   │       └── Services
    │   │   │   │   │           ├── Middlewares
    │   │   │   │   │           │   ├── MiddlewareTestBase.cs
    │   │   │   │   │           │   ├── ServiceInvokerChatVerifyCanSendToChatChannelTests.cs
    │   │   │   │   │           │   ├── ServiceInvokerConferenceMiddlewareTests.cs
    │   │   │   │   │           │   ├── ServiceInvokerPermissionMiddlewareTests.cs
    │   │   │   │   │           │   ├── ServiceInvokerValidationMiddlewareTests.cs
    │   │   │   │   │           │   └── ServiceInvokerVerifyMessageConformsOptionsTests.cs
    │   │   │   │   │           └── ServiceRequestBuilderTests.cs
    │   │   │   │   ├── Messaging
    │   │   │   │   │   └── SFU
    │   │   │   │   │       └── SfuConferenceInfoUpdateAggregatorTests.cs
    │   │   │   │   └── Strive.Tests.csproj
    │   │   │   └── Strive.Tests.Utils
    │   │   │       ├── AssertHelper.cs
    │   │   │       ├── MediatorNotificationCollector.cs
    │   │   │       ├── MediatorTestUtils.cs
    │   │   │       ├── Strive.Tests.Utils.csproj
    │   │   │       └── TestOutputHelperUtils.cs
    │   │   ├── Identity
    │   │   │   └── Identity.API
    │   │   │       ├── appsettings.json
    │   │   │       ├── Config.cs
    │   │   │       ├── Controllers
    │   │   │       │   └── UserController.cs
    │   │   │       ├── DemoUserProvider.cs
    │   │   │       ├── Dockerfile
    │   │   │       ├── Identity.API.csproj
    │   │   │       ├── ProfileService.cs
    │   │   │       ├── Program.cs
    │   │   │       ├── Properties
    │   │   │       │   └── launchSettings.json
    │   │   │       ├── Quickstart
    │   │   │       │   ├── Account
    │   │   │       │   │   ├── AccountController.cs
    │   │   │       │   │   ├── AccountOptions.cs
    │   │   │       │   │   ├── LoggedOutViewModel.cs
    │   │   │       │   │   ├── LoginInputModel.cs
    │   │   │       │   │   ├── LoginViewModel.cs
    │   │   │       │   │   ├── LogoutInputModel.cs
    │   │   │       │   │   ├── LogoutViewModel.cs
    │   │   │       │   │   └── RedirectViewModel.cs
    │   │   │       │   ├── Extensions.cs
    │   │   │       │   ├── Home
    │   │   │       │   │   ├── ErrorViewModel.cs
    │   │   │       │   │   └── HomeController.cs
    │   │   │       │   ├── IUserProvider.cs
    │   │   │       │   └── SecurityHeadersAttribute.cs
    │   │   │       ├── Startup.cs
    │   │   │       ├── Views
    │   │   │       │   ├── Account
    │   │   │       │   │   ├── AccessDenied.cshtml
    │   │   │       │   │   ├── LoggedOut.cshtml
    │   │   │       │   │   ├── Login.cshtml
    │   │   │       │   │   └── Logout.cshtml
    │   │   │       │   ├── Home
    │   │   │       │   │   └── Index.cshtml
    │   │   │       │   ├── Shared
    │   │   │       │   │   ├── Error.cshtml
    │   │   │       │   │   ├── _Layout.cshtml
    │   │   │       │   │   ├── _Nav.cshtml
    │   │   │       │   │   ├── Redirect.cshtml
    │   │   │       │   │   └── _ValidationSummary.cshtml
    │   │   │       │   ├── _ViewImports.cshtml
    │   │   │       │   └── _ViewStart.cshtml
    │   │   │       └── wwwroot
    │   │   │           ├── css
    │   │   │           │   ├── site.css
    │   │   │           │   ├── site.min.css
    │   │   │           │   └── site.scss
    │   │   │           ├── duende-logo.svg
    │   │   │           ├── favicon.ico
    │   │   │           ├── js
    │   │   │           │   ├── signin-redirect.js
    │   │   │           │   └── signout-redirect.js
    │   │   │           └── lib
    │   │   │               ├── bootstrap
    │   │   │               │   ├── dist
    │   │   │               │   │   ├── css
    │   │   │               │   │   │   ├── bootstrap.css
    │   │   │               │   │   │   ├── bootstrap.css.map
    │   │   │               │   │   │   ├── bootstrap-grid.css
    │   │   │               │   │   │   ├── bootstrap-grid.css.map
    │   │   │               │   │   │   ├── bootstrap-grid.min.css
    │   │   │               │   │   │   ├── bootstrap-grid.min.css.map
    │   │   │               │   │   │   ├── bootstrap.min.css
    │   │   │               │   │   │   ├── bootstrap.min.css.map
    │   │   │               │   │   │   ├── bootstrap-reboot.css
    │   │   │               │   │   │   ├── bootstrap-reboot.css.map
    │   │   │               │   │   │   ├── bootstrap-reboot.min.css
    │   │   │               │   │   │   └── bootstrap-reboot.min.css.map
    │   │   │               │   │   └── js
    │   │   │               │   │       ├── bootstrap.bundle.js
    │   │   │               │   │       ├── bootstrap.bundle.js.map
    │   │   │               │   │       ├── bootstrap.bundle.min.js
    │   │   │               │   │       ├── bootstrap.bundle.min.js.map
    │   │   │               │   │       ├── bootstrap.js
    │   │   │               │   │       ├── bootstrap.js.map
    │   │   │               │   │       ├── bootstrap.min.js
    │   │   │               │   │       └── bootstrap.min.js.map
    │   │   │               │   ├── LICENSE
    │   │   │               │   └── README.md
    │   │   │               └── jquery
    │   │   │                   ├── dist
    │   │   │                   │   ├── jquery.js
    │   │   │                   │   ├── jquery.min.js
    │   │   │                   │   ├── jquery.min.map
    │   │   │                   │   ├── jquery.slim.js
    │   │   │                   │   ├── jquery.slim.min.js
    │   │   │                   │   └── jquery.slim.min.map
    │   │   │                   ├── LICENSE.txt
    │   │   │                   └── README.md
    │   │   └── SFU
    │   │       ├── Dockerfile
    │   │       ├── package.json
    │   │       ├── README.md
    │   │       ├── src
    │   │       │   ├── common-types.ts
    │   │       │   ├── config.ts
    │   │       │   ├── controllers.ts
    │   │       │   ├── errors.ts
    │   │       │   ├── index.ts
    │   │       │   ├── lib
    │   │       │   │   ├── conference
    │   │       │   │   │   ├── conference-factory.ts
    │   │       │   │   │   ├── conference-manager.ts
    │   │       │   │   │   ├── conference-messenger.ts
    │   │       │   │   │   ├── conference.ts
    │   │       │   │   │   ├── pub-types.ts
    │   │       │   │   │   ├── request-types.ts
    │   │       │   │   │   ├── stream-info-repo.ts
    │   │       │   │   │   └── sub-types.ts
    │   │       │   │   ├── connection.ts
    │   │       │   │   ├── media-soup
    │   │       │   │   │   └── mediasoup-mixer.ts
    │   │       │   │   ├── participant-permissions.ts
    │   │       │   │   ├── participant.ts
    │   │       │   │   ├── permissions.ts
    │   │       │   │   ├── rooms
    │   │       │   │   │   ├── loopback-manager.ts
    │   │       │   │   │   ├── room-manager.ts
    │   │       │   │   │   └── room.ts
    │   │       │   │   ├── synchronization
    │   │       │   │   │   ├── conference-management-client.ts
    │   │       │   │   │   ├── conference-repository.ts
    │   │       │   │   │   ├── message-types.ts
    │   │       │   │   │   ├── pub-sub-messenger.ts
    │   │       │   │   │   ├── rabbit-pub.ts
    │   │       │   │   │   └── synchronized-conference.ts
    │   │       │   │   └── types.ts
    │   │       │   ├── media-soup-workers.ts
    │   │       │   ├── rabbitmq
    │   │       │   │   └── rabbit-mq-conn.ts
    │   │       │   └── utils
    │   │       │       ├── logger.ts
    │   │       │       ├── map-utils.ts
    │   │       │       └── promise-utils.ts
    │   │       ├── test
    │   │       │   └── lib
    │   │       │       ├── conference
    │   │       │       │   └── stream-info-repo.test.ts
    │   │       │       ├── rooms
    │   │       │       │   ├── loopback-manager.test.ts
    │   │       │       │   ├── room-manager.test.ts
    │   │       │       │   └── room.test.ts
    │   │       │       ├── synchronization
    │   │       │       │   ├── conference-management-client.test.ts
    │   │       │       │   ├── conference-repository.test.ts
    │   │       │       │   └── synchronized-conference.test.ts
    │   │       │       └── utils
    │   │       │           └── map-utils.test.ts
    │   │       ├── tsconfig.json
    │   │       └── yarn.lock
    │   ├── Strive.sln
    │   ├── Strive.sln.DotSettings
    │   ├── Tests
    │   │   └── e2e
    │   │       ├── cypress
    │   │       │   ├── fixtures
    │   │       │   │   └── example.json
    │   │       │   ├── integration
    │   │       │   │   ├── common.js
    │   │       │   │   └── features
    │   │       │   │       ├── breakout-room.js
    │   │       │   │       ├── chat.js
    │   │       │   │       ├── create-conference.js
    │   │       │   │       ├── poll.js
    │   │       │   │       └── webrtc.js
    │   │       │   ├── plugins
    │   │       │   │   └── index.js
    │   │       │   └── support
    │   │       │       ├── commands.js
    │   │       │       └── index.js
    │   │       ├── cypress.json
    │   │       ├── Dockerfile
    │   │       ├── package.json
    │   │       └── yarn.lock
    │   ├── traefik.yml
    │   └── Web
    │       └── WebSPA
    │           ├── AppSettings.cs
    │           ├── appsettings.json
    │           ├── Client
    │           │   ├── package.json
    │           │   ├── public
    │           │   │   ├── favicon.ico
    │           │   │   ├── index.css
    │           │   │   ├── index.html
    │           │   │   └── manifest.json
    │           │   ├── README.md
    │           │   ├── src
    │           │   │   ├── App.tsx
    │           │   │   ├── assets
    │           │   │   │   ├── animated-icons
    │           │   │   │   │   ├── AnimatedCamIcon.tsx
    │           │   │   │   │   ├── AnimatedIconBase.tsx
    │           │   │   │   │   ├── AnimatedMicIcon.tsx
    │           │   │   │   │   └── AnimatedScreenIcon.tsx
    │           │   │   │   ├── audio
    │           │   │   │   │   ├── strive_conference_opened.mp3
    │           │   │   │   │   └── test_audio_file.mp3
    │           │   │   │   ├── locales
    │           │   │   │   │   ├── de
    │           │   │   │   │   │   ├── common.json
    │           │   │   │   │   │   ├── errors.json
    │           │   │   │   │   │   ├── glossary.json
    │           │   │   │   │   │   ├── index.ts
    │           │   │   │   │   │   └── main.json
    │           │   │   │   │   └── en
    │           │   │   │   │       ├── common.json
    │           │   │   │   │       ├── errors.json
    │           │   │   │   │       ├── glossary.json
    │           │   │   │   │       ├── index.ts
    │           │   │   │   │       └── main.json
    │           │   │   │   └── stop_words
    │           │   │   │       ├── stop_words_de.json
    │           │   │   │       └── stop_words_en.json
    │           │   │   ├── communication-types.ts
    │           │   │   ├── components
    │           │   │   │   ├── CompactInput.tsx
    │           │   │   │   ├── ConsumerDiagnosticInfo.tsx
    │           │   │   │   ├── CountdownRenderer.tsx
    │           │   │   │   ├── ErrorWrapper.tsx
    │           │   │   │   ├── FullscreenError.tsx
    │           │   │   │   ├── IconHide.tsx
    │           │   │   │   ├── MobileAwareSelect.tsx
    │           │   │   │   ├── NativeIsoDateInput.tsx
    │           │   │   │   ├── PopperWrapper.tsx
    │           │   │   │   ├── RenderConsumerVideo.tsx
    │           │   │   │   └── TwoLineFab.tsx
    │           │   │   ├── config.ts
    │           │   │   ├── consts.ts
    │           │   │   ├── core-hub.ts
    │           │   │   ├── core-hub.types.ts
    │           │   │   ├── equipment-hub.ts
    │           │   │   ├── equipment-hub.types.ts
    │           │   │   ├── errors.ts
    │           │   │   ├── features
    │           │   │   │   ├── auth
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── AuthCallback.tsx
    │           │   │   │   │   │   ├── AuthenticatingComponent.tsx
    │           │   │   │   │   │   ├── BaseAuthComponent.tsx
    │           │   │   │   │   │   ├── NotAuthenticated.tsx
    │           │   │   │   │   │   └── SessionLostComponent.tsx
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   └── selectors.ts
    │           │   │   │   ├── breakout-rooms
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── BreakoutRoomsAssignments.tsx
    │           │   │   │   │   │   ├── BreakoutRoomsDialog.tsx
    │           │   │   │   │   │   ├── BreakoutRoomsForm.tsx
    │           │   │   │   │   │   ├── CreateBreakoutRoomsDialog.tsx
    │           │   │   │   │   │   └── UpdateBreakoutRoomsDialog.tsx
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   └── types.ts
    │           │   │   │   ├── chat
    │           │   │   │   │   ├── actions.ts
    │           │   │   │   │   ├── channel-serializer.ts
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── AnnouncementCard.tsx
    │           │   │   │   │   │   ├── AnnouncementOverlay.tsx
    │           │   │   │   │   │   ├── ChatBar.tsx
    │           │   │   │   │   │   ├── ChatChannelTabs.tsx
    │           │   │   │   │   │   ├── ChatMessageInput.tsx
    │           │   │   │   │   │   ├── ChatMessageList.tsx
    │           │   │   │   │   │   ├── ChatMessage.tsx
    │           │   │   │   │   │   ├── Chat.tsx
    │           │   │   │   │   │   ├── EmojisPopper.tsx
    │           │   │   │   │   │   ├── NewChat.tsx
    │           │   │   │   │   │   ├── NewMessagesIndicator.tsx
    │           │   │   │   │   │   ├── ParticipantsTypingText.tsx
    │           │   │   │   │   │   ├── ParticipantsTyping.tsx
    │           │   │   │   │   │   ├── SendMessageForm.tsx
    │           │   │   │   │   │   └── SendMessageOptions.tsx
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   ├── types.ts
    │           │   │   │   │   ├── useBooleanThrottle.ts
    │           │   │   │   │   └── utils.ts
    │           │   │   │   ├── conference
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── appbar
    │           │   │   │   │   │   │   ├── AppBarLogo.tsx
    │           │   │   │   │   │   │   ├── BreakoutRoomChip.tsx
    │           │   │   │   │   │   │   └── WebRtcStatusChip.tsx
    │           │   │   │   │   │   ├── ClassConference.tsx
    │           │   │   │   │   │   ├── ConferenceAppBar.tsx
    │           │   │   │   │   │   ├── ConferenceConnecting.tsx
    │           │   │   │   │   │   ├── conference-not-open
    │           │   │   │   │   │   │   ├── ConferenceNotOpenLayout.tsx
    │           │   │   │   │   │   │   ├── ConferenceNotOpenModerator.tsx
    │           │   │   │   │   │   │   ├── ConferenceNotOpen.tsx
    │           │   │   │   │   │   │   └── ConferenceOpenSound.ts
    │           │   │   │   │   │   ├── ConferenceSidebar.tsx
    │           │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   ├── MyConferencesList.tsx
    │           │   │   │   │   │   ├── ParticipantContextMenuPopper.tsx
    │           │   │   │   │   │   ├── ParticipantContextMenuTempPermissions.tsx
    │           │   │   │   │   │   ├── ParticipantContextMenu.tsx
    │           │   │   │   │   │   ├── ParticipantItem.tsx
    │           │   │   │   │   │   ├── PermissionDialog.tsx
    │           │   │   │   │   │   ├── PermissionsView.tsx
    │           │   │   │   │   │   ├── RequestUserInteractionView.tsx
    │           │   │   │   │   │   └── troubleshoot
    │           │   │   │   │   │       ├── StatusChip.tsx
    │           │   │   │   │   │       ├── TroubleshootAccordion.tsx
    │           │   │   │   │   │       ├── troubleshoot-connection
    │           │   │   │   │   │       │   ├── DetailedErrorStatus.tsx
    │           │   │   │   │   │       │   ├── status-utils.ts
    │           │   │   │   │   │       │   ├── TransportStats.tsx
    │           │   │   │   │   │       │   └── useWebRtcHealth.ts
    │           │   │   │   │   │       ├── TroubleshootConnection.tsx
    │           │   │   │   │   │       ├── TroubleshootDiagnostics.tsx
    │           │   │   │   │   │       ├── Troubleshooting.tsx
    │           │   │   │   │   │       ├── TroubleshootLogging.tsx
    │           │   │   │   │   │       ├── troubleshoot-microphone
    │           │   │   │   │   │       │   ├── ActiveMicrophoneChip.tsx
    │           │   │   │   │   │       │   ├── DetailedStatus.tsx
    │           │   │   │   │   │       │   └── utilts.ts
    │           │   │   │   │   │       ├── TroubleshootMicrophone.tsx
    │           │   │   │   │   │       ├── TroubleshootSpeakers.tsx
    │           │   │   │   │   │       └── utils.ts
    │           │   │   │   │   ├── conference-layout-context.ts
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   └── types.ts
    │           │   │   │   ├── create-conference
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── ConferenceControls.tsx
    │           │   │   │   │   │   ├── ConferenceCreatedView.tsx
    │           │   │   │   │   │   ├── CreateConferenceDialog.tsx
    │           │   │   │   │   │   ├── CreateConferenceFormSkeleton.tsx
    │           │   │   │   │   │   ├── CreateConferenceForm.tsx
    │           │   │   │   │   │   ├── PermissionList.tsx
    │           │   │   │   │   │   ├── SceneLayoutSelect.tsx
    │           │   │   │   │   │   ├── TabCommon.tsx
    │           │   │   │   │   │   ├── TabModerators.tsx
    │           │   │   │   │   │   └── TabPermissions.tsx
    │           │   │   │   │   ├── form.ts
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   └── types.ts
    │           │   │   │   ├── diagnostics
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── DiagnosticsView.tsx
    │           │   │   │   │   │   └── DiagnosticsWindow.tsx
    │           │   │   │   │   └── reducer.ts
    │           │   │   │   ├── equipment
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── AvailableEquipmentTable.tsx
    │           │   │   │   │   │   ├── CommandHistory.tsx
    │           │   │   │   │   │   ├── Equipment.tsx
    │           │   │   │   │   │   └── RequestPermissions.tsx
    │           │   │   │   │   ├── reducer.tsx
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── types.ts
    │           │   │   │   │   └── ua-utils.ts
    │           │   │   │   ├── media
    │           │   │   │   │   ├── AudioManager.ts
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── MediaControls.tsx
    │           │   │   │   │   │   ├── MediaFab.tsx
    │           │   │   │   │   │   ├── ParticipantMicManager.tsx
    │           │   │   │   │   │   └── UserInteractionListener.tsx
    │           │   │   │   │   ├── media-controls-context.ts
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   ├── types.ts
    │           │   │   │   │   └── useDeviceManagement.ts
    │           │   │   │   ├── poll
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── CurrentPollsBar.tsx
    │           │   │   │   │   │   ├── OpenPollDialogForm.tsx
    │           │   │   │   │   │   ├── OpenPollDialog.tsx
    │           │   │   │   │   │   ├── PollCardResultsPopup.tsx
    │           │   │   │   │   │   ├── PollCardResultSummary.tsx
    │           │   │   │   │   │   ├── PollCardSubmitButton.tsx
    │           │   │   │   │   │   ├── PollCard.tsx
    │           │   │   │   │   │   ├── PollContextMenu.tsx
    │           │   │   │   │   │   └── PollResultsView.tsx
    │           │   │   │   │   ├── poll-presets.ts
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   ├── types
    │           │   │   │   │   │   ├── multiple-choice
    │           │   │   │   │   │   │   ├── index.ts
    │           │   │   │   │   │   │   ├── MultipleChoiceAnswerForm.tsx
    │           │   │   │   │   │   │   └── MultipleChoiceInstructionForm.tsx
    │           │   │   │   │   │   ├── NivoTooltip.tsx
    │           │   │   │   │   │   ├── numeric
    │           │   │   │   │   │   │   ├── index.ts
    │           │   │   │   │   │   │   ├── NumericAnswerForm.tsx
    │           │   │   │   │   │   │   ├── NumericInstructionForm.tsx
    │           │   │   │   │   │   │   └── NumericPollResults.tsx
    │           │   │   │   │   │   ├── register.ts
    │           │   │   │   │   │   ├── single-choice
    │           │   │   │   │   │   │   ├── index.ts
    │           │   │   │   │   │   │   ├── SelectionPollResults.tsx
    │           │   │   │   │   │   │   ├── SingleChoiceAnswerForm.tsx
    │           │   │   │   │   │   │   └── SingleChoiceInstructionForm.tsx
    │           │   │   │   │   │   ├── tag-cloud
    │           │   │   │   │   │   │   ├── index.ts
    │           │   │   │   │   │   │   ├── TagCloudAnswerForm.tsx
    │           │   │   │   │   │   │   ├── TagCloudForm.tsx
    │           │   │   │   │   │   │   └── TagCloudResults.tsx
    │           │   │   │   │   │   └── types.ts
    │           │   │   │   │   └── types.ts
    │           │   │   │   ├── rooms
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── RoomHeader.tsx
    │           │   │   │   │   │   └── RoomsList.tsx
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   └── types.ts
    │           │   │   │   ├── scenes
    │           │   │   │   │   ├── allow-overwrite-hoc.tsx
    │           │   │   │   │   ├── calculations.ts
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── ActiveChipsLayout.tsx
    │           │   │   │   │   │   ├── ActiveParticipantsChips.tsx
    │           │   │   │   │   │   ├── activeSpeaker
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   └── RenderActiveSpeaker.tsx
    │           │   │   │   │   │   ├── autonomous
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   └── RenderAutonomous.tsx
    │           │   │   │   │   │   ├── AutoSceneLayout.tsx
    │           │   │   │   │   │   ├── breakoutRoom
    │           │   │   │   │   │   │   ├── BreakoutRoomListItem.tsx
    │           │   │   │   │   │   │   ├── BreakoutRoomsPopper.tsx
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   ├── OpenBreakoutRoomsItem.tsx
    │           │   │   │   │   │   │   └── RenderBreakoutRoom.tsx
    │           │   │   │   │   │   ├── grid
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   ├── ParticipantsGrid.tsx
    │           │   │   │   │   │   │   └── RenderGrid.tsx
    │           │   │   │   │   │   ├── ParticipantChips.tsx
    │           │   │   │   │   │   ├── ParticipantInfoChip.tsx
    │           │   │   │   │   │   ├── ParticipantTileLabel.tsx
    │           │   │   │   │   │   ├── ParticipantTile.tsx
    │           │   │   │   │   │   ├── poll
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   ├── PollActionItem.tsx
    │           │   │   │   │   │   │   ├── PollListItem.tsx
    │           │   │   │   │   │   │   ├── PollOptionsPopper.tsx
    │           │   │   │   │   │   │   └── RenderPollScene.tsx
    │           │   │   │   │   │   ├── presenter
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   └── RenderPresenter.tsx
    │           │   │   │   │   │   ├── SceneLayout.tsx
    │           │   │   │   │   │   ├── SceneListItem.tsx
    │           │   │   │   │   │   ├── SceneListItemWithPopper.tsx
    │           │   │   │   │   │   ├── SceneManagementModeSelectionDialog.tsx
    │           │   │   │   │   │   ├── SceneManagement.tsx
    │           │   │   │   │   │   ├── SceneSelector.tsx
    │           │   │   │   │   │   ├── SceneView.tsx
    │           │   │   │   │   │   ├── screenShare
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   └── ScreenShare.tsx
    │           │   │   │   │   │   ├── talkingStick
    │           │   │   │   │   │   │   ├── AddToListFab.tsx
    │           │   │   │   │   │   │   ├── FrameWithPassFab.tsx
    │           │   │   │   │   │   │   ├── index.tsx
    │           │   │   │   │   │   │   ├── ModeSceneListItem.tsx
    │           │   │   │   │   │   │   ├── PassStickFab.tsx
    │           │   │   │   │   │   │   ├── PassStickList.tsx
    │           │   │   │   │   │   │   ├── RenderTalkingStick.tsx
    │           │   │   │   │   │   │   ├── TalkingStickFrame.tsx
    │           │   │   │   │   │   │   ├── TalkingStickQueue.tsx
    │           │   │   │   │   │   │   ├── TalkingStickRace.tsx
    │           │   │   │   │   │   │   ├── TalkingStickScreen.tsx
    │           │   │   │   │   │   │   └── TalkingStickSpeakerPassingStick.tsx
    │           │   │   │   │   │   ├── TileFrameGridTop.tsx
    │           │   │   │   │   │   ├── TilesBarLayoutRow.tsx
    │           │   │   │   │   │   ├── TilesBarLayout.tsx
    │           │   │   │   │   │   └── whiteboard
    │           │   │   │   │   │       ├── index.ts
    │           │   │   │   │   │       ├── RenderWhiteboard.tsx
    │           │   │   │   │   │       ├── WhiteboardActionItem.tsx
    │           │   │   │   │   │       ├── WhiteboardListItem.tsx
    │           │   │   │   │   │       └── WhiteboardOptionsPopper.tsx
    │           │   │   │   │   ├── layout-child-size-context.ts
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── scene-presenter-registry.ts
    │           │   │   │   │   ├── selectors.ts
    │           │   │   │   │   ├── tile-frame-calculations.ts
    │           │   │   │   │   ├── types.ts
    │           │   │   │   │   └── useSomeParticipants.tsx
    │           │   │   │   ├── settings
    │           │   │   │   │   ├── components
    │           │   │   │   │   │   ├── About.tsx
    │           │   │   │   │   │   ├── AudioRecorderTest.tsx
    │           │   │   │   │   │   ├── AudioSettingsTest.tsx
    │           │   │   │   │   │   ├── AudioSettings.tsx
    │           │   │   │   │   │   ├── CommonSettings.tsx
    │           │   │   │   │   │   ├── DeviceSelector.tsx
    │           │   │   │   │   │   ├── EquipmentSettings.tsx
    │           │   │   │   │   │   ├── ScreenSettings.tsx
    │           │   │   │   │   │   ├── SettingsDialog.tsx
    │           │   │   │   │   │   ├── Settings.tsx
    │           │   │   │   │   │   ├── WebcamSettingsTest.tsx
    │           │   │   │   │   │   └── WebcamSettings.tsx
    │           │   │   │   │   ├── reducer.tsx
    │           │   │   │   │   ├── sagas.ts
    │           │   │   │   │   ├── selectors.tsx
    │           │   │   │   │   ├── thunks.tsx
    │           │   │   │   │   └── types.ts
    │           │   │   │   └── whiteboard
    │           │   │   │       ├── components
    │           │   │   │       │   ├── ClearWhiteboardButton.tsx
    │           │   │   │       │   ├── ColorIcon.tsx
    │           │   │   │       │   ├── FontSizeTool.tsx
    │           │   │   │       │   ├── LineWidthTool.tsx
    │           │   │   │       │   ├── ToolColorPicker.tsx
    │           │   │   │       │   ├── ToolIcon.tsx
    │           │   │   │       │   ├── ToolPopper.tsx
    │           │   │   │       │   ├── ToolsContainer.tsx
    │           │   │   │       │   └── Whiteboard.tsx
    │           │   │   │       ├── fabric-style.ts
    │           │   │   │       ├── fabric-utils.ts
    │           │   │   │       ├── live-update-handler.ts
    │           │   │   │       ├── path-cache.ts
    │           │   │   │       ├── path-compression.ts
    │           │   │   │       ├── reducer.ts
    │           │   │   │       ├── selectors.ts
    │           │   │   │       ├── tools
    │           │   │   │       │   ├── LineTool.ts
    │           │   │   │       │   ├── NoTool.ts
    │           │   │   │       │   ├── PanTool.ts
    │           │   │   │       │   ├── PencilTool.ts
    │           │   │   │       │   ├── SelectTool.ts
    │           │   │   │       │   └── TextTool.ts
    │           │   │   │       ├── types.ts
    │           │   │   │       ├── whiteboard-controller.ts
    │           │   │   │       └── whiteboard-tool.ts
    │           │   │   ├── hooks
    │           │   │   │   ├── useBottomScrollTrigger.ts
    │           │   │   │   ├── useConsumerMediaStream.ts
    │           │   │   │   ├── useMediaStreamMotionAudioLevel.ts
    │           │   │   │   ├── useMyParticipantId.ts
    │           │   │   │   ├── usePageTitle.ts
    │           │   │   │   ├── usePermission.ts
    │           │   │   │   ├── useSelectorFactory.ts
    │           │   │   │   ├── useStriveSound.ts
    │           │   │   │   ├── useThrottledResizeObserver.ts
    │           │   │   │   └── useUpdateDeviceLabelsAutomatically.ts
    │           │   │   ├── index.tsx
    │           │   │   ├── permissions.ts
    │           │   │   ├── react-app-env.d.ts
    │           │   │   ├── RedirectToConference.tsx
    │           │   │   ├── routes
    │           │   │   │   ├── AuthenticatedRoutes.tsx
    │           │   │   │   ├── ConferenceRoute.tsx
    │           │   │   │   ├── EquipmentRoute.tsx
    │           │   │   │   ├── MainRoute.tsx
    │           │   │   │   └── types.ts
    │           │   │   ├── services
    │           │   │   │   ├── api
    │           │   │   │   │   ├── conference-link.ts
    │           │   │   │   │   ├── conference.ts
    │           │   │   │   │   └── user.ts
    │           │   │   │   ├── i18n.ts
    │           │   │   │   └── types.d.ts
    │           │   │   ├── serviceWorker.ts
    │           │   │   ├── store
    │           │   │   │   ├── index.ts
    │           │   │   │   ├── notifier
    │           │   │   │   │   ├── actions.ts
    │           │   │   │   │   ├── create-middleware.ts
    │           │   │   │   │   └── utils.ts
    │           │   │   │   ├── root-reducer.ts
    │           │   │   │   ├── root-saga.ts
    │           │   │   │   ├── saga-utils.ts
    │           │   │   │   ├── signal
    │           │   │   │   │   ├── actions.ts
    │           │   │   │   │   ├── app-hub-connection.ts
    │           │   │   │   │   ├── create-middleware.ts
    │           │   │   │   │   ├── reducer.ts
    │           │   │   │   │   ├── synchronization
    │           │   │   │   │   │   ├── synchronized-object-ids.ts
    │           │   │   │   │   │   ├── synchronized-object-id.test.ts
    │           │   │   │   │   │   ├── synchronized-object-id.ts
    │           │   │   │   │   │   ├── synchronized-property.test.ts
    │           │   │   │   │   │   └── synchronized-property.ts
    │           │   │   │   │   ├── synchronized-object.test.ts
    │           │   │   │   │   ├── synchronized-object.ts
    │           │   │   │   │   ├── types.d.ts
    │           │   │   │   │   └── useSignalRHub.ts
    │           │   │   │   ├── webrtc
    │           │   │   │   │   ├── consumer-manager.ts
    │           │   │   │   │   ├── consumer-usage-control.ts
    │           │   │   │   │   ├── hooks
    │           │   │   │   │   │   ├── useConsumerStatusInfo.ts
    │           │   │   │   │   │   ├── useConsumer.ts
    │           │   │   │   │   │   ├── useMedia.ts
    │           │   │   │   │   │   ├── useMicrophone.ts
    │           │   │   │   │   │   ├── useScreen.ts
    │           │   │   │   │   │   ├── useWebcam.ts
    │           │   │   │   │   │   ├── useWebRtcStatus.ts
    │           │   │   │   │   │   └── useWebRtc.ts
    │           │   │   │   │   ├── sfu-client.ts
    │           │   │   │   │   ├── types.ts
    │           │   │   │   │   ├── utils.ts
    │           │   │   │   │   ├── WebRtcConnection.ts
    │           │   │   │   │   ├── WebRtcContext.ts
    │           │   │   │   │   └── WebRtcManager.ts
    │           │   │   │   └── WebStore.ts
    │           │   │   ├── types.ts
    │           │   │   ├── ui-errors.ts
    │           │   │   └── utils
    │           │   │       ├── array-utils.ts
    │           │   │       ├── browser-info.ts
    │           │   │       ├── color-utils.ts
    │           │   │       ├── error-result.ts
    │           │   │       ├── error-utils.ts
    │           │   │       ├── object-merge.test.ts
    │           │   │       ├── object-merge.ts
    │           │   │       ├── obj-utils.ts
    │           │   │       ├── promise-utils.ts
    │           │   │       ├── reat-hook-form-utils.ts
    │           │   │       ├── reselect.ts
    │           │   │       ├── signalr-utils.ts
    │           │   │       ├── string-utils.ts
    │           │   │       ├── token-helpers.ts
    │           │   │       └── to.tsx
    │           │   ├── tsconfig.json
    │           │   └── yarn.lock
    │           ├── Controllers
    │           │   └── ConfigController.cs
    │           ├── Dockerfile
    │           ├── language.props
    │           ├── Program.cs
    │           ├── Properties
    │           │   └── launchSettings.json
    │           ├── readme.md
    │           ├── Startup.cs
    │           ├── Utils
    │           │   └── JavaScriptResult.cs
    │           └── WebSPA.csproj
    ├── styleguide.md
    └── yarn.lock

380 directories, 1404 files

标签:

实例下载地址

Anapher:开源视频会议平台源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警