@3dsource/angular-unreal-module 0.0.94 → 0.0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"3dsource-angular-unreal-module.mjs","sources":["../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/CustomCloseCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/disconnect-reasons.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/SignalingMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/unreal-internal-signal-events.interface.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/AnswerHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ConfigHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/IceCandidateHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/InstanceReadyHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/ButtonsAndCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EControlSchemeType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EToClientMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/initial-config.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/InputOptions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/UnrealStatusMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/sub.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/afk.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/freeze-frame.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataFlowMonitor.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/DataFlowConstants.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/command-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/StreamerListHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/OfferHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/httpToWsUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/create-websocket.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ForceDisconnect.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/OrchestrationErrorHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/signalling.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/web-rtc-player.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/deepEqual.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/file-receiver.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/aggregator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/console-extensions.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/dev-mode.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/TouchEmulator.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-communicator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/input.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/regions-ping.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/afk.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/signalling.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/unreal-communicator.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/aggregator.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/freeze-frame.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/command-telemetry.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/stream-status-telemetry.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/console-extensions.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/file-receiver.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/input.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/ReceivedMimeTypes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/file-handler.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/analytics.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/fps-monitor.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.providers.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-error-modal/unreal-error-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-error-modal/unreal-error-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/InstanceReservedHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/PingHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/PlayerCountHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/SSInfoHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnCloseHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnErrorHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnMessageHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OpenHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/keep-max-until-reset.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/CommandObserver.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataDecoder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/EventWrapper.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/dispatchResize.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/error-codes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/float-to-smooth-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-image-from-video-stream.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/GetNextUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/KalmanFilter1D.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/LatencyTimings.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/mapQpToQuality.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/remove-exile-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resetAfk.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resize-observer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/VideoRecorder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/pipes/safe-html.pipe.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/image-loading-src/image-loading-src.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/image-loading-src/image-loading-src.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/stat-graph/stat-graph.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/stat-graph/stat-graph.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/resume-stream-button/resume-stream-button.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/resume-stream-button/resume-stream-button.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/intro-src/intro-src.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/intro-src/intro-src.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/webrtc-error-modal/webrtc-error-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/webrtc-error-modal/webrtc-error-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.html","../../../../projects/3dsource/angular-unreal-module/src/3dsource-angular-unreal-module.ts"],"sourcesContent":["export const WSCloseCode_NORMAL_CLOSURE = 3000;\nexport const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;\nexport const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;\nexport const WSCloseCode_FORCE_CIRRUS_CLOSE = 3003;\n\nexport const WSCloseCode_UNKNOWN = 1000;\n\nexport const WSCloseCode_CIRRUS_PLAYER_DISCONNECTED = 1001;\nexport const WSCloseCode_CIRRUS_ABNORMAL_CLOSURE = 1006;\nexport const WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR = 1013;\nexport const WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER = 1011;\n\nexport const WSCloseCodes = [\n WSCloseCode_NORMAL_CLOSURE,\n WSCloseCode_NORMAL_AFK_TIMEOUT,\n WSCloseCode_NORMAL_MANUAL_DISCONNECT,\n WSCloseCode_FORCE_CIRRUS_CLOSE,\n WSCloseCode_UNKNOWN,\n WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n] as const;\n\nexport type WSCloseCodesValues = (typeof WSCloseCodes)[number];\n","export const DisconnectReason = {\n Afk: 'Afk',\n None: 'None',\n Destroy: 'Destroy',\n DataChannelClosed: 'DataChannelClosed',\n DataChannelTimeout: 'DataChannelTimeout',\n WebRTCError: 'WebRTCError',\n WebSocketError: 'WebSocketError',\n WebSocketClose: 'WebSocketClose',\n DropConnection: 'DropConnection',\n OrchestrationPlayerDisconnected: 'OrchestrationPlayerDisconnected',\n OrchestrationStreamerDisconnected: 'OrchestrationStreamerDisconnected',\n IceConnectionFailed: 'IceConnectionFailed',\n ReconnectFailed: 'ReconnectFailed',\n} as const;\n\nexport type DisconnectReasonType =\n (typeof DisconnectReason)[keyof typeof DisconnectReason];\n\nexport interface ConnectionError {\n reason: DisconnectReasonType;\n message: string;\n}\n","/*\nexport interface RequestReservation extends InstanceMessageBase {\n type: 'requestReservation';\n}\n*/\n\nimport type { SignalingData } from './SignalingData';\n\nexport const OrchestrationMessageTypes = {\n ping: 'ping',\n error: 'error',\n offer: 'offer',\n answer: 'answer',\n ssInfo: 'ssInfo',\n config: 'config',\n playerCount: 'playerCount',\n iceCandidate: 'iceCandidate',\n streamerList: 'streamerList',\n requestStream: 'requestStream',\n listStreamers: 'listStreamers',\n instanceReady: 'instanceReady',\n p2pEstablished: 'p2pEstablished',\n instanceReserved: 'instanceReserved',\n playerDisconnected: 'playerDisconnected',\n streamPreparedForUserInteraction: 'streamPreparedForUserInteraction',\n streamerDisconnected: 'streamerDisconnected',\n interruptClientStream: 'interruptClientStream',\n} as const;\n\nexport interface InstanceReady extends InstanceMessageBase {\n type: 'instanceReady';\n}\n\nexport interface InstanceReserved extends InstanceMessageBase {\n type: 'instanceReserved';\n}\n\nexport interface OrchestrationErrorMessage {\n type: 'error';\n payload: { code: number; message: string };\n}\n\ninterface InstanceMessageBase extends MessageBase {\n correlationId: string;\n payload: {\n instanceId: string;\n streamRequestId: string;\n eta: number;\n };\n}\n\nexport interface MessageBase {\n type: OrchestrationMessageType;\n}\n\nexport interface SSInfo extends MessageBase {\n type: 'ssInfo';\n message: string;\n data: SignalingData;\n}\n\nexport interface PlayerCountMessage extends MessageBase {\n type: 'playerCount';\n playerCount: number;\n}\nexport interface StreamerListMessage extends MessageBase {\n type: 'streamerList';\n ids: string[];\n}\n\nexport interface ConfigMessage extends MessageBase, UnknownFields {\n type: 'config';\n peerConnectionOptions: RTCConfiguration;\n}\n\nexport interface CandidateMessage extends MessageBase {\n type: 'iceCandidate';\n candidate: RTCIceCandidate;\n}\n\nexport interface PingMessage extends MessageBase {\n type: 'ping';\n playerId: string;\n appConnectionCounter: number;\n}\n\nexport type UnknownFields = Record<string, unknown>;\n\nexport interface InterruptClientStream extends MessageBase {\n type: 'interruptClientStream';\n correlationId: string;\n payload: {\n environmentId: string;\n };\n}\n\nexport interface ForceClientDisconnect extends MessageBase {\n type: 'streamerDisconnected' | 'playerDisconnected';\n connectionId: string;\n}\n\nexport interface ListStreamersMessage extends MessageBase {\n type: 'listStreamers';\n correlationId: string;\n}\n\nexport interface P2PEstablishedMessage extends MessageBase {\n type: 'p2pEstablished';\n source: string;\n sessionId: string;\n}\n\nexport interface streamPreparedForUserInteractionMessage extends MessageBase {\n type: 'streamPreparedForUserInteraction';\n correlationId: string;\n}\n\nexport interface RequestStream extends MessageBase {\n type: 'requestStream';\n correlationId: string;\n payload: {\n environmentId: string;\n region?: string;\n /**\n * The context field is used for plugins of the external\n * applications for collecting additional statistics, etc.\n */\n context: StreamRequestContext;\n };\n}\n\ninterface MetaboxBasicConfiguratorContext {\n id: 'metaboxBasicConfigurator';\n data: {\n configuratorId: string; //uuid here;\n };\n}\n\ninterface MetaboxModularConfiguratorContext {\n id: 'metaboxModularConfigurator';\n data: {\n configuratorId: string; //uuid here;\n };\n}\n\ninterface MetaboxProductContext {\n id: 'metaboxProduct';\n data: {\n productId: string; //uuid here;\n };\n}\n\ninterface MetaboxEnvironmentContext {\n id: 'metaboxEnvironment';\n data: {\n environmentId: string; //uuid here;\n };\n}\ninterface MetaboxStudioContext {\n id: 'metaboxStudio';\n data: {\n userId: string; //uuid here;\n workspaceId: string; //uuid here;\n };\n}\ninterface CustomApplicationContext {\n id: 'customApplication';\n data: {\n clientId: string;\n applicationId: string;\n };\n}\n\nexport type StreamRequestContext =\n | MetaboxStudioContext\n | MetaboxProductContext\n | CustomApplicationContext\n | MetaboxEnvironmentContext\n | MetaboxBasicConfiguratorContext\n | MetaboxModularConfiguratorContext;\n\nexport interface SignalingMessageMap {\n [OrchestrationMessageTypes.ping]: PingMessage;\n [OrchestrationMessageTypes.offer]: RTCSessionDescriptionInit;\n [OrchestrationMessageTypes.error]: OrchestrationErrorMessage;\n [OrchestrationMessageTypes.ssInfo]: SSInfo;\n [OrchestrationMessageTypes.config]: ConfigMessage;\n [OrchestrationMessageTypes.answer]: RTCSessionDescriptionInit;\n [OrchestrationMessageTypes.playerCount]: PlayerCountMessage;\n [OrchestrationMessageTypes.iceCandidate]: CandidateMessage;\n [OrchestrationMessageTypes.streamerList]: StreamerListMessage;\n [OrchestrationMessageTypes.instanceReady]: InstanceReady;\n [OrchestrationMessageTypes.requestStream]: RequestStream;\n [OrchestrationMessageTypes.listStreamers]: ListStreamersMessage;\n [OrchestrationMessageTypes.p2pEstablished]: P2PEstablishedMessage;\n [OrchestrationMessageTypes.instanceReserved]: InstanceReserved;\n [OrchestrationMessageTypes.playerDisconnected]: ForceClientDisconnect;\n [OrchestrationMessageTypes.streamPreparedForUserInteraction]: streamPreparedForUserInteractionMessage;\n [OrchestrationMessageTypes.streamerDisconnected]: ForceClientDisconnect;\n [OrchestrationMessageTypes.interruptClientStream]: InterruptClientStream;\n}\n\nexport type OrchestrationMessageType = keyof SignalingMessageMap;\n\n// New strict outbound union type (only valid signaling messages allowed)\nexport type AnySignalingMessage =\n | SignalingMessageMap[OrchestrationMessageType]\n | string;\n\nexport type SignalingMessageHandler<T extends keyof SignalingMessageMap> = (\n msg: SignalingMessageMap[T],\n) => void;\n\nexport interface PollingOrchestrationMessage {\n mm_message?: string;\n signallingServer?: string;\n error?: string;\n info?: {\n age: number | null;\n left: number | null;\n percent: number | null;\n total: number | null;\n };\n}\n","import type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport type { Quality } from './quality.interface';\nimport type { DataFlowCheckResult } from '../helpers';\n\nexport const UnrealInternalSignalEvents = {\n OnVideoInitialized: 'OnVideoInitialized',\n RestAfkTimer: 'RestAfkTimer',\n FreezeFrameStart: 'FreezeFrameStart',\n UnrealCallback: 'UnrealCallback',\n ClickableOverlay: 'ClickableOverlay',\n VideoPlayClick: 'VideoPlayClick',\n ShowPlayButton: 'ShowPlayButton',\n ForceResizeViewport: 'ForceResizeViewport',\n VideoAdaptedToContainer: 'VideoAdaptedToContainer',\n TelemetryStart: 'TelemetryStart',\n TelemetryStop: 'TelemetryStop',\n TelemetryReset: 'TelemetryReset',\n} as const;\n\nexport interface SignalDescriptor {\n [UnrealInternalSignalEvents.UnrealCallback]: {\n json: UnrealCallBackJson;\n };\n [UnrealInternalSignalEvents.ClickableOverlay]: {\n message: string;\n className: string;\n isActivityDetected: boolean;\n onOverlayClick: () => void;\n } | void;\n [UnrealInternalSignalEvents.VideoPlayClick]: {\n text: string;\n };\n [UnrealInternalSignalEvents.ForceResizeViewport]: void;\n [UnrealInternalSignalEvents.OnVideoInitialized]: HTMLVideoElement;\n [UnrealInternalSignalEvents.VideoAdaptedToContainer]: void;\n [UnrealInternalSignalEvents.ShowPlayButton]: {\n text: string;\n callback: () => boolean;\n };\n [UnrealInternalSignalEvents.RestAfkTimer]: void;\n [UnrealInternalSignalEvents.FreezeFrameStart]: void;\n [UnrealInternalSignalEvents.TelemetryReset]: void;\n [UnrealInternalSignalEvents.TelemetryStart]: { externalId: string };\n [UnrealInternalSignalEvents.TelemetryStop]: {\n externalId: string;\n payload?: { multi?: boolean };\n };\n\n [key: string]: any;\n}\n\nexport type UnrealCallBackJson =\n | MetaBoxCommandPacket\n | WrappedMetaBoxCommandPacket;\n\nexport interface WrappedMetaBoxCommandPacket {\n commandCallback: MetaBoxCommandPacket;\n}\n\nexport interface IAggregatedStat {\n quality: Quality;\n aggregatedStats: InboundVideoStats;\n}\n\nexport interface InboundVideoStats extends RTCInboundRtpStreamStats {\n VideoEncoderQP: number;\n runTime: number;\n pixelRatio: number;\n bytesReceivedStart: number;\n framesDecodedStart: number;\n timestampStart: number;\n videoCodec: string;\n avgBitrate: number;\n avgFrameRate: number;\n selectedPair: {\n local: { type: string; url: string };\n remote: { type: string; url: string };\n } | null;\n currentRoundTripTime: number;\n codecs: Record<string, string>;\n receiveToCompositeMs: number;\n bitrate: number;\n kalmanBitrate: number;\n bitrateDrop: number;\n dataFlowCheckResult: DataFlowCheckResult;\n dataFlowBitrate: DataFlowCheckResult;\n}\n\nexport interface AwsInstance {\n /**\n * WebSocket URL for connecting to the Cirrus (polling mode) or Orchestration (direct mode).\n */\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n\n /**\n * Unique identifier for the streaming request.\n * Coming with new orchestration message \"instanceReserved\".\n */\n streamRequestId?: string;\n\n /**\n * Estimated time of arrival (in seconds) for the instance to be ready.\n * Coming with new orchestration message \"instanceReserved\".\n */\n eta?: number;\n\n /**\n * Progress of completion for the instance launch (0-1).\n * Based on ETA time comes from backend with new orchestration.\n * If eta is not provided, this value will be undefined.\n */\n progressComplete?: number;\n\n message?: string;\n}\n","import type { SignallingService } from '../../services';\n\nexport function AnswerHandler(\n this: SignallingService,\n msg: RTCSessionDescriptionInit,\n) {\n this.onWebRtcAnswer$.next(msg);\n}\n","import type { SignallingService } from '../../services';\nimport type { ConfigMessage } from '../../interfaces';\n\nexport function ConfigHandler(this: SignallingService, msg: ConfigMessage) {\n this.onConfig$.next(msg);\n}\n","import type { SignallingService } from '../../services';\n\nexport function IceCandidateHandler(\n this: SignallingService,\n msg: { candidate: RTCIceCandidate },\n) {\n this.onWebRtcIce$.next(msg.candidate);\n}\n","import { OrchestrationMessageTypes } from '../../interfaces';\nimport type { SignallingService } from '../../services';\n\nexport function InstanceReadyHandler(this: SignallingService) {\n this.send({\n type: OrchestrationMessageTypes.listStreamers,\n correlationId: this.correlationId,\n });\n}\n","import { createAction, props } from '@ngrx/store';\nimport type {\n DisconnectReasonType,\n LBMStats,\n SignalingData,\n StreamConfig,\n StreamRequestContext,\n} from '../interfaces';\n\nconst scoped = (templateString: TemplateStringsArray) =>\n `[UNREAL] ${templateString[0]}`;\nexport const trackMixpanelEvent = createAction(\n scoped`track mixpanel event`,\n props<{ event: string; data?: unknown }>(),\n);\nexport const changeLowBandwidth = createAction(\n scoped`change low bandwidth`,\n props<{\n lowBandwidth: boolean;\n stats?: LBMStats;\n }>(),\n);\nexport const setMaxFps = createAction(\n scoped`change fps`,\n props<{ maxFps: number }>(),\n);\nexport const destroyRemoteConnections = createAction(\n scoped`destroyRemoteConnections`,\n props<{ reason: DisconnectReasonType }>(),\n);\nexport const destroyUnrealScene = createAction(scoped`destroyUnrealScene`);\nexport const setCirrusConnected = createAction(scoped`cirrusConnected`);\nexport const setCirrusDisconnected = createAction(scoped`cirrusDisconnected`);\nexport const changeStatusMainVideoOnScene = createAction(\n scoped`change status main video on scene`,\n props<{ isVideoPlaying: boolean }>(),\n);\nexport const setAwsInstance = createAction(\n scoped`set aws instance`,\n props<{\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n }>(),\n);\nexport const setStatusMessage = createAction(\n scoped`set status message`,\n props<{ statusMessage: string | null }>(),\n);\nexport const setStatusPercentSignallingServer = createAction(\n scoped`change status percent signalling server`,\n props<{ percent: number | null }>(),\n);\nexport const setFreezeFrame = createAction(\n scoped`set freeze frame`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setStreamClientCompanyId = createAction(\n scoped`set stream client company id`,\n props<{ id: string }>(),\n);\nexport const setStreamViewId = createAction(\n scoped`set stream view id`,\n props<{ id: string }>(),\n);\nexport const setIntroImageSrc = createAction(\n scoped`set intro image src`,\n props<{ src: string }>(),\n);\n\nexport const setLoadingImageSrc = createAction(\n scoped`set loading image src`,\n props<{ src: string }>(),\n);\nexport const setIntroVideoSrc = createAction(\n scoped`set intro video src`,\n props<{ src: string }>(),\n);\nexport const resetIntroSrc = createAction(scoped`reset intro src`);\nexport const setFreezeFrameFromVideo = createAction(\n scoped`set freeze frame from video`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setEstablishingConnection = createAction(\n scoped`set establishing connection`,\n props<{ value: boolean }>(),\n);\n/**\n * @deprecated Use `dataChannelReady` instead. Currently, this action is not working.\n */\nexport const setDataChannelConnected = createAction(\n scoped`set data channel connected`,\n props<{ statusMessage: string }>(),\n);\nexport const dataChannelConnected = createAction(\n scoped`data channel connected`,\n props<{ statusMessage: string }>(),\n);\nexport const dataChannelReady = createAction(scoped`dataChannelReady`);\nexport const setConfig = createAction(\n scoped`set config`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const disconnectStream = createAction(\n scoped`disconnectStream`,\n props<{\n reason: DisconnectReasonType;\n message: string;\n }>(),\n);\nexport const dropConnection = createAction(scoped`dropConnection`);\nexport const setViewportReady = createAction(scoped`set viewport ready`);\nexport const setViewportNotReady = createAction(scoped`set viewport not ready`);\nexport const changeStreamResolutionAction = createAction(\n scoped`change stream resolution`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const changeStreamResolutionSuccessAction = createAction(\n scoped`change stream resolution success action`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const setSignalingName = createAction(\n scoped`set aws instanceName`,\n props<{ instanceName: string }>(),\n);\nexport const setOrchestrationParameters = createAction(\n scoped`set orchestration parameters`,\n props<{ instanceName: string; streamRequestId: string; eta: number }>(),\n);\nexport const setOrchestrationMessage = createAction(\n scoped`set orchestration message`,\n props<{ message: string }>(),\n);\nexport const setOrchestrationProgress = createAction(\n scoped`set orchestration progress`,\n props<{ progressComplete: number }>(),\n);\nexport const setOrchestrationContext = createAction(\n scoped`set orchestration params`,\n props<{\n urls: string[];\n environmentId: string;\n streamRequestContext: StreamRequestContext;\n }>(),\n);\nexport const updateCirrusInfo = createAction(\n scoped`set unrealInfo`,\n props<{\n ssInfo: string;\n ssData: SignalingData;\n }>(),\n);\nexport const commandStarted = createAction(\n scoped`command started`,\n props<{ id: string; command: string }>(),\n);\nexport const commandCompleted = createAction(\n scoped`command completed`,\n props<{ id: string }>(),\n);\nexport const setLoopBackCommandIsCompleted = createAction(\n scoped`set loopBack command is completed`,\n);\nexport const setAfkTimerVisible = createAction(scoped`set afk timer visible`);\nexport const setAfkTimerHide = createAction(scoped`set afk timer hide`);\nexport const showUnrealErrorMessage = createAction(\n scoped`show unreal error message`,\n props<{ code: number | null; error?: string }>(),\n);\nexport const initSignalling = createAction(\n scoped`init signalling`,\n (\n data: { resetDisconnectionReason: boolean } = {\n resetDisconnectionReason: true,\n },\n ) => ({\n resetDisconnectionReason: data.resetDisconnectionReason,\n }),\n);\nexport const startStream = createAction(\n scoped`startStream`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const resetConfig = createAction(scoped`reset config`);\nexport const resetAfkAction = createAction(scoped`reset afk action`);\nexport const resetWarnTimeout = createAction(scoped`reset config warn timeout`);\nexport const abortEstablishingConnection = createAction(\n scoped`abortEstablishingConnection`,\n);\nexport const setUnrealPlaywrightConfig = createAction(\n scoped`set unreal playwright config`,\n);\nexport const saveAnalyticsEvent = createAction(\n scoped`save analytics event`,\n props<{ event: { name: string; params: Record<string, unknown> } }>(),\n);\n\n/** Action to trigger WebRTC peer reconnection (keeps signaling connection) */\nexport const reconnectPeer = createAction(\n scoped`reconnect peer`,\n props<{ attempt: number; maxAttempts: number; delay?: number }>(),\n);\n\n/** Action to reset the data channel state before reconnection */\nexport const resetDataChannelForReconnect = createAction(\n scoped`reset data channel for reconnect`,\n);\n\n/** Action dispatched when peer reconnection succeeds */\nexport const reconnectPeerSuccess = createAction(\n scoped`reconnect peer success`,\n);\n\n/** Action dispatched when all peer reconnection attempts are exhausted */\nexport const reconnectPeerFailed = createAction(\n scoped`reconnect peer failed`,\n props<{ reason: string }>(),\n);\n\n/** Action dispatched when ICE connection state changes to failed/disconnected */\nexport const iceConnectionFailed = createAction(\n scoped`ice connection failed`,\n props<{ state: RTCIceConnectionState }>(),\n);\n","export const SpecialKeyCodes = {\n BackSpace: 8,\n Shift: 16,\n Control: 17,\n Alt: 18,\n RightShift: 253,\n RightControl: 254,\n RightAlt: 255,\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\nexport const MouseButton = {\n MainButton: 0, // Left button.\n AuxiliaryButton: 1, // Wheel button.\n SecondaryButton: 2, // Right button.\n FourthButton: 3, // Browser Back button.\n FifthButton: 4, // Browser Forward button.\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\nexport const MouseButtonsMask = {\n PrimaryButton: 1, // Left button.\n SecondaryButton: 2, // Right button.\n AuxiliaryButton: 4, // Wheel button.\n FourthButton: 8, // Browser Back button.\n FifthButton: 16, // Browser Forward button.\n};\n","export const EControlSchemeType = {\n // A mouse can lock inside the WebRTC player so the user can simply move the\n // mouse to control the orientation of the camera. The user presses the\n // Escape key to unlock the mouse.\n LockedMouse: 0,\n\n // A mouse can hover over the WebRTC player so the user needs to click and\n // drag to control the orientation of the camera.\n HoveringMouse: 1,\n Default: 2,\n} as const;\n\nexport type EControlSchemeTypeValues =\n (typeof EControlSchemeType)[keyof typeof EControlSchemeType];\n","// Must be kept in sync with PixelStreamingProtocol::EToUE4Msg C++ descriptors.\n\nexport const EMessageType = {\n /*\n * Control Messages. Range = 0..49.\n */\n IFrameRequest: 0,\n RequestQualityControl: 1,\n MaxFpsRequest: 2,\n AverageBitrateRequest: 3,\n StartStreaming: 4,\n StopStreaming: 5,\n LatencyTest: 6,\n RequestInitialSettings: 7,\n\n /*\n * Input Messages. Range = 50..89.\n */\n\n // Generic Input Messages. Range = 50..59.\n UIInteraction: 50,\n Command: 51,\n\n // Keyboard Input Message. Range = 60..69.\n KeyDown: 60,\n KeyUp: 61,\n KeyPress: 62,\n\n // Mouse Input Messages. Range = 70..79.\n MouseEnter: 70,\n MouseLeave: 71,\n MouseDown: 72,\n MouseUp: 73,\n MouseMove: 74,\n MouseWheel: 75,\n\n // Touch Input Messages. Range = 80..89.\n TouchStart: 80,\n TouchEnd: 81,\n TouchMove: 82,\n} as const;\n\nexport type EMessageTypeValues =\n (typeof EMessageType)[keyof typeof EMessageType];\n","export const EToClientMessageType = {\n QualityControlOwnership: 0,\n Response: 1,\n Command: 2,\n FreezeFrame: 3,\n UnfreezeFrame: 4,\n VideoEncoderAvgQP: 5,\n LatencyTest: 6,\n InitialSettings: 7,\n FileExtension: 8,\n FileMimeType: 9,\n FileContents: 10,\n TestEcho: 11,\n InputControlOwnership: 12,\n GamepadResponse: 13,\n Protocol: 255,\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport type { UnrealInitialConfig } from '../interfaces';\n\nexport const UNREAL_CONFIG = new InjectionToken<UnrealInitialConfig>(\n 'Unreal Initial Configuration',\n);\n","import { EControlSchemeType } from './EControlSchemeType';\nimport type { InputProps } from '../interfaces';\n\nexport const InputOptions: InputProps = {\n controlScheme: EControlSchemeType.Default,\n suppressBrowserKeys: true,\n fakeMouseWithTouches: false,\n};\n","export const UnrealStatusMessage = {\n CONNECTING_TO_SESSION: 'Connecting to session.',\n STARTING_YOUR_SESSION: 'Starting your session',\n} as const;\n","export const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;\nexport const SAME_SIZE_THRESHOLD = 1.01;\nexport const MINIMAL_FPS = 6;\nexport const STREAMING_VIDEO_ID = 'streamingVideo';\nexport const CONSOLE_COMMAND_ENABLE_MESSAGES = 'EnableAllScreenMessages';\nexport const CONSOLE_COMMAND_DISABLE_MESSAGES = 'DisableAllScreenMessages';\nexport const CONSOLE_COMMAND_PIXEL_QUALITY =\n 'PixelStreaming.FreezeFrameQuality 95';\nexport const FULL_HD_WIDTH = 1920;\nexport const FULL_HD_HEIGHT = 1080;\nexport const WS_TIMEOUT = 2000;\nexport const POLLING_TIME = 4000;\nexport const WS_OPEN_STATE = 1;\nexport const DEFAULT_AFK_TIMEOUT_PERIOD = 15;\nexport const DEFAULT_AFK_TIMEOUT = 120;\nexport const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000; //ms;\nexport const SIGNALLING_PERCENT_VALUE = 56;\nexport const SCREEN_LOCKER_CONTAINER_ID = '3dsource_start_screen';\n\n// Reconnection defaults\nexport const DEFAULT_RECONNECT_ENABLED = true;\nexport const DEFAULT_RECONNECT_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RECONNECT_DELAY_MS = 1000;\nexport const DEFAULT_RECONNECT_ON_ICE_FAILURE = true;\nexport const DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE = true;\n","import { share, skip } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { unrealFeature } from '../store';\nimport { filter } from 'rxjs/operators';\nimport { Falsy } from '@3dsource/utils';\n\nexport class SubService {\n store = inject(Store);\n disconnect$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), share());\n}\n","import { Injectable } from '@angular/core';\nimport { distinctUntilChanged, filter, withLatestFrom } from 'rxjs/operators';\nimport {\n DEFAULT_AFK_TIMEOUT_PERIOD,\n EControlSchemeType,\n InputOptions,\n} from '../constants';\nimport { Truthy } from '@3dsource/utils';\nimport { SubService } from './sub.service';\nimport { DisconnectReason, UnrealInternalSignalEvents } from '../interfaces';\nimport {\n disconnectStream,\n selectWarnTimeout,\n setAfkTimerHide,\n setAfkTimerVisible,\n unrealFeature,\n} from '../store';\nimport { fromSignal, sendSignal } from '../helpers';\nimport { merge } from 'rxjs';\n\n@Injectable()\nexport class AFKService extends SubService {\n // Optionally detect if the user is not interacting (AFK) and disconnect them.\n private enabled = true; // Set to true to enable the AFK system.\n private readonly closeTimeout = DEFAULT_AFK_TIMEOUT_PERIOD; // The time after the warning when we disconnect the user.\n private active = false; // Whether the AFK system is currently looking for inactivity.\n private warnTimer!: ReturnType<typeof setTimeout>; // The timer which waits to show the inactivity warning overlay.\n private countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.\n private countdownTimer!: ReturnType<typeof setTimeout>; // The timer used to tick the seconds shown on the inactivity warning overlay.\n private selectWarnTimeout = this.store.selectSignal(selectWarnTimeout);\n private isViewportReady = this.store.selectSignal(\n unrealFeature.selectViewportReady,\n );\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n merge(\n this.store.select(selectWarnTimeout),\n fromSignal(UnrealInternalSignalEvents.RestAfkTimer),\n )\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(() => this.resetAfkWarningTimer());\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(distinctUntilChanged(), filter(Truthy))\n .subscribe(() => this.startAfkWarningTimer());\n this.disconnect$.subscribe(() => this.stop());\n }\n\n private hideOverlay() {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay);\n this.store.dispatch(setAfkTimerHide());\n }\n\n /**\n * Start a timer which when elapsed will warn the user they are inactive.\n */\n private startAfkWarningTimer() {\n this.active = this.enabled;\n this.resetAfkWarningTimer();\n }\n\n /**\n * If the user interacts, then reset the warning timer.\n */\n private resetAfkWarningTimer() {\n if (this.active) {\n this.clearTimers();\n this.warnTimer = setTimeout(() => {\n this.showAfkOverlay();\n }, this.selectWarnTimeout() * 1000);\n }\n }\n\n /**\n * Update the count-down spans number for the overlay\n * @param countdown the count down number to be inserted into the span for updating\n */\n private updateCountDown(countdown: number) {\n this.dispatchMessage(String(countdown));\n }\n\n /**\n * Update the text overlays inner text\n * @param message the update text to be inserted into the overlay\n */\n private dispatchMessage(message: string) {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay, {\n message,\n isActivityDetected: true,\n className: 'clickableState',\n onOverlayClick: () => this.reset(),\n });\n }\n\n private clearTimers() {\n clearInterval(this.countdownTimer);\n clearTimeout(this.warnTimer);\n }\n\n private stop() {\n this.clearTimers();\n this.hideOverlay();\n }\n\n private reset() {\n this.hideOverlay();\n clearInterval(this.countdownTimer);\n this.startAfkWarningTimer();\n }\n\n private showAfkOverlay() {\n if (!this.isViewportReady()) {\n return;\n }\n // Pause the timer while the user is looking at the inactivity warning overlay.\n this.active = false;\n this.countdown = this.closeTimeout;\n this.store.dispatch(setAfkTimerVisible());\n this.updateCountDown(this.countdown);\n\n if (InputOptions.controlScheme === EControlSchemeType.LockedMouse) {\n document.exitPointerLock();\n }\n\n this.countdownTimer = setInterval(() => {\n this.countdown--;\n if (this.countdown === 0) {\n // The user failed to click so disconnect them\n this.hideOverlay();\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.Afk,\n message: `AFK timeout:${this.selectWarnTimeout()} seconds, popup timeout:${this.closeTimeout} seconds`,\n }),\n );\n clearInterval(this.countdownTimer);\n } else {\n this.updateCountDown(this.countdown);\n }\n }, 1000);\n }\n}\n","import { filter } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { setFreezeFrame, unrealFeature } from '../store';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { sendSignal } from '../helpers';\n\n@Injectable()\nexport class FreezeFrameService extends SubService {\n receiving = false;\n\n private size = 0;\n private jpeg!: Uint8Array | undefined;\n private freezeFrameOverlay = new Image();\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.invalidate());\n }\n\n setData(view: Uint8Array) {\n view = view.slice(1 + 4);\n\n if (!this.jpeg) {\n return;\n }\n\n const jpeg = new Uint8Array(this.jpeg.length + view.length);\n jpeg.set(this.jpeg, 0);\n jpeg.set(view, this.jpeg.length);\n this.jpeg = jpeg;\n if (this.jpeg.length === this.size) {\n this.receiving = false;\n Logger.info(`FRAME: Received complete freeze frame ${this.size}`);\n this.showFreezeFrame();\n } else if (this.jpeg.length > this.size) {\n Logger.error(\n `FRAME: Received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`,\n );\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: 0 }));\n\n this.jpeg = undefined;\n this.receiving = false;\n } else {\n this.dispatchInProgress();\n }\n }\n\n private dispatchInProgress() {\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: null,\n progress: (this.jpeg?.length || 0) / this.size,\n }),\n );\n }\n\n start(view: Uint8Array) {\n this.size = new DataView(view.slice(1, 5).buffer).getInt32(0, true);\n this.jpeg = view.slice(1 + 4);\n if (this.jpeg.length < this.size) {\n this.dispatchInProgress();\n sendSignal(UnrealInternalSignalEvents.FreezeFrameStart);\n Logger.info(\n `FRAME: Received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = true;\n } else {\n Logger.info(\n `FRAME: Received complete freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = false;\n this.showFreezeFrame();\n }\n }\n\n invalidate() {\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: null }));\n this.jpeg = undefined;\n this.receiving = false;\n }\n\n private showFreezeFrame() {\n if (!this.jpeg) {\n return;\n }\n\n const base64 = btoa(\n this.jpeg?.reduce((data, byte) => data + String.fromCharCode(byte), ''),\n );\n this.freezeFrameOverlay.src = 'data:image/jpeg;base64,' + base64;\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: this.freezeFrameOverlay.src,\n progress: 1,\n }),\n );\n }\n}\n","import type { Quality } from '../interfaces';\nimport { calculateMedian, clampf } from '@3dsource/utils';\nimport type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport interface DataFlowCheckResult {\n isDropDetected: boolean;\n dropPercentage: number;\n activeMedian: number;\n quality: Quality;\n message: string;\n dataHistory: number[];\n config: {\n yellowFlagThresholdPercentage: number;\n redFlagThresholdPercentage: number;\n historyBufferLength: number;\n splitPoint: number;\n };\n}\n\nexport class DataFlowMonitor {\n protected dataHistory: number[] = [];\n\n /**\n * Initializes the DataFlowMonitor monitor.\n * @param yellowFlagThresholdPercentage - The percentage drop to trigger a YELLOW warning (default: 15%).\n * @param redFlagThresholdPercentage - The percentage drop to trigger a RED warning (default: 30%).\n * @param historyBufferLength - buffer length (default: 100).\n * @param splitPoint - The point at which to split the history buffer into two halves (default: 0.5).\n */\n constructor(\n protected yellowFlagThresholdPercentage = 15,\n protected redFlagThresholdPercentage = 30,\n protected historyBufferLength = 100,\n protected splitPoint = 0.5,\n ) {}\n\n reset() {\n this.dataHistory.length = 0;\n }\n\n config(data: FilterSettings) {\n this.reset();\n this.yellowFlagThresholdPercentage = data.yellowFlag;\n this.redFlagThresholdPercentage = data.redFlag;\n }\n\n /**\n * Adds a new bitrate measurement and checks for significant drops.\n * @param currentValue - The current bitrate in kbps.\n * @returns BitrateCheckResult indicating if a drop was detected.\n */\n addValue(currentValue: number): DataFlowCheckResult {\n if (isNaN(currentValue) || currentValue < 1) {\n return {} as DataFlowCheckResult;\n }\n const historyLength = this.dataHistory.length;\n\n if (historyLength > this.historyBufferLength) {\n this.dataHistory.shift();\n }\n this.dataHistory.push(currentValue);\n\n if (historyLength < this.historyBufferLength) {\n this.dataHistory.length = this.historyBufferLength;\n this.dataHistory.fill(currentValue, 0, this.historyBufferLength);\n }\n\n const splitIndex = Math.floor(historyLength * this.splitPoint);\n const firstHalf = this.dataHistory.slice(0, splitIndex);\n const secondHalf = this.dataHistory.slice(splitIndex);\n const firstHalfMedian = calculateMedian(firstHalf);\n const secondHalfMedian = calculateMedian(secondHalf);\n\n const dropPercentage = clampf(\n 0,\n 100,\n ((firstHalfMedian - secondHalfMedian) / firstHalfMedian) * 100,\n );\n\n const isRedFlag = dropPercentage >= this.redFlagThresholdPercentage;\n if (dropPercentage >= this.yellowFlagThresholdPercentage) {\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: true,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: isRedFlag ? 'red' : 'orange',\n message: `Significant flow drop detected: ${dropPercentage.toFixed(2)}% (from ${firstHalfMedian} to ${secondHalfMedian})`,\n };\n }\n\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: false,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: 'lime',\n message: 'Stable flow',\n };\n }\n}\n","import { DataFlowMonitor } from '../../helpers/DataFlowMonitor';\n\nexport interface FilterSettings {\n /**\n * Minimum number of kilobits per second to trigger low bandwidth\n */\n minimumBitrate: number;\n /**\n * Amount of a percentage drop to trigger a yellow warning\n */\n\n yellowFlag: number;\n\n /**\n * Amount of a percentage drop to trigger a red warning\n */\n redFlag: number;\n\n /**\n * Minimum number of frames per second to trigger low bandwidth\n */\n minimumFps: number;\n\n /**\n * Time to wait before checking if we can switch to low bandwidth\n */\n monitoringDelayTime: number;\n\n // initial guess in kbps\n initialBitrateEstimate: number;\n\n // initial error covariance\n initialErrorCovariance: number;\n\n // Q: how much we expect the bitrate to change between measurements\n processNoise: number;\n\n // R: variance of measurement noise\n measurementNoise: number;\n\n panelOpen: boolean;\n}\n\n/**\n * Default LBM Filter Parameters\n */\nexport const DefaultFilterModel: FilterSettings = {\n minimumBitrate: 1600,\n yellowFlag: 30,\n redFlag: 50,\n minimumFps: 5,\n monitoringDelayTime: 5000,\n initialBitrateEstimate: 1600,\n initialErrorCovariance: 1,\n processNoise: 3,\n measurementNoise: 500,\n panelOpen: false,\n} as const;\n\n/**\n * Global LBM Filter Parameters\n */\nexport const FilterModel = { ...DefaultFilterModel };\n\n/**\n * Bitrate Monitor Static Class\n */\nexport const BITRATE_MONITOR = new DataFlowMonitor(\n FilterModel.yellowFlag,\n FilterModel.redFlag,\n 20,\n);\n","import { from, fromEvent, interval, map, of, share, Subject, take } from 'rxjs';\nimport { SubService } from './sub.service';\nimport { Injectable } from '@angular/core';\nimport {\n type IAggregatedStat,\n type InboundVideoStats,\n UnrealInternalSignalEvents,\n} from '../interfaces';\nimport { catchError, filter, switchMap } from 'rxjs/operators';\nimport {\n dispatchResize,\n KalmanFilter1D,\n LatencyTimings,\n mapQpToQuality,\n sendSignal,\n} from '../helpers';\nimport { changeStatusMainVideoOnScene } from '../store';\nimport { STREAMING_VIDEO_ID } from '../constants';\nimport { Signal, tapLog, Truthy } from '@3dsource/utils';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class VideoService extends SubService {\n video: HTMLVideoElement | null = null;\n audio: HTMLAudioElement | null = null;\n\n private container: HTMLDivElement | null = null;\n private latencyTestTimings = new LatencyTimings();\n\n private videoTrack$ = new Subject<{\n stream: MediaStream;\n pcClient: RTCPeerConnection;\n } | null>();\n\n private VideoEncoderQP = 0;\n private aggregatedStats = {} as InboundVideoStats;\n private kalmanFilter1D = new KalmanFilter1D(\n FilterModel.initialBitrateEstimate,\n FilterModel.initialErrorCovariance,\n FilterModel.processNoise,\n FilterModel.measurementNoise,\n );\n\n /**\n * Aggregate video stats and emit it as videoStats$\n */\n videoStats$ = this.videoTrack$.pipe(\n // If videoTrack$ emits null, switch to EMPTY → the current interval is canceled.\n switchMap((track) =>\n track\n ? // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values\n interval(250).pipe(\n map(() => track.pcClient),\n switchMap((pcClient) => from(this.getStats(pcClient))),\n filter(Truthy),\n )\n : of(null),\n ),\n filter(Truthy),\n share(),\n );\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n Signal.on('setKalmanParams').subscribe((data) => {\n this.kalmanFilter1D.config(data);\n BITRATE_MONITOR.config(data);\n });\n }\n\n setContainer(container: HTMLDivElement | null = null) {\n this.container = container;\n }\n\n setLatencyTimings(latencyTimings: string) {\n this.latencyTestTimings.SetUETimings(latencyTimings);\n }\n\n setEncoder(data: any) {\n this.VideoEncoderQP = Number(new TextDecoder('utf-16').decode(data));\n }\n\n create() {\n this.disconnect$.pipe(take(1)).subscribe(() => this.destroy());\n this.destroy();\n this.createWebRtcVideo();\n this.createWebRtcAudio();\n }\n\n attachVideoStream(stream: MediaStream, pcClient: RTCPeerConnection) {\n if (this.video) {\n this.video.srcObject = stream;\n this.videoTrack$.next({ stream, pcClient });\n } else {\n console.error('Video element is not defined.');\n }\n }\n\n attachAudioStream(stream: MediaStream) {\n // do nothing the video has the same media stream as the audio track we have here (they are linked)\n if (this.video?.srcObject === stream) {\n return;\n }\n // the video element has some other media stream not associated with this audio track\n else if (\n this.audio &&\n this.video?.srcObject &&\n this.video?.srcObject !== stream\n ) {\n this.audio.srcObject = stream;\n this.playAudio(this.audio);\n }\n }\n\n play() {\n void this.safePlay(this.video);\n }\n\n async safePlay(video: HTMLVideoElement | null) {\n if (!video) {\n return;\n }\n\n try {\n await video.play();\n return;\n } catch (e: any) {\n if (e?.name !== 'NotAllowedError') throw e;\n\n // Try silent inline autoplay\n video.muted = true;\n video.setAttribute('playsinline', '');\n try {\n await video.play();\n return;\n } catch {\n /* fall through */\n }\n\n // Last resort: wait for the next real user gesture and play with/without sound\n const resume = async () => {\n try {\n // choose whether to unmute here\n // video.muted = false;\n await video.play();\n } catch {\n /* ignore, maybe another gesture needed */\n } finally {\n window.removeEventListener('pointerdown', resume, true);\n window.removeEventListener('keydown', resume, true);\n }\n };\n\n window.addEventListener('pointerdown', resume, {\n once: true,\n capture: true,\n });\n window.addEventListener('keydown', resume, { once: true, capture: true });\n }\n }\n\n private async getStats(\n pcClient: RTCPeerConnection | null,\n ): Promise<IAggregatedStat | null> {\n if (!pcClient || pcClient.connectionState === 'closed') {\n return null;\n }\n\n try {\n const stats = await pcClient.getStats(null);\n return this.generateAggregatedStatsFunction(stats);\n } catch (err) {\n // Handle InvalidStateError or any transient WebRTC errors gracefully\n if (err instanceof DOMException && err.name === 'InvalidStateError') {\n console.warn('Peer connection is closed or unusable, skipping stats.');\n return null;\n }\n throw err;\n }\n }\n\n private generateAggregatedStatsFunction(\n stats: RTCStatsReport,\n ): IAggregatedStat {\n const newStat: InboundVideoStats = {} as InboundVideoStats;\n\n // store each type of codec we can get stats on\n newStat.codecs = {};\n newStat.currentRoundTripTime = -1;\n\n stats.forEach((report) => {\n // Get the inbound-rtp for video\n if (report.type === 'inbound-rtp' && report.kind === 'video') {\n Object.assign(newStat, report);\n\n newStat.bytesReceivedStart =\n this.aggregatedStats && this.aggregatedStats.bytesReceivedStart\n ? this.aggregatedStats.bytesReceivedStart\n : report.bytesReceived;\n\n newStat.framesDecodedStart =\n this.aggregatedStats && this.aggregatedStats.framesDecodedStart\n ? this.aggregatedStats.framesDecodedStart\n : report.framesDecoded;\n\n newStat.timestampStart =\n this.aggregatedStats && this.aggregatedStats.timestampStart\n ? this.aggregatedStats.timestampStart\n : report.timestamp;\n\n if (this.aggregatedStats && this.aggregatedStats.timestamp) {\n // Get the mimetype of the video codec being used\n if (\n report.codecId &&\n this.aggregatedStats.codecs &&\n Object.hasOwn(this.aggregatedStats.codecs, report.codecId)\n ) {\n newStat.videoCodec = this.aggregatedStats.codecs[report.codecId];\n }\n\n if (this.aggregatedStats.bytesReceived) {\n // bitrate = bits received since last time / number of ms since last time\n // This is automatically in kbits (where k=1000) since time is in ms and stat we want is in seconds (so a '* 1000' then a '/ 1000' would negate each other)\n newStat.bitrate = Math.floor(\n (8 *\n (newStat.bytesReceived! - this.aggregatedStats.bytesReceived)) /\n (newStat.timestamp - this.aggregatedStats.timestamp),\n );\n }\n\n if (this.aggregatedStats.bytesReceivedStart) {\n newStat.avgBitrate = Math.floor(\n (8 *\n (newStat?.bytesReceived! -\n this.aggregatedStats.bytesReceivedStart)) /\n (newStat.timestamp - this.aggregatedStats.timestampStart),\n );\n }\n\n if (this.aggregatedStats.framesDecodedStart) {\n newStat.avgFrameRate = Math.floor(\n (newStat.framesDecoded! -\n this.aggregatedStats.framesDecodedStart) /\n ((newStat.timestamp - this.aggregatedStats.timestampStart) /\n 1000),\n );\n }\n }\n }\n\n if (\n report.type === 'candidate-pair' &&\n Object.hasOwn(report, 'currentRoundTripTime')\n ) {\n newStat.currentRoundTripTime = report.currentRoundTripTime ?? 0;\n }\n\n if (\n report.type === 'transport' &&\n Object.hasOwn(report, 'selectedCandidatePairId')\n ) {\n const selectedPair = (stats as any).get(report.selectedCandidatePairId);\n const local = (stats as any).get(selectedPair.localCandidateId);\n const remote = (stats as any).get(selectedPair.remoteCandidateId);\n newStat.selectedPair = {\n local: { type: local?.candidateType, url: local?.url },\n remote: { type: remote?.candidateType, url: remote?.url },\n };\n }\n\n // Store mimetype of each codec\n if (\n Object.hasOwn(newStat, 'codecs') &&\n report.type === 'codec' &&\n report.mimeType &&\n report.id\n ) {\n const codecId = report.id;\n newStat.codecs[codecId] = report.mimeType\n .replace('video/', '')\n .replace('audio/', '');\n }\n });\n\n newStat.pixelRatio = +window.devicePixelRatio.toFixed(2);\n if (this.aggregatedStats.receiveToCompositeMs) {\n newStat.receiveToCompositeMs = this.aggregatedStats.receiveToCompositeMs;\n this.latencyTestTimings.SetFrameDisplayDeltaTime(\n this.aggregatedStats.receiveToCompositeMs,\n );\n }\n\n // Calculate duration of run\n newStat.runTime = Math.floor(\n (newStat.timestamp - newStat.timestampStart) / 1000,\n );\n newStat.kalmanBitrate = Math.floor(\n this.kalmanFilter1D.update(\n newStat.bitrate || FilterModel.initialBitrateEstimate,\n ),\n );\n\n newStat.dataFlowCheckResult = BITRATE_MONITOR.addValue(\n newStat.kalmanBitrate,\n );\n\n newStat.bitrateDrop = Math.floor(\n newStat.dataFlowCheckResult.dropPercentage,\n );\n this.aggregatedStats = newStat;\n return this.onAggregatedStats(newStat);\n }\n\n private onAggregatedStats(aggregatedStats: InboundVideoStats) {\n return {\n quality: mapQpToQuality(this.VideoEncoderQP),\n\n aggregatedStats: {\n ...aggregatedStats,\n VideoEncoderQP: this.VideoEncoderQP,\n },\n };\n }\n\n private destroy() {\n this.video = null;\n this.audio = null;\n this.videoTrack$.next(null);\n\n while (this.container?.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: false }),\n );\n }\n\n private createWebRtcVideo() {\n dispatchResize();\n const video = document.createElement('video');\n video.id = STREAMING_VIDEO_ID;\n video.playsInline = true;\n video.muted = true;\n video.autoplay = true;\n video.preload = 'auto';\n video.disablePictureInPicture = true;\n\n this.video = video;\n this.container?.appendChild(this.video);\n\n this.video.addEventListener('play', () =>\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: true }),\n ),\n );\n\n fromEvent(this.video, 'loadedmetadata')\n .pipe(\n take(1),\n filter((data) => this.video === data.target),\n tapLog('VideoService loadedmetadata:'),\n )\n .subscribe(() => {\n if (this.video) {\n sendSignal(UnrealInternalSignalEvents.OnVideoInitialized, this.video);\n }\n });\n }\n\n private createWebRtcAudio() {\n const audio = new Audio();\n audio.id = 'streamingAudio';\n this.audio = audio;\n }\n\n private playAudio(audio: HTMLAudioElement) {\n from(audio.play())\n .pipe(\n catchError(() => fromEvent(document, 'click')),\n take(1),\n )\n .subscribe({\n next: () => audio.play(),\n error: () => ({}),\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { catchError, filter } from 'rxjs/operators';\nimport type { TelemetryType } from '../interfaces';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { of, take, timer } from 'rxjs';\nimport { fromSignal, sendSignal } from '../helpers';\nimport { generateUuid, Truthy } from '@3dsource/utils';\nimport { HttpClient } from '@angular/common/http';\nimport { UNREAL_CONFIG } from '../constants';\n\n@Injectable()\nexport class CommandTelemetryService {\n private readonly appId: string = 'metabox-telemetry';\n private commandsSent: Record<string, CommandToSend> = {};\n private exileTimeout = 60000;\n private pollingTime = 5000;\n private commandSequenceNumber = 0;\n\n /**\n * The time the telemetry service was started.\n * Initialized at a moment when connectToSignaling() was called.\n * @private\n */\n private startTime!: number;\n private lastTime!: number;\n private uuid!: string;\n private viewId!: string;\n private sessionId!: string;\n private userId!: string;\n private payloads: Payload[] = [];\n\n private readonly httpClient = inject(HttpClient);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG, {\n optional: true,\n });\n\n constructor() {\n this.init();\n }\n\n protected init() {\n if (!this.unrealInitialConfig?.commandTelemetryReceiver) {\n return;\n }\n\n this.reset();\n this.sessionId = sessionStorage.getItem(this.appId) || this.uuid;\n this.userId = localStorage.getItem(this.appId) || this.uuid;\n sessionStorage.setItem(this.appId, this.sessionId);\n localStorage.setItem(this.appId, this.userId);\n this.start();\n }\n\n private get timeNow() {\n return Date.now();\n }\n\n private get sessionTime() {\n return this.timeNow - this.startTime;\n }\n\n private get canSkipSending() {\n return !(this.timeNow - this.lastTime > this.pollingTime * 2);\n }\n\n decorate(funcToDecorate: IToBeDecorated) {\n this.listenCallbacks();\n return this.wrapper.bind(this, funcToDecorate);\n }\n\n protected start() {\n fromSignal(UnrealInternalSignalEvents.TelemetryStart).subscribe(\n ({ externalId }) => {\n this.trackStartCommand(`EXT-${externalId}`);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryStop).subscribe(\n ({ externalId, payload }) => {\n const trackingId = `EXT-${externalId}`;\n this.trackStopCommand(trackingId, undefined, payload?.multi, payload);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryReset).subscribe(() => {\n this.reset();\n });\n\n timer(0, this.pollingTime).subscribe(() => {\n this.send(this.payloads);\n });\n }\n\n private reset() {\n this.uuid = generateUuid();\n this.commandSequenceNumber = 0;\n this.viewId = this.uuid;\n this.startTime = this.timeNow;\n this.payloads.length = 0;\n this.commandsSent = {};\n }\n\n private trackStartCommand(trackingId: string) {\n const out = {\n command: trackingId,\n trackingId,\n };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer('commandSent', out, timers);\n this.trackTime(out);\n }\n\n private trackStopCommand(\n trackingId: string,\n timeStampsRaw?: TimeStampsRaw,\n multi = false,\n response: any = {},\n ) {\n const commandResponse = this.commandsSent[trackingId];\n if (!commandResponse) {\n return;\n }\n const totalRoundTripTime = this.timeNow - commandResponse.timeStampJs;\n\n /**\n * Time between telemetry was reset and command was sent.\n */\n const commandSentJsTime = commandResponse.timeStampJs - this.startTime;\n let unrealTimers = {};\n\n const t = timeStampsRaw?.timeStampCommand;\n if (t) {\n unrealTimers = {\n unrealRoundTripTime:\n t.onCompleteCommand.timestamp - t.onRequestCommand.timestamp,\n\n unrealExecutionDuration:\n t.onCompleteCommand.timestamp - t.onStartCommand.timestamp,\n\n timeDiffRequest:\n t.onRequestCommand.timestamp - commandResponse.timeStampJs,\n\n timeDiffCallBack: this.timeNow - t.onCompleteCommand.timestamp,\n };\n }\n\n const timers = {\n sessionElapsedTime: this.sessionTime,\n commandSentJsTime,\n totalRoundTripTime,\n ...unrealTimers,\n } as ComputedTimers;\n\n this.pushStatToBuffer(\n 'commandStop',\n { ...commandResponse.command, response },\n timers,\n timeStampsRaw,\n );\n if (!multi) {\n delete this.commandsSent[trackingId];\n }\n }\n\n private pushStatToBuffer(\n type: TelemetryType,\n commandContent: any,\n computedTimers: ComputedTimers,\n timeStampsRaw?: TimeStampsRaw,\n ) {\n this.pushData({\n type,\n commandSequenceNumber: this.commandSequenceNumber++,\n commandContent,\n timeStampsRaw,\n computedTimers,\n });\n }\n\n private trackTime(command: any) {\n this.commandsSent[command.trackingId] = {\n timeStampJs: this.timeNow,\n command,\n };\n }\n\n private send(payload: Payload[]) {\n if (payload.length === 0 || (this.canSkipSending && payload.length < 10)) {\n return;\n }\n this.lastTime = this.timeNow;\n const out: TelemetryBatch = {\n appId: this.appId,\n sessionId: this.sessionId,\n viewId: this.viewId,\n userId: this.userId,\n ua: navigator.userAgent,\n timeStamp: new Date(this.timeNow).toString(),\n href: location.href,\n resolution: {\n width: window.screen.width,\n height: window.screen.height,\n pixelRatio: window.devicePixelRatio,\n },\n payload,\n };\n const lastIndex = payload[payload.length - 1].commandSequenceNumber;\n this.httpClient\n .post(this.unrealInitialConfig?.commandTelemetryReceiver || '', out)\n .pipe(\n catchError(() => of(null)),\n take(1),\n )\n .subscribe(() => {\n this.payloads = this.payloads.filter(\n (p) => p.commandSequenceNumber > lastIndex,\n );\n });\n }\n\n /**\n * Listens for Unreal Engine callbacks.\n * Subscribes to the Unreal Engine event loop back and filters out events that do not have a tracking ID.\n * When a callback with a tracking ID is received,\n * it stops tracking the time for that command and filters out commands\n * that have exceeded the timeout limit.\n */\n protected listenCallbacks() {\n fromSignal(UnrealInternalSignalEvents.UnrealCallback)\n .pipe(\n filter(({ json }) => {\n const callback =\n 'commandCallback' in json ? json.commandCallback : json;\n\n return Truthy(callback?.trackingId);\n }),\n )\n .subscribe(({ json }: any) => {\n const callback = json.commandCallback;\n const timeStampsRaw = json.timeStamp;\n const trackingId = callback?.trackingId || '';\n\n this.trackStopCommand(trackingId, timeStampsRaw);\n this.removeExileCommands();\n });\n }\n\n private pushData(payload: Payload) {\n this.payloads.push(payload);\n }\n\n /**\n * Removes commands that have exceeded the timeout limit.\n * Iterates over all the commands sent and checks if the difference between the current time\n * and the time the command was sent is greater than the timeout limit.\n * If it is, the command is marked for deletion.\n * After checking all commands, those marked for deletion are removed from the commands sent.\n * This method is used to ensure that commands that are not responded to within a certain time frame\n * do not remain in the commandsSent object indefinitely, which could lead to memory leaks over time.\n */\n private removeExileCommands() {\n const time: number = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries<CommandToSend>(this.commandsSent).forEach(\n ([trackingId, { timeStampJs }]) => {\n if (time - timeStampJs > this.exileTimeout) {\n markForDelete.push(trackingId);\n }\n },\n );\n\n markForDelete.forEach((trackingId) => {\n delete this.commandsSent[trackingId];\n });\n }\n\n /**\n * Wraps the provided function with telemetry tracking.\n * Generates a unique tracking ID and adds it to the data object.\n * Pushes the command sent to the payloads with the tracking ID.\n * Starts tracking the time for the command.\n * Finally, calls the provided function with the modified data object.\n *\n * @param {IToBeDecorated} funcToDecorate - The function to be decorated with telemetry tracking.\n * @param {any} data - The data object to be passed to the function. It will be augmented with a unique tracking ID.\n */\n private wrapper(funcToDecorate: IToBeDecorated, data: any) {\n const out = { ...data, trackingId: generateUuid() };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer(\n 'commandSent',\n {\n ...out,\n trackingId: `${out.trackingId}`,\n },\n timers,\n );\n this.trackTime(out);\n funcToDecorate(out);\n }\n}\n\ntype IToBeDecorated = (data: any) => unknown;\n\ninterface TelemetryBatch {\n appId: string;\n sessionId: string;\n viewId: string;\n userId: string;\n ua: string;\n timeStamp: string;\n href: string;\n payload: Payload[];\n resolution: {\n width: number;\n height: number;\n pixelRatio: number;\n };\n}\n\ninterface Payload {\n type: TelemetryType;\n commandSequenceNumber: number;\n commandContent: any;\n timeStampsRaw?: TimeStampsRaw;\n computedTimers: ComputedTimers;\n}\n\ninterface TimeStampsRaw {\n timeStampPak: TimeStampPakCollection;\n timeStampCommand: TimeStampCommandCollection;\n}\n\ninterface TimeStampPakCollection {\n onLoadPak: TimeStampMemory;\n onRenderPak: TimeStampMemory;\n onSequencePak: TimeStampMemory;\n onSpawnPak: TimeStampMemory;\n}\n\ninterface TimeStampMemory {\n timestamp: number;\n ram: number;\n vRam: number;\n}\n\ninterface TimeStampCommandCollection {\n onRequestCommand: TimeStampMemory;\n onStartCommand: TimeStampMemory;\n onCompleteCommand: TimeStampMemory;\n}\n\ninterface ComputedTimers {\n unrealRoundTripTime: number;\n totalRoundTripTime: number;\n unrealExecutionDuration: number;\n sessionElapsedTime: number;\n timeDiffRequest: number;\n timeDiffCallBack: number;\n commandSentJsTime: number;\n}\n\nexport function TelemetryStart(externalId: string) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStart, { externalId });\n}\n\nexport function TelemetryStop(externalId: string, payload?: any) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStop, { externalId, payload });\n}\n\nexport function ResetTelemetry() {\n sendSignal(UnrealInternalSignalEvents.TelemetryReset);\n}\n\ninterface CommandToSend {\n timeStampJs: number;\n command: { trackingId: string };\n}\n","import type { SignallingService } from '../../services';\nimport type { StreamerListMessage } from '../../interfaces';\n\nexport function StreamerListHandler(\n this: SignallingService,\n msg: StreamerListMessage,\n) {\n this.send(\n JSON.stringify({\n type: 'subscribe',\n streamerId: msg.ids[0],\n }),\n );\n}\n","import type { SignallingService } from '../../services';\n\nexport function OfferHandler(\n this: SignallingService,\n msg: RTCSessionDescriptionInit,\n) {\n this.onOffer$.next(msg);\n}\n","export function httpUrlToWs(url: string) {\n return url.replace('http://', 'ws://').replace('https://', 'wss://');\n}\n","import { defer, Observable, throwError } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport { Logger } from '@3dsource/utils';\nimport { WS_TIMEOUT } from '../constants';\n\nexport function createWebSocket(wsUrl: string): Observable<WebSocket> {\n if (typeof window === 'undefined' || !('WebSocket' in window)) {\n return throwError(\n () => new Error(\"Your browser doesn't support WebSocket\"),\n );\n }\n\n Logger.info('Creating socket', wsUrl);\n\n return defer(\n () =>\n new Observable<WebSocket>((observer) => {\n const ws = new WebSocket(wsUrl);\n\n const onOpen = () => {\n observer.next(ws); // connection established\n };\n\n const onError = (ev: Event) => {\n const anyEv = ev as any;\n const err =\n anyEv?.error instanceof Error\n ? anyEv.error\n : new Error('WebSocket failed to connect');\n observer.error(err);\n };\n\n const onClose = (ev: CloseEvent) => {\n if (ws.readyState !== WebSocket.OPEN) {\n observer.error(\n new Error(`WebSocket closed before open (code ${ev.code})`),\n );\n }\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n\n return () => {\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n };\n }),\n ).pipe(\n timeout({\n first: WS_TIMEOUT, // fail if no 'open' event in this window\n with: () =>\n throwError(\n () =>\n new Error(`WebSocket connection timed out after ${WS_TIMEOUT}ms`),\n ),\n }),\n );\n}\n","/*\n * Copyright (c) 2024.\n * Sergii Karanda - All Rights Reserved\n */\n\nimport { disconnectStream } from '../../store';\nimport type { SignallingService } from '../../services';\nimport { DisconnectReason } from '../../interfaces';\n\nexport function PlayerDisconnectHandler(this: SignallingService) {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.OrchestrationPlayerDisconnected,\n message: 'Orchestration: PlayerDisconnectHandler',\n }),\n );\n}\nexport function StreamerDisconnectHandler(this: SignallingService) {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.OrchestrationStreamerDisconnected,\n message: 'Orchestration: StreamerDisconnectHandler',\n }),\n );\n}\n","import type { SignallingService } from '../../services';\nimport type { OrchestrationErrorMessage } from '../../interfaces';\nimport { POLLING_TIME } from '../../constants';\nimport { setOrchestrationMessage } from '../../store';\n\n// Structured constants holding code + description\nexport const ORCHESTRATION_ERROR_CODES = {\n NO_AVAILABLE_INSTANCES: {\n code: 4001,\n description: 'There are no instances to run for the requested environment.',\n },\n LIMIT_REACHED: {\n code: 4002,\n description:\n 'The limit of instances for the requested environment is reached.',\n },\n DIFFERENT_ORIGIN: {\n code: 4003,\n description:\n 'Origin instance and client are on different connection servers on instance.',\n },\n} as const;\n\n// Set for codes that should trigger a retry\nconst RETRY_CODES = new Set<number>([\n ORCHESTRATION_ERROR_CODES.NO_AVAILABLE_INSTANCES.code,\n ORCHESTRATION_ERROR_CODES.LIMIT_REACHED.code,\n]);\n\nexport function OrchestrationErrorHandler(\n this: SignallingService,\n msg: OrchestrationErrorMessage,\n) {\n if (RETRY_CODES.has(msg.payload.code)) {\n const errorInfo = Object.values(ORCHESTRATION_ERROR_CODES).find(\n ({ code }) => code === msg.payload.code,\n );\n this.store.dispatch(\n setOrchestrationMessage({ message: errorInfo?.description as string }),\n );\n setTimeout(() => this.sendRequestStream(), POLLING_TIME);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport {\n ResetTelemetry,\n TelemetryStart,\n TelemetryStop,\n} from './command-telemetry.service';\nimport type { Observable } from 'rxjs';\nimport { defer, retry, Subject, switchMap, take, timeout, timer } from 'rxjs';\nimport { exhaustMap, filter, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n abortEstablishingConnection,\n dataChannelReady,\n selectClientAndViewIds,\n setAwsInstance,\n setEstablishingConnection,\n setStatusMessage,\n setStatusPercentSignallingServer,\n unrealFeature,\n} from '../store';\nimport { HttpClient } from '@angular/common/http';\nimport { SubService } from './sub.service';\nimport { POLLING_TIME, UnrealStatusMessage, WS_OPEN_STATE } from '../constants';\nimport type {\n AnySignalingMessage,\n AwsInstance,\n CloseReason,\n ConfigMessage,\n MessageBase,\n PollingOrchestrationMessage,\n SignalingMessageHandler,\n SignalingMessageMap,\n} from '../interfaces';\nimport { OrchestrationMessageTypes } from '../interfaces';\nimport {\n COLOR_CODES,\n generateUuid,\n Logger,\n tapLog,\n Truthy,\n} from '@3dsource/utils';\nimport {\n AnswerHandler,\n ConfigHandler,\n getActiveUrl,\n IceCandidateHandler,\n InstanceReadyHandler,\n InstanceReservedHandler,\n OnCloseHandler,\n OnErrorHandler,\n OnMessageHandler,\n OnOpenHandler,\n PingHandler,\n PlayerCountHandler,\n SSInfoHandler,\n} from '../helpers';\nimport { RegionsPingService } from '../services';\nimport { StreamerListHandler } from '../helpers/FromStreamerHandlers/StreamerListHandler';\nimport { OfferHandler } from '../helpers/FromStreamerHandlers/OfferHandler';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { httpUrlToWs } from '../helpers/httpToWsUrl';\nimport { createWebSocket } from '../helpers/create-websocket';\nimport {\n PlayerDisconnectHandler,\n StreamerDisconnectHandler,\n} from '../helpers/FromStreamerHandlers/ForceDisconnect';\nimport { OrchestrationErrorHandler } from '../helpers/FromStreamerHandlers/OrchestrationErrorHandler';\n\n@Injectable()\nexport class SignallingService extends SubService {\n private readonly action$ = inject(Actions);\n private readonly httpClient = inject(HttpClient);\n private readonly regionsPingService = inject(RegionsPingService);\n\n readonly region = signal('');\n\n readonly selectClientAndViewIds = this.store.selectSignal(\n selectClientAndViewIds,\n );\n readonly environmentId = this.store.selectSignal(\n unrealFeature.selectEnvironmentId,\n );\n readonly streamRequestContext = this.store.selectSignal(\n unrealFeature.selectStreamRequestContext,\n );\n\n onOffer$ = new Subject<RTCSessionDescriptionInit>();\n onConfig$ = new Subject<ConfigMessage>();\n onWebRtcIce$ = new Subject<RTCIceCandidate>();\n onWebRtcAnswer$ = new Subject<RTCSessionDescriptionInit | null>();\n abort$ = this.action$.pipe(ofType(abortEstablishingConnection));\n\n private ws!: WebSocket;\n\n private wsMsgHandlers: Partial<{\n [K in keyof SignalingMessageMap]: SignalingMessageHandler<K>;\n }> = {};\n\n protected correlationId!: string;\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.setHandlersFromStream();\n this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {\n this.send({\n type: 'p2pEstablished',\n source: 'front',\n sessionId: generateUuid(),\n });\n });\n\n this.action$\n .pipe(\n ofType(dataChannelReady),\n switchMap(() =>\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy), take(1)),\n ),\n )\n .subscribe(() => {\n this.send({\n type: 'streamPreparedForUserInteraction',\n correlationId: generateUuid(),\n });\n });\n }\n\n connectToSignaling(urlList: string[]) {\n Logger.log('CONNECT TO SIGNALLING');\n // Preparation for WebSocket Orchestration\n this.correlationId = generateUuid();\n\n ResetTelemetry();\n this.startEstablishingConnection();\n\n return defer(() =>\n this.getRegion().pipe(\n tap((region) => this.region.set(region!)),\n map((region) => this.adaptUrlsToRegion(urlList, region)),\n switchMap((urls) => this.getAwsInstance(urls).pipe(take(1))),\n tap((awsInstance) => this.store.dispatch(setAwsInstance(awsInstance))),\n switchMap(({ wsUrl }) => this.connectToCirrus(wsUrl!)),\n filter(Truthy),\n take(1),\n takeUntil(this.abort$),\n ),\n ).pipe(\n // Retry the whole attempt on error, advancing to the next URL each time.\n retry({\n delay: (err, attempt) => {\n Logger.info(\n `Retrying Signalling Connection in ${POLLING_TIME}ms. Attempt# ${attempt}.`,\n err?.message,\n );\n return timer(POLLING_TIME);\n },\n // count: 10, // Optional: cap the number of attempts.\n }),\n );\n }\n\n protected startEstablishingConnection() {\n this.showStatusMessage(UnrealStatusMessage.STARTING_YOUR_SESSION);\n this.store.dispatch(setEstablishingConnection({ value: true }));\n }\n\n private adaptUrlsToRegion(urlList: string[], region?: string) {\n return urlList.map((url) => {\n if (region && !url.includes(':region')) {\n return url.replace(\n /signallingserver/gi,\n `signallingserver/region:${region}`,\n );\n }\n return url;\n });\n }\n\n /**\n * Resolves an active AWS *signaling* instance and returns a WebSocket endpoint.\n *\n * The observable produced by this method is **cold** and executes inside a `defer`,\n * so each subscription (including those triggered by `retry`) pulls the **next**\n * URL candidate from a generator created by `getActiveUrl(urlsPool)`.\n *\n * ### Execution flow\n *\n * 1. **Telemetry** — Starts a `getSignaling` span for end-to-end timing.\n * 2. **Candidate URL selection** — A stateful generator (`urlGen`) is created\n * from `urlsPool`. Each resubscription (e.g. via `retry`) advances to the next URL.\n * 3. **Short-circuit for WS URLs** — If the picked candidate already matches\n * `ws://` or `wss://`, emit `{ wsUrl, pollingUrl: null, instanceName: null }`\n * immediately and complete (no HTTP request).\n * 4. **Await client/view identifiers** — `this.store.select(selectClientAndViewIds)`\n * is tapped for logging (missing IDs) and then filtered to require both `clientId`\n * and `viewId` to be truthy.\n * 5. **Single in-flight HTTP orchestration call** — Uses `exhaustMap` to issue\n * `GET {signalingUrl}{clientId}/{viewId}`. New `{clientId, viewId}` emissions\n * while the request is in flight are **ignored** until completion, preventing overlap.\n * 6. **Per-attempt timeout** — `timeout(WS_TIMEOUT)` caps how long we wait for a response.\n * On timeout, the attempt errors and the outer `retry` schedules the next URL.\n * 7. **Response validation & progress reporting** — A `filter`:\n * - Calls `TelemetryStop('getSignaling', { ...data, multi: true })` on receipt.\n * - If `data.signallingServer === ''` or `data.error`:\n * shows a status message, optionally dispatches `setStatusPercentSignallingServer`\n * with `data.info.percent`, and **throws** to fail the attempt (triggers `retry`).\n * 8. **Mapping to `AwsInstance`** — Converts the validated orchestration payload into:\n * - `wsUrl`: via `httpUrlToWs(\\`\\${location.protocol}//\\${data.signallingServer}\\`)`\n * - `pollingUrl`: the base `signalingUrl` that succeeded\n * - `instanceName`: the (validated) `data.signallingServer`\n * 9. **Retry policy** — On *any* upstream error (timeout, HTTP error, invalid payload),\n * `retry({ delay })`:\n * - Shows a “connecting” status,\n * - Logs the attempt number,\n * - Waits `WS_TIMEOUT` ms (via `timer`) and **resubscribes**, advancing `urlGen`.\n *\n * ### Concurrency semantics\n *\n * - `exhaustMap` guarantees a **single** HTTP request per attempt; subsequent\n * `{clientId, viewId}` emissions are ignored until the current request completes.\n *\n * ### Telemetry semantics\n *\n * - `TelemetryStart('getSignaling')` begins before work.\n * - `TelemetryStop('getSignaling', {...})` runs on receipt of an orchestration response.\n * If an attempt fails (e.g., timeout), stopping the span is the responsibility of\n * your telemetry layer or a `finalize` elsewhere if desired.\n *\n * ### Error & retry semantics\n *\n * - Missing/never-emitted IDs → timeout → retry with next URL.\n * - HTTP/network error → retry with next URL.\n * - Invalid orchestration payload (`error` set or empty `signallingServer`) → throw in\n * validation filter → retry with next URL.\n * - Short-circuit WS path **does not** retry (emits once, completes).\n *\n * @param urlsPool - Ordered list of base URLs to probe. Retries advance through this list\n * until a working signaling server is found. A candidate may also be a direct `ws://`/`wss://`\n * URL to short-circuit HTTP orchestration.\n *\n * @returns Observable that emits exactly one {@link AwsInstance} on success and then completes.\n * On failure, the stream errors; the built-in `retry` operator re-subscribes after `WS_TIMEOUT`\n * and advances to the next URL candidate.\n *\n * @throws Emits an error within the observable chain (not a thrown synchronous exception) when:\n * - The HTTP request fails or times out.\n * - The orchestration response indicates an error or an empty `signallingServer`.\n * - Any other operator in the chain surfaces an error.\n *\n * @remarks\n * - The URL generator (`urlGen`) is created **outside** `defer`, so resubscriptions\n * advance the pool. Creating it inside `defer` would restart from the first URL each retry.\n * - `location.protocol` is used to derive `ws` vs `wss`. If this may run in non-browser\n * contexts (e.g., SSR), guard or abstract this logic.\n * - Consider capping retries with `count` in `retry({ count, delay })` when appropriate.\n *\n * @example\n * ```ts\n * getAwsInstance(['https://signaling.example.com/', 'wss://direct.example.com'])\n * .subscribe({\n * next: ({ wsUrl }) => connect(wsUrl),\n * error: (e) => console.error('Unable to establish signaling:', e),\n * });\n * ```\n *\n * @see httpUrlToWs\n * @see selectClientAndViewIds\n * @see setStatusPercentSignallingServer\n */\n private getAwsInstance(urlsPool: string[]): Observable<AwsInstance> {\n TelemetryStart('getSignaling');\n\n // Stateful iterator over candidate URLs; retries advance this sequence.\n const urlGen = getActiveUrl(urlsPool);\n\n return defer(() => {\n const signalingUrl = `${urlGen.next().value}`;\n\n // Short-circuit if the candidate is already a WS endpoint.\n if (signalingUrl.match(/^ws(s?):\\/\\//i)) {\n return this.store.select(selectClientAndViewIds).pipe(\n filter(({ clientId, viewId }) => !!clientId && !!viewId),\n map(() => {\n return {\n wsUrl: signalingUrl,\n pollingUrl: null,\n instanceName: 'Direct Connection',\n };\n }),\n );\n }\n\n return this.store.select(selectClientAndViewIds).pipe(\n // Log missing IDs without altering the stream.\n tap(({ clientId, viewId }) => {\n if (!clientId || !viewId) {\n console.error('Client ID or View ID is not set');\n }\n }),\n\n // Only proceed when both identifiers are available.\n filter(({ clientId, viewId }) => !!clientId && !!viewId),\n\n // Take first value\n take(1),\n\n // Ensure a single in-flight HTTP request per attempt.\n exhaustMap(({ clientId, viewId }) =>\n this.httpClient.get<PollingOrchestrationMessage>(\n `${signalingUrl}${clientId}/${viewId}`,\n ),\n ),\n\n // Bound the time spent waiting for the orchestration response.\n timeout(POLLING_TIME),\n\n // Validate response; report progress; fail fast on invalid payloads.\n filter((data: PollingOrchestrationMessage) => {\n TelemetryStop('getSignaling', { ...data, multi: true });\n\n if (data.signallingServer === '' || data.error) {\n this.showStatusMessage(data?.mm_message || 'Server not found');\n\n if (data?.info) {\n this.store.dispatch(\n setStatusPercentSignallingServer({\n percent: data.info.percent,\n }),\n );\n }\n\n // Throwing here fails the attempt and activates the retry strategy.\n throw new Error(\n `Orchestration message => ${data?.mm_message || 'Polling retry'}`,\n );\n }\n\n return true;\n }),\n\n // Map a valid orchestration payload into the final AwsInstance.\n map((data: PollingOrchestrationMessage): AwsInstance => {\n const wsUrl = httpUrlToWs(\n `${location.protocol}//${data.signallingServer}`,\n );\n\n return {\n wsUrl,\n pollingUrl: signalingUrl,\n instanceName: data.signallingServer!,\n };\n }),\n );\n }).pipe(\n // Retry the whole attempt on error, advancing to the next URL each time.\n retry({\n delay: (err, attempt) => {\n this.showStatusMessage(UnrealStatusMessage.CONNECTING_TO_SESSION);\n Logger.log(\n `Retrying with new URL in ${POLLING_TIME}ms. Attempt# ${attempt}`,\n err?.message,\n );\n return timer(POLLING_TIME);\n },\n // count: 10, // Optional: cap the number of attempts.\n }),\n );\n }\n\n private connectToCirrus(wsUrl: string) {\n this.clearWs();\n return createWebSocket(wsUrl).pipe(\n tapLog('WS CREATED'),\n tap((ws) => {\n TelemetryStart('iceCandidate');\n this.addWsHandlers(ws);\n }),\n );\n }\n\n addWsHandlers(ws: WebSocket) {\n ws.onmessage = OnMessageHandler.bind(this);\n ws.onclose = OnCloseHandler.bind(this);\n ws.onerror = OnErrorHandler.bind(this);\n this.ws = ws;\n Logger.log('WS HANDLERS ADDED');\n OnOpenHandler.call(this);\n }\n\n showStatusMessage(statusMessage: string | null) {\n this.store.dispatch(setStatusMessage({ statusMessage }));\n }\n\n /**\n * Close the connection with the signaling server\n * @param data\n */\n close(data: CloseReason) {\n const { code, reason } = data;\n if (this.ws) Logger.warn('Closing existing WebSocket connection');\n this.ws?.close(code, reason);\n this.ws = null as never;\n }\n\n send(data: AnySignalingMessage) {\n let dataString = data;\n if (typeof dataString !== 'string') {\n dataString = JSON.stringify(data);\n }\n if (this.ws && this.ws.readyState === WS_OPEN_STATE) {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, JSON.parse(dataString));\n try {\n this.ws.send(dataString);\n } catch {\n Logger.error('No Websocket');\n }\n }\n }\n\n private clearWs() {\n this.onWebRtcAnswer$.next(null);\n if (this.ws) {\n this.ws.onmessage = () => null;\n this.ws.onerror = () => null;\n this.ws.onclose = () => null;\n this.ws.onopen = () => null;\n this.ws = null as never;\n }\n }\n\n protected handleMessage(msg: MessageBase) {\n try {\n Logger.colored(...COLOR_CODES.FROM_CIRRUS, msg);\n this.wsMsgHandlers[msg.type]!(msg as never);\n } catch {\n Logger.colored(\n ...COLOR_CODES.FROM_CIRRUS_ERROR,\n `Invalid CIRRUS message type: ${msg.type}`,\n );\n }\n }\n\n private setHandlersFromStream() {\n this.wsMsgHandlers.ping = PingHandler.bind(this);\n this.wsMsgHandlers.error = OrchestrationErrorHandler.bind(this);\n this.wsMsgHandlers.config = ConfigHandler.bind(this);\n this.wsMsgHandlers.answer = AnswerHandler.bind(this);\n this.wsMsgHandlers.ssInfo = SSInfoHandler.bind(this);\n this.wsMsgHandlers.playerCount = PlayerCountHandler.bind(this);\n this.wsMsgHandlers.streamerList = StreamerListHandler.bind(this);\n this.wsMsgHandlers.iceCandidate = IceCandidateHandler.bind(this);\n this.wsMsgHandlers.instanceReady = InstanceReadyHandler.bind(this);\n this.wsMsgHandlers.instanceReserved = InstanceReservedHandler.bind(this);\n this.wsMsgHandlers.playerDisconnected = PlayerDisconnectHandler.bind(this);\n this.wsMsgHandlers.streamerDisconnected =\n StreamerDisconnectHandler.bind(this);\n\n this.wsMsgHandlers.offer = OfferHandler.bind(this);\n }\n\n protected sendRequestStream() {\n this.send({\n type: OrchestrationMessageTypes.requestStream,\n correlationId: this.correlationId,\n payload: {\n region: this.region(),\n environmentId: this.environmentId()!,\n context: this.streamRequestContext()!,\n },\n });\n }\n\n /**\n * Check if the WebSocket connection is open and ready.\n */\n isConnected(): boolean {\n return this.ws && this.ws.readyState === WS_OPEN_STATE;\n }\n\n private getRegion() {\n Logger.log('Start Getting Region');\n return this.regionsPingService.getFastest().pipe(take(1));\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { fromEvent, share, Subject, take, tap } from 'rxjs';\nimport { filter, map, takeUntil, withLatestFrom } from 'rxjs/operators';\nimport {\n dataChannelConnected,\n disconnectStream,\n reconnectPeer,\n unrealFeature,\n} from '../store';\nimport { SubService } from './sub.service';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { TelemetryStart, TelemetryStop } from './command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces';\nimport { DisconnectReason } from '../interfaces';\nimport { SignallingService } from './signalling.service';\nimport { VideoService } from './video.service';\n\n@Injectable()\nexport class WebRtcPlayerService extends SubService {\n onDataChannelMessage$ = new Subject<ArrayBuffer>();\n\n private pcClient!: RTCPeerConnection | null;\n private signallingSrv = inject(SignallingService);\n private videoService = inject(VideoService);\n private cfg: RTCConfiguration = {};\n private useMic = false;\n private forceTURN = false;\n private forceMonoAudio = false;\n private dcClient!: RTCDataChannel | null;\n\n private isReconnecting = this.store.selectSignal(\n unrealFeature.selectIsReconnecting,\n );\n\n constructor() {\n super();\n this.init();\n Signal.on('dropDC').subscribe(() => this.dcClient?.close());\n Signal.on('dropPC').subscribe(() => this.pcClient?.close());\n }\n\n protected init() {\n const iceCandidateBuffer: RTCIceCandidate[] = [];\n\n const processBuffer = () => {\n iceCandidateBuffer.forEach((cnd) => {\n this.handleCandidateFromServer(cnd);\n });\n iceCandidateBuffer.length = 0;\n };\n\n this.signallingSrv.onConfig$.subscribe((config: ConfigMessage) => {\n this.videoService.create();\n this.setConfig(config);\n });\n\n this.signallingSrv.onWebRtcAnswer$\n .pipe(filter(Truthy))\n .subscribe((answer) => {\n this.receiveAnswer(answer);\n processBuffer();\n });\n\n this.signallingSrv.onOffer$.pipe(filter(Truthy)).subscribe(() => {\n void this.createWebRtcOffer();\n });\n\n this.signallingSrv.onWebRtcIce$\n .pipe(withLatestFrom(this.signallingSrv.onWebRtcAnswer$))\n .subscribe(([candidate, answerEstablished]) => {\n TelemetryStop('iceCandidate', {\n multi: true,\n });\n\n iceCandidateBuffer.push(candidate);\n if (answerEstablished) {\n processBuffer();\n }\n });\n }\n\n private async createWebRtcOffer(): Promise<void> {\n Logger.info('Creating offer');\n let offer: void;\n try {\n offer = await this.createPeerConnection(this.cfg);\n } catch {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.WebRTCError,\n message: 'WebRTCError: Offer Error',\n }),\n );\n }\n\n return offer;\n }\n\n private createDataChannel(\n pc: RTCPeerConnection,\n label: string,\n options: RTCDataChannelInit,\n ) {\n // This is the primary data channel code path when we are \"offering\"\n const datachannel = pc.createDataChannel(label, options);\n return this.setupDataChannelCallbacks(datachannel);\n }\n\n private receiveAnswer(answer: RTCSessionDescriptionInit) {\n this.pcClient?.setRemoteDescription(answer);\n }\n\n private handleCandidateFromServer(iceCandidate: RTCIceCandidate) {\n try {\n const candidate = new RTCIceCandidate(iceCandidate);\n Logger.info(\n '[Unreal ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n\n // if forcing TURN, reject any candidates not relay\n if (this.forceTURN) {\n // check if no relay address is found, if so, we are assuming it means no TURN server\n if (candidate.candidate.indexOf('relay') < 0) {\n Logger.warn(\n 'Dropping candidate because it was not TURN relay.',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n return;\n }\n }\n this.pcClient?.addIceCandidate(candidate).catch(function () {\n // Logger.error('Failed to add ICE candidate', e);\n });\n } catch (e) {\n Logger.error('Error handleCandidateFromServer', e);\n }\n }\n\n private mungeSDP(offer: RTCSessionDescriptionInit): void {\n let audioSDP = '';\n\n // set max bitrate to the highest bitrate Opus supports\n audioSDP += 'maxaveragebitrate=510000;';\n\n if (this.useMic) {\n // set the max capture rate to 48khz (so we can send high-quality audio from mic)\n audioSDP += 'sprop-maxcapturerate=48000;';\n }\n\n // Force mono or stereo based on whether ?forceMono was passed or not\n audioSDP += this.forceMonoAudio\n ? 'sprop-stereo=0;stereo=0;'\n : 'sprop-stereo=1;stereo=1;';\n\n // enable in-band forward error correction for opus audio\n audioSDP += 'useinbandfec=1';\n\n // We use the line 'useinbandfec=1' (which Opus uses) to set our Opus specific audio parameters.\n offer.sdp = offer.sdp?.replace('useinbandfec=1', audioSDP);\n }\n\n /**\n * Closes existing PeerConnection\n */\n closePC(): void {\n if (this.pcClient) Logger.warn('Closing existing PeerConnection');\n this.pcClient?.close();\n this.pcClient = null;\n\n if (this.dcClient) Logger.warn('Closing existing DataChannel');\n this.dcClient?.close();\n this.dcClient = null;\n }\n\n canSend() {\n return this.dcClient && this.dcClient.readyState === 'open';\n }\n\n send(data: ArrayBuffer) {\n if (this.canSend()) {\n this.dcClient?.send(data);\n } else {\n Logger.colored(\n 'black',\n 'yellow',\n `DataChannel connection not prepared or in state: ${this.dcClient?.readyState}`,\n );\n\n // Trigger peer reconnection if DC is not open and we're not already reconnecting\n this.tryReconnectOnSendFailure();\n }\n }\n\n /**\n * Attempts to reconnect the peer when send fails due to DataChannel not being open.\n * This handles cases where the DC connection is broken but no error events are fired.\n */\n private tryReconnectOnSendFailure(): void {\n // Skip if already reconnecting or signaling is not connected\n if (this.isReconnecting()) {\n Logger.info(\n '[Reconnect] Already reconnecting, skipping duplicate attempt',\n );\n return;\n }\n\n if (!this.signallingSrv.isConnected()) {\n Logger.warn('[Reconnect] Cannot reconnect: Signaling not connected');\n return;\n }\n\n // Check if DC exists but is in a non-open state (closing, closed, or connecting stuck)\n const dcState = this.dcClient?.readyState;\n if (dcState && dcState !== 'open') {\n Logger.warn(\n `[Reconnect] DataChannel in \"${dcState}\" state during send, initiating peer reconnection`,\n );\n this.store.dispatch(\n reconnectPeer({ attempt: 1, maxAttempts: 3, delay: 0 }),\n );\n }\n }\n\n /**\n * Reconnect only the WebRTC peer connection without re-establishing signaling.\n * This closes the current PeerConnection and creates a new offer through\n * the existing WebSocket connection.\n * @returns true if reconnection was initiated, false if signaling is not connected\n */\n reconnectPeer(): boolean {\n if (!this.signallingSrv.isConnected()) {\n Logger.error(\n '[Reconnect] Cannot reconnect peer: Signaling not connected',\n );\n return false;\n }\n\n if (!this.cfg || Object.keys(this.cfg).length === 0) {\n Logger.error('[Reconnect] Cannot reconnect peer: No config available');\n return false;\n }\n\n Logger.info('[Reconnect] Initiating peer reconnection');\n\n // Close only the PeerConnection, keep WebSocket alive\n this.closePC();\n\n // Create a new WebRTC offer using the stored config\n void this.createWebRtcOffer();\n\n return true;\n }\n\n private setConfig(parOptions = {} as ConfigMessage) {\n const urlParams = new URLSearchParams(window.location.search);\n\n //**********************\n //Config setup\n //**********************\n this.cfg = { ...parOptions.peerConnectionOptions };\n\n this.forceTURN = urlParams.has('ForceTURN');\n if (this.forceTURN) {\n Logger.info(\n 'Forcing TURN usage by setting ICE Transport Policy in peer connection config.',\n );\n this.cfg.iceTransportPolicy = 'relay';\n }\n\n this.cfg.bundlePolicy = urlParams.has('ForceMaxBundle')\n ? 'max-bundle'\n : 'balanced';\n\n //**********************\n //Variables\n //**********************\n this.pcClient = null;\n this.dcClient = null;\n\n // When ?useMic check for SSL or localhost\n const isLocalhostConnection =\n location.hostname === 'localhost' || location.hostname === '127.0.0.1';\n const isHttpsConnection = location.protocol === 'https:';\n if (this.useMic && !isLocalhostConnection && !isHttpsConnection) {\n this.useMic = false;\n Logger.error(\n 'Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access.',\n );\n Logger.error(\n \"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'\",\n );\n }\n }\n\n private async createPeerConnection(config: RTCConfiguration): Promise<void> {\n this.closePC();\n this.pcClient = new RTCPeerConnection(config);\n\n TelemetryStart('Browser ICE gathering');\n TelemetryStart('Browser ICE connection');\n TelemetryStart('Signaling state change');\n\n this.handlePeerConnectionEvents(this.pcClient);\n await this.setupTransceiversAsync(this.pcClient);\n\n this.dcClient = this.createDataChannel(\n this.pcClient,\n 'UnrealDcConnection',\n {\n // See https://www.w3.org/TR/webrtc/#dom-rtcdatachannelinit for values (this is needed for Firefox to be consistent with Chrome.)\n ordered: true,\n },\n );\n\n this.disconnect$.pipe(take(1)).subscribe(() => {\n this.closePC();\n });\n\n await this.createOffer(this.pcClient);\n }\n\n private handlePeerConnectionEvents(pcClient: RTCPeerConnection) {\n fromEvent(pcClient, 'signalingstatechange')\n .pipe(\n map(() => this.pcClient?.signalingState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Signaling state change] |', state, '|');\n TelemetryStop('Signaling state change', { state, multi: true });\n });\n\n fromEvent(pcClient, 'iceconnectionstatechange')\n .pipe(\n map(() => this.pcClient?.iceConnectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE connection] |', state, '|');\n TelemetryStop('Browser ICE connection', { state, multi: true });\n });\n\n fromEvent(pcClient, 'icegatheringstatechange')\n .pipe(\n map(() => this.pcClient?.iceGatheringState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE gathering] |', state, '|');\n TelemetryStop('Browser ICE gathering', { state, multi: true });\n });\n\n fromEvent(pcClient, 'connectionstatechange')\n .pipe(\n map(() => this.pcClient?.connectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[RTCPeerConnection state] |', state, '|');\n });\n\n fromEvent<RTCPeerConnectionIceEvent>(pcClient, 'icecandidate')\n .pipe(\n map((e: RTCPeerConnectionIceEvent) => e.candidate),\n filter(Truthy),\n tap((candidate: RTCIceCandidate) =>\n Logger.info(\n '[Browser ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n ),\n ),\n takeUntil(this.disconnect$),\n )\n .subscribe((candidate) =>\n this.signallingSrv.send({ type: 'iceCandidate', candidate }),\n );\n\n fromEvent<RTCDataChannelEvent>(pcClient, 'datachannel')\n .pipe(\n tap(() =>\n Logger.info(\n 'Data channel created for us by browser as we are a receiving peer.',\n ),\n ),\n map((e: RTCDataChannelEvent) => e.channel),\n takeUntil(this.disconnect$),\n )\n .subscribe((datachannel) => {\n this.dcClient = this.setupDataChannelCallbacks(datachannel);\n });\n\n const onTrack$ = fromEvent<RTCTrackEvent>(pcClient, 'track').pipe(\n takeUntil(this.disconnect$),\n filter((e) => !!e.track),\n tap((e) =>\n Logger.info(\n 'Got track - ' +\n e.track.kind +\n ' id=' +\n e.track.id +\n ' readyState=' +\n e.track.readyState,\n ),\n ),\n share(),\n );\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'audio'),\n map((e) => e.streams[0]),\n )\n .subscribe((stream) => this.videoService.attachAudioStream(stream));\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'video'),\n map((e) => e.streams[0]),\n tap(() => Logger.info('Set video source from video track ontrack.')),\n )\n .subscribe((stream) => {\n if (this.pcClient) {\n this.videoService.attachVideoStream(stream, this.pcClient);\n }\n });\n }\n\n private async setupTransceiversAsync(pc: RTCPeerConnection): Promise<void> {\n const hasTransceivers = pc.getTransceivers().length > 0;\n\n // Setup a transceiver for getting UE video\n pc.addTransceiver('video', { direction: 'recvonly' });\n\n // Setup a transceiver for sending mic audio to UE and receiving audio from UE\n if (!this.useMic) {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n } else {\n const audioSendOptions = this.useMic\n ? {\n autoGainControl: false,\n channelCount: 1,\n echoCancellation: false,\n latency: 0,\n noiseSuppression: false,\n sampleRate: 48000,\n sampleSize: 16,\n volume: 1.0,\n }\n : false;\n\n // Note using mic on android chrome requires SSL or chrome://flags/ \"unsafely-treat-insecure-origin-as-secure\"\n const stream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: audioSendOptions,\n });\n if (stream) {\n if (hasTransceivers) {\n for (const transceiver of pc.getTransceivers()) {\n if (\n transceiver &&\n transceiver.receiver &&\n transceiver.receiver.track &&\n transceiver.receiver.track.kind === 'audio'\n ) {\n for (const track of stream.getTracks()) {\n if (track.kind && track.kind === 'audio') {\n await transceiver.sender.replaceTrack(track);\n transceiver.direction = 'sendrecv';\n }\n }\n }\n }\n } else {\n for (const track of stream.getTracks()) {\n if (track.kind && track.kind === 'audio') {\n pc.addTransceiver(track, { direction: 'sendrecv' });\n }\n }\n }\n } else {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n }\n }\n }\n\n private setupDataChannelCallbacks(\n datachannel: RTCDataChannel,\n ): RTCDataChannel | null {\n try {\n Logger.log(\n `[DATACHANNEL] Setting up datachannel \"${datachannel.label}\" callbacks...`,\n );\n TelemetryStart('DataChannel Connection');\n // Inform browser we would like binary data as an ArrayBuffer (FF chooses Blob by default!)\n datachannel.binaryType = 'arraybuffer';\n\n fromEvent(datachannel, 'close')\n .pipe(\n // Only dispatch disconnect if not already reconnecting to avoid infinite loops\n filter(() => !this.isReconnecting()),\n take(1),\n )\n .subscribe((e) => {\n Logger.warn(\n `[DATACHANNEL] Data channel disconnected: ${datachannel.label}(${datachannel.id})`,\n e,\n );\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.DataChannelClosed,\n message: 'DataChannelClosed',\n }),\n );\n });\n\n fromEvent(datachannel, 'error')\n .pipe(takeUntil(this.disconnect$))\n .subscribe((e) => {\n const message = `[DATACHANNEL] Data channel \"${datachannel.label}\" error. id:${datachannel.id}`;\n Logger.error(message, e);\n });\n\n fromEvent(datachannel, 'open')\n .pipe(\n tap(() => {\n Logger.info(\n `[DATACHANNEL] Data channel \"${datachannel.label}\" connected. id:${datachannel.id}`,\n );\n }),\n takeUntil(this.disconnect$),\n )\n .subscribe(() => {\n TelemetryStop('DataChannel Connection');\n this.onDataChannelConnected();\n });\n\n fromEvent<MessageEvent>(datachannel, 'message')\n .pipe(\n map((e: MessageEvent) => e.data),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onDataChannelMessage$.next(data));\n\n return datachannel;\n } catch (e) {\n Logger.warn('[DATACHANNEL] Datachannel setup caused an exception: ', e);\n return null;\n }\n }\n\n private onDataChannelConnected() {\n let statusMessage = 'Session connected, video stream starting.';\n if (navigator.userAgent.includes('Firefox')) {\n statusMessage +=\n '\\n If you are experiencing connection problems please try Google Chrome';\n }\n\n this.store.dispatch(dataChannelConnected({ statusMessage }));\n }\n\n private async createOffer(pcClient: RTCPeerConnection): Promise<void> {\n try {\n const offer = await pcClient.createOffer({\n offerToReceiveAudio: false, //Note: if you don't need audio, you can get improved latency by turning this off.\n offerToReceiveVideo: true,\n });\n this.mungeSDP(offer);\n pcClient?.setLocalDescription(offer);\n this.signallingSrv.send(offer);\n } catch {\n Logger.error(\"Couldn't create offer\");\n }\n }\n}\n","export const deepEqual = (a: any, b: any) => {\n if (a === b) return true;\n\n // must both be objects (and not null)?\n if (\n typeof a === 'object' &&\n a !== null &&\n typeof b === 'object' &&\n b !== null\n ) {\n // arrays?\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n // plain objects\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n // `b` must have key, and values must match\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n // everything else (including mismatched types)\n return false;\n};\n","import { filter } from 'rxjs/operators';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { unrealFeature } from '../store';\nimport { Subject } from 'rxjs';\nimport type { ReceivedMimeType } from '../interfaces/ReceivedMimeTypes';\n\nexport class FileReceiverService extends SubService {\n public fileComplete$ = new Subject<ReceivedFile>();\n\n private valid = false;\n private chunks = 0;\n private mimetype = '' as ReceivedMimeType;\n private receiving = false;\n private extension = '';\n private timestampStart = 0;\n private data: Uint8Array<ArrayBuffer>[] = [];\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.reset());\n }\n\n public reset() {\n this.mimetype = '' as ReceivedMimeType;\n this.extension = '';\n this.receiving = false;\n this.valid = false;\n this.chunks = 0;\n this.data = [];\n this.timestampStart = new Date().getTime();\n // Logger.info('Received file state');\n }\n\n private resetOnStart() {\n this.reset();\n this.receiving = true;\n }\n\n /**\n * Processes a file extension when received over data channel\n * @param view - the file extension data\n */\n setExtensionFromBytes(view: Uint8Array) {\n // Reset this if we got a file message and we are not \"receiving\" it yet\n if (!this.receiving) {\n this.resetOnStart();\n }\n\n //Logger.info(extensionAsString);\n this.extension = new TextDecoder('utf-16').decode(view.slice(1));\n }\n\n /**\n * Processes a file mime type when received over data channel\n * @param view - the file mime type data\n */\n setMimeTypeFromBytes(view: Uint8Array) {\n // Reset this if we got a file message and we are not \"receiving\" it yet\n if (!this.receiving) {\n this.resetOnStart();\n }\n\n const mimeAsString = new TextDecoder('utf-16').decode(view.slice(1));\n // Logger.info(mimeAsString);\n this.mimetype = mimeAsString as ReceivedMimeType;\n }\n\n /*-------------------------------------------------------------------------------------------*/\n\n public setContentsFromBytes(view: Uint8Array) {\n // If we haven't received the initial setup instructions, return\n if (!this.receiving) return;\n\n const typeSize = 1;\n const intSize = 4;\n const maxMessageSize = 16 * 1024;\n const headerSize = typeSize + intSize;\n const maxPayloadSize = maxMessageSize - headerSize;\n\n // Calculate the total number of chunks from the total this size\n this.chunks = Math.ceil(\n new DataView(view.slice(typeSize, headerSize).buffer).getInt32(0, true) /\n maxPayloadSize,\n );\n\n // Get the file part of the payload\n const thisBytes = view.slice(headerSize);\n\n // Append to existing data that holds this\n this.data.push(thisBytes);\n\n // Uncomment for debug\n // Logger.info(`Received this chunk: ${this.data.length}/${this.chunks}`);\n\n if (this.data.length === this.chunks) {\n this.receiving = false;\n this.valid = true;\n /*Logger.info('Received complete file');\n const transferDuration = new Date().getTime() - this.timestampStart;\n const transferBitrate = Math.round(\n (this.chunks * maxMessageSize) / transferDuration,\n );\n Logger.info(\n `Average transfer bitrate: ${transferBitrate}kb/s over ${transferDuration / 1000} seconds`,\n );*/\n\n /**\n * Reconstruct the file\n * This code reconstructs the received data into the original this based on the mime type and extension provided\n */\n const blob = new Blob([...this.data], { type: this.mimetype });\n this.fileComplete$.next({\n blob,\n mimetype: this.mimetype,\n extension: this.extension,\n valid: this.valid,\n });\n this.reset();\n } else if (this.data.length > this.chunks) {\n Logger.error(\n `Received bigger this than advertised: ${this.data.length}/${this.chunks}`,\n );\n this.reset();\n }\n }\n}\nexport interface ReceivedFile {\n blob: Blob;\n mimetype: ReceivedMimeType;\n extension: string;\n valid: boolean;\n}\n","import { COLOR_CODES, Logger, Truthy, where } from '@3dsource/utils';\nimport { inject, Injectable } from '@angular/core';\nimport { merge, Subject } from 'rxjs';\nimport { distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';\nimport {\n EControlSchemeType,\n EToClientMessageType,\n InputOptions,\n SCREEN_LOCKER_CONTAINER_ID,\n UNREAL_CONFIG,\n} from '../constants';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport {\n selectStreamConfig,\n showUnrealErrorMessage,\n unrealFeature,\n} from '../store';\nimport { decodeData, sendSignal } from '../helpers';\nimport type { UnrealCommands } from '@3dsource/types-unreal';\nimport { deepEqual } from '../helpers/deepEqual';\nimport { SubService } from './sub.service';\nimport { FileReceiverService } from './file-receiver.service';\n\nconst filteredLogs = [\n {\n command: 'onChangeSequence',\n },\n];\n\n@Injectable()\nexport class AggregatorService extends SubService {\n private readonly selectStreamConfig =\n this.store.selectSignal(selectStreamConfig);\n private readonly videoService = inject(VideoService);\n private readonly webrtcPlayer = inject(WebRtcPlayerService);\n private readonly freezeFrame = inject(FreezeFrameService);\n private readonly fileReceiver = inject(FileReceiverService);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG);\n private readonly responseEventListeners = new Map<\n string,\n (data: unknown) => void\n >();\n\n /**\n * Never called for now\n */\n private readonly destroy$ = new Subject<void>();\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.listenWebRTC();\n this.initialize();\n }\n\n protected listenWebRTC() {\n this.webrtcPlayer.onDataChannelMessage$\n .pipe(takeUntil(this.destroy$))\n .subscribe((data) => this.dataChannelMessageHandler(data));\n }\n\n protected initialize() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(distinctUntilChanged())\n .subscribe((connected) => {\n this.resetResponseList();\n if (connected) {\n this.startListenCallbacks();\n }\n });\n\n const unlockViewport$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy));\n\n merge(unlockViewport$, this.disconnect$).subscribe(() => {\n this.removeLoadScreen();\n });\n\n if (\n !this.selectStreamConfig()?.autoStart ||\n location.href.match(/^http:/gi)\n ) {\n this.removeLoadScreen();\n }\n\n InputOptions.controlScheme = EControlSchemeType.HoveringMouse;\n }\n\n private addResponseEventListener(\n name: string,\n listener: (data: unknown) => void,\n ) {\n this.responseEventListeners.set(name, listener);\n }\n\n private showOnScreenKeyboard<T extends { showOnScreenKeyboard: boolean }>(\n command: T,\n ) {\n if (command.showOnScreenKeyboard) {\n // Show the 'edit text' button.\n //editTextButton.classList.remove('hiddenState');\n // Place the 'edit text' button near the UE4 input widget.\n //let pos = unquantizeAndDenormalizeUnsigned(command.x, command.y);\n //editTextButton.style.top = pos.y.toString() + 'px';\n //editTextButton.style.left = (pos.x - 40).toString() + 'px';\n } else {\n // Hide the 'edit text' button.\n //editTextButton.classList.add('hiddenState');\n // Hide the on-screen keyboard.\n // hiddenInput.blur();\n }\n }\n\n private removeLoadScreen() {\n document\n .getElementById(\n this.unrealInitialConfig?.screenLockerContainerId ||\n SCREEN_LOCKER_CONTAINER_ID,\n )\n ?.remove();\n }\n\n private startListenCallbacks() {\n Logger.info('Start Listen Unreal Callbacks');\n let previousJson: unknown = null;\n this.addResponseEventListener('unrealEvents', (data) => {\n try {\n if (typeof data !== 'string') {\n return;\n }\n const json = JSON.parse(data);\n\n if (!deepEqual(json, previousJson)) {\n if (json?.error) {\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL_ERROR,\n `${json.error}`,\n data,\n );\n this.store.dispatch(\n showUnrealErrorMessage({ code: json.code, error: json?.error }),\n );\n } else {\n this.showMessageFromUnreal(json);\n\n previousJson = json;\n sendSignal(UnrealInternalSignalEvents.UnrealCallback, { json });\n }\n } else {\n // Logger.warn('Duplicate message received');\n }\n } catch (e) {\n Logger.error(e);\n Logger.error('ERROR=>', data);\n }\n });\n }\n\n private showMessageFromUnreal<T extends UnrealCommands>(json: T) {\n if (filteredLogs.some(where({ command: json?.command }))) {\n return;\n }\n Logger.colored(...COLOR_CODES.FROM_UNREAL, json);\n }\n\n private resetResponseList() {\n this.responseEventListeners.clear();\n }\n\n private dataChannelMessageHandler(data: ArrayBuffer) {\n const view = new Uint8Array(data);\n const anyData = data.slice(1);\n\n if (this.freezeFrame.receiving) {\n this.freezeFrame.setData(view);\n return;\n }\n\n switch (view[0]) {\n case EToClientMessageType.QualityControlOwnership: {\n const ownership = view[1] !== 0;\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Received quality controller message, will control quality: ' +\n ownership,\n );\n break;\n }\n\n case EToClientMessageType.Response: {\n const response = decodeData(anyData);\n\n for (const listener of this.responseEventListeners.values()) {\n listener(response as never);\n }\n\n break;\n }\n\n case EToClientMessageType.Command: {\n const commandAsString = decodeData(anyData);\n Logger.colored(...COLOR_CODES.FROM_UNREAL, commandAsString);\n const command = JSON.parse(commandAsString);\n\n if (command.command === 'onScreenKeyboard') {\n this.showOnScreenKeyboard(command);\n }\n break;\n }\n case EToClientMessageType.FileExtension:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileExtension');\n this.fileReceiver.setExtensionFromBytes(view);\n break;\n\n case EToClientMessageType.FileMimeType:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileMimeType');\n this.fileReceiver.setMimeTypeFromBytes(view);\n break;\n\n case EToClientMessageType.FileContents:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileContents');\n this.fileReceiver.setContentsFromBytes(view);\n break;\n\n case EToClientMessageType.FreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Freeze frame');\n this.freezeFrame.start(view);\n break;\n\n case EToClientMessageType.UnfreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Un-Freeze frame');\n this.freezeFrame.invalidate();\n break;\n\n case EToClientMessageType.VideoEncoderAvgQP:\n this.videoService.setEncoder(anyData);\n break;\n\n case EToClientMessageType.LatencyTest: {\n const latencyTimings = decodeData(anyData);\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Got latency timings :',\n latencyTimings,\n );\n Logger.colored(...COLOR_CODES.FROM_UNREAL, latencyTimings);\n this.videoService.setLatencyTimings(latencyTimings);\n break;\n }\n\n case EToClientMessageType.InitialSettings:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InitialSettings message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.Protocol:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Protocol message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.InputControlOwnership:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InputControlOwnership message :',\n anyData,\n );\n break;\n\n default:\n Logger.warn(`unrecognized data received, packet ID ${view[0]}`);\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n changeLowBandwidth,\n disconnectStream,\n setConfig,\n setMaxFps,\n unrealFeature,\n} from '../store';\nimport { of, switchMap, take } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { Logger, Signal, tapLog } from '@3dsource/utils';\nimport { catchError, filter } from 'rxjs/operators';\nimport { DevModeService, SubService } from '../services';\nimport { DisconnectReason } from '../interfaces';\n\ninterface CustomWindow extends Window {\n emitUIInteraction: (data: unknown) => void;\n emitCommand: (data: unknown) => void;\n dropConnection: (data: unknown) => void;\n dropDC: (data: unknown) => void;\n dropPC: (data: unknown) => void;\n toggleBandwidth: (data: unknown) => void;\n setMaxFps: (data: number) => void;\n rebootInstance: (data: unknown) => void;\n startShowcase: (data: unknown) => void;\n restartApp: (data: unknown) => void;\n unrealHelp: (data: unknown) => void;\n setWarnTime: (data: number) => void;\n}\n\ndeclare let window: CustomWindow;\n\n@Injectable()\nexport class ConsoleExtensionsService extends SubService {\n #httpClient = inject(HttpClient);\n #isDevMode = inject(DevModeService).isDevMode;\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n if (!this.#isDevMode) {\n return;\n }\n window.dropConnection = () => {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.DropConnection,\n message: 'Manual Console Drop',\n }),\n );\n return true;\n };\n\n window.dropDC = () => {\n Signal.broadcast('dropDC');\n return true;\n };\n\n window.dropPC = () => {\n Signal.broadcast('dropPC');\n return true;\n };\n\n window.toggleBandwidth = () => {\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(take(1))\n .subscribe((isLow) =>\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: !isLow })),\n );\n return 'LowBandwidth => toggled';\n };\n window.setMaxFps = (maxFps: number) => {\n this.store.dispatch(setMaxFps({ maxFps }));\n return `Max Fps Set to ${maxFps}`;\n };\n window.restartApp = () => {\n this.store\n .select(unrealFeature.selectAwsInstance)\n .pipe(\n take(1),\n filter((data) => !!data.instanceName),\n tapLog('Instance', `Restart initiated`),\n switchMap((data) =>\n this.#httpClient.get(`//${data.instanceName}/restartapp`),\n ),\n catchError(() => of(null)),\n )\n .subscribe();\n };\n window.unrealHelp = () => this.unrealHelp();\n window.setWarnTime = (time: number) => {\n this.store.dispatch(setConfig({ config: { warnTimeout: time } }));\n };\n }\n\n private unrealHelp() {\n Logger.info(\n 'dropConnection() => Closes Web Socket and abort communication.',\n );\n Logger.info('toggleBandwidth() => toggles speed.');\n Logger.info('restartApp() => force restart Unreal app.');\n Logger.info('rebootInstance() => force reboot instance.');\n Logger.info('startShowcase(time) => start Showcase.');\n Logger.info('setWarnTime() => set time to appear the AFK window.');\n Logger.info('emitCommand(command) => send command to Unreal Engine.');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Truthy } from '@3dsource/utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DevModeService {\n get isDevMode() {\n return Truthy(localStorage.getItem('devMode'));\n }\n setDevMode(value: boolean) {\n return localStorage.setItem('devMode', value.toString());\n }\n}\n","import type { InputService } from '../services';\nimport { MouseButton } from '../constants';\nimport { fromEvent } from 'rxjs';\n\nexport default class TouchEmulator {\n private lastDistance = 0;\n private prevDistance = 0;\n private touchReset = true;\n private delta = 0;\n private moveSensitivityScale = 3;\n private prevX = 0;\n private prevY = 0;\n\n constructor(private host: InputService) {\n this.registerTouchEvents(host.video);\n }\n\n private getPosition({ clientX, clientY }: Position) {\n return {\n x: clientX - this.host.videoBoundingRect.left,\n y: clientY - this.host.videoBoundingRect.top,\n };\n }\n\n private getCenter(v1: Vector, v2: Vector) {\n return {\n x: (v2.x - v1.x) / 2 + v1.x,\n y: (v2.y - v1.y) / 2 + v1.y,\n };\n }\n\n private getDistance(v1: Vector, v2: Vector) {\n const quad = {\n x: Math.abs(v2.x - v1.x) ^ 2,\n y: Math.abs(v2.y - v1.y) ^ 2,\n };\n\n return Math.sqrt(quad.x + quad.y);\n }\n\n updateDistance(touches: TouchList) {\n const center = this.getCenter(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n this.lastDistance = this.getDistance(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n if (this.touchReset) {\n this.prevDistance = this.lastDistance;\n this.touchReset = false;\n }\n\n return center;\n }\n\n private touchToVector2({ clientX, clientY }: Position) {\n return {\n x: clientX,\n y: clientY,\n };\n }\n\n private twoFingersAction(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n\n this.lastDistance = 0;\n this.prevDistance = 0;\n this.prevX = center.x;\n this.prevY = center.y;\n this.host.emitMouseUp(MouseButton.MainButton, center.x, center.y);\n this.host.emitMouseDown(MouseButton.SecondaryButton, center.x, center.y);\n }\n\n private threeFingersActionMove(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n this.delta = this.lastDistance - this.prevDistance;\n\n const xx = center.x - this.prevX;\n const yy = center.y - this.prevY;\n\n this.host.emitMouseMove(\n center.x,\n center.y,\n this.moveSensitivityScale * xx,\n this.moveSensitivityScale * yy,\n );\n this.prevX = center.x;\n this.prevY = center.y;\n }\n\n private twoFingersActionZoom(touches: TouchList) {\n const center = this.updateDistance(touches);\n this.delta = this.lastDistance - this.prevDistance;\n\n if (Math.abs(this.delta) < 0.3) {\n return;\n }\n\n this.delta = (this.delta / Math.abs(this.delta)) * 2000;\n\n if (isNaN(this.delta)) {\n return;\n }\n\n this.prevDistance = this.lastDistance;\n this.host.emitMouseWheel(this.delta, center.x, center.y);\n }\n\n private registerTouchEvents(playerElement: HTMLVideoElement | null) {\n if (!playerElement) {\n return;\n }\n let finger: Finger | undefined;\n\n fromEvent<TouchEvent>(playerElement, 'touchstart', {\n passive: false,\n }).subscribe((e: TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const touches: TouchList = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersAction(touches);\n\n return;\n }\n\n /**\n * One finger actions below\n */\n\n this.prevDistance = 0;\n this.touchReset = true;\n\n if (finger === undefined) {\n const firstTouch = e.changedTouches[0];\n const { x, y } = this.getPosition(firstTouch);\n finger = {\n id: firstTouch.identifier,\n x,\n y,\n };\n // Hack: Mouse events require an enter and leave so we just\n // enter and leave manually with each touch as this event\n // is not fired with a touch device.\n playerElement.dispatchEvent(new MouseEvent('mouseenter', e));\n this.host.emitMouseDown(MouseButton.MainButton, finger.x, finger.y);\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchend', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < e.changedTouches.length; t++) {\n const touch = e.changedTouches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n this.host.emitMouseUp(MouseButton.MainButton, x, y);\n this.host.emitMouseUp(MouseButton.SecondaryButton, x, y);\n // Hack: Manual mouse leave event.\n playerElement.dispatchEvent(new MouseEvent('mouseleave', e));\n finger = undefined;\n\n break;\n }\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchmove', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n const touches = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n this.threeFingersActionMove(touches);\n\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersActionZoom(touches);\n\n return;\n }\n\n for (let t = 0; t < touches.length; t++) {\n const touch = e.touches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n\n this.host.emitMouseMove(\n x,\n y,\n this.moveSensitivityScale * (x - finger.x),\n this.moveSensitivityScale * (y - finger.y),\n );\n finger.x = x;\n finger.y = y;\n\n break;\n }\n }\n });\n }\n}\n\ninterface Vector {\n x: number;\n y: number;\n}\n\ninterface Finger extends Vector {\n id: number;\n}\n\ninterface Position {\n clientX: number;\n clientY: number;\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport { Subject } from 'rxjs';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { EMessageTypeValues } from '../constants';\nimport { EMessageType } from '../constants';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { fromSignal, resetAfk, sendSignal } from '../helpers';\nimport { COLOR_CODES, generateUuid, Logger } from '@3dsource/utils';\nimport { commandStarted, dataChannelReady, unrealFeature } from '../store';\nimport { Store } from '@ngrx/store';\nimport { Actions, ofType } from '@ngrx/effects';\n\n@Injectable()\nexport class UnrealCommunicatorService {\n private action$ = inject(Actions);\n private store = inject(Store);\n private commandTelemetryService = inject(CommandTelemetryService);\n private freezeFrameService = inject(FreezeFrameService);\n private webRtcPlayerService = inject(WebRtcPlayerService);\n private videoService = inject(VideoService);\n private destroy$ = new Subject<void>();\n\n private cirrusConnected = this.store.selectSignal(\n unrealFeature.selectCirrusConnected,\n );\n\n constructor() {\n this.init();\n }\n\n protected init() {\n this.emitUIInteraction = this.commandTelemetryService.decorate(\n this.emitUIInteraction.bind(this),\n );\n this.listenVideo();\n this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {\n this.requestInitialSettings();\n this.requestQualityControl();\n });\n }\n\n destroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n sendCommandToUnreal(data: MetaBoxCommandPacket) {\n if (this.webRtcPlayerService.canSend()) {\n const uniqId = data?.correlationId ?? generateUuid();\n const sendData: MetaBoxCommandPacket = { ...data, correlationId: uniqId };\n Logger.colored(...COLOR_CODES.TO_UNREAL, sendData);\n this.emitUIInteraction(sendData);\n\n this.store.dispatch(\n commandStarted({ id: uniqId, command: data.command as string }),\n );\n }\n }\n\n emitUIInteraction(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.UIInteraction, descriptor);\n }\n\n /**\n A build-in command can be sent to the UE4 client. The commands are defined by a\n JSON descriptor and will be executed automatically.\n The currently supported commands are:\n\n 1. A command to run any console command:\n \"{ ConsoleCommand: <string> }\"\n\n 2. A command to change the resolution to the given width and height.\n \"{ Resolution.Width: <value>, Resolution.Height: <value> }\"\n */\n emitCommand(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.Command, descriptor);\n }\n\n sendInputData(data: ArrayBuffer) {\n try {\n resetAfk();\n this.webRtcPlayerService.send(data);\n } catch (error) {\n if (this.cirrusConnected()) {\n Logger.error(error);\n }\n }\n }\n\n private emitDescriptor(\n messageType: EMessageTypeValues,\n descriptor: MetaBoxCommandPacket,\n ) {\n // Convert the descriptor object into a JSON string.\n const descriptorAsString = JSON.stringify(descriptor);\n\n // Add the UTF-16 JSON string to the array byte buffer, going two bytes at\n // a time.\n const data = new DataView(\n new ArrayBuffer(1 + 2 + 2 * descriptorAsString.length),\n );\n let byteIdx = 0;\n data.setUint8(byteIdx, messageType);\n byteIdx++;\n data.setUint16(byteIdx, descriptorAsString.length, true);\n byteIdx += 2;\n\n for (let i = 0; i < descriptorAsString.length; i++) {\n data.setUint16(byteIdx, descriptorAsString.charCodeAt(i), true);\n byteIdx += 2;\n }\n\n this.sendInputData(data.buffer);\n }\n\n private requestInitialSettings() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestInitialSettings]).buffer,\n );\n }\n\n private requestQualityControl() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestQualityControl]).buffer,\n );\n }\n\n protected listenVideo() {\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized).subscribe(() =>\n this.prepareScreen(),\n );\n }\n\n private prepareScreen() {\n this.showPlayOverlay();\n this.freezeFrameService.invalidate();\n }\n\n private showPlayOverlay() {\n const callback = () => {\n this.videoService.play();\n resetAfk();\n sendSignal(UnrealInternalSignalEvents.VideoPlayClick, {\n text: 'Play Clicked',\n });\n\n return true;\n };\n\n sendSignal(UnrealInternalSignalEvents.ShowPlayButton, {\n text: 'Play',\n callback,\n });\n }\n}\n","import type { IKeyCode, IKeyName } from '@3dsource/utils';\nimport {\n InvertedKeyMap,\n KeyboardNumericCode,\n Logger,\n Truthy,\n} from '@3dsource/utils';\nimport type {\n InputProps,\n NormalizeAndQuantizeSignedValue,\n NormalizeAndQuantizeUnsignedValue,\n UnquantizeAndDenormalizeUnsignedValue,\n} from '../interfaces';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport type { EMessageTypeValues } from '../constants';\nimport {\n EMessageType,\n InputOptions,\n MouseButton,\n MouseButtonsMask,\n SpecialKeyCodes,\n} from '../constants';\nimport type { Observable } from 'rxjs';\nimport { fromEvent, merge, startWith, Subject, takeUntil } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n} from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport TouchEmulator from '../helpers/TouchEmulator';\nimport { fromResizeObserver, fromSignal } from '../helpers';\nimport { UnrealCommunicatorService } from './unreal-communicator.service';\nimport { DevModeService, SubService, VideoService } from '../services';\nimport { unrealFeature } from '../store';\n\nexport class InputService extends SubService {\n private commandsSender = inject(UnrealCommunicatorService);\n private isDevMode = inject(DevModeService).isDevMode;\n private videoService = inject(VideoService);\n\n readonly defaultKeys = [\n KeyboardNumericCode.KeyW,\n KeyboardNumericCode.KeyS,\n KeyboardNumericCode.KeyA,\n KeyboardNumericCode.KeyD,\n KeyboardNumericCode.ArrowUp,\n KeyboardNumericCode.ArrowDown,\n KeyboardNumericCode.ArrowLeft,\n KeyboardNumericCode.ArrowRight,\n KeyboardNumericCode.NumpadAdd,\n KeyboardNumericCode.NumpadSubtract,\n KeyboardNumericCode.ControlRight,\n KeyboardNumericCode.Equal,\n KeyboardNumericCode.Minus,\n KeyboardNumericCode.NumpadDecimal,\n ];\n private availableKeys: IKeyCode[] = this.defaultKeys;\n private options!: InputProps;\n private reInit$ = new Subject<void>();\n private deactivatedVideoTrigger$!: Observable<unknown>;\n\n private normalizeAndQuantizeUnsigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeUnsignedValue;\n private unQuantizeAndDenormalizeUnsigned!: (\n x: number,\n y: number,\n ) => UnquantizeAndDenormalizeUnsignedValue;\n private normalizeAndQuantizeSigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeSignedValue;\n\n videoBoundingRect: DOMRect = new DOMRect(0, 0, 1, 1);\n fingerIds = new Map();\n maxByteValue = 255;\n fingers = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];\n\n private offsetParams: OffsetParams = {\n scaleX: 1,\n scaleY: 1,\n scaledHeight: 0,\n scaledWidth: 0,\n offsetByY: 0,\n offsetByX: 0,\n };\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n const visibilityHiddenTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'hidden'),\n filter(Truthy),\n );\n const visibilityVisibleTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n startWith(true),\n );\n\n this.deactivatedVideoTrigger$ = merge(\n this.disconnect$,\n this.reInit$,\n visibilityHiddenTrigger$,\n );\n\n merge(\n visibilityVisibleTrigger$,\n this.store.select(unrealFeature.selectViewportReady).pipe(filter(Truthy)),\n ).subscribe(() => this.setup());\n }\n\n useKeyboardKeys(keys: IKeyCode[]) {\n this.availableKeys = keys || [];\n }\n\n get video() {\n return this.videoService.video;\n }\n\n private setup() {\n const video = this.video;\n if (!video) {\n return;\n }\n Logger.log('DEBUG: video initialized: ', video);\n this.options = InputOptions;\n this.reInit$.next();\n\n merge(\n fromResizeObserver(video),\n fromSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer),\n )\n .pipe(debounceTime(300), takeUntil(this.deactivatedVideoTrigger$))\n .subscribe(() => {\n this.setupNormalizeAndQuantize(video);\n });\n\n this.setupNormalizeAndQuantize(video);\n this.registerInputs(video);\n }\n\n /**\n * We use `object-fit: cover` on the video element. Since the video can have\n * a different aspect ratio from its container (and potentially be larger),\n * we need to calculate offsets and scale factors to map container (e.g., mouse)\n * coordinates back to the actual video coordinates.\n *\n * @param videoElement The video element whose scaling and positioning we need\n * @returns Object containing offset and scale info for coordinate normalization\n * @private\n */\n private getObjectFitOffset(videoElement: HTMLVideoElement) {\n const { width, height } = this.videoBoundingRect;\n const { videoWidth, videoHeight } = videoElement;\n\n Logger.log('Video Quantizing with => ', this.videoBoundingRect, {\n videoWidth,\n videoHeight,\n });\n\n // Compute aspect ratios\n const containerRatio = width / height;\n const videoRatio = videoWidth / videoHeight;\n\n // Determine how much to scale the video to fit the container (cover mode)\n const scale =\n videoRatio > containerRatio ? height / videoHeight : width / videoWidth;\n\n // Calculate the displayed (scaled) dimensions of the video\n const scaledWidth = videoWidth * scale;\n const scaledHeight = videoHeight * scale;\n\n // Offsets in x/y directions (like \"padding\") once the video is scaled\n const offsetByX = (width - scaledWidth) / 2;\n const offsetByY = (height - scaledHeight) / 2;\n\n // Scale factors for coordinate transformation from container space to video space\n const scaleX = width / scaledWidth;\n const scaleY = height / scaledHeight;\n\n return {\n offsetByX,\n offsetByY,\n scaleX,\n scaleY,\n scaledWidth,\n scaledHeight,\n };\n }\n\n private setupNormalizeAndQuantize(videoElement: HTMLVideoElement) {\n if (videoElement) {\n this.videoBoundingRect = videoElement.getBoundingClientRect();\n this.offsetParams = this.getObjectFitOffset(videoElement);\n\n // Unsigned XY positions are the ratio (0.0..1.0) along a viewport axis,\n // quantized into an uint16 (0..65536).\n // Signed XY deltas are the ratio (-1.0..1.0) along a viewport axis,\n // quantized into an int16 (-32767..32767).\n // This allows the browser viewport and client viewport to have a different\n // size.\n // Hack: Currently we set an out-of-range position to an extreme (65535)\n // as we can't yet accurately detect mouse enter and leave events\n // precisely inside a video with an aspect ratio which causes mattes.\n\n this.normalizeAndQuantizeUnsigned = (x, y) => {\n const normalizedX = x / videoElement.clientWidth;\n const normalizedY = y / videoElement.clientHeight;\n\n if (\n normalizedX < 0.0 ||\n normalizedX > 1.0 ||\n normalizedY < 0.0 ||\n normalizedY > 1.0\n ) {\n return {\n inRange: false,\n x: 65535,\n y: 65535,\n };\n } else {\n return {\n inRange: true,\n x: normalizedX * 65536,\n y: normalizedY * 65536,\n };\n }\n };\n\n this.unQuantizeAndDenormalizeUnsigned = (x, y) => {\n const normalizedX = x / 65536;\n const normalizedY = y / 65536;\n return {\n x: normalizedX * videoElement.clientWidth,\n y: normalizedY * videoElement.clientHeight,\n };\n };\n\n // Signed.\n this.normalizeAndQuantizeSigned = (x, y) => {\n const normalizedX = x / (0.5 * videoElement.clientWidth);\n const normalizedY = y / (0.5 * videoElement.clientHeight);\n return {\n x: normalizedX * 32767,\n y: normalizedY * 32767,\n };\n };\n }\n }\n\n private sendInputData(data: ArrayBuffer) {\n this.commandsSender.sendInputData(data);\n }\n\n private registerInputs(video: HTMLVideoElement) {\n merge(\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(distinctUntilChanged(), filter(Truthy)),\n fromEvent(window, 'blur'),\n )\n .pipe(\n filter(() => !!video),\n takeUntil(this.deactivatedVideoTrigger$),\n )\n .subscribe(() => this.releaseMouseButtons(255, 0, 0));\n\n this.registerMouseEnterAndLeaveEvents(video);\n this.registerHoveringMouseEvents(video);\n this.registerKeyboardEvents(this.availableKeys);\n\n if (InputOptions.fakeMouseWithTouches) {\n new TouchEmulator(this);\n } else {\n this.registerTouchEvents(video);\n }\n }\n\n private getTouchPositionWithOffset({ clientX, clientY }: Touch) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (clientX - offsetByX - this.videoBoundingRect.left) * scaleX,\n y: (clientY - offsetByY - this.videoBoundingRect.top) * scaleY,\n };\n }\n\n private getMousePositionWithOffset({ offsetX, offsetY }: MouseEvent) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (offsetX - offsetByX) * scaleX,\n y: (offsetY - offsetByY) * scaleY,\n };\n }\n\n private registerTouchEvents(htmlVideoElement: HTMLVideoElement) {\n // We need to assign a unique identifier to each finger.\n // We do this by mapping each Touch object to the identifier.\n\n const rememberTouch = (touch: Touch) => {\n const finger = this.fingers.pop();\n if (finger === undefined) {\n Logger.info('exhausted touch identifiers');\n return;\n }\n this.fingerIds.set(touch.identifier, finger);\n };\n\n const forgetTouch = (touch: Touch) => {\n this.fingers.push(this.fingerIds.get(touch.identifier));\n // Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop\n this.fingers.sort(function (a, b) {\n return b - a;\n });\n this.fingerIds.delete(touch.identifier);\n };\n\n const emitTouchData = (type: EMessageTypeValues, touches: TouchList) => {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n let byte = 2;\n const numTouches = 1; // the number of touches to be sent this message\n const touch = touches[t];\n const { x, y } = this.getTouchPositionWithOffset(touch);\n Logger.info(`F${this.fingerIds.get(touch.identifier)}=(${x}, ${y})`);\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const data = new DataView(new ArrayBuffer(9));\n\n data.setUint8(0, type);\n data.setUint8(1, numTouches);\n data.setUint16(byte, coord.x, true);\n byte += 2;\n data.setUint16(byte, coord.y, true);\n byte += 2;\n data.setUint8(byte, this.fingerIds.get(touch.identifier));\n byte += 1;\n // force is between 0.0 and 1.0, so quantize into byte.\n // iOs bug: Forced to be always 0.5 on all devices as we do not use forced touch any way;/\n data.setUint8(byte, this.maxByteValue * 0.5);\n byte += 1;\n data.setUint8(byte, coord.inRange ? 1 : 0);\n byte += 1;\n this.sendInputData(data.buffer);\n }\n };\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchstart')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n this.focusWindow();\n const touches: TouchList = e.changedTouches;\n // Assign a unique identifier to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n rememberTouch(touches[t]);\n }\n Logger.info('touch start');\n emitTouchData(EMessageType.TouchStart, touches);\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchend')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.changedTouches;\n Logger.info('touch end');\n\n emitTouchData(EMessageType.TouchEnd, touches);\n\n // Re-cycle unique identifiers previously assigned to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n forgetTouch(touches[t]);\n }\n\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchmove')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n emitTouchData(EMessageType.TouchMove, e.touches);\n e.preventDefault();\n });\n }\n\n focusWindow() {\n window.focus();\n }\n\n emitMouseMove(x: number, y: number, deltaX: number, deltaY: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const delta = this.normalizeAndQuantizeSigned(deltaX, deltaY);\n const Data = new DataView(new ArrayBuffer(9));\n\n Data.setUint8(0, EMessageType.MouseMove);\n Data.setUint16(1, coord.x, true);\n Data.setUint16(3, coord.y, true);\n Data.setInt16(5, delta.x, true);\n Data.setInt16(7, delta.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseDown(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseDown);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseUp(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseUp);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseWheel(delta: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(7));\n Data.setUint8(0, EMessageType.MouseWheel);\n Data.setInt16(1, delta, true);\n Data.setUint16(3, coord.x, true);\n Data.setUint16(5, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n private releaseMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseUp(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseUp(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseUp(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseUp(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseUp(MouseButton.FifthButton, x, y);\n }\n }\n\n // If the user has any mouse buttons pressed then press them again.\n private pressMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseDown(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseDown(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseDown(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseDown(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseDown(MouseButton.FifthButton, x, y);\n }\n }\n\n private registerHoveringMouseEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmousemove = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseMove(x, y, e.movementX, e.movementY);\n e.preventDefault();\n };\n\n htmlVideoElement.onmousedown = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.focusWindow();\n this.emitMouseDown(e.button, x, y);\n e.preventDefault();\n };\n\n htmlVideoElement.onmouseup = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseUp(e.button, x, y);\n e.preventDefault();\n };\n\n // When the context menu is shown, then it is safest to release the button\n // pressed when the event happened. This will guarantee we will\n // get at least one mouse up corresponding to a mouse down event. Otherwise,\n // the mouse can get stuck.\n // https://github.com/facebook/react/issues/5531\n // playerElement.oncontextmenu = (e) => {\n // e.preventDefault();\n // this.emitMouseUp(e.button, e.offsetX, e.offsetY);\n // };\n\n fromEvent<WheelEvent>(htmlVideoElement, 'wheel')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e: WheelEvent) => {\n this.emitMouseWheel(e.deltaY * -120, e.offsetX, e.offsetY);\n e.preventDefault();\n });\n\n (htmlVideoElement as Clickable).pressMouseButtons = (e: MouseEvent) => {\n this.pressMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n\n (htmlVideoElement as Clickable).releaseMouseButtons = (e: MouseEvent) => {\n this.releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n }\n\n private registerMouseEnterAndLeaveEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmouseenter = (e) => {\n this.focusWindow();\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseEnter);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).pressMouseButtons(e);\n };\n\n htmlVideoElement.onmouseleave = (e) => {\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseLeave);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).releaseMouseButtons(e);\n };\n }\n\n // Browser keys do not have a charCode so we only need to test keyCode.\n private isKeyCodeBrowserKey(keyCode: number): boolean {\n // Function keys or tab key.\n return (keyCode >= 112 && keyCode <= 123) || keyCode === 9;\n }\n\n private getKeyCode(e: KeyboardEvent): number {\n if (e.keyCode === SpecialKeyCodes.Shift && e.code === 'ShiftRight')\n return SpecialKeyCodes.RightShift;\n else if (e.keyCode === SpecialKeyCodes.Control && e.code === 'ControlRight')\n return SpecialKeyCodes.RightControl;\n else if (e.keyCode === SpecialKeyCodes.Alt && e.code === 'AltRight')\n return SpecialKeyCodes.RightAlt;\n else return e.keyCode;\n }\n\n private registerKeyboardEvents(availableKeys: IKeyCode[]) {\n const availableKeyNames = Object.entries(availableKeys).map(([, value]) => {\n return InvertedKeyMap[value];\n });\n\n const keyBlock = (event: KeyboardEvent) => {\n const code: IKeyName = event.code as IKeyName;\n const isInputFieldFocused =\n (event.target as HTMLElement)?.localName === 'input';\n const keyMatch = availableKeyNames.includes(code);\n\n if (this.isDevMode && !keyMatch) {\n Logger.warn(\n 'Code=>',\n code,\n 'Keyboard event is not filtered in DEV Mode. App may behave inappropriately!',\n );\n return isInputFieldFocused;\n }\n\n return isInputFieldFocused || !keyMatch;\n };\n this.startListenKeys(keyBlock);\n }\n\n private startListenKeys(_filter?: (event: KeyboardEvent) => boolean) {\n const filter = _filter ?? (() => false);\n\n document.onkeydown = (e) => {\n if (filter(e)) {\n return;\n }\n\n const isCtrlOrCommand = e.ctrlKey || e.metaKey;\n\n const isPlusOrMinus =\n e.keyCode === KeyboardNumericCode.Equal ||\n e.keyCode === KeyboardNumericCode.Minus;\n if (isCtrlOrCommand && isPlusOrMinus) {\n return;\n }\n\n this.sendInputData(\n new Uint8Array([\n EMessageType.KeyDown,\n this.getKeyCode(e),\n Number(e.repeat),\n ]).buffer,\n );\n // Backspace is not considered a keypress in JavaScript, but we need it\n // to be so characters may be deleted in a UE4 text entry field.\n if (e.keyCode === SpecialKeyCodes.BackSpace) {\n (document as DocumentClickable).onkeypress({\n charCode: SpecialKeyCodes.BackSpace,\n });\n //document.dispatchEvent(new KeyboardEvent('keydown',{key: name, keyCode: SpecialKeyCodes.BackSpace, code: SpecialKeyCodes.BackSpace, repeat: false} ));\n }\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeyup = (e) => {\n if (filter(e)) {\n return;\n }\n this.sendInputData(\n new Uint8Array([EMessageType.KeyUp, this.getKeyCode(e)]).buffer,\n );\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeypress = (e) => {\n if (filter(e)) {\n return;\n }\n const data = new DataView(new ArrayBuffer(3));\n data.setUint8(0, EMessageType.KeyPress);\n data.setUint16(1, e.charCode, true);\n this.sendInputData(data.buffer);\n };\n }\n}\n\ninterface OffsetParams {\n scaleX: number;\n scaleY: number;\n scaledHeight: number;\n scaledWidth: number;\n offsetByY: number;\n offsetByX: number;\n}\n\ntype Clickable = HTMLVideoElement & {\n releaseMouseButtons: (e: MouseEvent) => void;\n pressMouseButtons: (e: MouseEvent) => void;\n};\n\ntype DocumentClickable = Document & {\n onkeypress: (data: unknown) => void;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Semaphore, tapLog } from '@3dsource/utils';\nimport { UNREAL_CONFIG } from '../constants';\n\n@Injectable()\nexport class RegionsPingService {\n private httpClient = inject(HttpClient);\n private unrealInitialConfig = inject(UNREAL_CONFIG, { optional: true });\n public config = {\n ping_count: 2,\n ping_timeout: 2000,\n max_parallel_requests: 10,\n bust_cache: true,\n };\n\n constructor() {\n if (!this.unrealInitialConfig?.regionsPingUrl) {\n return;\n }\n }\n\n public getFastest(\n regionListUrl = this.unrealInitialConfig?.regionsPingUrl || '',\n ): Observable<string | undefined> {\n return this.getProviders(regionListUrl).pipe(\n switchMap((providers: ProvidersData) => this.getPingResult(providers)),\n catchError(() => of(null)),\n tapLog('PingResult'),\n map((data) => data?.region_code),\n );\n }\n\n public getPingResult(\n providers: ProvidersData,\n ): Observable<PingResult | null> {\n const regions = providers.regions;\n this.config.ping_timeout = providers.timeout || this.config.ping_timeout;\n return from(this.startPinging(regions));\n }\n\n public getProviders(\n regionList = this.unrealInitialConfig?.regionsPingUrl || '',\n ) {\n return this.httpClient.get<ProvidersData>(regionList);\n }\n\n private startPinging(endpoints: Region[]): Promise<PingResult | null> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const pingResults: PingResult[] = [];\n const semaphore = new Semaphore(10);\n const tasks = endpoints.map(async ({ region_code, url, timeout }) => {\n await semaphore.acquire();\n try {\n const result = await this.checkLatency(url, timeout);\n const data = { region_code, result };\n pingResults.push({ region_code, result });\n resolve(data);\n } catch {\n pingResults.push({ region_code: undefined, result: [] });\n } finally {\n semaphore.release();\n }\n const okValues = pingResults.filter(\n (pingResult) => pingResult.result.length > 1,\n );\n if (okValues.length) {\n return okValues[0];\n }\n return okValues;\n });\n await Promise.all(tasks);\n resolve(null);\n });\n }\n\n private async checkLatency(\n endpoint: string,\n timeout: number = this.config.ping_timeout,\n ) {\n const pingResults = [];\n\n for (let i = 0; i < this.config.ping_count; i++) {\n const startTime = performance.now();\n try {\n await this.fetchWithTimeout(\n this.config.bust_cache\n ? `${endpoint}?&cache_buster=${performance.now()}`\n : endpoint,\n {\n method: 'GET',\n mode: 'no-cors',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n Pragma: 'no-cache',\n Expires: '0',\n },\n credentials: 'omit', // Optional: prevents sending or receiving cookies, which can affect caching.\n },\n timeout,\n );\n } catch {\n //Do not remove this block, else finally will not work!\n } finally {\n const latency = Math.round(performance.now() - startTime);\n pingResults.push(latency);\n }\n }\n return pingResults;\n }\n\n private async fetchWithTimeout(\n url: string,\n options: any = {},\n timeout: number,\n ) {\n const controller = new AbortController();\n options.signal = controller.signal;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\ninterface ProvidersData {\n timeout?: number;\n regions: Region[];\n}\n\ninterface Region {\n region_code: string;\n url: string;\n timeout?: number;\n}\n\ninterface PingResult {\n region_code: string | undefined;\n result: number[];\n}\n","import { Store } from '@ngrx/store';\nimport { inject, Injectable } from '@angular/core';\nimport { auditTime } from 'rxjs';\nimport { filter, map, withLatestFrom } from 'rxjs/operators';\nimport { trackMixpanelEvent, unrealFeature } from '../store';\nimport type {\n AwsInstance,\n IAggregatedStat,\n InboundVideoStats,\n LBMStats,\n} from '../interfaces';\nimport { VideoService } from './video.service';\n\n@Injectable()\nexport class StreamStatusTelemetryService {\n #store = inject(Store);\n #videoService = inject(VideoService);\n\n constructor() {\n this.init();\n }\n\n protected init() {\n this.#videoService.videoStats$\n .pipe(\n withLatestFrom(\n this.#store.select(unrealFeature.selectAwsInstance),\n this.#store.select(unrealFeature.selectLowBandwidth),\n this.#store.select(unrealFeature.selectLowBandwidthStats),\n this.#store.select(unrealFeature.selectCirrusConnected),\n ),\n auditTime(5000),\n filter(([, , , , cirrusConnected]) => cirrusConnected),\n map(([data, signalingServer, isLowBandwidth, lbmStats]) =>\n this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats),\n ),\n )\n .subscribe((data) => this.trackEventToMixPanel(data));\n }\n\n private mapEventData(\n data: IAggregatedStat,\n signalingServer: AwsInstance,\n isLowBandwidth: boolean,\n lbmStats: LBMStats | undefined,\n ) {\n const {\n bitrate,\n VideoEncoderQP,\n framesPerSecond,\n frameWidth,\n frameHeight,\n jitter,\n packetsLost,\n currentRoundTripTime,\n } = data.aggregatedStats;\n\n return {\n runTime: data.aggregatedStats.runTime,\n frameWidth,\n frameHeight,\n isLowBandwidth,\n client: signalingServer.wsUrl,\n pixelRatio: window.devicePixelRatio,\n framesPerSecond,\n jitter,\n packetsLost,\n instanceName: signalingServer.instanceName,\n bitrate,\n lbmStats,\n rtt: currentRoundTripTime,\n VideoEncoderQP,\n };\n }\n\n private trackEventToMixPanel(data: Partial<InboundVideoStats>) {\n this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AFKService } from '../afk.service';\n\n@Injectable()\nexport class AfkPlaywrightService extends AFKService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SignallingService } from '../index';\nimport { EMPTY } from 'rxjs';\nimport { dataChannelConnected, setUnrealPlaywrightConfig } from '../../store';\n\n@Injectable()\nexport class SignallingPlaywrightService extends SignallingService {\n constructor() {\n super();\n }\n\n override init() {\n return;\n }\n\n override connectToSignaling() {\n this.store.dispatch(setUnrealPlaywrightConfig());\n this.store.dispatch(\n dataChannelConnected({\n statusMessage: 'Playwright set data channel connected',\n }),\n );\n return EMPTY;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { UnrealCommunicatorService } from '../unreal-communicator.service';\n\n@Injectable()\nexport class UnrealCommunicatorPlaywrightService extends UnrealCommunicatorService {\n override init() {\n return;\n }\n\n override sendCommandToUnreal() {\n return;\n }\n\n override sendInputData() {\n return;\n }\n\n override listenVideo() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AggregatorService } from '../aggregator.service';\n\n@Injectable()\nexport class AggregatorPlaywrightService extends AggregatorService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FreezeFrameService } from '../freeze-frame.service';\n\n@Injectable()\nexport class FreezeFramePlaywrightService extends FreezeFrameService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CommandTelemetryService } from '../command-telemetry.service';\n\n@Injectable()\nexport class CommandTelemetryPlaywrightService extends CommandTelemetryService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { StreamStatusTelemetryService } from '../stream-status-telemetry.service';\n\n@Injectable()\nexport class StreamStatusTelemetryPlaywrightService extends StreamStatusTelemetryService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ConsoleExtensionsService } from '../console-extensions.service';\n\n@Injectable()\nexport class ConsoleExtensionsPlaywrightService extends ConsoleExtensionsService {\n override init() {\n return;\n }\n}\n","import { FileReceiverService } from '../file-receiver.service';\n\nexport class FileReceiverPlaywrightService extends FileReceiverService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { InputService } from '../index';\n\n@Injectable()\nexport class InputPlaywrightService extends InputService {\n override init() {\n return;\n }\n}\n","/*\n * Copyright (c) 2025.\n * 3DSource.com. Sergii Karanda steve@3dsource.com. All Rights Reserved.\n */\n\nexport const ReceivedMimeTypes = {\n ApplicationJson: 'application/json',\n} as const;\nexport type ReceivedMimeType =\n (typeof ReceivedMimeTypes)[keyof typeof ReceivedMimeTypes];\n","import { inject, Injectable } from '@angular/core';\nimport type { ReceivedFile } from './file-receiver.service';\nimport { FileReceiverService } from './file-receiver.service';\nimport { generateUuid, Logger, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap, take, timeout } from 'rxjs';\nimport type { ObservedCallbackResponse } from '../helpers';\nimport { catchError, filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@3dsource/types-unreal';\nimport type { ReceivedMimeType } from '../interfaces/ReceivedMimeTypes';\nimport { ReceivedMimeTypes } from '../interfaces/ReceivedMimeTypes';\n\ntype FileHandlers = Record<\n ReceivedMimeType,\n (data: ReceivedFile, correlationId: string) => Observable<unknown>\n>;\n\n@Injectable()\nexport class FileHandlerService {\n private fileService = inject(FileReceiverService);\n private fileHandlers: FileHandlers = {\n [ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),\n };\n\n private handleJsonFile(data: ReceivedFile, correlationId: string) {\n const { blob } = data;\n return from(blob.text()).pipe(\n map((text: string) => JSON.parse(text)),\n filter(({ commandCallback }) => {\n return commandCallback.correlationId === correlationId;\n }),\n );\n }\n\n observeFileResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n >(\n mimetype: ReceivedMimeType,\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n ): Observable<{ commandCallback: ObservedCallbackResponse<T> } | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = this.fileService.fileComplete$.pipe(\n switchMap((data) => {\n const { valid } = data;\n if (valid && this.fileHandlers[mimetype]) {\n return this.fileHandlers[mimetype](data, correlationId).pipe(\n filter(Truthy),\n );\n }\n return of(null);\n }),\n timeout(timeOut),\n catchError((e) => {\n Logger.error(e);\n return of(null);\n }),\n take(1),\n );\n setTimeout(() => sender(out), 0);\n return observable as never;\n }\n}\n","import type { Observable } from 'rxjs';\nimport {\n filter,\n fromEvent,\n map,\n merge,\n Subject,\n takeUntil,\n throttleTime,\n} from 'rxjs';\nimport { inject, Injectable } from '@angular/core';\nimport { distinctUntilChanged, tap } from 'rxjs/operators';\nimport { saveAnalyticsEvent, unrealFeature } from '../store';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, Truthy } from '@3dsource/utils';\n\n@Injectable()\nexport class AnalyticsService {\n #store = inject(Store);\n #destroy$ = new Subject<void>();\n\n sendEventToMixPanel(\n name: string,\n params: Record<string, unknown> = {},\n ): void {\n Logger.log('Analytics Event:', name, params);\n this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));\n }\n\n constructor() {\n const abortSignal$ = this.#store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n filter(Falsy),\n map(() => void 0),\n );\n this.#store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n tap(() => this.monitorMouse(abortSignal$)),\n )\n .subscribe();\n }\n\n private monitorMouse(abortSignal$: Observable<void>) {\n this.#destroy$.next();\n const stop$ = merge(this.#destroy$.asObservable(), abortSignal$);\n const element = document.getElementById('streamingVideo');\n\n if (!element) {\n return;\n }\n\n // Monitor mousewheel events\n const mousewheel$ = fromEvent<WheelEvent>(element, 'wheel').pipe(\n takeUntil(stop$),\n throttleTime(1000),\n );\n\n // Monitor mouse button states\n const mousedown$ = fromEvent<MouseEvent>(element, 'mousedown').pipe(\n takeUntil(stop$),\n );\n const touchStart$ = fromEvent<TouchEvent>(element, 'touchstart').pipe(\n takeUntil(stop$),\n );\n const touchMove$ = fromEvent<TouchEvent>(element, 'touchmove').pipe(\n takeUntil(stop$),\n throttleTime(200),\n );\n\n // Track mouse movement while the left or right button is pressed\n mousedown$\n .pipe(\n filter((event) => event.button === 0 || event.button === 2),\n tap((downEvent) => {\n const { offsetX, offsetY } = this.getOffset(downEvent, element);\n this.sendEventToMixPanel('mouse_interaction', {\n viewX: offsetX / element.clientWidth,\n viewY: offsetY / element.clientHeight,\n action: downEvent.button === 0 ? 'spinning' : 'panning',\n });\n }),\n )\n .subscribe();\n\n // Track mouse movement while the left or right button is pressed\n touchStart$\n .pipe(\n tap((downEvent) => {\n const totalTouches = downEvent.touches.length;\n const touch = downEvent.touches[0];\n const { offsetX, offsetY } = this.getOffset(touch, element);\n this.sendEventToMixPanel('touch_interaction', {\n viewX: offsetX / element.clientWidth,\n viewY: offsetY / element.clientHeight,\n action: totalTouches === 1 ? 'spinning' : 'panning',\n });\n }),\n )\n .subscribe();\n\n let initialTouchDistance = 0;\n // Subscribe to mousewheel events\n touchMove$.subscribe((event: TouchEvent) => {\n const totalTouches = event.touches.length;\n if (totalTouches < 2) {\n return;\n }\n\n // Calculate the current distance between two touches\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const offset1 = this.getOffset(touch1, element);\n const offset2 = this.getOffset(touch2, element);\n const currentDistance = Math.sqrt(\n Math.pow(offset2.offsetX - offset1.offsetX, 2) +\n Math.pow(offset2.offsetY - offset1.offsetY, 2),\n );\n\n // Determine if zooming in or out based on distance change\n const deltaDistance = currentDistance - initialTouchDistance;\n const isZoomingIn = deltaDistance > 0;\n\n // Only send event if there's a significant change (avoid noise)\n if (Math.abs(deltaDistance) > 10) {\n this.sendEventToMixPanel('touch_zoom_interaction', {\n delta: isZoomingIn ? 1 : -1,\n action: isZoomingIn ? 'zoomin' : 'zoomout',\n });\n\n // Update initial distance for next comparison\n initialTouchDistance = currentDistance;\n }\n });\n\n mousewheel$.subscribe((event: WheelEvent) => {\n this.sendEventToMixPanel('mouse_zoom_interaction', {\n delta: -(event.deltaY / Math.abs(event.deltaY)),\n action: event.deltaY < 0 ? 'zoomin' : 'zoomout',\n });\n });\n }\n\n private getOffset(event: MouseEvent | Touch, element: HTMLElement) {\n const rect = element.getBoundingClientRect(); // in viewport coords\n const offsetX = event.clientX - rect.left; // relative to element\n const offsetY = event.clientY - rect.top;\n\n return { offsetX, offsetY };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { filter, withLatestFrom } from 'rxjs/operators';\nimport { clampf, Logger } from '@3dsource/utils';\nimport { VideoService } from './video.service';\nimport { setMaxFps, unrealFeature } from '../store';\nimport type { IAggregatedStat } from '../interfaces';\nimport { mapQpToQuality } from '../helpers';\n\ntype Decision = 'decrease' | 'hold' | 'increase';\n\n/**\n * Adaptive FPS controller that monitors the incoming WebRTC video stream\n * quality and dynamically adjusts Unreal Engine's `t.MaxFPS` console variable.\n *\n * ## How it works\n *\n * The service subscribes to `VideoService.videoStats$` (emitted every 250 ms)\n * and collects samples of FPS, bitrate, and QP (Quantisation Parameter).\n * Every {@link SAMPLE_WINDOW} ticks (~2 s) it averages the collected samples\n * and feeds them into a set of **fuzzy-logic membership functions** that\n * classify each metric into overlapping quality bands.\n *\n * ### Input signals\n *\n * **1. FPS ratio** = `actualFPS / currentTargetFPS` (0..1+)\n *\n * | Band | Range | Meaning |\n * |--------|---------------------|-----------------------------------------------|\n * | low | ratio < 0.7 → 1.0, linear ramp 0.7..0.9 → 0 | Stream cannot keep up with the target |\n * | ok | triangle 0.8..1.0, peak at 0.95 | Stream roughly matches the target |\n * | high | ratio 0.9..1.0 → ramp, >1.0 → 1.0 | Stream meets or exceeds the target |\n *\n * **2. Bitrate load** = `currentBitrate / MAX_BITRATE` (0..1+)\n *\n * `MAX_BITRATE` = 20 Mbit/s — the reference ceiling for the encoder.\n *\n * | Band | Range | Meaning |\n * |--------|-------------------------------------------------|-----------------------------------------------|\n * | high | load 0.5..0.8 → ramp, >0.8 → 1.0 | Encoder is using most of the available bandwidth |\n * | not high | load < 0.5 → 0.0 | Bandwidth headroom is available |\n *\n * **3. Quality** — mapped from QP via `mapQpToQuality()` (see {@link Quality}):\n *\n * | Quality | QP range | Meaning |\n * |----------|-----------|-------------------------------------------------|\n * | `lime` | QP <= 26 | Good — encoder has enough headroom |\n * | `orange` | QP 27..35 | Fair — encoder is under moderate pressure |\n * | `red` | QP > 35 | Poor — heavy compression, visible artefacts |\n *\n * ### Decision rules (evaluated in priority order, first match wins)\n *\n * | # | Condition | Decision |\n * |---|------------------------------------------------------------|--------------|\n * | 1 | FPS ratio is **low** (membership > 0.5) | **decrease** |\n * | 2 | FPS ratio is **ok** AND quality is `red` | **decrease** |\n * | 3 | FPS ratio is **ok** AND bitrate **high** AND quality is `orange` | **hold** |\n * | 4 | FPS ratio is **high** AND quality is `lime` AND bitrate **not high** | **increase** |\n * | — | Everything else | **hold** |\n *\n * ## Cooldown-based throttling\n *\n * The service continuously evaluates fuzzy rules every sample window.\n * After each FPS step change it enforces a cooldown before the next\n * change can be applied. The cooldown duration depends on the\n * (previous decision → next decision) pair:\n *\n * | Previous | Next | Cooldown |\n * |-----------|-----------|-----------------------------------------------------|\n * | decrease | decrease | {@link COOLDOWN_DECREASE_AFTER_DECREASE_MS} (2 s) |\n * | decrease | increase | {@link COOLDOWN_INCREASE_AFTER_DECREASE_MS} (10 s) |\n * | increase | decrease | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |\n * | increase | increase | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |\n *\n * This means the system reacts quickly after an increase (2 s in any\n * direction) but is cautious about stepping back up after a decrease\n * (10 s), while still allowing consecutive decreases at 2 s intervals.\n *\n * ## FPS dispatch\n *\n * FPS changes are dispatched via the NgRx `setMaxFps` action, which triggers\n * the existing `UnrealEffects.setMaxFps$` effect that sends the\n * `t.MaxFPS <value>` console command to Unreal Engine.\n */\n@Injectable()\nexport class FpsMonitorService {\n private videoService = inject(VideoService);\n private store = inject(Store);\n\n /** Discrete FPS targets the controller can switch between (ascending order). */\n private readonly FPS_STEPS = [30, 40, 50, 60] as const;\n\n /** Reference ceiling for bitrate (bits/sec) used to normalise bitrate load to 0..1. */\n private readonly MAX_BITRATE = 20_000_000;\n\n /**\n * Cooldown (ms) for any decision (increase or decrease) following an increase.\n * After an increase the system should react faster.\n */\n private readonly COOLDOWN_AFTER_INCREASE_MS = 2_000;\n\n /**\n * Cooldown (ms) for a decrease following a previous decrease.\n */\n private readonly COOLDOWN_DECREASE_AFTER_DECREASE_MS = 2_000;\n\n /**\n * Cooldown (ms) for an increase following a previous decrease.\n * The stream needs more time to stabilise before stepping back up.\n */\n private readonly COOLDOWN_INCREASE_AFTER_DECREASE_MS = 10_000;\n\n /**\n * Number of videoStats$ ticks to accumulate before evaluating.\n * At 250 ms per tick this gives a ~2 s sliding evaluation window,\n * long enough to smooth out single-frame jitter.\n */\n private readonly SAMPLE_WINDOW = 8;\n\n /** Current FPS target; starts at max (60 FPS) and adapts downward/upward. */\n private currentFpsTarget: number = this.FPS_STEPS[this.FPS_STEPS.length - 1];\n private samples: { fps: number; bitrate: number; qp: number }[] = [];\n private lastDecisionTime = Date.now();\n private lastUpgrade: Decision = 'hold';\n\n constructor() {\n this.init();\n }\n\n protected init() {\n this.videoService.videoStats$\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(([stats]) => this.processTick(stats));\n }\n\n /**\n * Called on every videoStats$ emission (~250 ms).\n * Accumulates samples and evaluates once per SAMPLE_WINDOW.\n */\n private processTick(stats: IAggregatedStat) {\n const { framesPerSecond, bitrate, VideoEncoderQP } = stats.aggregatedStats;\n\n this.samples.push({\n fps: framesPerSecond ?? 0,\n bitrate: bitrate ?? 0,\n qp: VideoEncoderQP ?? 0,\n });\n\n // Wait until we have enough samples for a reliable average.\n if (this.samples.length < this.SAMPLE_WINDOW) {\n return;\n }\n\n const avg = this.averageSamples();\n this.samples = [];\n\n this.handleMonitoring(avg, this.currentFpsTarget);\n }\n\n private handleMonitoring(\n avg: { fps: number; bitrate: number; qp: number },\n currentTarget: number,\n ) {\n const decision = this.evaluateDecision(avg, currentTarget);\n this.upgradeFps(decision, avg.qp);\n }\n\n /**\n * Combines fuzzy membership values into a single discrete decision.\n * Rules are evaluated in priority order — first match wins.\n *\n * Inputs:\n * - `fpsRatio` = avgFPS / currentTargetFPS (e.g. 45/60 = 0.75)\n * - `bitrateLoad` = avgBitrate / 20 Mbit/s (e.g. 12M/20M = 0.6)\n * - `quality` = mapQpToQuality(avgQP) → 'lime' | 'orange' | 'red'\n */\n private evaluateDecision(\n avg: { fps: number; bitrate: number; qp: number },\n currentTarget: number,\n ): Decision {\n const fpsRatio = currentTarget > 0 ? avg.fps / currentTarget : 1;\n const bitrateLoad = avg.bitrate / this.MAX_BITRATE;\n\n const fpsLow = this.membershipFpsLow(fpsRatio);\n const fpsOk = this.membershipFpsOk(fpsRatio);\n const fpsHigh = this.membershipFpsHigh(fpsRatio);\n\n const bitrateHigh = this.membershipBitrateHigh(bitrateLoad);\n\n // Quality is derived from QP: lime (QP <= 26), orange (QP 27..35), red (QP > 35).\n const quality = mapQpToQuality(avg.qp);\n\n // Rule 1: FPS clearly below target (ratio roughly < 0.8) → step down immediately.\n if (fpsLow > 0.5) {\n return 'decrease';\n }\n\n // Rule 2: FPS looks acceptable numerically, but encoder quality is 'red'\n // (QP > 35 — heavy compression artefacts). Reducing target FPS frees\n // encoder headroom and improves visual quality.\n if (fpsOk > 0.4 && quality === 'red') {\n return 'decrease';\n }\n\n // Rule 3: FPS is ok, but bitrate is above ~50-80% of 20 Mbit/s ceiling\n // and quality is 'orange' (QP 27..35). Near capacity — don't push higher.\n if (fpsOk > 0.4 && bitrateHigh > 0.5 && quality === 'orange') {\n return 'hold';\n }\n\n // Rule 4: FPS meets/exceeds target (ratio >= ~0.95), quality is 'lime'\n // (QP <= 26), and bitrate is below 50% of ceiling — safe to step up.\n if (\n fpsHigh > 0.5 &&\n quality === 'lime' &&\n bitrateHigh < 0.5 &&\n this.currentFpsTarget < this.FPS_STEPS[this.FPS_STEPS.length - 1]\n ) {\n return 'increase';\n }\n\n return 'hold';\n }\n\n // ---------------------------------------------------------------------------\n // Fuzzy membership functions\n //\n // Each function maps a normalised input (0..1+) to a membership degree (0..1).\n // Overlapping trapezoid/triangle shapes let multiple categories be partially\n // active at the same time, which makes the rules less brittle than hard thresholds.\n // ---------------------------------------------------------------------------\n\n /**\n * FPS ratio membership \"low\".\n * Input: ratio = actualFPS / targetFPS (e.g. 42/60 = 0.70).\n *\n * ratio < 0.7 → 1.0 (clearly failing, e.g. 40/60)\n * ratio 0.7..0.9 → linear ramp down (e.g. 0.8 → 0.5)\n * ratio > 0.9 → 0.0 (keeping up)\n */\n private membershipFpsLow(ratio: number): number {\n if (ratio < 0.7) return 1.0;\n if (ratio > 0.9) return 0.0;\n return (0.9 - ratio) / 0.2;\n }\n\n /**\n * FPS ratio membership \"ok\" — triangle shape.\n * Input: ratio = actualFPS / targetFPS.\n *\n * ratio < 0.8 → 0.0\n * ratio 0.8..0.95 → ramp up, peak at 0.95 (e.g. 57/60)\n * ratio 0.95..1.0 → ramp down\n * ratio > 1.0 → 0.0\n */\n private membershipFpsOk(ratio: number): number {\n if (ratio < 0.8) return 0.0;\n if (ratio < 0.95) return (ratio - 0.8) / 0.15;\n if (ratio <= 1.0) return (1.0 - ratio) / 0.05;\n return 0.0;\n }\n\n /**\n * FPS ratio membership \"high\".\n * Input: ratio = actualFPS / targetFPS.\n *\n * ratio < 0.9 → 0.0\n * ratio 0.9..1.0 → linear ramp up (e.g. 0.95 → 0.5)\n * ratio >= 1.0 → 1.0 (meeting or exceeding target, e.g. 60/60)\n */\n private membershipFpsHigh(ratio: number): number {\n if (ratio < 0.9) return 0.0;\n if (ratio > 1.0) return 1.0;\n return (ratio - 0.9) / 0.1;\n }\n\n /**\n * Bitrate load membership \"high\".\n * Input: load = currentBitrate / MAX_BITRATE (20 Mbit/s).\n *\n * load < 0.5 → 0.0 (below 10 Mbit/s — plenty of headroom)\n * load 0.5..0.8 → linear ramp (e.g. 13M/20M = 0.65 → 0.5)\n * load > 0.8 → 1.0 (above 16 Mbit/s — near capacity)\n */\n private membershipBitrateHigh(load: number): number {\n if (load < 0.5) return 0.0;\n if (load > 0.8) return 1.0;\n return (load - 0.5) / 0.3;\n }\n\n // ---------------------------------------------------------------------------\n // Step actions\n // ---------------------------------------------------------------------------\n\n private upgradeFps(decision: Decision, qp: number) {\n if (decision === 'hold') return;\n\n const now = Date.now();\n\n // Throttle: cooldown depends on (previous decision → current decision) pair.\n const isStepUp = decision === 'increase';\n const cooldown =\n this.lastUpgrade === 'decrease'\n ? isStepUp\n ? this.COOLDOWN_INCREASE_AFTER_DECREASE_MS\n : this.COOLDOWN_DECREASE_AFTER_DECREASE_MS\n : this.COOLDOWN_AFTER_INCREASE_MS;\n\n if (now - this.lastDecisionTime < cooldown) {\n return;\n }\n\n this.lastUpgrade = decision;\n\n const quality = mapQpToQuality(qp);\n const newTarget = this.getNextFpsTarget(this.currentFpsTarget, decision);\n\n Logger.info(\n `[FpsMonitor] Decision: ${decision} → FPS: ${newTarget}, Quality: ${quality}`,\n );\n\n if (newTarget !== this.currentFpsTarget) {\n this.currentFpsTarget = newTarget;\n this.store.dispatch(setMaxFps({ maxFps: newTarget }));\n }\n\n this.lastDecisionTime = now;\n this.samples = [];\n }\n\n /**\n * Get the next FPS target based on current target and decision.\n * Clamps to valid FPS_STEPS range.\n */\n private getNextFpsTarget(currentTarget: number, decision: Decision): number {\n const currentIndex = this.FPS_STEPS.indexOf(\n currentTarget as (typeof this.FPS_STEPS)[number],\n );\n\n // If current target is not in FPS_STEPS, find closest one\n const validIndex =\n currentIndex === -1\n ? this.findClosestFpsIndex(currentTarget)\n : currentIndex;\n\n const delta = decision === 'increase' ? 1 : -1;\n const newIndex = clampf(0, this.FPS_STEPS.length - 1, validIndex + delta);\n\n return this.FPS_STEPS[newIndex];\n }\n\n /**\n * Find the closest FPS step index for a given target value.\n */\n private findClosestFpsIndex(target: number): number {\n let closestIndex = 0;\n let closestDiff = Math.abs(this.FPS_STEPS[0] - target);\n\n for (let i = 1; i < this.FPS_STEPS.length; i++) {\n const diff = Math.abs(this.FPS_STEPS[i] - target);\n if (diff < closestDiff) {\n closestDiff = diff;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n /** Average all collected samples for the current evaluation window. */\n private averageSamples(): { fps: number; bitrate: number; qp: number } {\n const len = this.samples.length;\n if (len === 0) return { fps: 0, bitrate: 0, qp: 0 };\n\n let fps = 0;\n let bitrate = 0;\n let qp = 0;\n\n for (const s of this.samples) {\n fps += s.fps;\n bitrate += s.bitrate;\n qp += s.qp;\n }\n\n return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };\n }\n}\n","import { provideState } from '@ngrx/store';\nimport { provideEffects } from '@ngrx/effects';\nimport { UnrealEffects, unrealFeature } from '../store';\nimport {\n AfkPlaywrightService,\n AFKService,\n AggregatorPlaywrightService,\n AggregatorService,\n AnalyticsService,\n CommandTelemetryPlaywrightService,\n CommandTelemetryService,\n ConsoleExtensionsPlaywrightService,\n ConsoleExtensionsService,\n FileHandlerService,\n FileReceiverPlaywrightService,\n FileReceiverService,\n FpsMonitorService,\n FreezeFramePlaywrightService,\n FreezeFrameService,\n InputService,\n RegionsPingService,\n SignallingPlaywrightService,\n SignallingService,\n StreamStatusTelemetryPlaywrightService,\n StreamStatusTelemetryService,\n UnrealCommunicatorPlaywrightService,\n UnrealCommunicatorService,\n VideoService,\n WebRtcPlayerService,\n} from '../services';\nimport {\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\n\nexport function provideAngularUnrealModule(config?: { playwright: boolean }) {\n return makeEnvironmentProviders([\n provideState(unrealFeature),\n provideEffects([UnrealEffects]),\n ConsoleExtensionsService,\n InputService,\n VideoService,\n WebRtcPlayerService,\n RegionsPingService,\n FileReceiverService,\n FileHandlerService,\n FpsMonitorService,\n AnalyticsService,\n {\n provide: StreamStatusTelemetryService,\n useClass: config?.playwright\n ? StreamStatusTelemetryPlaywrightService\n : StreamStatusTelemetryService,\n },\n {\n provide: CommandTelemetryService,\n useClass: config?.playwright\n ? CommandTelemetryPlaywrightService\n : CommandTelemetryService,\n },\n {\n provide: AggregatorService,\n useClass: config?.playwright\n ? AggregatorPlaywrightService\n : AggregatorService,\n },\n {\n provide: FreezeFrameService,\n useClass: config?.playwright\n ? FreezeFramePlaywrightService\n : FreezeFrameService,\n },\n {\n provide: UnrealCommunicatorService,\n useClass: config?.playwright\n ? UnrealCommunicatorPlaywrightService\n : UnrealCommunicatorService,\n },\n {\n provide: AFKService,\n useClass: config?.playwright ? AfkPlaywrightService : AFKService,\n },\n {\n provide: SignallingService,\n useClass: config?.playwright\n ? SignallingPlaywrightService\n : SignallingService,\n },\n {\n provide: ConsoleExtensionsService,\n useClass: config?.playwright\n ? ConsoleExtensionsPlaywrightService\n : ConsoleExtensionsService,\n },\n {\n provide: FileReceiverService,\n useClass: config?.playwright\n ? FileReceiverPlaywrightService\n : FileReceiverService,\n },\n provideEnvironmentInitializer(() => {\n inject(AggregatorService);\n inject(InputService);\n inject(StreamStatusTelemetryService);\n inject(ConsoleExtensionsService);\n inject(AFKService);\n inject(FreezeFrameService);\n inject(AnalyticsService);\n inject(FpsMonitorService);\n }),\n ]);\n}\n","import {\n changeLowBandwidth,\n changeStatusMainVideoOnScene,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n commandStarted,\n dataChannelConnected,\n destroyRemoteConnections,\n destroyUnrealScene,\n disconnectStream,\n dropConnection,\n initSignalling,\n reconnectPeerSuccess,\n resetConfig,\n resetDataChannelForReconnect,\n resetIntroSrc,\n resetWarnTimeout,\n saveAnalyticsEvent,\n setAfkTimerHide,\n setAfkTimerVisible,\n setAwsInstance,\n setCirrusConnected,\n setCirrusDisconnected,\n setConfig,\n setEstablishingConnection,\n setFreezeFrame,\n setFreezeFrameFromVideo,\n setIntroImageSrc,\n setIntroVideoSrc,\n setLoadingImageSrc,\n setLoopBackCommandIsCompleted,\n setOrchestrationContext,\n setOrchestrationMessage,\n setOrchestrationParameters,\n setOrchestrationProgress,\n setSignalingName,\n setStatusMessage,\n setStatusPercentSignallingServer,\n setStreamClientCompanyId,\n setStreamViewId,\n setUnrealPlaywrightConfig,\n setViewportNotReady,\n setViewportReady,\n startStream,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { createReducer, on } from '@ngrx/store';\nimport type {\n AwsInstance,\n ConnectionError,\n DisconnectReasonType,\n FreezeFrameMessage,\n LBMStats,\n SignalingData,\n StreamConfig,\n StreamRequestContext,\n StreamResolutionProps,\n} from '../interfaces';\nimport { DisconnectReason } from '../interfaces';\nimport { DEFAULT_AFK_TIMEOUT } from '../constants';\nimport { removeExileCommands } from '../helpers';\n\nexport interface CommandsLoaderState {\n commandsInProgress: {\n timeStamp: number;\n command: string;\n id: string;\n }[];\n totalCommandsStarted: number;\n totalCommandsCompleted: number;\n}\n\nexport interface UnrealState {\n lowBandwidthStats: LBMStats | undefined;\n streamConfig: StreamConfig;\n awsInstance: AwsInstance;\n lowBandwidth: boolean;\n wasInitialized: boolean;\n isFirstSuccessLoad: boolean;\n isAfkTimerVisible: boolean;\n cirrusConnected: boolean;\n viewportReady: boolean;\n freezeFrameFromVideo: FreezeFrameMessage;\n freezeFrame: FreezeFrameMessage;\n statusMessage: string | null;\n /**\n * @deprecated, use ssData in future\n */\n ssInfo: string | null;\n ssData: SignalingData | null;\n statusPercentSignallingServer: number | null;\n errorMessage: ConnectionError | null;\n isReconnecting: boolean;\n dataChannelConnected: boolean;\n streamResolution: StreamResolutionProps;\n isVideoPlaying: boolean;\n establishingConnection: boolean;\n disconnectReason: DisconnectReasonType;\n loaderCommands: CommandsLoaderState;\n matchUrls: string[];\n environmentId: string | null;\n streamClientCompanyId: string | null;\n streamViewId: string | null;\n videoIntroSrc: string | null;\n imageIntroSrc: string | null;\n imageLoadingSrc: string;\n streamRequestContext: StreamRequestContext | null;\n analyticsEvent: { name: string; params: Record<string, unknown> } | null;\n}\n\nexport const initialState: UnrealState = {\n streamRequestContext: null,\n environmentId: null,\n lowBandwidthStats: undefined,\n wasInitialized: false,\n isFirstSuccessLoad: false,\n isAfkTimerVisible: false,\n lowBandwidth: false,\n cirrusConnected: false,\n establishingConnection: false,\n isReconnecting: false,\n viewportReady: false,\n dataChannelConnected: false,\n isVideoPlaying: false,\n statusPercentSignallingServer: null,\n statusMessage: null,\n errorMessage: null,\n ssInfo: null,\n ssData: null,\n streamResolution: { width: null, height: null },\n freezeFrameFromVideo: { dataUrl: null, progress: null },\n freezeFrame: { dataUrl: null, progress: null },\n disconnectReason: DisconnectReason.None,\n awsInstance: {\n wsUrl: null,\n instanceName: null,\n pollingUrl: null,\n progressComplete: 0,\n },\n streamConfig: {\n autoStart: true,\n warnTimeout: DEFAULT_AFK_TIMEOUT,\n },\n loaderCommands: {\n commandsInProgress: [],\n totalCommandsStarted: 0,\n totalCommandsCompleted: 0,\n },\n matchUrls: [],\n streamClientCompanyId: '',\n streamViewId: 'default',\n videoIntroSrc: null,\n imageIntroSrc: null,\n imageLoadingSrc: '',\n analyticsEvent: null,\n};\nexport const unrealReducer = createReducer(\n initialState,\n on(\n changeLowBandwidth,\n (state, { lowBandwidth, stats }): UnrealState => ({\n ...state,\n lowBandwidth: lowBandwidth,\n lowBandwidthStats: lowBandwidth ? stats : undefined,\n }),\n ),\n on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }): UnrealState => {\n return { ...state, isVideoPlaying: isVideoPlaying };\n }),\n on(\n setAwsInstance,\n (state, { instanceName, wsUrl, pollingUrl }): UnrealState => {\n return { ...state, awsInstance: { instanceName, wsUrl, pollingUrl } };\n },\n ),\n on(setViewportReady, (state): UnrealState => {\n return {\n ...state,\n viewportReady: true,\n statusMessage: null,\n errorMessage: null,\n };\n }),\n on(setViewportNotReady, (state): UnrealState => {\n return { ...state, viewportReady: false };\n }),\n on(updateCirrusInfo, (state, { ssInfo, ssData }): UnrealState => {\n return {\n ...state,\n ssInfo: ssInfo, // For back compatibility\n ssData: ssData, // Contains all the data from the ssInfo as an object\n };\n }),\n on(\n changeStreamResolutionSuccessAction,\n (state, { width, height }): UnrealState => {\n return { ...state, streamResolution: { width: width, height: height } };\n },\n ),\n on(setFreezeFrame, (state, freezeFrame): UnrealState => {\n return {\n ...state,\n freezeFrame: {\n dataUrl:\n freezeFrame.progress === 0 ||\n freezeFrame.progress === 1 ||\n freezeFrame.progress === null\n ? freezeFrame.dataUrl\n : state.freezeFrame.dataUrl,\n progress: freezeFrame.progress || null,\n },\n };\n }),\n on(disconnectStream, (state, errorMessage): UnrealState => {\n if (\n state.dataChannelConnected ||\n state.disconnectReason === DisconnectReason.Destroy\n ) {\n return state;\n }\n return {\n ...state,\n errorMessage,\n statusMessage: null,\n wasInitialized: true,\n };\n }),\n on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo): UnrealState => {\n return {\n ...state,\n freezeFrameFromVideo: {\n dataUrl: freezeFrameFromVideo.dataUrl,\n progress: freezeFrameFromVideo.progress || null,\n },\n };\n }),\n on(setStatusMessage, (state, { statusMessage }): UnrealState => {\n return { ...state, statusMessage };\n }),\n on(setEstablishingConnection, (state, { value }): UnrealState => {\n return { ...state, establishingConnection: value };\n }),\n on(setStatusPercentSignallingServer, (state, { percent }): UnrealState => {\n return { ...state, statusPercentSignallingServer: percent };\n }),\n on(dataChannelConnected, (state, { statusMessage }): UnrealState => {\n return {\n ...state,\n statusMessage,\n dataChannelConnected: true,\n establishingConnection: false,\n wasInitialized: true,\n };\n }),\n on(setConfig, startStream, (state, { config }): UnrealState => {\n return { ...state, streamConfig: { ...state.streamConfig, ...config } };\n }),\n on(resetConfig, (state): UnrealState => {\n return { ...state, streamConfig: initialState.streamConfig };\n }),\n on(resetWarnTimeout, (state): UnrealState => {\n return {\n ...state,\n streamConfig: { ...state.streamConfig, warnTimeout: DEFAULT_AFK_TIMEOUT },\n };\n }),\n on(\n initSignalling,\n (state, { resetDisconnectionReason = true }): UnrealState => {\n return {\n ...state,\n disconnectReason: resetDisconnectionReason\n ? DisconnectReason.None\n : state.disconnectReason,\n };\n },\n ),\n on(destroyRemoteConnections, (state, { reason }): UnrealState => {\n if (state.disconnectReason === DisconnectReason.Destroy) {\n return state;\n }\n return { ...state, disconnectReason: reason };\n }),\n\n on(reconnectPeerSuccess, (state): UnrealState => {\n return { ...state, isReconnecting: false };\n }),\n\n on(setSignalingName, (state, { instanceName }): UnrealState => {\n return { ...state, awsInstance: { ...state.awsInstance, instanceName } };\n }),\n on(\n setOrchestrationParameters,\n (state, { instanceName, streamRequestId, eta }): UnrealState => {\n return {\n ...state,\n awsInstance: {\n ...state.awsInstance,\n message: undefined,\n instanceName,\n streamRequestId,\n eta,\n },\n };\n },\n ),\n on(setOrchestrationProgress, (state, { progressComplete }): UnrealState => {\n return {\n ...state,\n awsInstance: {\n ...state.awsInstance,\n progressComplete,\n },\n };\n }),\n on(setOrchestrationMessage, (state, { message }): UnrealState => {\n return {\n ...state,\n awsInstance: {\n ...state.awsInstance,\n message,\n },\n };\n }),\n on(setLoopBackCommandIsCompleted, (state): UnrealState => {\n return { ...state, isFirstSuccessLoad: true };\n }),\n on(setAfkTimerVisible, (state): UnrealState => {\n return { ...state, isAfkTimerVisible: true };\n }),\n on(setAfkTimerHide, (state): UnrealState => {\n return { ...state, isAfkTimerVisible: false };\n }),\n on(\n setOrchestrationContext,\n (state, { urls, environmentId, streamRequestContext }): UnrealState => {\n return {\n ...state,\n matchUrls: urls,\n environmentId,\n streamRequestContext,\n };\n },\n ),\n on(setStreamClientCompanyId, (state, { id }): UnrealState => {\n return { ...state, streamClientCompanyId: id };\n }),\n on(setStreamViewId, (state, { id }): UnrealState => {\n return { ...state, streamViewId: id };\n }),\n on(setIntroImageSrc, (state, { src }): UnrealState => {\n return { ...state, imageIntroSrc: src };\n }),\n on(setLoadingImageSrc, (state, { src }): UnrealState => {\n return { ...state, imageLoadingSrc: src };\n }),\n on(setIntroVideoSrc, (state, { src }): UnrealState => {\n return { ...state, videoIntroSrc: src };\n }),\n on(resetIntroSrc, (state): UnrealState => {\n return { ...state, imageIntroSrc: '', videoIntroSrc: '' };\n }),\n on(saveAnalyticsEvent, (state: UnrealState, { event }): UnrealState => {\n return { ...state, analyticsEvent: event };\n }),\n on(commandStarted, (state, { id, command }): UnrealState => {\n return {\n ...state,\n loaderCommands: {\n ...state.loaderCommands,\n totalCommandsStarted: state.loaderCommands.totalCommandsStarted + 1,\n commandsInProgress: [\n ...state.loaderCommands.commandsInProgress,\n { id, command, timeStamp: new Date().getTime() },\n ],\n },\n };\n }),\n on(commandCompleted, (state, { id }): UnrealState => {\n return {\n ...state,\n loaderCommands: removeExileCommands(state.loaderCommands, id),\n };\n }),\n on(setCirrusConnected, (state): UnrealState => {\n return { ...state, cirrusConnected: true };\n }),\n on(setCirrusDisconnected, (state): UnrealState => {\n return {\n ...initialState,\n establishingConnection: state.establishingConnection,\n disconnectReason: state.disconnectReason,\n wasInitialized: state.wasInitialized,\n isFirstSuccessLoad: state.isFirstSuccessLoad,\n matchUrls: state.matchUrls,\n streamClientCompanyId: state.streamClientCompanyId,\n streamViewId: state.streamViewId,\n imageIntroSrc: state.imageIntroSrc,\n videoIntroSrc: state.videoIntroSrc,\n imageLoadingSrc: state.imageLoadingSrc,\n environmentId: state.environmentId,\n streamRequestContext: state.streamRequestContext,\n streamConfig: state.streamConfig,\n };\n }),\n on(dropConnection, (state): UnrealState => {\n return { ...state, establishingConnection: false };\n }),\n on(resetDataChannelForReconnect, (state): UnrealState => {\n return {\n ...state,\n isReconnecting: true,\n dataChannelConnected: false,\n viewportReady: false,\n statusMessage: 'Reconnecting...',\n };\n }),\n on(setUnrealPlaywrightConfig, (state): UnrealState => {\n return {\n ...state,\n wasInitialized: true,\n isFirstSuccessLoad: true,\n cirrusConnected: true,\n viewportReady: true,\n dataChannelConnected: true,\n isVideoPlaying: true,\n };\n }),\n on(destroyUnrealScene, (): UnrealState => {\n return initialState;\n }),\n);\n","import { createFeature } from '@ngrx/store';\nimport { unrealReducer } from './unreal.reducer';\n\nexport const unrealFeature = createFeature({\n name: 'unrealFeature',\n reducer: unrealReducer,\n});\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-unreal-error-modal',\n templateUrl: './unreal-error-modal.component.html',\n styleUrl: './unreal-error-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class UnrealErrorModalComponent {\n dialogRef = inject(DialogRef);\n dialogData = inject<{ content: string }>(DIALOG_DATA);\n\n close() {\n this.dialogRef.close();\n }\n}\n","<div class=\"src-modal src-modal--small\">\n <div class=\"src-modal__header\">\n <div\n [attr.data-testid]=\"'unreal-error-header-title'\"\n class=\"src-modal__title\"\n >\n Warning\n </div>\n </div>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button (onClick)=\"close()\"> Ok </src-button>\n </div>\n</div>\n","import { concatLatestFrom } from '@ngrx/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport {\n debounceTime,\n EMPTY,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n switchMap,\n take,\n timeout,\n timer,\n} from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport {\n abortEstablishingConnection,\n changeLowBandwidth,\n changeStreamResolutionAction,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n dataChannelConnected,\n dataChannelReady,\n destroyRemoteConnections,\n destroyUnrealScene,\n disconnectStream,\n dropConnection,\n initSignalling,\n reconnectPeer,\n reconnectPeerFailed,\n reconnectPeerSuccess,\n resetAfkAction,\n resetConfig,\n resetDataChannelForReconnect,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusDisconnected,\n setConfig,\n setFreezeFrame,\n setLoopBackCommandIsCompleted,\n setMaxFps,\n setOrchestrationParameters,\n setOrchestrationProgress,\n setStatusPercentSignallingServer,\n setViewportNotReady,\n setViewportReady,\n showUnrealErrorMessage,\n startStream,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { unrealFeature } from './unreal.feature';\nimport {\n catchError,\n distinctUntilChanged,\n exhaustMap,\n filter,\n takeUntil,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n fromSignal,\n getRtcErrorMessage,\n observeCommandResponse,\n resetAfk,\n} from '../helpers';\nimport {\n CONSOLE_COMMAND_PIXEL_QUALITY,\n DATA_CHANNEL_CONNECTION_TIMEOUT,\n DEFAULT_RECONNECT_DELAY_MS,\n DEFAULT_RECONNECT_ENABLED,\n DEFAULT_RECONNECT_MAX_ATTEMPTS,\n DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE,\n DEFAULT_RECONNECT_ON_ICE_FAILURE,\n MINIMAL_FPS,\n UNREAL_CONFIG,\n} from '../constants';\nimport { selectCommandsInProgress, selectIsAutostart } from '../store';\nimport { WebrtcErrorModalComponent } from '../components';\nimport {\n DevModeService,\n SignallingService,\n TelemetryStart,\n TelemetryStop,\n UnrealCommunicatorService,\n VideoService,\n WebRtcPlayerService,\n} from '../services';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport { ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport type { AwsInstance, WrappedMetaBoxCommandPacket } from '../interfaces';\nimport {\n DisconnectReason,\n UnrealInternalSignalEvents,\n WSCloseCode_FORCE_CIRRUS_CLOSE,\n} from '../interfaces';\nimport type { FLoopBackCommand } from '@3dsource/types-unreal';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\nimport { UnrealErrorModalComponent } from '../components/unreal-error-modal/unreal-error-modal.component';\n\n@Injectable()\nexport class UnrealEffects {\n private actions$ = inject(Actions);\n private dialog = inject(Dialog);\n private http = inject(HttpClient);\n private store = inject(Store);\n private isDevMode = inject(DevModeService).isDevMode;\n private scrollStrategy = inject(ScrollStrategyOptions).block();\n private unrealInitialConfig = inject(UNREAL_CONFIG);\n private webRtcPlayerService = inject(WebRtcPlayerService);\n private commandsSender = inject(UnrealCommunicatorService);\n private signallingService = inject(SignallingService);\n private videoService = inject(VideoService);\n private dataChannelConnectionTimeout =\n this.unrealInitialConfig?.dataChannelConnectionTimeout ??\n DATA_CHANNEL_CONNECTION_TIMEOUT;\n private connectionCompleted$ = this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy));\n\n // ==================== PEER RECONNECTION EFFECTS ====================\n\n private reconnectConfig = {\n enabled:\n this.unrealInitialConfig?.reconnect?.enabled ?? DEFAULT_RECONNECT_ENABLED,\n maxAttempts:\n this.unrealInitialConfig?.reconnect?.maxAttempts ??\n DEFAULT_RECONNECT_MAX_ATTEMPTS,\n delayMs:\n this.unrealInitialConfig?.reconnect?.delayMs ??\n DEFAULT_RECONNECT_DELAY_MS,\n onIceFailure:\n this.unrealInitialConfig?.reconnect?.onIceFailure ??\n DEFAULT_RECONNECT_ON_ICE_FAILURE,\n onDataChannelClose:\n this.unrealInitialConfig?.reconnect?.onDataChannelClose ??\n DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE,\n };\n\n disconnectReasonHandling$ = createEffect(() => {\n const destroyReasons = [\n DisconnectReason.Afk,\n DisconnectReason.DataChannelClosed,\n DisconnectReason.DataChannelTimeout,\n DisconnectReason.WebSocketError,\n DisconnectReason.WebSocketClose,\n DisconnectReason.WebRTCError,\n DisconnectReason.DropConnection,\n DisconnectReason.IceConnectionFailed,\n DisconnectReason.ReconnectFailed,\n ];\n return this.actions$.pipe(\n ofType(disconnectStream),\n filter(({ reason }) => {\n // Skip DataChannelClosed if peer reconnection is enabled and signaling is connected\n // The peer reconnection effect will handle this case\n if (\n reason === DisconnectReason.DataChannelClosed &&\n this.reconnectConfig.enabled &&\n this.reconnectConfig.onDataChannelClose &&\n this.signallingService.isConnected()\n ) {\n Logger.info(\n '[Reconnect] Skipping destroy for DataChannelClosed - peer reconnection will handle',\n );\n return false;\n }\n return destroyReasons.some((r) => r === reason);\n }),\n tap(({ reason, message }) => {\n Logger.log(\n `Disconnect Call=> reason:'${reason}', message:'${message}'`,\n );\n }),\n map(({ reason }) => destroyRemoteConnections({ reason })),\n );\n });\n destroyConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyUnrealScene),\n tap(() => {\n this.commandsSender.destroy();\n this.videoService.setContainer(null);\n }),\n map(() => destroyRemoteConnections({ reason: DisconnectReason.Destroy })),\n );\n });\n destroyRemoteConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n tap(({ reason }) => {\n this.signallingService.close({\n code: WSCloseCode_FORCE_CIRRUS_CLOSE,\n reason,\n });\n this.webRtcPlayerService.closePC();\n }),\n filter(({ reason }) => reason === DisconnectReason.DropConnection),\n map(() => dropConnection()),\n );\n });\n webrtcErrorModalComponent$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(disconnectStream),\n filter(({ reason }) => reason === DisconnectReason.WebRTCError),\n debounceTime(400),\n switchMap(() =>\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(take(1), filter(Falsy)),\n ),\n tap(() => this.dialog.open(WebrtcErrorModalComponent)),\n );\n },\n { dispatch: false },\n );\n changeStreamResolution$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeStreamResolutionAction),\n filter((size) => !!(size?.width && size?.height)),\n concatLatestFrom(() =>\n this.store.select(unrealFeature.selectStreamResolution),\n ),\n filter(\n ([newSizes, savedSizes]) =>\n !(\n newSizes.width === savedSizes.width &&\n newSizes.height === savedSizes.height\n ),\n ),\n map(([sizes]) =>\n changeStreamResolutionSuccessAction({\n width: sizes.width,\n height: sizes.height,\n }),\n ),\n );\n });\n forceLBMOff$ = createEffect(() => {\n return fromEvent(document, 'visibilitychange').pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n withLatestFrom(this.store.select(unrealFeature.selectLowBandwidth)),\n filter(([, isLowBandwidth]) => isLowBandwidth),\n tapLog('forceLBMOff$'),\n map(() => changeLowBandwidth({ lowBandwidth: false })),\n );\n });\n resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeLowBandwidth),\n map(({ lowBandwidth }) => lowBandwidth),\n distinctUntilChanged(),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n sendLbmStat$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n exhaustMap(() =>\n this.actions$.pipe(\n ofType(changeLowBandwidth),\n filter(({ lowBandwidth }) => lowBandwidth),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n take(1),\n exhaustMap(([, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n message: {\n type: 'front',\n error: 'low_bandwidth_mode',\n signalling: instance.pollingUrl,\n },\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n })\n .pipe(catchError(() => EMPTY)),\n ),\n ),\n ),\n )\n .subscribe();\n resetAfk$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setConfig, resetWarnTimeout, resetConfig),\n map(() => resetAfkAction()),\n );\n });\n abortEstablishingConnection$ = createEffect(() => {\n const viewportReady$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n filter(Truthy),\n map(() => abortEstablishingConnection()),\n );\n\n const disconnectEvents$ = this.actions$.pipe(\n ofType(setCirrusDisconnected, destroyUnrealScene, dropConnection),\n map(() => abortEstablishingConnection()),\n );\n\n return merge(viewportReady$, disconnectEvents$).pipe(tapLog('ABORT'));\n });\n setMaxFps$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setMaxFps),\n tap(({ maxFps }) => {\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: `t.MaxFPS ${maxFps}` },\n });\n }),\n );\n },\n { dispatch: false },\n );\n resetAfkAction$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(resetAfkAction),\n tap(() => resetAfk()),\n );\n },\n { dispatch: false },\n );\n setSignalingTo100$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n map(() => setStatusPercentSignallingServer({ percent: 100 })),\n );\n });\n setOrchestrationParameters$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setOrchestrationParameters),\n map(({ eta }) => eta),\n filter((value) => value > 0),\n switchMap((total) => {\n // Emit every second: 0,1,2,...,total (inclusive)\n return timer(0, 1000).pipe(\n takeUntil(this.connectionCompleted$),\n take(total + 1),\n map((sec) => sec / total),\n distinctUntilChanged(),\n map((progressComplete) =>\n setOrchestrationProgress({ progressComplete }),\n ),\n );\n }),\n );\n });\n setDataChannelTimeoutCheck$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n // require wsUrl present on the action payload\n filter((action) => !!action.wsUrl),\n // for each awsInstance action capture one ssData snapshot, then wait for dataChannelConnected\n switchMap((awsInstance: AwsInstance) => {\n return this.actions$.pipe(\n ofType(updateCirrusInfo),\n take(1),\n tap(() =>\n Logger.log(\n `DataChannel timeout check started with next timeout: ${this.dataChannelConnectionTimeout}ms`,\n ),\n ),\n switchMap(({ ssData }) => {\n const abort$ = this.actions$.pipe(\n ofType(\n setCirrusDisconnected, // ← \"Cirrus closed\" action\n ),\n take(1),\n );\n\n return this.actions$.pipe(\n ofType(dataChannelConnected),\n take(1),\n\n // 🚫 If Cirrus (or anything else) disconnects first, abort BEFORE timeout fires.\n takeUntil(abort$),\n\n // if it becomes true within timeout -> complete without dispatching any action\n timeout(this.dataChannelConnectionTimeout),\n\n // successfully connect → no action\n mergeMap(() => EMPTY),\n\n // ⏱️ Only actual timeout (or real upstream error) ends up here.\n catchError(() => {\n const error = `⏱️ DataChannel connection timeout ${this.dataChannelConnectionTimeout}ms, requesting new signaling.`;\n Logger.error(error);\n\n const body = {\n awsInstance,\n connectionId: ssData?.connectionId,\n href: location.href,\n userAgent: navigator.userAgent,\n error,\n };\n\n return this.http.post(awsInstance.pollingUrl || '', body).pipe(\n catchError((postError: unknown) => {\n Logger.error('Error sending timeout info:', postError);\n return of(null);\n }),\n // map response to the destroy action which ngrx will dispatch\n map(() =>\n disconnectStream({\n reason: DisconnectReason.DataChannelTimeout,\n message: 'Data Channel Timeout',\n }),\n ),\n );\n }),\n );\n }),\n );\n }),\n );\n });\n destroyConnectionAndRestart$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n filter(({ reason }) => reason === DisconnectReason.DataChannelTimeout),\n switchMap(() =>\n this.actions$.pipe(ofType(setCirrusDisconnected), take(1)),\n ),\n map(() => initSignalling()),\n );\n });\n showUnrealError$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n map(({ code }) => getRtcErrorMessage(code)),\n distinctUntilChanged(),\n filter(Truthy),\n switchMap(\n (content: string) =>\n this.dialog.open(UnrealErrorModalComponent, {\n scrollStrategy: this.scrollStrategy,\n data: { content },\n }).closed,\n ),\n map(() => showUnrealErrorMessage({ code: null })),\n );\n });\n sendStatisticsToUnreal$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n filter(({ code }) => code === 404),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n switchMap(([action, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n message: {\n type: 'front',\n error: 'pak_not_found',\n info: action?.error ?? '',\n },\n })\n .pipe(\n tap(() =>\n Logger.log(\n `successfully send to ${this.unrealInitialConfig?.customErrorsEndpoint}`,\n ),\n ),\n catchError(() => {\n Logger.error(\n `get error from ${this.unrealInitialConfig?.customErrorsEndpoint}`,\n );\n return EMPTY;\n }),\n ),\n ),\n );\n },\n { dispatch: false },\n );\n\n unrealReceiverReady$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(dataChannelConnected),\n concatLatestFrom(() =>\n this.store.select(unrealFeature.selectIsReconnecting),\n ),\n filter(([, isReconnecting]) => !isReconnecting),\n map(() => dataChannelReady()),\n );\n });\n\n initAppBySetDataChannelConnected$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(dataChannelReady),\n tap(() => {\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: CONSOLE_COMMAND_PIXEL_QUALITY },\n });\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FDebugModeCommand,\n payload: { value: this.isDevMode },\n });\n TelemetryStart('SetViewportReady');\n }),\n switchMap(() =>\n this.store.select(selectCommandsInProgress).pipe(\n debounceTime(100), // !IMPORTANT last command detection time\n take(1),\n switchMap(() =>\n observeCommandResponse<FLoopBackCommand['command']>(\n { command: MetaBoxCommand.FLoopBackCommand },\n (data) => this.commandsSender.sendCommandToUnreal(data),\n ),\n ),\n switchMap(() => this.videoService.videoStats$),\n filter(\n (videoStats) =>\n !!videoStats.aggregatedStats.framesPerSecond &&\n videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&\n (videoStats.aggregatedStats.framesDecoded || 0) > 15,\n ),\n take(1),\n map(() => setLoopBackCommandIsCompleted()),\n ),\n ),\n );\n });\n setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setLoopBackCommandIsCompleted, reconnectPeerSuccess),\n tap(() => TelemetryStop('SetViewportReady', { ready: true })),\n map(() => setViewportReady()),\n );\n });\n startStream$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(startStream),\n tapLog('Start Stream Pressed'),\n map(() => initSignalling()),\n );\n });\n listenUnrealCallbackByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n filter(() => !this.unrealInitialConfig?.playwright),\n switchMap(() =>\n fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(\n ({ json }) =>\n (json as WrappedMetaBoxCommandPacket)?.commandCallback\n ?.correlationId,\n ),\n filter(Truthy),\n map((id) => commandCompleted({ id })),\n ),\n ),\n );\n });\n connectToSignaling$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(initSignalling),\n withLatestFrom(\n this.store.select(unrealFeature.selectMatchUrls),\n this.store.select(selectIsAutostart),\n this.store.select(unrealFeature.selectCirrusConnected),\n ),\n filter(([, , autoStart, cirrusConnected]) => {\n if (cirrusConnected) {\n Logger.warn(\n `SIGNALING REQUEST can't be called when cirrus connection is already established.`,\n );\n }\n return autoStart && !cirrusConnected;\n }),\n map(([, matchMakerUrls]) => [...matchMakerUrls].filter(Truthy)),\n filter((urls) => urls.length > 0),\n // Ensure a single in-flight request per attempt.\n exhaustMap((urls) => this.signallingService.connectToSignaling(urls)),\n );\n },\n { dispatch: false },\n );\n /**\n * Effect: `forceViewportNotReady$`\n *\n * Ensures the viewport is explicitly marked as *not ready* to prevent\n * a temporary black screen flash when disconnecting.\n *\n * ### Why\n * - The video stream is disconnected immediately.\n * - The DataChannel closes slightly later.\n * - Closing the DataChannel resets the Unreal scene,\n * which also sets `viewPortReady` to `false`.\n *\n * Without this effect, the order of these events may cause\n * a visible flicker (video flashing to black).\n */\n forceViewportNotReady$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n map(() => setViewportNotReady()),\n );\n });\n\n /**\n * Effect: `handleDataChannelClosed$`\n *\n * Triggers peer reconnection when DataChannel closes unexpectedly.\n * Only triggers if reconnection is enabled, onDataChannelClose is true,\n * and the signaling WebSocket is still connected.\n */\n handleDataChannelClosed$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(disconnectStream),\n filter(\n ({ reason }) =>\n reason === DisconnectReason.DataChannelClosed &&\n this.reconnectConfig.enabled &&\n this.reconnectConfig.onDataChannelClose &&\n this.signallingService.isConnected(),\n ),\n tap(() => {\n Logger.warn(\n '[Reconnect] DataChannel closed, initiating peer reconnection',\n );\n }),\n map(() =>\n reconnectPeer({\n attempt: 1,\n maxAttempts: this.reconnectConfig.maxAttempts,\n delay: 0,\n }),\n ),\n );\n });\n\n /**\n * Effect: `resetStateForPeerReconnect$`\n *\n * Resets the data channel state when peer reconnection starts.\n */\n resetStateForPeerReconnect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(reconnectPeer),\n filter(() => this.reconnectConfig.enabled),\n filter(({ attempt }) => attempt === 1), // Only reset on the first attempt\n map(() => resetDataChannelForReconnect()),\n );\n });\n\n /**\n * Effect: `executePeerReconnect$`\n *\n * Executes the actual peer reconnection attempt.\n * This only re-establishes the WebRTC connection, not the signaling.\n */\n executePeerReconnect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(reconnectPeer),\n filter(() => this.reconnectConfig.enabled),\n tap(({ attempt, maxAttempts }) => {\n Logger.info(\n `[Reconnect] Peer reconnection attempt ${attempt}/${maxAttempts} in ${this.reconnectConfig.delayMs}ms`,\n );\n }),\n switchMap(({ attempt, maxAttempts, delay }) =>\n timer(delay ?? this.reconnectConfig.delayMs).pipe(\n switchMap(() => {\n Logger.info(\n `[Reconnect] Starting peer reconnection attempt ${attempt}`,\n );\n // Initiate peer reconnection through WebRtcPlayerService\n const success = this.webRtcPlayerService.reconnectPeer();\n if (!success) {\n Logger.error('[Reconnect] Failed to initiate peer reconnection');\n if (attempt < maxAttempts) {\n return of(reconnectPeer({ attempt: attempt + 1, maxAttempts }));\n }\n return of(\n reconnectPeerFailed({\n reason: 'Signaling connection lost during peer reconnection',\n }),\n );\n }\n // Monitor for successful data channel connection\n return this.actions$.pipe(\n ofType(dataChannelConnected),\n take(1),\n timeout(this.dataChannelConnectionTimeout),\n tap(() =>\n Logger.info('[Reconnect] Peer reconnection successful!'),\n ),\n map(() => reconnectPeerSuccess()),\n catchError(() => {\n if (attempt < maxAttempts) {\n Logger.warn(\n `[Reconnect] Peer reconnection attempt ${attempt} timed out, scheduling retry`,\n );\n return of(\n reconnectPeer({\n attempt: attempt + 1,\n maxAttempts,\n }),\n );\n } else {\n Logger.error(\n `[Reconnect] All ${maxAttempts} peer reconnection attempts exhausted`,\n );\n return of(\n reconnectPeerFailed({\n reason: `Peer reconnection failed after ${maxAttempts} attempts`,\n }),\n );\n }\n }),\n );\n }),\n // Cancel if scene is destroyed\n takeUntil(this.actions$.pipe(ofType(destroyUnrealScene), take(1))),\n ),\n ),\n );\n });\n\n /**\n * Effect: `handlePeerReconnectFailed$`\n *\n * Handles the case when all peer reconnection attempts have failed.\n * Falls back to full disconnection which may trigger full reconnection.\n */\n handlePeerReconnectFailed$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(reconnectPeerFailed),\n tap(({ reason }) => {\n Logger.error(`[Reconnect] Peer reconnection failed: ${reason}`);\n }),\n map(({ reason }) =>\n disconnectStream({\n reason: DisconnectReason.ReconnectFailed,\n message: reason,\n }),\n ),\n );\n });\n\n /**\n * Effect: `logPeerReconnectSuccess$`\n *\n * Logs successful peer reconnection for telemetry.\n */\n logPeerReconnectSuccess$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(reconnectPeerSuccess),\n tap(() => {\n Logger.info('[Reconnect] Peer connection restored successfully');\n }),\n );\n },\n { dispatch: false },\n );\n}\n","import { createSelector } from '@ngrx/store';\nimport { unrealFeature } from './unreal.feature';\nimport { DEFAULT_AFK_TIMEOUT, SIGNALLING_PERCENT_VALUE } from '../constants';\nimport { clampf, lerp } from '@3dsource/utils';\n\nexport const selectFreezeFrameDataUrlFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.dataUrl || null,\n);\nexport const selectFreezeFrameProgressMessageFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.progress || null,\n);\nexport const selectFreezeFrameDataUrl = createSelector(\n unrealFeature.selectFreezeFrame,\n unrealFeature.selectLowBandwidth,\n (freezeFrame, isLow) =>\n freezeFrame?.dataUrl && isLow ? freezeFrame?.dataUrl : null,\n);\nexport const selectIsFreezeFrameLoading = createSelector(\n unrealFeature.selectFreezeFrame,\n (freezeFrame) =>\n freezeFrame?.progress\n ? freezeFrame.progress > 0 && freezeFrame.progress < 1\n : false,\n);\nexport const selectFreezeFrameCombinedDataUrl = createSelector(\n selectFreezeFrameDataUrlFromVideo,\n selectFreezeFrameDataUrl,\n (dataUrlFromVideo, remoteDataUrl) =>\n dataUrlFromVideo || remoteDataUrl || null,\n);\nexport const selectStreamConfig = createSelector(\n unrealFeature.selectStreamConfig,\n (config) => config,\n);\nexport const selectWarnTimeout = createSelector(\n selectStreamConfig,\n (config) => config?.warnTimeout || DEFAULT_AFK_TIMEOUT,\n);\nexport const selectIsExistMatchUrls = createSelector(\n unrealFeature.selectMatchUrls,\n (urls) => urls?.length > 0,\n);\nexport const selectIsAutostart = createSelector(\n selectStreamConfig,\n (config) => config?.autoStart,\n);\nexport const showPopupWithoutAutoStart = createSelector(\n selectStreamConfig,\n unrealFeature.selectWasInitialized,\n (config, wasInitialized) => !config.autoStart && !wasInitialized,\n);\nexport const selectShowReconnectPopup = createSelector(\n unrealFeature.selectCirrusConnected,\n unrealFeature.selectEstablishingConnection,\n (connected, establishing) => !connected && !establishing,\n);\nexport const selectShowLoader = createSelector(\n selectShowReconnectPopup,\n unrealFeature.selectViewportReady,\n (showPopup, viewportReady) => !showPopup && !viewportReady,\n);\nexport const selectIsVideoPlayingAndDataChannelConnected = createSelector(\n unrealFeature.selectIsVideoPlaying,\n unrealFeature.selectDataChannelConnected,\n (isVideoPlaying, isDataChannelConnected) =>\n isVideoPlaying && isDataChannelConnected,\n);\nexport const selectSignalingParameters = createSelector(\n unrealFeature.selectSsData,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectSsInfo,\n (data, instance, ssInfo) => {\n const info = [];\n if (data) {\n info.push(\n `${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`,\n );\n info.push(`Unreal App Version: ${data.streamerVersion}`);\n info.push(`APP: ${data.streamPath}${data.streamApp}`);\n } else {\n info.push(ssInfo);\n }\n info.push(`Polling: ${instance.pollingUrl}`);\n info.push(`WS: ${instance.wsUrl}`);\n return info.join('<br>');\n },\n);\nexport const selectLoaderCommands = createSelector(\n unrealFeature.selectLoaderCommands,\n (loaderCommands) => loaderCommands,\n);\nexport const selectCommandsInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => loaderCommands.commandsInProgress.length,\n);\nexport const selectCommandProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => {\n if (loaderCommands.totalCommandsStarted > 0) {\n return (\n loaderCommands.totalCommandsCompleted /\n loaderCommands.totalCommandsStarted\n );\n }\n return 0;\n },\n);\nexport const selectLastCommandInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) =>\n loaderCommands.commandsInProgress?.length\n ? loaderCommands.commandsInProgress[\n loaderCommands.commandsInProgress.length - 1\n ]\n : null,\n);\n/**\n * Returns Scene load progress as a float value in between 0-1\n */\nexport const selectTotalProgress = createSelector(\n unrealFeature.selectStatusPercentSignallingServer,\n selectCommandProgress,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectDataChannelConnected,\n (\n statusPercentSignallingServer,\n commandProgress,\n awsInstance,\n dataChannelConnected,\n ) => {\n //TODO make better mechanism to detect is new orchestration\n const isNewOrchestration = String(awsInstance?.wsUrl).match(\n /^wss:\\/\\/orchestration-websocket/i,\n );\n\n const newOrchestrationProgressComplete = dataChannelConnected\n ? 100\n : (awsInstance?.progressComplete || 0) * 100;\n /**\n * Set 57% {@link SIGNALLING_PERCENT_VALUE} immediately when signalingServer?.signalingUrl is available\n * Up to 56% {@link SIGNALLING_PERCENT_VALUE} - 1 of the progress is reserved for signaling server polling\n */\n\n const signalingPercentValue = isNewOrchestration\n ? newOrchestrationProgressComplete\n : statusPercentSignallingServer;\n\n const SIGNALLING_MAX = SIGNALLING_PERCENT_VALUE / 100;\n const splitPoint = awsInstance?.wsUrl\n ? SIGNALLING_MAX + 0.01\n : SIGNALLING_MAX;\n\n const progressSignaling = lerp(\n 0.001,\n splitPoint,\n (signalingPercentValue ?? 0) / 100,\n );\n const progressRest = lerp(0, 1 - splitPoint, commandProgress);\n return clampf(0, 1, progressSignaling + progressRest);\n },\n);\n\nexport const selectClientAndViewIds = createSelector(\n unrealFeature.selectStreamClientCompanyId,\n unrealFeature.selectStreamViewId,\n (clientId, viewId) => ({ clientId, viewId }),\n);\nexport const isLoaderScreenVisible = createSelector(\n unrealFeature.selectViewportReady,\n unrealFeature.selectDataChannelConnected,\n unrealFeature.selectCirrusConnected,\n (viewReady, cirrusConnected, dataChannelConnected) =>\n !viewReady || !cirrusConnected || !dataChannelConnected,\n);\n","import type { InstanceReserved } from '../../interfaces';\nimport type { SignallingService } from '../../services';\nimport { setOrchestrationParameters } from '../../store';\n\nexport function InstanceReservedHandler(\n this: SignallingService,\n msg: InstanceReserved,\n) {\n this.store.dispatch(\n setOrchestrationParameters({\n instanceName: msg.payload.instanceId,\n streamRequestId: msg.payload.streamRequestId,\n eta: msg.payload.eta ?? 150,\n }),\n );\n}\n","import type { SignallingService } from '../../services';\n\nexport function PingHandler(this: SignallingService) {\n this.send(\n JSON.stringify({\n type: 'pong',\n source: 'front',\n }),\n );\n}\n","import type { SignallingService } from '../..//services';\nimport type { PlayerCountMessage } from '../..//interfaces';\nimport { Logger } from '@3dsource/utils';\n\nexport function PlayerCountHandler(\n this: SignallingService,\n msg: PlayerCountMessage,\n) {\n Logger.log(msg);\n}\n","import type { SignallingService } from '../../services';\nimport type { SSInfo } from '../../interfaces';\nimport { updateCirrusInfo } from '../../store';\n\nexport function SSInfoHandler(this: SignallingService, msg: SSInfo) {\n this.store.dispatch(\n updateCirrusInfo({ ssInfo: msg.message, ssData: msg.data }),\n );\n return null;\n}\n","import type { SignallingService } from '../../services';\nimport { dropConnection, setCirrusDisconnected } from '../../store';\nimport { Logger } from '@3dsource/utils';\nimport {\n WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n WSCloseCode_UNKNOWN,\n} from '../../interfaces';\n\nconst dropCodes = [\n WSCloseCode_UNKNOWN,\n WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n];\nexport function OnCloseHandler(this: SignallingService, e: CloseEvent): void {\n const message = `WebSocket closed: ${JSON.stringify(e.code)} - ${e.reason}`;\n Logger.warn(message);\n this.store.dispatch(setCirrusDisconnected());\n\n if (dropCodes.includes(e.code)) {\n this.store.dispatch(dropConnection());\n }\n}\n","import type { SignallingService } from '../../services';\nimport { Logger } from '@3dsource/utils';\nimport { disconnectStream } from '../../store';\nimport { DisconnectReason } from '../../interfaces';\n\nexport function OnErrorHandler(this: SignallingService, e: Event): void {\n Logger.warn(`WS error: ${JSON.stringify(e)}`);\n\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.WebSocketError,\n message: 'WebSocket Error',\n }),\n );\n}\n","import type { SignallingService } from '../../services';\n\nexport function OnMessageHandler(\n this: SignallingService,\n e: MessageEvent<string | Blob>,\n): void {\n const handleData = (data: string) => {\n //Logger.colored(...COLOR_CODES.FROM_SIGNALING, data);\n const msg = JSON.parse(data);\n this.handleMessage(msg);\n };\n\n if (typeof e.data === 'string') {\n handleData(e.data);\n } else if (e.data instanceof Blob) {\n e.data.text().then(handleData);\n }\n}\n","import type { SignallingService } from '../../services';\nimport { setCirrusConnected } from '../../store';\n\nexport function OnOpenHandler(this: SignallingService) {\n this.store.dispatch(setCirrusConnected());\n\n this.sendRequestStream();\n}\n","import type { Observable } from 'rxjs';\nimport { map, merge, scan } from 'rxjs';\n\ninterface ResetEvent {\n readonly type: 'reset';\n}\ninterface ValueEvent {\n readonly type: 'value';\n readonly value: number;\n}\ntype Event = ResetEvent | ValueEvent;\n\n/**\n * Keeps the max of numbers seen so far; resets to 0 whenever `reset$` emits.\n * Emits `0` immediately on reset.\n */\nexport const keepMaxUntilReset = (\n reset$: Observable<unknown>,\n): ((source: Observable<number>) => Observable<number>) => {\n return (source$: Observable<number>) =>\n merge(\n source$.pipe(map((value): Event => ({ type: 'value', value }) as const)),\n reset$.pipe(map((): Event => ({ type: 'reset' }) as const)),\n ).pipe(\n scan(\n (max, evt) => (evt.type === 'reset' ? 0 : Math.max(max, evt.value)),\n 0,\n ),\n );\n};\n","import type {\n MetaBoxCommandList,\n MetaBoxCommandPacket,\n} from '@3dsource/types-unreal';\nimport type { Observable } from 'rxjs';\nimport { of, take, timeout } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { catchError, filter, map } from 'rxjs/operators';\nimport { fromSignal } from '../helpers';\nimport { generateUuid, tapLog, Truthy } from '@3dsource/utils';\n\nexport function observeCommandResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n>(\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n dispatchOnTimeout = true,\n): Observable<ObservedCallbackResponse<T> | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(({ json }) => {\n // Some callbacks do not have commandCallback wrapper,\n // so first we check if it exists,\n // then fallback to JSON itself\n return 'commandCallback' in json\n ? { json }\n : { json: { commandCallback: json } };\n }),\n filter(({ json }) => {\n return json.commandCallback.correlationId === correlationId;\n }),\n timeout(timeOut),\n catchError(() =>\n dispatchOnTimeout\n ? of({ json: { commandCallback: { correlationId: 'timeout' } } })\n : of(null),\n ),\n take(1),\n tapLog('Command Response Observer'),\n filter(Truthy),\n );\n\n setTimeout(() => sender(out), 0);\n\n return observable as never;\n}\n\n// Suppose MetaBoxCommandPacket is your base command shape.\n// This type ensures that after filtering, json.commandCallback\n// has the same type as you passed in to observeCommandResponse.\nexport interface ObservedCallbackResponse<T extends MetaBoxCommandPacket> {\n json: {\n commandCallback: T;\n };\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function decodeData(anyData: any) {\n try {\n return new TextDecoder('utf-16').decode(anyData);\n } catch {\n return '';\n }\n}\n","import type { SignalDescriptor } from '../interfaces';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport type { Observable } from 'rxjs';\nimport { Signal } from '@3dsource/utils';\nimport { filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@3dsource/types-unreal';\n\ntype Descriptor = MetaBoxCommandList & SignalDescriptor;\n\n/**\n * UnrealInternalSignalEvents commands list wrapper listener\n * @param event\n */\nexport function fromSignal<K extends keyof Descriptor>(\n event: K,\n): Observable<Descriptor[K]> {\n return Signal.on(event).pipe(\n //tapLog('fromSignal', event), // <== for debugging, do not remove\n map((data: unknown) =>\n data && typeof data === 'object' && 'detail' in data ? data.detail : '',\n ),\n );\n}\n\ntype ArgumentType<K extends keyof Descriptor> = Descriptor[K] extends void\n ? never\n : Descriptor[K];\n\n/**\n * UnrealInternalSignalEvents commands list wrapper sender\n * @param event\n * @param args\n */\nexport function sendSignal<K extends keyof Descriptor>(\n event: K,\n ...args: ArgumentType<K> extends never ? [] : [ArgumentType<K>]\n) {\n Signal.broadcast(event, { detail: args?.[0] || null });\n}\n\nexport function fromUnrealCallBackSignal<K extends keyof Descriptor>(\n command: K,\n): Observable<Descriptor[K]> {\n return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map((data) => data?.json),\n map((json) => {\n if ('commandCallback' in json) {\n return json?.commandCallback;\n }\n\n return json;\n }),\n filter((json) => json.command === command),\n map((data) => data),\n map((data) => {\n if ('payload' in data) {\n return {\n command: data.command,\n payload: data?.payload,\n } as Descriptor[K];\n }\n\n return {\n command: data.command,\n } as Descriptor[K];\n }),\n );\n}\n","import { sendSignal } from './EventWrapper';\nimport { UnrealInternalSignalEvents } from '../interfaces';\n\nexport const dispatchResize = () => {\n window.dispatchEvent(new Event('resize'));\n};\n\nexport const forceResizeUnrealVideo = () => {\n sendSignal(UnrealInternalSignalEvents.ForceResizeViewport);\n};\n","const errorCodes: Record<`code${number}`, string | undefined> = {\n code404:\n 'Your asset is being synced on Metabox servers and is not yet available in Metabox Studio or Metabox Configurator. Please check again later after syncing is complete. ',\n};\n\nexport function getRtcErrorMessage(code: number | null): string | undefined {\n if (code === null) return undefined;\n\n return errorCodes[`code${code}`];\n}\n","import type { Observable } from 'rxjs';\nimport { animationFrameScheduler, concatMap, interval, of, scan } from 'rxjs';\nimport { distinctUntilChanged, map, takeWhile } from 'rxjs/operators';\nimport { clampf, lerp } from '@3dsource/utils';\n\nexport const floatToSmoothPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) => ({\n previous: acc.current,\n current: value,\n previousTs: acc.currentTs,\n currentTs:\n typeof performance !== 'undefined' ? performance.now() : Date.now(),\n }),\n {\n previous: 0,\n current: 0,\n previousTs: 0,\n currentTs: 0,\n } as {\n previous: number;\n current: number;\n previousTs: number;\n currentTs: number;\n },\n ),\n\n concatMap(({ previous, current, previousTs, currentTs }) => {\n // time delta in milliseconds\n const dt = previousTs ? currentTs - previousTs : 0;\n if (Math.abs(current - previous) > 0.95) {\n // Assume that a big difference seems like switch between 0 and 1 immediately after resetLoaderState(),\n // so it should go to 'current' without transitions\n return of(current);\n }\n\n // Max 300ms duration for smooth transition\n return smoothTransition(previous, current, Math.min(dt, 300));\n }),\n\n map((value) => clampf(0, 100, Math.round(value * 100))),\n );\n};\n\n/**\n * Creates an observable that emits values transitioning smoothly from the start value to the end value over a specified duration.\n * The transition is performed using linear interpolation (lerp) and clamped to the range [0, 1].\n *\n * @param {number} start - The starting value of the transition.\n * @param {number} end - The ending value of the transition.\n * @param {number} duration - The duration of the transition in milliseconds.\n * @returns {Observable<number>} An observable that emits the interpolated values from start to end over the specified duration.\n */\nexport const smoothTransition = (\n start: number,\n end: number,\n duration: number,\n): Observable<number> => {\n const startTime = animationFrameScheduler.now();\n return interval(0, animationFrameScheduler).pipe(\n map(() => {\n const elapsed = (animationFrameScheduler.now() - startTime) / duration;\n return clampf(0, 1, elapsed);\n }),\n distinctUntilChanged(),\n takeWhile((fraction) => fraction < 1, true),\n map((fraction) => lerp(start, end, fraction)),\n );\n};\n","import {\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n STREAMING_VIDEO_ID,\n} from '../constants';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport { getCanvasCached, getSnapshot } from '@3dsource/utils';\nimport type { StreamResolutionProps } from '../interfaces';\n\nexport const getImageFromVideoStream = (\n takeSizeFrom: 'video' | 'constant' = 'video',\n imageOutput?: ImageOutputValues,\n sizes?: StreamResolutionProps,\n) => {\n try {\n const video = document.getElementById(\n STREAMING_VIDEO_ID,\n ) as HTMLVideoElement;\n const { canvas, ctx } = getCanvasCached('video');\n\n canvas.width =\n takeSizeFrom === 'video'\n ? sizes?.width || video?.clientWidth || FULL_HD_WIDTH\n : FULL_HD_WIDTH;\n canvas.height =\n takeSizeFrom === 'video'\n ? sizes?.height || video?.clientHeight || FULL_HD_HEIGHT\n : FULL_HD_HEIGHT;\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n return getSnapshot(canvas, canvas.width, imageOutput) as string;\n } catch {\n return null;\n }\n};\n","/**\n * Generator for loop through urls\n * Each time it will return the next url, based on an index which MUST NOT be re-initialized inside function\n * @param urls\n */\nlet index = 0;\nexport function* getActiveUrl(urls: string[]) {\n while (true) {\n yield urls[index++ % urls.length];\n }\n}\n","import type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport class KalmanFilter1D {\n private estimate: number;\n private uncertainty: number;\n private processNoise: number;\n private measurementNoise: number;\n\n /**\n * @param initialEstimate Initial guess of the state.\n * @param initialUncertainty Initial uncertainty in the guess.\n * @param processNoise Process variance (Q) representing model uncertainty.\n * @param measurementNoise Measurement variance (R) representing noise in measurements.\n */\n constructor(\n initialEstimate: number,\n initialUncertainty: number,\n processNoise: number,\n measurementNoise: number,\n ) {\n this.estimate = initialEstimate;\n this.uncertainty = initialUncertainty;\n this.processNoise = processNoise;\n this.measurementNoise = measurementNoise;\n }\n\n /**\n * Incorporates a new measurement and returns the updated estimate.\n * @param measurement The new measurement value.\n */\n update(measurement: number): number {\n // === Prediction Step ===\n // For a constant model, the predicted state is the previous estimate.\n const predictedEstimate = this.estimate;\n // Increase the uncertainty by the process noise.\n const predictedUncertainty = this.uncertainty + this.processNoise;\n\n // === Update Step ===\n // Compute the innovation or measurement residual.\n const innovation = measurement - predictedEstimate;\n // Compute the innovation covariance.\n const innovationCovariance = predictedUncertainty + this.measurementNoise;\n // Compute the Kalman Gain.\n const kalmanGain = predictedUncertainty / innovationCovariance;\n\n // Update the estimate with the measurement, weighted by the Kalman Gain.\n this.estimate = predictedEstimate + kalmanGain * innovation;\n // Update the uncertainty.\n this.uncertainty = (1 - kalmanGain) * predictedUncertainty;\n\n return this.estimate;\n }\n\n config(data: FilterSettings) {\n const {\n initialBitrateEstimate,\n initialErrorCovariance,\n processNoise,\n measurementNoise,\n } = data;\n this.estimate = initialBitrateEstimate;\n this.uncertainty = initialErrorCovariance;\n this.processNoise = processNoise;\n this.measurementNoise = measurementNoise;\n }\n}\n","export class LatencyTimings {\n TestStartTimeMs!: number | null;\n UEReceiptTimeMs!: number | null;\n UEEncodeMs!: number | null;\n UECaptureToSendMs!: number | null;\n UETransmissionTimeMs!: number | null;\n BrowserReceiptTimeMs!: number | null;\n FrameDisplayDeltaTimeMs!: number | null;\n\n Reset() {\n this.TestStartTimeMs = null;\n this.UEReceiptTimeMs = null;\n this.UEEncodeMs = null;\n this.UECaptureToSendMs = null;\n this.UETransmissionTimeMs = null;\n this.BrowserReceiptTimeMs = null;\n this.FrameDisplayDeltaTimeMs = null;\n }\n\n SetUETimings(UETimings: any) {\n this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;\n this.UEEncodeMs = UETimings.EncodeMs;\n this.UECaptureToSendMs = UETimings.CaptureToSendMs;\n this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;\n this.BrowserReceiptTimeMs = Date.now();\n this.OnAllLatencyTimingsReady(this);\n }\n\n SetFrameDisplayDeltaTime(DeltaTimeMs: number) {\n if (this.FrameDisplayDeltaTimeMs == null) {\n this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);\n this.OnAllLatencyTimingsReady(this);\n }\n }\n\n OnAllLatencyTimingsReady(_: any) {}\n}\n","import type { Quality } from '../interfaces';\n\nexport function mapQpToQuality(VideoEncoderQP: number): Quality {\n const orangeQP = 26;\n const redQP = 35;\n\n let quality: Quality = 'lime';\n if (VideoEncoderQP > redQP) {\n quality = 'red';\n } else if (VideoEncoderQP > orangeQP) {\n quality = 'orange';\n }\n return quality;\n}\n","import { whereNot } from '@3dsource/utils';\nimport type { CommandsLoaderState } from '../store';\n\nexport const removeExileCommands = (\n state: CommandsLoaderState,\n idToRemove: string,\n) => {\n const exileTimout = 10000;\n const out = { ...state };\n out.commandsInProgress = out.commandsInProgress.filter(\n whereNot({ id: idToRemove }),\n );\n out.totalCommandsCompleted++;\n const time = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries(out.commandsInProgress).forEach(([, { id, timeStamp }]) => {\n if (time - timeStamp > exileTimout) {\n markForDelete.push(id);\n }\n });\n out.totalCommandsCompleted += markForDelete.length;\n out.commandsInProgress = out.commandsInProgress.filter(\n (command) => !markForDelete.includes(command.id),\n );\n return out;\n};\n","import { UnrealInternalSignalEvents } from '../interfaces';\nimport { sendSignal } from './EventWrapper';\n\nexport const resetAfk = () => {\n sendSignal(UnrealInternalSignalEvents.RestAfkTimer);\n};\n","import { Observable } from 'rxjs';\n\nexport function fromResizeObserver(\n elem: HTMLElement,\n): Observable<ResizeObserverEntry[]> {\n return new Observable((subscriber) => {\n const observer = new window.ResizeObserver((entries) =>\n subscriber.next(entries),\n );\n observer.observe(elem);\n\n return () => observer.unobserve(elem);\n });\n}\n","export class VideoRecorder {\n private recordedChunks!: any[];\n private mediaRecorder!: MediaRecorder;\n\n capture(canvas: any) {\n // Optional frames per second argument can be set in captureStream().\n const stream = (canvas as HTMLCanvasElement).captureStream();\n\n this.recordedChunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n this.mediaRecorder = new MediaRecorder(stream, options);\n this.mediaRecorder.ondataavailable = this.handleDataAvailable.bind(this);\n this.mediaRecorder.start();\n\n // demo: to download after 9sec\n /*\n setTimeout((event) => {\n mediaRecorder.stop();\n }, 9000);\n */\n }\n\n stop() {\n this.mediaRecorder?.stop();\n }\n\n handleDataAvailable(event: any) {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n this.download();\n }\n }\n\n download() {\n const blob = new Blob(this.recordedChunks, {\n type: 'video/webm',\n });\n\n const url = URL.createObjectURL(blob);\n const a: any = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = 'test.webm';\n a.click();\n URL.revokeObjectURL(url);\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { UnrealInternalSignalEvents } from '../../interfaces';\nimport { fromSignal } from '../../helpers';\nimport { CommonModule } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-clickable-overlay',\n templateUrl: './clickable-overlay.component.html',\n styleUrl: './clickable-overlay.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, SourceButtonComponent],\n})\nexport class ClickableOverlayComponent {\n readonly state = toSignal(\n fromSignal(UnrealInternalSignalEvents.ClickableOverlay).pipe(\n map((data) => (typeof data === 'object' ? data : null)),\n ),\n );\n}\n","@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [isFullWidth]=\"true\"\n [data-testid]=\"'continue-session'\"\n weight=\"primary\"\n size=\"lg\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport {\n selectFreezeFrameCombinedDataUrl,\n selectFreezeFrameProgressMessageFromVideo,\n} from '../../store';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-freeze-frame',\n templateUrl: './freeze-frame.component.html',\n styleUrl: './freeze-frame.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreezeFrameComponent {\n private store = inject(Store);\n\n readonly freezeFrameProgressMessageFromVideo = toSignal(\n this.store.select(selectFreezeFrameProgressMessageFromVideo),\n );\n readonly combinedFreeze = toSignal(\n this.store.select(selectFreezeFrameCombinedDataUrl),\n );\n}\n","<div class=\"freeze-images\">\n @if (combinedFreeze()) {\n <img\n [src]=\"combinedFreeze()\"\n class=\"videoStillImage\"\n alt=\"freezeFrameImage\"\n />\n }\n\n @if (freezeFrameProgressMessageFromVideo()) {\n <div class=\"progress-status\">\n {{ freezeFrameProgressMessageFromVideo() }}\n </div>\n }\n</div>\n","import type { PipeTransform } from '@angular/core';\nimport { inject, Pipe } from '@angular/core';\nimport type {\n SafeHtml,\n SafeResourceUrl,\n SafeScript,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safe',\n})\nexport class SafePipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n transform(\n value: any,\n type: string,\n ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\n if (!value) {\n return value;\n }\n\n switch (type) {\n case 'html':\n return this.sanitizer.bypassSecurityTrustHtml(value);\n case 'style':\n return this.sanitizer.bypassSecurityTrustStyle(value);\n case 'script':\n return this.sanitizer.bypassSecurityTrustScript(value);\n case 'url':\n return this.sanitizer.bypassSecurityTrustUrl(value);\n case 'resourceUrl':\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\n default:\n throw new Error(`Invalid safe type specified: ${type}`);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { DialogRef } from '@angular/cdk/dialog';\n\nimport { SafePipe } from '../../pipes';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-low-bandwidth-modal',\n templateUrl: './low-bandwidth-modal.component.html',\n styleUrl: './low-bandwidth-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SafePipe, SourceButtonComponent],\n})\nexport class LowBandwidthModalComponent {\n dialogRef = inject(DialogRef);\n\n close(value?: boolean) {\n this.dialogRef.close(value || false);\n }\n}\n","<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { isLoaderScreenVisible, unrealFeature } from '../../store';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\n\n@Component({\n selector: 'app-image-loading-src',\n templateUrl: './image-loading-src.component.html',\n styleUrl: './image-loading-src.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgOptimizedImage],\n})\nexport class ImageLoadingSrcComponent {\n store = inject(Store);\n\n isLoaderScreenVisible = this.store.selectSignal(isLoaderScreenVisible);\n imageLoadingSrc = this.store.selectSignal(\n unrealFeature.selectImageLoadingSrc,\n );\n}\n","@if (isLoaderScreenVisible()) {\n <div class=\"preload\">\n <div class=\"back\">\n @if (imageLoadingSrc()) {\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n }\n </div>\n </div>\n}\n","import type { AfterViewInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n inject,\n Input,\n input,\n ViewChild,\n} from '@angular/core';\nimport {\n HEXtoRGB,\n HSVtoRGB,\n inverseLerp,\n RGBtoHEX,\n RGBtoHSV,\n} from '@3dsource/utils';\n\n@Component({\n selector: 'app-stat-graph',\n templateUrl: './stat-graph.component.html',\n styleUrl: './stat-graph.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatGraphComponent implements AfterViewInit {\n private el = inject(ElementRef);\n @ViewChild('graph') graph!: ElementRef;\n private canvas!: HTMLCanvasElement;\n private ctx!: CanvasRenderingContext2D;\n\n readonly color = input('#417bc9');\n readonly tickStep = input(3);\n readonly label = input.required<string>();\n private scaleY!: number;\n\n @Input() set dataTick(data: { value: number; hash: number } | null) {\n this.pushData(data?.value ?? null);\n }\n\n private data: (number | null)[] = [];\n\n max = 0;\n min = 0;\n current = 0;\n\n ngAfterViewInit() {\n this.canvas = this.graph.nativeElement;\n this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n }\n\n @HostListener('window:resize', ['$event'])\n resize(e: Event) {\n this.draw();\n }\n\n private draw() {\n if (!this.canvas) {\n return;\n }\n\n const all = this.data.filter((r) => r !== null && !isNaN(r)) as number[];\n this.max = Math.max(...all);\n this.min = Math.min(...all);\n this.scaleY = this.canvas.height / (this.max || 1);\n this.current = all[all.length - 1] || 0;\n this.ctx.save();\n const bounds = this.el.nativeElement.getBoundingClientRect();\n this.canvas.width = bounds.width;\n this.canvas.height = bounds.height - 30; // -p height\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n [...this.data].reverse().forEach((val, index) => {\n const h = (val || 0) * this.scaleY;\n\n this.ctx.fillStyle = this.getColor(this.color(), h as number);\n this.ctx.fillRect(\n index * this.tickStep(),\n this.canvas.height - h,\n this.tickStep(),\n h,\n );\n });\n this.ctx.restore();\n }\n\n private getColor(fillStyle: string, value = 0) {\n const { r, g, b } = HEXtoRGB(fillStyle);\n /* eslint-disable-next-line prefer-const */\n let [h, s, v] = RGBtoHSV(r, g, b);\n v = inverseLerp(0, this.canvas.height, value);\n {\n const [r, g, b] = HSVtoRGB(h, s, v);\n return '#' + RGBtoHEX(r, g, b);\n }\n }\n\n private pushData(value: number | null) {\n this.data.push(value);\n\n if (!this.canvas) {\n return;\n }\n\n if (this.data.length > this.canvas.width / this.tickStep()) {\n this.data.shift();\n }\n\n this.draw();\n }\n}\n","<div class=\"content\">\n <p>{{ label() }}: {{ current }} | Min:{{ min }} | Max:{{ max }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Falsy, tapLog, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { combineLatestWith, merge, of, skip, Subject, switchMap } from 'rxjs';\nimport {\n debounceTime,\n delay,\n distinctUntilChanged,\n filter,\n map,\n tap,\n} from 'rxjs/operators';\nimport {\n selectShowLoader,\n selectTotalProgress,\n unrealFeature,\n} from '../../store';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { SCREEN_LOCKER_CONTAINER_ID, UNREAL_CONFIG } from '../../constants';\nimport { floatToSmoothPercents, keepMaxUntilReset } from '../../helpers';\nimport { SourceLoadingComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-unreal-status',\n templateUrl: './unreal-status.component.html',\n styleUrl: './unreal-status.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceLoadingComponent],\n})\nexport class UnrealStatusComponent implements OnInit {\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG);\n private readonly destroyRef = inject(DestroyRef);\n private readonly store = inject(Store);\n\n private readonly resetPercentageSignal$ = this.store\n .select(selectShowLoader)\n .pipe(filter(Falsy));\n\n readonly showLoader = this.store.selectSignal(selectShowLoader);\n /**\n * An observable that emits smoothed percentage values from 0 to 100.\n */\n readonly messagePercents = toSignal(\n this.store.select(selectTotalProgress).pipe(\n keepMaxUntilReset(this.resetPercentageSignal$),\n floatToSmoothPercents(),\n distinctUntilChanged(),\n map((progress) => (progress || 0) + '%'),\n combineLatestWith(this.store.select(unrealFeature.selectIsReconnecting)),\n map(([percent, isReconnecting]) =>\n isReconnecting ? 'Reconnecting...' : percent,\n ),\n ),\n );\n\n readonly awsInstance = this.store.selectSignal(\n unrealFeature.selectAwsInstance,\n );\n\n ngOnInit() {\n /**\n * A subject that emits null values to trigger nullification.\n */\n const nullify$ = new Subject<null>();\n\n /**\n * An observable that emits null values with a delay of 2000 milliseconds.\n */\n const nullifyObs$: Observable<null> = nullify$\n .asObservable()\n .pipe(delay(2000));\n\n /**\n * An observable that emits the status message from the Unreal feature store.\n */\n const signalingStatus$ = this.store.select(\n unrealFeature.selectStatusMessage,\n );\n\n /**\n * An observable that emits connection status messages based on the Cirrus connection state.\n * Then call side effect to nullify the message.\n */\n const cirrusConnected$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(\n skip(1),\n switchMap((connected) =>\n connected\n ? of('Creating Socket...')\n : of('Connection closed.').pipe(tap(() => nullify$.next(null))),\n ),\n );\n\n /**\n * An observable that emits the viewport visibility state.\n */\n const viewportTrigger$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n\n /**\n * An observable that will nullify any message displayed after 500 mSec, when viewport changes its state.\n */\n const streamToggle$ = merge(\n viewportTrigger$.pipe(filter(Falsy), skip(1)),\n viewportTrigger$.pipe(filter(Truthy)),\n ).pipe(\n delay(500),\n map(() => null),\n );\n\n /**\n * A subscription that merges various status observables and emits debounced status via postMessage.\n */\n merge(nullifyObs$, cirrusConnected$, signalingStatus$, streamToggle$)\n .pipe(\n debounceTime(0),\n tapLog('STATUS=>'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((status) => this.sendMessageToIndex(status as string));\n }\n\n /**\n * Sends a message to the embedded iframe identified by the default value '3dsource_start_screen' ID.\n * This function tries to post a message to the iframe's content window. If the content\n * window is not accessible (e.g., due to cross-origin policies), the function fails silently.\n *\n * @param {string} text The message to be sent to the iframe. This could be a status update\n * or any other relevant information that the iframe needs to process.\n */\n private sendMessageToIndex(text: string) {\n const objectElement = document.getElementById(\n this.unrealInitialConfig?.screenLockerContainerId ||\n SCREEN_LOCKER_CONTAINER_ID,\n ) as HTMLIFrameElement;\n\n try {\n const objectDocument = objectElement.contentWindow;\n objectDocument?.postMessage(text, '*');\n } catch {\n // Fails silently if the iframe's content window cannot be accessed\n }\n }\n}\n","@if (showLoader()) {\n <div class=\"status-box\">\n @if (awsInstance().message) {\n <p>{{ awsInstance().message }}</p>\n } @else {\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents() }}\n </div>\n }\n </div>\n}\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { BehaviorSubject, combineLatestWith, of } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport type { InboundVideoStats } from '../../interfaces';\nimport { selectSignalingParameters, unrealFeature } from '../../store';\nimport { StatGraphComponent } from '../stat-graph/stat-graph.component';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { Store } from '@ngrx/store';\nimport { DevModeService, VideoService } from '../../services';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { SafePipe } from '../../pipes';\n\n@Component({\n selector: 'app-video-stats',\n templateUrl: './video-stats.component.html',\n styleUrl: './video-stats.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe],\n})\nexport class VideoStatsComponent implements OnInit {\n collapsed = false;\n private store = inject(Store);\n private videoService = inject(VideoService);\n private isDevMode = inject(DevModeService).isDevMode;\n private obs$ = this.videoService.videoStats$;\n\n readonly viewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n readonly ssInfo = toSignal(this.store.select(selectSignalingParameters));\n readonly fpsTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.framesPerSecond || 0,\n hash: index,\n })),\n ),\n );\n readonly fpsAvgTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.avgFrameRate,\n hash: index,\n })),\n ),\n );\n readonly bitrateTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.bitrate,\n hash: index,\n })),\n ),\n );\n readonly videoQP = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.VideoEncoderQP,\n hash: index,\n })),\n ),\n );\n readonly bitrateAverageTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.avgBitrate,\n hash: index,\n })),\n ),\n );\n readonly videoStatus = toSignal(\n this.obs$.pipe(\n map(\n (event) =>\n this.isDevMode &&\n ({\n ...event.aggregatedStats,\n quality: event.quality,\n } as InboundVideoStats),\n ),\n filter(Boolean),\n map((data: any) => {\n return this.fields\n .map((key) => {\n return {\n key,\n value: data[key],\n };\n })\n .filter((r) => !this.elementsToShow.includes(r.key));\n }),\n ),\n );\n fields!: string[];\n graphList: any[] = [];\n graphList$!: Observable<any>;\n private idKey = 'com.source3d.unreal.stat';\n private elementsToShow: string[] = [];\n\n private trigger$ = new BehaviorSubject<void>(undefined);\n\n constructor() {\n this.getFields();\n }\n\n ngOnInit() {\n this.fields = [\n 'kalmanBitrate',\n 'bitrateDrop',\n 'runTime',\n 'pixelRatio',\n 'frameHeight',\n 'frameWidth',\n ':-------------',\n 'jitter',\n 'MBytesReceived',\n 'framesDecoded',\n 'framesDropped',\n 'framesReceived',\n 'keyFramesDecoded',\n 'currentRoundTripTime',\n 'packetsLost',\n ':-------------',\n 'quality',\n 'videoCodec',\n 'kind',\n 'type',\n 'codecs',\n 'selectedPair',\n //'pliCount',\n //'sliCount',\n //'transportId',\n //'id',\n ];\n\n this.updateGraph();\n }\n\n updateGraph() {\n this.graphList = this.fields.map((key: any) => {\n const stat = this.obs$.pipe(\n map((val, index) => {\n const value = (val.aggregatedStats as any)[key];\n return { value, hash: index } as any;\n }),\n );\n\n return {\n key,\n color: Math.floor(Math.random() * 16777216),\n stat,\n };\n });\n\n this.graphList$ = of(this.graphList).pipe(\n combineLatestWith(this.trigger$),\n map(([graphList]) =>\n graphList.filter((r) => this.elementsToShow.includes(r.key)),\n ),\n );\n }\n\n toggle() {\n this.collapsed = !this.collapsed;\n this.writeFields();\n }\n\n toggleGraph($event: MouseEvent, el: string, value?: any) {\n $event.stopPropagation();\n if ((value && typeof value !== 'number') || isNaN(value)) {\n return;\n }\n if (this.elementsToShow.includes(el)) {\n this.elementsToShow = this.elementsToShow.filter((item) => item !== el);\n } else {\n this.elementsToShow.push(el);\n }\n this.writeFields();\n this.trigger$.next();\n }\n\n private getFields() {\n try {\n const { elements, collapsed } =\n JSON.parse(localStorage.getItem(this.idKey) as string) || [];\n this.elementsToShow = elements || [];\n this.collapsed = collapsed;\n } catch {\n this.elementsToShow = [];\n }\n }\n\n private writeFields() {\n localStorage.setItem(\n this.idKey,\n JSON.stringify({\n collapsed: this.collapsed,\n elements: this.elementsToShow,\n }),\n );\n }\n}\n","@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats</button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()!\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()!\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()!\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n}\n","import type { AfterViewInit, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { VideoService } from '../../services';\nimport {\n isLoaderScreenVisible,\n selectIsExistMatchUrls,\n selectShowReconnectPopup,\n selectStreamConfig,\n startStream,\n unrealFeature,\n} from '../../store';\nimport { filter, skip } from 'rxjs/operators';\nimport type { SignalDescriptor } from '../../interfaces';\nimport { UnrealInternalSignalEvents } from '../../interfaces';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Falsy, Logger } from '@3dsource/utils';\nimport { fromSignal } from '../../helpers';\nimport { Store } from '@ngrx/store';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-resume-stream-button',\n templateUrl: './resume-stream-button.component.html',\n styleUrl: './resume-stream-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class ResumeStreamButtonComponent implements AfterViewInit, OnInit {\n store = inject(Store);\n videoService = inject(VideoService);\n destroyRef = inject(DestroyRef);\n\n showReconnectPopup = this.store.selectSignal(selectShowReconnectPopup);\n isLoaderScreenVisible = this.store.selectSignal(isLoaderScreenVisible);\n\n streamConfig = this.store.selectSignal(selectStreamConfig);\n isExistMatchUrls = this.store.selectSignal(selectIsExistMatchUrls);\n readonly isSecondStart = signal(\n !!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)),\n );\n readonly isShowResumeButton = computed(\n () =>\n this.isLoaderScreenVisible() &&\n this.showReconnectPopup() &&\n this.isExistMatchUrls(),\n );\n\n playCallBack: null | (() => void) = null;\n\n ngOnInit() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onDisconnect());\n }\n\n ngAfterViewInit() {\n fromSignal(UnrealInternalSignalEvents.ShowPlayButton)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: SignalDescriptor['ShowPlayButton']) => {\n this.playCallBack = event.callback;\n\n if (this.videoService.video?.paused) {\n Logger.info('Simulate Press Play');\n this.playCallBack();\n }\n });\n }\n\n connect() {\n this.store.dispatch(startStream({ config: { autoStart: true } }));\n }\n\n onDisconnect() {\n this.isSecondStart.set(true);\n this.playCallBack = null;\n }\n}\n","@if (isShowResumeButton()) {\n <div class=\"resume-box\">\n @if (isSecondStart()) {\n <div class=\"resume-box__text\">\n Your stream has been paused due to inactivity\n </div>\n }\n\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [data-testid]=\"'connect-button'\"\n size=\"lg\"\n weight=\"primary\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n}\n","import type { ElementRef } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\nimport { resetIntroSrc, unrealFeature } from '../../store';\n\n@Component({\n selector: 'app-intro-src',\n templateUrl: './intro-src.component.html',\n styleUrl: './intro-src.component.scss',\n imports: [NgOptimizedImage],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IntroSrcComponent {\n private readonly videoElement =\n viewChild<ElementRef<HTMLDivElement>>('videoPlayerCover');\n private store = inject(Store);\n protected imageIntroSrc = this.store.selectSignal(\n unrealFeature.selectImageIntroSrc,\n );\n protected videoIntroSrc = this.store.selectSignal(\n unrealFeature.selectVideoIntroSrc,\n );\n private viewportReady = this.store.selectSignal(\n unrealFeature.selectViewportReady,\n );\n\n constructor() {\n effect(() => {\n const viewportReady = this.viewportReady();\n const videoIntroSrc = this.videoIntroSrc();\n const imageIntroSrc = this.imageIntroSrc();\n untracked(() => {\n if (viewportReady && (videoIntroSrc || imageIntroSrc)) {\n this.store.dispatch(resetIntroSrc());\n }\n });\n });\n effect(() => {\n const videoIntroSrc = this.videoIntroSrc();\n const videoElement = this.videoElement();\n if (!videoIntroSrc || !videoElement) {\n return;\n }\n untracked(() =>\n this.createVideo(videoIntroSrc, videoElement.nativeElement),\n );\n });\n }\n\n private createVideo(src: string, videoContainer: HTMLDivElement) {\n const matchAbsolutePath = !!src.match(/.*\\.(mp4|WebM)(\\?.*)?$/i);\n // Select the parent layout where the video will be inserted\n videoContainer.innerHTML = ''; // This will remove all existing content within the layout\n // Create the video element\n const videoElement = document.createElement('video');\n videoElement.autoplay = true;\n videoElement.muted = true;\n videoElement.loop = true;\n if (!matchAbsolutePath) {\n videoElement.poster = `${src}/cover.webp`;\n }\n\n videoElement.style.position = 'absolute';\n videoElement.style.width = '100%';\n videoElement.style.height = '100%';\n videoElement.style.objectFit = 'cover';\n\n const sourceElement = document.createElement('source');\n if (matchAbsolutePath) {\n sourceElement.src = src;\n } else {\n sourceElement.src = `${src}/video.mp4`;\n }\n\n sourceElement.type = 'video/mp4';\n // Append the source element to the video element\n videoElement.appendChild(sourceElement);\n // Handle browser fallback text\n videoElement.innerHTML += 'Browser not supported';\n // Append the video element to the layout\n videoContainer.appendChild(videoElement);\n }\n}\n","@let imageSrc = imageIntroSrc();\n@if (imageSrc) {\n <div class=\"backImage\">\n <img [ngSrc]=\"imageSrc\" fill alt=\"imageSrc\" />\n </div>\n} @else if (videoIntroSrc()) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { distinctUntilChanged, filter, map, tap } from 'rxjs/operators';\nimport {\n combineLatestWith,\n debounceTime,\n fromEvent,\n merge,\n switchMap,\n take,\n timer,\n} from 'rxjs';\nimport {\n DevModeService,\n UnrealCommunicatorService,\n VideoService,\n} from '../../services';\nimport { UnrealInternalSignalEvents } from '../../interfaces';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport type { Area, Size } from '@3dsource/utils';\nimport { fitIntoRectangle, fpIsASameAsB, Truthy } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport {\n changeStreamResolutionAction,\n destroyUnrealScene,\n initSignalling,\n selectIsExistMatchUrls,\n selectIsFreezeFrameLoading,\n unrealFeature,\n} from '../../store';\nimport {\n DEBOUNCE_TO_MANY_RESIZE_CALLS,\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n SAME_SIZE_THRESHOLD,\n} from '../../constants';\nimport { fromSignal, sendSignal } from '../../helpers';\nimport { ClickableOverlayComponent } from '../clickable-overlay/clickable-overlay.component';\nimport { UnrealStatusComponent } from '../unreal-status/unreal-status.component';\nimport { FreezeFrameComponent } from '../freeze-frame/freeze-frame.component';\nimport { VideoStatsComponent } from '../video-stats/video-stats.component';\nimport { ResumeStreamButtonComponent } from '../resume-stream-button/resume-stream-button.component';\nimport { ImageLoadingSrcComponent } from '../image-loading-src/image-loading-src.component';\nimport { IntroSrcComponent } from '../intro-src/intro-src.component';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\n\n@Component({\n selector: 'app-unreal-scene',\n templateUrl: './unreal-scene.component.html',\n styleUrl: './unreal-scene.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ClickableOverlayComponent,\n UnrealStatusComponent,\n FreezeFrameComponent,\n VideoStatsComponent,\n ResumeStreamButtonComponent,\n ImageLoadingSrcComponent,\n IntroSrcComponent,\n ],\n})\nexport class UnrealSceneComponent {\n readonly isStudio = input(false);\n readonly useContainerAsSizeProvider = input(true);\n readonly studioResolutionSize = input<{ width: number; height: number }>({\n width: FULL_HD_WIDTH,\n height: FULL_HD_HEIGHT,\n });\n studioResolutionValues = toObservable(\n computed(() => {\n const values = this.studioResolutionSize();\n return { width: values.width, height: values.height };\n }),\n );\n readonly videoElement =\n viewChild<ElementRef<HTMLDivElement>>('videoContainer');\n changeMouseOverScene = output<boolean>();\n private width = FULL_HD_WIDTH;\n private height = FULL_HD_HEIGHT;\n private store = inject(Store);\n private isExistMatchUrls = this.store.selectSignal(selectIsExistMatchUrls);\n readonly isDevMode = inject(DevModeService).isDevMode;\n readonly lightMode = this.store.selectSignal(\n unrealFeature.selectLowBandwidth,\n );\n private isFreezeFrameLoading = this.store.selectSignal(\n selectIsFreezeFrameLoading,\n );\n private commandsSender = inject(UnrealCommunicatorService);\n private videoService = inject(VideoService);\n private element = inject(ElementRef);\n private destroyRef = inject(DestroyRef);\n\n private get resizeValues() {\n if (!this.isStudio()) {\n return this.getResizeValuesUniversal();\n }\n return this.getResizeValues();\n }\n\n private get pixelRatio() {\n return window.devicePixelRatio;\n }\n\n @HostListener('mouseover')\n onMouseOver() {\n this.changeMouseOverScene.emit(true);\n }\n @HostListener('mouseout')\n onMouseOut() {\n this.changeMouseOverScene.emit(false);\n }\n\n constructor() {\n this.destroyRef.onDestroy(() => this.store.dispatch(destroyUnrealScene()));\n effect(() => {\n const videoElement = this.videoElement();\n const isExistMatchUrls = this.isExistMatchUrls();\n if (videoElement && isExistMatchUrls) {\n this.store.dispatch(initSignalling());\n }\n });\n\n afterNextRender({\n read: () => {\n const videoElement = this.videoElement();\n if (videoElement) {\n this.videoService.setContainer(videoElement.nativeElement);\n\n if (this.element?.nativeElement) {\n fromEvent<Event>(this.element?.nativeElement, 'contextmenu')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: Event) => event.preventDefault());\n }\n this.listenResizeValues();\n }\n },\n });\n }\n\n private listenResizeValues() {\n const customSizeInputChanged$ = this.studioResolutionValues.pipe(\n filter(Truthy),\n distinctUntilChanged(),\n filter(\n ({ width, height }) => this.width !== width || this.height !== height,\n ),\n map(({ width, height }) => ({ width, height })),\n tap(({ width, height }) => {\n this.width = width;\n this.height = height;\n }),\n );\n\n const resizeRequired$ = merge(\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized),\n fromEvent(window, 'resize'),\n );\n\n const videoStreamSizeChanged$ = this.videoService?.videoStats$.pipe(\n filter(() => !this.isFreezeFrameLoading()),\n map((stats) => ({\n w: stats.aggregatedStats.frameWidth || 0,\n h: stats.aggregatedStats.frameHeight || 0,\n })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n );\n\n merge(customSizeInputChanged$, resizeRequired$, videoStreamSizeChanged$)\n .pipe(\n debounceTime(DEBOUNCE_TO_MANY_RESIZE_CALLS),\n switchMap(() => {\n const key = Math.random();\n // Monitoring the size of the video stream\n return timer(0, 300).pipe(\n take(3),\n map(() => key),\n );\n }),\n map((key) => ({ key, ...this.resizeValues })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD) &&\n previous.key === current.key,\n ),\n tap((size) => this.adaptVideo(size)),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n combineLatestWith(\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy)),\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([size]) => {\n this.store.dispatch(\n changeStreamResolutionAction({ width: size.w, height: size.h }),\n );\n this.sendResize(size);\n });\n\n fromSignal(UnrealInternalSignalEvents.ForceResizeViewport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.sendResize(this.resizeValues);\n });\n }\n\n private adaptVideo(size: Size) {\n const video = this.videoService.video;\n const areaSize = this.resizeValues;\n\n if (video?.style) {\n const pR = this.pixelRatio;\n video.width = this.makeEven(size.w / pR / areaSize.scale);\n video.height = this.makeEven(size.h / pR / areaSize.scale);\n\n if (!this.isStudio()) {\n video.style.overflow = 'hidden';\n video.style.objectFit = 'cover';\n video.style.width = `${video.width}px`;\n video.style.height = `${video.height}px`;\n }\n }\n\n sendSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer);\n }\n\n /**\n * This method calculates the dimensions for resizing a layout in a configurator stream.\n * It takes into account the pixel ratio of the device's screen and the orientation of the layout.\n * The method uses the `fitIntoRectangle` function to calculate the dimensions that would allow the layout to fit into the maximum space while maintaining its aspect ratio.\n * It also sets the maximum limits for the width and height based on the layout's orientation.\n * If the scale of the fitted dimensions is less than 1, it assigns the fitted dimensions to the output. Otherwise, it sets the scale of the output to 1.\n * @returns {Area} An object of type `Area` that contains the calculated dimensions for resizing the layout.\n */\n private getResizeValuesUniversal(): Area {\n const pR = this.pixelRatio;\n let containerW = window.innerWidth || 2;\n let containerH = window.innerHeight || 2;\n\n if (this.useContainerAsSizeProvider()) {\n containerW = this.videoElement()?.nativeElement.offsetWidth || 2;\n containerH = this.videoElement()?.nativeElement.offsetHeight || 2;\n }\n\n const maxSpace = { w: containerW * pR, h: containerH * pR };\n\n const isVertical = containerW < containerH;\n let maxH = FULL_HD_HEIGHT;\n let maxW = FULL_HD_WIDTH;\n\n const params = new URLSearchParams(location.search);\n const maxRes = params.get('maxresolution');\n\n if (Truthy(maxRes)) {\n maxH = FULL_HD_HEIGHT * 2;\n maxW = FULL_HD_WIDTH * 2;\n }\n\n const maxLimits = isVertical\n ? { w: maxH, h: maxW, x: 0, y: 0 }\n : { w: maxW, h: maxH, x: 0, y: 0 };\n\n const props = fitIntoRectangle(\n { x: 0, y: 0, w: containerW, h: containerH },\n { x: 0, y: 0, ...maxSpace },\n );\n\n let out = { ...props };\n\n const fitIntoMax = fitIntoRectangle(props, maxLimits);\n if (fitIntoMax.scale < 1) {\n // If reducing size to 1920x1080 is required, do it\n out = fitIntoMax;\n } else {\n // Otherwise, use the lowest resolution because the layout size is smaller than 1920x1080\n out.scale = 1;\n }\n\n /**\n * Ensure that the size is always even.\n */\n out.w = this.makeEven(out.w);\n out.h = this.makeEven(out.h);\n\n return { ...out };\n }\n\n private getResizeValues(): Area {\n const pR = this.pixelRatio;\n const containerW =\n pR * (this.videoElement()?.nativeElement.offsetWidth || 2);\n const containerH =\n pR * (this.videoElement()?.nativeElement.offsetHeight || 2);\n const maxSpace = { w: containerW, h: containerH };\n\n const videoSizePixelPerfect = fitIntoRectangle(\n { x: 0, y: 0, w: this.width, h: this.height },\n { x: 0, y: 0, ...maxSpace },\n );\n\n const out = fitIntoRectangle(videoSizePixelPerfect, {\n x: 0,\n y: 0,\n w: Math.min(containerW, FULL_HD_WIDTH),\n h: Math.min(containerH, FULL_HD_HEIGHT),\n });\n\n /**\n * Ensure that the size is always even.\n */\n out.w = this.makeEven(out.w);\n out.h = this.makeEven(out.h);\n return out;\n }\n\n private sendResize(size: Size) {\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FChangeResolutionCommand,\n payload: { resolution: { x: size.w, y: size.h } },\n });\n }\n\n private makeEven(value: number) {\n return Math.floor((value + 1) / 2) * 2;\n }\n}\n","<div class=\"frame unreal-container\">\n <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-intro-src />\n <app-image-loading-src />\n <app-resume-stream-button />\n <app-unreal-status />\n <app-freeze-frame />\n <app-clickable-overlay />\n\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n\n @if (isDevMode) {\n <app-video-stats />\n }\n</div>\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { disconnectStream, unrealFeature } from '../../store';\nimport { DisconnectReason } from '../../interfaces';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\nimport { take } from 'rxjs';\n\n@Component({\n selector: 'app-webrtc-error-modal',\n templateUrl: './webrtc-error-modal.component.html',\n styleUrl: './webrtc-error-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class WebrtcErrorModalComponent {\n private dialogRef = inject(DialogRef);\n private store = inject(Store);\n\n close() {\n this.dialogRef.close();\n }\n\n closeModalWithCirrusDisconnect() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(take(1))\n .subscribe((isConnected) => {\n if (!isConnected) {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.DropConnection,\n message: 'Modal Drop Connection',\n }),\n );\n }\n this.close();\n });\n }\n}\n","<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { DefaultFilterModel, FilterModel } from '../DataFlowConstants';\n\n@Component({\n selector: 'app-filter-settings',\n templateUrl: './filter-settings.component.html',\n styleUrl: './filter-settings.component.scss',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSettingsComponent implements OnInit {\n private readonly storageKey = 'LBMFilterSettings';\n readonly defaultFilterModel = { ...DefaultFilterModel };\n settings = { ...DefaultFilterModel };\n\n ngOnInit(): void {\n const savedSettings = localStorage.getItem(this.storageKey);\n if (savedSettings) {\n this.dispatch(JSON.parse(savedSettings));\n }\n }\n\n togglePanel() {\n this.settings.panelOpen = !this.settings.panelOpen;\n this.saveSettings();\n }\n\n saveSettings() {\n const valid = Object.entries(this.settings).reduce((acc, [key, value]) => {\n return Truthy(value) ? { ...acc, [key]: value } : acc;\n }, {});\n this.dispatch({ ...DefaultFilterModel, ...valid });\n }\n\n dispatch(model: typeof DefaultFilterModel) {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(model));\n } catch (e) {\n Logger.error('Storage not available, Error saving filter settings:', e);\n }\n Object.assign(this.settings, model);\n Object.assign(FilterModel, model);\n Signal.broadcast('setKalmanParams', model);\n }\n\n reset() {\n this.dispatch({\n ...DefaultFilterModel,\n panelOpen: this.settings.panelOpen,\n });\n }\n}\n","<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n @if (settings.panelOpen) {\n <div class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n }\n</div>\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { filter, tap } from 'rxjs/operators';\nimport { LowBandwidthModalComponent } from '../low-bandwidth-modal/low-bandwidth-modal.component';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport { changeLowBandwidth, unrealFeature } from '../../store';\nimport { Dialog } from '@angular/cdk/dialog';\nimport {\n combineLatestWith,\n concat,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n of,\n share,\n skip,\n switchMap,\n take,\n takeUntil,\n timer,\n} from 'rxjs';\nimport { DevModeService, VideoService } from '../../services';\nimport type { Quality } from '../../interfaces';\nimport type { DataFlowCheckResult } from '../../helpers';\nimport { FilterSettingsComponent } from './filter-settings/filter-settings.component';\nimport { BITRATE_MONITOR, FilterModel } from './DataFlowConstants';\n\n@Component({\n selector: 'app-low-bandwidth-detector',\n templateUrl: './low-bandwidth-detector.component.html',\n styleUrl: './low-bandwidth-detector.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FilterSettingsComponent],\n})\nexport class LowBandwidthDetectorComponent implements OnInit {\n private readonly store = inject(Store);\n private readonly dialog = inject(Dialog);\n private readonly destroyRef = inject(DestroyRef);\n private readonly videoService = inject(VideoService);\n readonly isDevMode = inject(DevModeService).isDevMode;\n\n private readonly viewportReady$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n private readonly isLowBandwidth$ = this.store.select(\n unrealFeature.selectLowBandwidth,\n );\n private readonly lowBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Truthy),\n );\n private readonly highBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly viewPortDestroyedTrigger$ = this.viewportReady$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly aggregatedStats$ = this.videoService.videoStats$.pipe(\n map((data) => data.aggregatedStats),\n share(),\n );\n private readonly nativeQuality$ = this.videoService.videoStats$.pipe(\n map((data) => data.quality),\n );\n\n private readonly monitoringTrigger$ = this.viewportReady$\n .pipe(\n combineLatestWith(this.isLowBandwidth$),\n map(\n ([viewPortReady, isLowBandwidth]) => viewPortReady && !isLowBandwidth,\n ),\n )\n .pipe(share());\n\n private readonly reTrigger$ = this.monitoringTrigger$.pipe(\n map(() => ({ quality: 'lime' as Quality })),\n );\n\n private readonly canSwitchToLowBand$ = this.monitoringTrigger$.pipe(\n debounceTime(100),\n switchMap((canSwitch) =>\n concat(\n of(false),\n timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch)),\n ).pipe(take(2), takeUntil(this.monitoringTrigger$)),\n ),\n distinctUntilChanged(),\n tapLog('DROP: [LOWBANDWIDTH] Monitoring Active =>'),\n share(),\n );\n\n private readonly videoQuality$ = merge(\n this.nativeQuality$,\n this.reTrigger$,\n ).pipe(share(), takeUntil(this.viewPortDestroyedTrigger$));\n\n private readonly fps$ = this.aggregatedStats$.pipe(\n map((data) => data.framesPerSecond || 0),\n );\n\n private readonly bitrateDrop$ = this.aggregatedStats$.pipe(\n map((data) => data.dataFlowCheckResult),\n filter((br) => br.isDropDetected),\n takeUntil(merge(this.viewPortDestroyedTrigger$, this.reTrigger$)),\n );\n\n readonly fps = toSignal(this.fps$, { initialValue: 0 });\n readonly nativeQuality = toSignal(this.nativeQuality$);\n readonly isLowBandwidth = toSignal(this.isLowBandwidth$);\n readonly aggregatedStats = toSignal(this.aggregatedStats$);\n readonly isReducedQuality = signal(false);\n readonly isIndicatorExpanded = signal(false);\n\n readonly isIndicatorExpandedTrigger$ = toObservable(\n this.isIndicatorExpanded,\n ).pipe(skip(1), distinctUntilChanged(), filter(Falsy));\n\n ngOnInit() {\n this.lowBandwidthTrigger$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.toggleIndicator(true));\n\n merge(this.viewPortDestroyedTrigger$, this.highBandwidthTrigger$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isReducedQuality.set(false));\n\n this.canSwitchToLowBand$\n .pipe(\n filter(Truthy),\n tap(() => {\n BITRATE_MONITOR.reset();\n this.isReducedQuality.set(false);\n }),\n switchMap(() => this.bitrateDrop$),\n tap(this.trySetLowBandwidth.bind(this)),\n map((dataFlowResult) => dataFlowResult?.isDropDetected),\n distinctUntilChanged(),\n tap(() => {\n this.isReducedQuality.set(true);\n }),\n switchMap(() => this.videoQuality$),\n filter((quality) => quality === 'lime'),\n tap(() => this.isReducedQuality.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private trySetLowBandwidth(dataFlowResult: DataFlowCheckResult) {\n // Evaluate FPS and native quality\n const isFpsLow = this.fps() < FilterModel.minimumFps;\n const isNativeQualityRed = this.nativeQuality() === 'red';\n const shouldSwitch = isNativeQualityRed || isFpsLow;\n\n // Exit if conditions are not met or already in low bandwidth\n if (!shouldSwitch || this.isLowBandwidth()) return;\n\n const { quality, activeMedian } = dataFlowResult;\n const isQualityRed = quality === 'red';\n const isLowBitrate = activeMedian < FilterModel.minimumBitrate;\n\n // Final check for a red drop or low bitrate, or low FPS\n if (isQualityRed || isLowBitrate || isFpsLow) {\n let reason: string;\n\n if (isFpsLow) {\n reason = `FPS < ${FilterModel.minimumFps}`;\n } else if (quality === 'red') {\n reason = `Drop > ${FilterModel.redFlag}%`;\n } else {\n reason = `Speed < ${FilterModel.minimumBitrate}`;\n }\n\n Logger.info(\n `LBM DETECTED: ${reason}, switching to low bandwidth; `,\n dataFlowResult.message,\n );\n\n this.store.dispatch(\n changeLowBandwidth({\n lowBandwidth: true,\n stats: {\n dataFlowResult,\n reason,\n triggerTime: this.aggregatedStats()?.runTime ?? 0,\n },\n }),\n );\n }\n }\n\n toggleIndicator(value: boolean) {\n this.isIndicatorExpanded.set(value);\n\n if (value) {\n this.hideIndicatorAfterDelay();\n }\n }\n\n hideIndicatorAfterDelay() {\n timer(3000)\n .pipe(take(1), takeUntil(this.isIndicatorExpandedTrigger$))\n .subscribe(() => this.toggleIndicator(false));\n }\n\n openLBMDialog() {\n this.dialog\n .open(LowBandwidthModalComponent)\n .closed.pipe(filter(Truthy))\n .subscribe(() => {\n this.toggleIndicator(false);\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));\n });\n }\n}\n","@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-filter-settings />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["switchMap","map","timeout","tap","takeUntil","filter","debounceTime","skip","i1","distinctUntilChanged"],"mappings":"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"}
1
+ {"version":3,"file":"3dsource-angular-unreal-module.mjs","sources":["../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/CustomCloseCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/disconnect-reasons.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/SignalingMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/unreal-internal-signal-events.interface.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/AnswerHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ConfigHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/IceCandidateHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/InstanceReadyHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/ButtonsAndCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EControlSchemeType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EToClientMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/initial-config.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/InputOptions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/UnrealStatusMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/sub.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/afk.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/freeze-frame.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataFlowMonitor.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/DataFlowConstants.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/command-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/StreamerListHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/OfferHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/httpToWsUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/create-websocket.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ForceDisconnect.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/OrchestrationErrorHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/signalling.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/web-rtc-player.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/deepEqual.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/file-receiver.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/aggregator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/console-extensions.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/dev-mode.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/TouchEmulator.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-communicator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/input.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/regions-ping.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/afk.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/signalling.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/unreal-communicator.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/aggregator.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/freeze-frame.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/command-telemetry.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/stream-status-telemetry.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/console-extensions.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/file-receiver.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/playwright/input.playwright.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/ReceivedMimeTypes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/file-handler.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/analytics.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/fps-monitor.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-error-modal/unreal-error-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-error-modal/unreal-error-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/InstanceReservedHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/PingHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/PlayerCountHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/SSInfoHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnCloseHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnErrorHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnMessageHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OpenHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/keep-max-until-reset.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/CommandObserver.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataDecoder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/EventWrapper.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/dispatchResize.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/error-codes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/float-to-smooth-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-image-from-video-stream.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/GetNextUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/KalmanFilter1D.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/LatencyTimings.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/mapQpToQuality.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/remove-exile-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resetAfk.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resize-observer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/VideoRecorder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/pipes/safe-html.pipe.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/image-loading-src/image-loading-src.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/image-loading-src/image-loading-src.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/stat-graph/stat-graph.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/stat-graph/stat-graph.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/resume-stream-button/resume-stream-button.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/resume-stream-button/resume-stream-button.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/intro-src/intro-src.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/intro-src/intro-src.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/webrtc-error-modal/webrtc-error-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/webrtc-error-modal/webrtc-error-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/providers/index.ts","../../../../projects/3dsource/angular-unreal-module/src/3dsource-angular-unreal-module.ts"],"sourcesContent":["export const WSCloseCode_NORMAL_CLOSURE = 3000;\nexport const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;\nexport const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;\nexport const WSCloseCode_FORCE_CIRRUS_CLOSE = 3003;\n\nexport const WSCloseCode_UNKNOWN = 1000;\n\nexport const WSCloseCode_CIRRUS_PLAYER_DISCONNECTED = 1001;\nexport const WSCloseCode_CIRRUS_ABNORMAL_CLOSURE = 1006;\nexport const WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR = 1013;\nexport const WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER = 1011;\n\nexport const WSCloseCodes = [\n WSCloseCode_NORMAL_CLOSURE,\n WSCloseCode_NORMAL_AFK_TIMEOUT,\n WSCloseCode_NORMAL_MANUAL_DISCONNECT,\n WSCloseCode_FORCE_CIRRUS_CLOSE,\n WSCloseCode_UNKNOWN,\n WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n] as const;\n\nexport type WSCloseCodesValues = (typeof WSCloseCodes)[number];\n","export const DisconnectReason = {\n Afk: 'Afk',\n None: 'None',\n Destroy: 'Destroy',\n DataChannelClosed: 'DataChannelClosed',\n DataChannelTimeout: 'DataChannelTimeout',\n WebRTCError: 'WebRTCError',\n WebSocketError: 'WebSocketError',\n WebSocketClose: 'WebSocketClose',\n DropConnection: 'DropConnection',\n OrchestrationPlayerDisconnected: 'OrchestrationPlayerDisconnected',\n OrchestrationStreamerDisconnected: 'OrchestrationStreamerDisconnected',\n IceConnectionFailed: 'IceConnectionFailed',\n ReconnectFailed: 'ReconnectFailed',\n} as const;\n\nexport type DisconnectReasonType =\n (typeof DisconnectReason)[keyof typeof DisconnectReason];\n\nexport interface ConnectionError {\n reason: DisconnectReasonType;\n message: string;\n}\n","/*\nexport interface RequestReservation extends InstanceMessageBase {\n type: 'requestReservation';\n}\n*/\n\nimport type { SignalingData } from './SignalingData';\n\nexport const OrchestrationMessageTypes = {\n ping: 'ping',\n error: 'error',\n offer: 'offer',\n answer: 'answer',\n ssInfo: 'ssInfo',\n config: 'config',\n playerCount: 'playerCount',\n iceCandidate: 'iceCandidate',\n streamerList: 'streamerList',\n requestStream: 'requestStream',\n listStreamers: 'listStreamers',\n instanceReady: 'instanceReady',\n p2pEstablished: 'p2pEstablished',\n instanceReserved: 'instanceReserved',\n playerDisconnected: 'playerDisconnected',\n streamPreparedForUserInteraction: 'streamPreparedForUserInteraction',\n streamerDisconnected: 'streamerDisconnected',\n interruptClientStream: 'interruptClientStream',\n} as const;\n\nexport interface InstanceReady extends InstanceMessageBase {\n type: 'instanceReady';\n}\n\nexport interface InstanceReserved extends InstanceMessageBase {\n type: 'instanceReserved';\n}\n\nexport interface OrchestrationErrorMessage {\n type: 'error';\n payload: { code: number; message: string };\n}\n\ninterface InstanceMessageBase extends MessageBase {\n correlationId: string;\n payload: {\n instanceId: string;\n streamRequestId: string;\n eta: number;\n };\n}\n\nexport interface MessageBase {\n type: OrchestrationMessageType;\n}\n\nexport interface SSInfo extends MessageBase {\n type: 'ssInfo';\n message: string;\n data: SignalingData;\n}\n\nexport interface PlayerCountMessage extends MessageBase {\n type: 'playerCount';\n playerCount: number;\n}\nexport interface StreamerListMessage extends MessageBase {\n type: 'streamerList';\n ids: string[];\n}\n\nexport interface ConfigMessage extends MessageBase, UnknownFields {\n type: 'config';\n peerConnectionOptions: RTCConfiguration;\n}\n\nexport interface CandidateMessage extends MessageBase {\n type: 'iceCandidate';\n candidate: RTCIceCandidate;\n}\n\nexport interface PingMessage extends MessageBase {\n type: 'ping';\n playerId: string;\n appConnectionCounter: number;\n}\n\nexport type UnknownFields = Record<string, unknown>;\n\nexport interface InterruptClientStream extends MessageBase {\n type: 'interruptClientStream';\n correlationId: string;\n payload: {\n environmentId: string;\n };\n}\n\nexport interface ForceClientDisconnect extends MessageBase {\n type: 'streamerDisconnected' | 'playerDisconnected';\n connectionId: string;\n}\n\nexport interface ListStreamersMessage extends MessageBase {\n type: 'listStreamers';\n correlationId: string;\n}\n\nexport interface P2PEstablishedMessage extends MessageBase {\n type: 'p2pEstablished';\n source: string;\n sessionId: string;\n}\n\nexport interface streamPreparedForUserInteractionMessage extends MessageBase {\n type: 'streamPreparedForUserInteraction';\n correlationId: string;\n}\n\nexport interface RequestStream extends MessageBase {\n type: 'requestStream';\n correlationId: string;\n payload: {\n environmentId: string;\n region?: string;\n /**\n * The context field is used for plugins of the external\n * applications for collecting additional statistics, etc.\n */\n context: StreamRequestContext;\n };\n}\n\ninterface MetaboxBasicConfiguratorContext {\n id: 'metaboxBasicConfigurator';\n data: {\n configuratorId: string; //uuid here;\n };\n}\n\ninterface MetaboxModularConfiguratorContext {\n id: 'metaboxModularConfigurator';\n data: {\n configuratorId: string; //uuid here;\n };\n}\n\ninterface MetaboxProductContext {\n id: 'metaboxProduct';\n data: {\n productId: string; //uuid here;\n };\n}\n\ninterface MetaboxEnvironmentContext {\n id: 'metaboxEnvironment';\n data: {\n environmentId: string; //uuid here;\n };\n}\ninterface MetaboxStudioContext {\n id: 'metaboxStudio';\n data: {\n userId: string; //uuid here;\n workspaceId: string; //uuid here;\n };\n}\ninterface CustomApplicationContext {\n id: 'customApplication';\n data: {\n clientId: string;\n applicationId: string;\n };\n}\n\nexport type StreamRequestContext =\n | MetaboxStudioContext\n | MetaboxProductContext\n | CustomApplicationContext\n | MetaboxEnvironmentContext\n | MetaboxBasicConfiguratorContext\n | MetaboxModularConfiguratorContext;\n\nexport interface SignalingMessageMap {\n [OrchestrationMessageTypes.ping]: PingMessage;\n [OrchestrationMessageTypes.offer]: RTCSessionDescriptionInit;\n [OrchestrationMessageTypes.error]: OrchestrationErrorMessage;\n [OrchestrationMessageTypes.ssInfo]: SSInfo;\n [OrchestrationMessageTypes.config]: ConfigMessage;\n [OrchestrationMessageTypes.answer]: RTCSessionDescriptionInit;\n [OrchestrationMessageTypes.playerCount]: PlayerCountMessage;\n [OrchestrationMessageTypes.iceCandidate]: CandidateMessage;\n [OrchestrationMessageTypes.streamerList]: StreamerListMessage;\n [OrchestrationMessageTypes.instanceReady]: InstanceReady;\n [OrchestrationMessageTypes.requestStream]: RequestStream;\n [OrchestrationMessageTypes.listStreamers]: ListStreamersMessage;\n [OrchestrationMessageTypes.p2pEstablished]: P2PEstablishedMessage;\n [OrchestrationMessageTypes.instanceReserved]: InstanceReserved;\n [OrchestrationMessageTypes.playerDisconnected]: ForceClientDisconnect;\n [OrchestrationMessageTypes.streamPreparedForUserInteraction]: streamPreparedForUserInteractionMessage;\n [OrchestrationMessageTypes.streamerDisconnected]: ForceClientDisconnect;\n [OrchestrationMessageTypes.interruptClientStream]: InterruptClientStream;\n}\n\nexport type OrchestrationMessageType = keyof SignalingMessageMap;\n\n// New strict outbound union type (only valid signaling messages allowed)\nexport type AnySignalingMessage =\n | SignalingMessageMap[OrchestrationMessageType]\n | string;\n\nexport type SignalingMessageHandler<T extends keyof SignalingMessageMap> = (\n msg: SignalingMessageMap[T],\n) => void;\n\nexport interface PollingOrchestrationMessage {\n mm_message?: string;\n signallingServer?: string;\n error?: string;\n info?: {\n age: number | null;\n left: number | null;\n percent: number | null;\n total: number | null;\n };\n}\n","import type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport type { Quality } from './quality.interface';\nimport type { DataFlowCheckResult } from '../helpers';\n\nexport const UnrealInternalSignalEvents = {\n OnVideoInitialized: 'OnVideoInitialized',\n RestAfkTimer: 'RestAfkTimer',\n FreezeFrameStart: 'FreezeFrameStart',\n UnrealCallback: 'UnrealCallback',\n ClickableOverlay: 'ClickableOverlay',\n VideoPlayClick: 'VideoPlayClick',\n ShowPlayButton: 'ShowPlayButton',\n ForceResizeViewport: 'ForceResizeViewport',\n VideoAdaptedToContainer: 'VideoAdaptedToContainer',\n TelemetryStart: 'TelemetryStart',\n TelemetryStop: 'TelemetryStop',\n TelemetryReset: 'TelemetryReset',\n} as const;\n\nexport interface SignalDescriptor {\n [UnrealInternalSignalEvents.UnrealCallback]: {\n json: UnrealCallBackJson;\n };\n [UnrealInternalSignalEvents.ClickableOverlay]: {\n message: string;\n className: string;\n isActivityDetected: boolean;\n onOverlayClick: () => void;\n } | void;\n [UnrealInternalSignalEvents.VideoPlayClick]: {\n text: string;\n };\n [UnrealInternalSignalEvents.ForceResizeViewport]: void;\n [UnrealInternalSignalEvents.OnVideoInitialized]: HTMLVideoElement;\n [UnrealInternalSignalEvents.VideoAdaptedToContainer]: void;\n [UnrealInternalSignalEvents.ShowPlayButton]: {\n text: string;\n callback: () => boolean;\n };\n [UnrealInternalSignalEvents.RestAfkTimer]: void;\n [UnrealInternalSignalEvents.FreezeFrameStart]: void;\n [UnrealInternalSignalEvents.TelemetryReset]: void;\n [UnrealInternalSignalEvents.TelemetryStart]: { externalId: string };\n [UnrealInternalSignalEvents.TelemetryStop]: {\n externalId: string;\n payload?: { multi?: boolean };\n };\n\n [key: string]: any;\n}\n\nexport type UnrealCallBackJson =\n | MetaBoxCommandPacket\n | WrappedMetaBoxCommandPacket;\n\nexport interface WrappedMetaBoxCommandPacket {\n commandCallback: MetaBoxCommandPacket;\n}\n\nexport interface IAggregatedStat {\n quality: Quality;\n aggregatedStats: InboundVideoStats;\n}\n\nexport interface InboundVideoStats extends RTCInboundRtpStreamStats {\n VideoEncoderQP: number;\n runTime: number;\n pixelRatio: number;\n bytesReceivedStart: number;\n framesDecodedStart: number;\n timestampStart: number;\n videoCodec: string;\n avgBitrate: number;\n avgFrameRate: number;\n selectedPair: {\n local: { type: string; url: string };\n remote: { type: string; url: string };\n } | null;\n currentRoundTripTime: number;\n codecs: Record<string, string>;\n receiveToCompositeMs: number;\n bitrate: number;\n kalmanBitrate: number;\n bitrateDrop: number;\n dataFlowCheckResult: DataFlowCheckResult;\n dataFlowBitrate: DataFlowCheckResult;\n}\n\nexport interface AwsInstance {\n /**\n * WebSocket URL for connecting to the Cirrus (polling mode) or Orchestration (direct mode).\n */\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n\n /**\n * Unique identifier for the streaming request.\n * Coming with new orchestration message \"instanceReserved\".\n */\n streamRequestId?: string;\n\n /**\n * Estimated time of arrival (in seconds) for the instance to be ready.\n * Coming with new orchestration message \"instanceReserved\".\n */\n eta?: number;\n\n /**\n * Progress of completion for the instance launch (0-1).\n * Based on ETA time comes from backend with new orchestration.\n * If eta is not provided, this value will be undefined.\n */\n progressComplete?: number;\n\n message?: string;\n}\n","import type { SignallingService } from '../../services';\n\nexport function AnswerHandler(\n this: SignallingService,\n msg: RTCSessionDescriptionInit,\n) {\n this.onWebRtcAnswer$.next(msg);\n}\n","import type { SignallingService } from '../../services';\nimport type { ConfigMessage } from '../../interfaces';\n\nexport function ConfigHandler(this: SignallingService, msg: ConfigMessage) {\n this.onConfig$.next(msg);\n}\n","import type { SignallingService } from '../../services';\n\nexport function IceCandidateHandler(\n this: SignallingService,\n msg: { candidate: RTCIceCandidate },\n) {\n this.onWebRtcIce$.next(msg.candidate);\n}\n","import { OrchestrationMessageTypes } from '../../interfaces';\nimport type { SignallingService } from '../../services';\n\nexport function InstanceReadyHandler(this: SignallingService) {\n this.send({\n type: OrchestrationMessageTypes.listStreamers,\n correlationId: this.correlationId,\n });\n}\n","import { createAction, props } from '@ngrx/store';\nimport type {\n DisconnectReasonType,\n LBMStats,\n SignalingData,\n StreamConfig,\n StreamRequestContext,\n} from '../interfaces';\n\nconst scoped = (templateString: TemplateStringsArray) =>\n `[UNREAL] ${templateString[0]}`;\nexport const trackMixpanelEvent = createAction(\n scoped`track mixpanel event`,\n props<{ event: string; data?: unknown }>(),\n);\nexport const changeLowBandwidth = createAction(\n scoped`change low bandwidth`,\n props<{\n lowBandwidth: boolean;\n stats?: LBMStats;\n }>(),\n);\nexport const setMaxFps = createAction(\n scoped`change fps`,\n props<{ maxFps: number }>(),\n);\nexport const destroyRemoteConnections = createAction(\n scoped`destroyRemoteConnections`,\n props<{ reason: DisconnectReasonType }>(),\n);\nexport const destroyUnrealScene = createAction(scoped`destroyUnrealScene`);\nexport const setCirrusConnected = createAction(scoped`cirrusConnected`);\nexport const setCirrusDisconnected = createAction(scoped`cirrusDisconnected`);\nexport const changeStatusMainVideoOnScene = createAction(\n scoped`change status main video on scene`,\n props<{ isVideoPlaying: boolean }>(),\n);\nexport const setAwsInstance = createAction(\n scoped`set aws instance`,\n props<{\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n }>(),\n);\nexport const setStatusMessage = createAction(\n scoped`set status message`,\n props<{ statusMessage: string | null }>(),\n);\nexport const setStatusPercentSignallingServer = createAction(\n scoped`change status percent signalling server`,\n props<{ percent: number | null }>(),\n);\nexport const setFreezeFrame = createAction(\n scoped`set freeze frame`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setStreamClientCompanyId = createAction(\n scoped`set stream client company id`,\n props<{ id: string }>(),\n);\nexport const setStreamViewId = createAction(\n scoped`set stream view id`,\n props<{ id: string }>(),\n);\nexport const setIntroImageSrc = createAction(\n scoped`set intro image src`,\n props<{ src: string }>(),\n);\n\nexport const setLoadingImageSrc = createAction(\n scoped`set loading image src`,\n props<{ src: string }>(),\n);\nexport const setIntroVideoSrc = createAction(\n scoped`set intro video src`,\n props<{ src: string }>(),\n);\nexport const resetIntroSrc = createAction(scoped`reset intro src`);\nexport const setFreezeFrameFromVideo = createAction(\n scoped`set freeze frame from video`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setEstablishingConnection = createAction(\n scoped`set establishing connection`,\n props<{ value: boolean }>(),\n);\n/**\n * @deprecated Use `dataChannelReady` instead. Currently, this action is not working.\n */\nexport const setDataChannelConnected = createAction(\n scoped`set data channel connected`,\n props<{ statusMessage: string }>(),\n);\nexport const dataChannelConnected = createAction(\n scoped`data channel connected`,\n props<{ statusMessage: string }>(),\n);\nexport const dataChannelReady = createAction(scoped`dataChannelReady`);\nexport const setConfig = createAction(\n scoped`set config`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const disconnectStream = createAction(\n scoped`disconnectStream`,\n props<{\n reason: DisconnectReasonType;\n message: string;\n }>(),\n);\nexport const dropConnection = createAction(scoped`dropConnection`);\nexport const setViewportReady = createAction(scoped`set viewport ready`);\nexport const setViewportNotReady = createAction(scoped`set viewport not ready`);\nexport const changeStreamResolutionAction = createAction(\n scoped`change stream resolution`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const changeStreamResolutionSuccessAction = createAction(\n scoped`change stream resolution success action`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const setSignalingName = createAction(\n scoped`set aws instanceName`,\n props<{ instanceName: string }>(),\n);\nexport const setOrchestrationParameters = createAction(\n scoped`set orchestration parameters`,\n props<{ instanceName: string; streamRequestId: string; eta: number }>(),\n);\nexport const setOrchestrationMessage = createAction(\n scoped`set orchestration message`,\n props<{ message: string }>(),\n);\nexport const setOrchestrationProgress = createAction(\n scoped`set orchestration progress`,\n props<{ progressComplete: number }>(),\n);\nexport const setOrchestrationContext = createAction(\n scoped`set orchestration params`,\n props<{\n urls: string[];\n environmentId: string;\n streamRequestContext: StreamRequestContext;\n }>(),\n);\nexport const updateCirrusInfo = createAction(\n scoped`set unrealInfo`,\n props<{\n ssInfo: string;\n ssData: SignalingData;\n }>(),\n);\nexport const commandStarted = createAction(\n scoped`command started`,\n props<{ id: string; command: string }>(),\n);\nexport const commandCompleted = createAction(\n scoped`command completed`,\n props<{ id: string }>(),\n);\nexport const setLoopBackCommandIsCompleted = createAction(\n scoped`set loopBack command is completed`,\n);\nexport const setAfkTimerVisible = createAction(scoped`set afk timer visible`);\nexport const setAfkTimerHide = createAction(scoped`set afk timer hide`);\nexport const showUnrealErrorMessage = createAction(\n scoped`show unreal error message`,\n props<{ code: number | null; error?: string }>(),\n);\nexport const initSignalling = createAction(\n scoped`init signalling`,\n (\n data: { resetDisconnectionReason: boolean } = {\n resetDisconnectionReason: true,\n },\n ) => ({\n resetDisconnectionReason: data.resetDisconnectionReason,\n }),\n);\nexport const startStream = createAction(\n scoped`startStream`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const resetConfig = createAction(scoped`reset config`);\nexport const resetAfkAction = createAction(scoped`reset afk action`);\nexport const resetWarnTimeout = createAction(scoped`reset config warn timeout`);\nexport const abortEstablishingConnection = createAction(\n scoped`abortEstablishingConnection`,\n);\nexport const setUnrealPlaywrightConfig = createAction(\n scoped`set unreal playwright config`,\n);\nexport const saveAnalyticsEvent = createAction(\n scoped`save analytics event`,\n props<{ event: { name: string; params: Record<string, unknown> } }>(),\n);\n\n/** Action to trigger WebRTC peer reconnection (keeps signaling connection) */\nexport const reconnectPeer = createAction(\n scoped`reconnect peer`,\n props<{ attempt: number; maxAttempts: number; delay?: number }>(),\n);\n\n/** Action to reset the data channel state before reconnection */\nexport const resetDataChannelForReconnect = createAction(\n scoped`reset data channel for reconnect`,\n);\n\n/** Action dispatched when peer reconnection succeeds */\nexport const reconnectPeerSuccess = createAction(\n scoped`reconnect peer success`,\n);\n\n/** Action dispatched when all peer reconnection attempts are exhausted */\nexport const reconnectPeerFailed = createAction(\n scoped`reconnect peer failed`,\n props<{ reason: string }>(),\n);\n\n/** Action dispatched when ICE connection state changes to failed/disconnected */\nexport const iceConnectionFailed = createAction(\n scoped`ice connection failed`,\n props<{ state: RTCIceConnectionState }>(),\n);\n","export const SpecialKeyCodes = {\n BackSpace: 8,\n Shift: 16,\n Control: 17,\n Alt: 18,\n RightShift: 253,\n RightControl: 254,\n RightAlt: 255,\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\nexport const MouseButton = {\n MainButton: 0, // Left button.\n AuxiliaryButton: 1, // Wheel button.\n SecondaryButton: 2, // Right button.\n FourthButton: 3, // Browser Back button.\n FifthButton: 4, // Browser Forward button.\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\nexport const MouseButtonsMask = {\n PrimaryButton: 1, // Left button.\n SecondaryButton: 2, // Right button.\n AuxiliaryButton: 4, // Wheel button.\n FourthButton: 8, // Browser Back button.\n FifthButton: 16, // Browser Forward button.\n};\n","export const EControlSchemeType = {\n // A mouse can lock inside the WebRTC player so the user can simply move the\n // mouse to control the orientation of the camera. The user presses the\n // Escape key to unlock the mouse.\n LockedMouse: 0,\n\n // A mouse can hover over the WebRTC player so the user needs to click and\n // drag to control the orientation of the camera.\n HoveringMouse: 1,\n Default: 2,\n} as const;\n\nexport type EControlSchemeTypeValues =\n (typeof EControlSchemeType)[keyof typeof EControlSchemeType];\n","// Must be kept in sync with PixelStreamingProtocol::EToUE4Msg C++ descriptors.\n\nexport const EMessageType = {\n /*\n * Control Messages. Range = 0..49.\n */\n IFrameRequest: 0,\n RequestQualityControl: 1,\n MaxFpsRequest: 2,\n AverageBitrateRequest: 3,\n StartStreaming: 4,\n StopStreaming: 5,\n LatencyTest: 6,\n RequestInitialSettings: 7,\n\n /*\n * Input Messages. Range = 50..89.\n */\n\n // Generic Input Messages. Range = 50..59.\n UIInteraction: 50,\n Command: 51,\n\n // Keyboard Input Message. Range = 60..69.\n KeyDown: 60,\n KeyUp: 61,\n KeyPress: 62,\n\n // Mouse Input Messages. Range = 70..79.\n MouseEnter: 70,\n MouseLeave: 71,\n MouseDown: 72,\n MouseUp: 73,\n MouseMove: 74,\n MouseWheel: 75,\n\n // Touch Input Messages. Range = 80..89.\n TouchStart: 80,\n TouchEnd: 81,\n TouchMove: 82,\n} as const;\n\nexport type EMessageTypeValues =\n (typeof EMessageType)[keyof typeof EMessageType];\n","export const EToClientMessageType = {\n QualityControlOwnership: 0,\n Response: 1,\n Command: 2,\n FreezeFrame: 3,\n UnfreezeFrame: 4,\n VideoEncoderAvgQP: 5,\n LatencyTest: 6,\n InitialSettings: 7,\n FileExtension: 8,\n FileMimeType: 9,\n FileContents: 10,\n TestEcho: 11,\n InputControlOwnership: 12,\n GamepadResponse: 13,\n Protocol: 255,\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport type { UnrealInitialConfig } from '../interfaces';\n\nexport const UNREAL_CONFIG = new InjectionToken<UnrealInitialConfig>(\n 'Unreal Initial Configuration',\n);\n","import { EControlSchemeType } from './EControlSchemeType';\nimport type { InputProps } from '../interfaces';\n\nexport const InputOptions: InputProps = {\n controlScheme: EControlSchemeType.Default,\n suppressBrowserKeys: true,\n fakeMouseWithTouches: false,\n};\n","export const UnrealStatusMessage = {\n CONNECTING_TO_SESSION: 'Connecting to session.',\n STARTING_YOUR_SESSION: 'Starting your session',\n} as const;\n","export const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;\nexport const SAME_SIZE_THRESHOLD = 1.01;\nexport const MINIMAL_FPS = 6;\nexport const STREAMING_VIDEO_ID = 'streamingVideo';\nexport const CONSOLE_COMMAND_ENABLE_MESSAGES = 'EnableAllScreenMessages';\nexport const CONSOLE_COMMAND_DISABLE_MESSAGES = 'DisableAllScreenMessages';\nexport const CONSOLE_COMMAND_PIXEL_QUALITY =\n 'PixelStreaming.FreezeFrameQuality 95';\nexport const FULL_HD_WIDTH = 1920;\nexport const FULL_HD_HEIGHT = 1080;\nexport const WS_TIMEOUT = 2000;\nexport const POLLING_TIME = 4000;\nexport const WS_OPEN_STATE = 1;\nexport const DEFAULT_AFK_TIMEOUT_PERIOD = 15;\nexport const DEFAULT_AFK_TIMEOUT = 120;\nexport const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000; //ms;\nexport const SIGNALLING_PERCENT_VALUE = 56;\nexport const SCREEN_LOCKER_CONTAINER_ID = '3dsource_start_screen';\n\n// Reconnection defaults\nexport const DEFAULT_RECONNECT_ENABLED = true;\nexport const DEFAULT_RECONNECT_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RECONNECT_DELAY_MS = 1000;\nexport const DEFAULT_RECONNECT_ON_ICE_FAILURE = true;\nexport const DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE = true;\n","import {\n changeLowBandwidth,\n changeStatusMainVideoOnScene,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n commandStarted,\n dataChannelConnected,\n destroyRemoteConnections,\n destroyUnrealScene,\n disconnectStream,\n dropConnection,\n initSignalling,\n reconnectPeerSuccess,\n resetConfig,\n resetDataChannelForReconnect,\n resetIntroSrc,\n resetWarnTimeout,\n saveAnalyticsEvent,\n setAfkTimerHide,\n setAfkTimerVisible,\n setAwsInstance,\n setCirrusConnected,\n setCirrusDisconnected,\n setConfig,\n setEstablishingConnection,\n setFreezeFrame,\n setFreezeFrameFromVideo,\n setIntroImageSrc,\n setIntroVideoSrc,\n setLoadingImageSrc,\n setLoopBackCommandIsCompleted,\n setOrchestrationContext,\n setOrchestrationMessage,\n setOrchestrationParameters,\n setOrchestrationProgress,\n setSignalingName,\n setStatusMessage,\n setStatusPercentSignallingServer,\n setStreamClientCompanyId,\n setStreamViewId,\n setUnrealPlaywrightConfig,\n setViewportNotReady,\n setViewportReady,\n startStream,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { createReducer, on } from '@ngrx/store';\nimport type {\n AwsInstance,\n ConnectionError,\n DisconnectReasonType,\n FreezeFrameMessage,\n LBMStats,\n SignalingData,\n StreamConfig,\n StreamRequestContext,\n StreamResolutionProps,\n} from '../interfaces';\nimport { DisconnectReason } from '../interfaces';\nimport { DEFAULT_AFK_TIMEOUT } from '../constants';\nimport { removeExileCommands } from '../helpers';\n\nexport interface CommandsLoaderState {\n commandsInProgress: {\n timeStamp: number;\n command: string;\n id: string;\n }[];\n totalCommandsStarted: number;\n totalCommandsCompleted: number;\n}\n\nexport interface UnrealState {\n lowBandwidthStats: LBMStats | undefined;\n streamConfig: StreamConfig;\n awsInstance: AwsInstance;\n lowBandwidth: boolean;\n wasInitialized: boolean;\n isFirstSuccessLoad: boolean;\n isAfkTimerVisible: boolean;\n cirrusConnected: boolean;\n viewportReady: boolean;\n freezeFrameFromVideo: FreezeFrameMessage;\n freezeFrame: FreezeFrameMessage;\n statusMessage: string | null;\n /**\n * @deprecated, use ssData in future\n */\n ssInfo: string | null;\n ssData: SignalingData | null;\n statusPercentSignallingServer: number | null;\n errorMessage: ConnectionError | null;\n isReconnecting: boolean;\n dataChannelConnected: boolean;\n streamResolution: StreamResolutionProps;\n isVideoPlaying: boolean;\n establishingConnection: boolean;\n disconnectReason: DisconnectReasonType;\n loaderCommands: CommandsLoaderState;\n matchUrls: string[];\n environmentId: string | null;\n streamClientCompanyId: string | null;\n streamViewId: string | null;\n videoIntroSrc: string | null;\n imageIntroSrc: string | null;\n imageLoadingSrc: string;\n streamRequestContext: StreamRequestContext | null;\n analyticsEvent: { name: string; params: Record<string, unknown> } | null;\n}\n\nexport const initialState: UnrealState = {\n streamRequestContext: null,\n environmentId: null,\n lowBandwidthStats: undefined,\n wasInitialized: false,\n isFirstSuccessLoad: false,\n isAfkTimerVisible: false,\n lowBandwidth: false,\n cirrusConnected: false,\n establishingConnection: false,\n isReconnecting: false,\n viewportReady: false,\n dataChannelConnected: false,\n isVideoPlaying: false,\n statusPercentSignallingServer: null,\n statusMessage: null,\n errorMessage: null,\n ssInfo: null,\n ssData: null,\n streamResolution: { width: null, height: null },\n freezeFrameFromVideo: { dataUrl: null, progress: null },\n freezeFrame: { dataUrl: null, progress: null },\n disconnectReason: DisconnectReason.None,\n awsInstance: {\n wsUrl: null,\n instanceName: null,\n pollingUrl: null,\n progressComplete: 0,\n },\n streamConfig: {\n autoStart: true,\n warnTimeout: DEFAULT_AFK_TIMEOUT,\n },\n loaderCommands: {\n commandsInProgress: [],\n totalCommandsStarted: 0,\n totalCommandsCompleted: 0,\n },\n matchUrls: [],\n streamClientCompanyId: '',\n streamViewId: 'default',\n videoIntroSrc: null,\n imageIntroSrc: null,\n imageLoadingSrc: '',\n analyticsEvent: null,\n};\nexport const unrealReducer = createReducer(\n initialState,\n on(\n changeLowBandwidth,\n (state, { lowBandwidth, stats }): UnrealState => ({\n ...state,\n lowBandwidth: lowBandwidth,\n lowBandwidthStats: lowBandwidth ? stats : undefined,\n }),\n ),\n on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }): UnrealState => {\n return { ...state, isVideoPlaying: isVideoPlaying };\n }),\n on(\n setAwsInstance,\n (state, { instanceName, wsUrl, pollingUrl }): UnrealState => {\n return { ...state, awsInstance: { instanceName, wsUrl, pollingUrl } };\n },\n ),\n on(setViewportReady, (state): UnrealState => {\n return {\n ...state,\n viewportReady: true,\n statusMessage: null,\n errorMessage: null,\n };\n }),\n on(setViewportNotReady, (state): UnrealState => {\n return { ...state, viewportReady: false };\n }),\n on(updateCirrusInfo, (state, { ssInfo, ssData }): UnrealState => {\n return {\n ...state,\n ssInfo: ssInfo, // For back compatibility\n ssData: ssData, // Contains all the data from the ssInfo as an object\n };\n }),\n on(\n changeStreamResolutionSuccessAction,\n (state, { width, height }): UnrealState => {\n return { ...state, streamResolution: { width: width, height: height } };\n },\n ),\n on(setFreezeFrame, (state, freezeFrame): UnrealState => {\n return {\n ...state,\n freezeFrame: {\n dataUrl:\n freezeFrame.progress === 0 ||\n freezeFrame.progress === 1 ||\n freezeFrame.progress === null\n ? freezeFrame.dataUrl\n : state.freezeFrame.dataUrl,\n progress: freezeFrame.progress || null,\n },\n };\n }),\n on(disconnectStream, (state, errorMessage): UnrealState => {\n if (\n state.dataChannelConnected ||\n state.disconnectReason === DisconnectReason.Destroy\n ) {\n return state;\n }\n return {\n ...state,\n errorMessage,\n statusMessage: null,\n wasInitialized: true,\n };\n }),\n on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo): UnrealState => {\n return {\n ...state,\n freezeFrameFromVideo: {\n dataUrl: freezeFrameFromVideo.dataUrl,\n progress: freezeFrameFromVideo.progress || null,\n },\n };\n }),\n on(setStatusMessage, (state, { statusMessage }): UnrealState => {\n return { ...state, statusMessage };\n }),\n on(setEstablishingConnection, (state, { value }): UnrealState => {\n return { ...state, establishingConnection: value };\n }),\n on(setStatusPercentSignallingServer, (state, { percent }): UnrealState => {\n return { ...state, statusPercentSignallingServer: percent };\n }),\n on(dataChannelConnected, (state, { statusMessage }): UnrealState => {\n return {\n ...state,\n statusMessage,\n dataChannelConnected: true,\n establishingConnection: false,\n wasInitialized: true,\n };\n }),\n on(setConfig, startStream, (state, { config }): UnrealState => {\n return { ...state, streamConfig: { ...state.streamConfig, ...config } };\n }),\n on(resetConfig, (state): UnrealState => {\n return { ...state, streamConfig: initialState.streamConfig };\n }),\n on(resetWarnTimeout, (state): UnrealState => {\n return {\n ...state,\n streamConfig: { ...state.streamConfig, warnTimeout: DEFAULT_AFK_TIMEOUT },\n };\n }),\n on(\n initSignalling,\n (state, { resetDisconnectionReason = true }): UnrealState => {\n return {\n ...state,\n disconnectReason: resetDisconnectionReason\n ? DisconnectReason.None\n : state.disconnectReason,\n };\n },\n ),\n on(destroyRemoteConnections, (state, { reason }): UnrealState => {\n if (state.disconnectReason === DisconnectReason.Destroy) {\n return state;\n }\n return { ...state, disconnectReason: reason };\n }),\n\n on(reconnectPeerSuccess, (state): UnrealState => {\n return { ...state, isReconnecting: false };\n }),\n\n on(setSignalingName, (state, { instanceName }): UnrealState => {\n return { ...state, awsInstance: { ...state.awsInstance, instanceName } };\n }),\n on(\n setOrchestrationParameters,\n (state, { instanceName, streamRequestId, eta }): UnrealState => {\n return {\n ...state,\n awsInstance: {\n ...state.awsInstance,\n message: undefined,\n instanceName,\n streamRequestId,\n eta,\n },\n };\n },\n ),\n on(setOrchestrationProgress, (state, { progressComplete }): UnrealState => {\n return {\n ...state,\n awsInstance: {\n ...state.awsInstance,\n progressComplete,\n },\n };\n }),\n on(setOrchestrationMessage, (state, { message }): UnrealState => {\n return {\n ...state,\n awsInstance: {\n ...state.awsInstance,\n message,\n },\n };\n }),\n on(setLoopBackCommandIsCompleted, (state): UnrealState => {\n return { ...state, isFirstSuccessLoad: true };\n }),\n on(setAfkTimerVisible, (state): UnrealState => {\n return { ...state, isAfkTimerVisible: true };\n }),\n on(setAfkTimerHide, (state): UnrealState => {\n return { ...state, isAfkTimerVisible: false };\n }),\n on(\n setOrchestrationContext,\n (state, { urls, environmentId, streamRequestContext }): UnrealState => {\n return {\n ...state,\n matchUrls: urls,\n environmentId,\n streamRequestContext,\n };\n },\n ),\n on(setStreamClientCompanyId, (state, { id }): UnrealState => {\n return { ...state, streamClientCompanyId: id };\n }),\n on(setStreamViewId, (state, { id }): UnrealState => {\n return { ...state, streamViewId: id };\n }),\n on(setIntroImageSrc, (state, { src }): UnrealState => {\n return { ...state, imageIntroSrc: src };\n }),\n on(setLoadingImageSrc, (state, { src }): UnrealState => {\n return { ...state, imageLoadingSrc: src };\n }),\n on(setIntroVideoSrc, (state, { src }): UnrealState => {\n return { ...state, videoIntroSrc: src };\n }),\n on(resetIntroSrc, (state): UnrealState => {\n return { ...state, imageIntroSrc: '', videoIntroSrc: '' };\n }),\n on(saveAnalyticsEvent, (state: UnrealState, { event }): UnrealState => {\n return { ...state, analyticsEvent: event };\n }),\n on(commandStarted, (state, { id, command }): UnrealState => {\n return {\n ...state,\n loaderCommands: {\n ...state.loaderCommands,\n totalCommandsStarted: state.loaderCommands.totalCommandsStarted + 1,\n commandsInProgress: [\n ...state.loaderCommands.commandsInProgress,\n { id, command, timeStamp: new Date().getTime() },\n ],\n },\n };\n }),\n on(commandCompleted, (state, { id }): UnrealState => {\n return {\n ...state,\n loaderCommands: removeExileCommands(state.loaderCommands, id),\n };\n }),\n on(setCirrusConnected, (state): UnrealState => {\n return { ...state, cirrusConnected: true };\n }),\n on(setCirrusDisconnected, (state): UnrealState => {\n return {\n ...initialState,\n establishingConnection: state.establishingConnection,\n disconnectReason: state.disconnectReason,\n wasInitialized: state.wasInitialized,\n isFirstSuccessLoad: state.isFirstSuccessLoad,\n matchUrls: state.matchUrls,\n streamClientCompanyId: state.streamClientCompanyId,\n streamViewId: state.streamViewId,\n imageIntroSrc: state.imageIntroSrc,\n videoIntroSrc: state.videoIntroSrc,\n imageLoadingSrc: state.imageLoadingSrc,\n environmentId: state.environmentId,\n streamRequestContext: state.streamRequestContext,\n streamConfig: state.streamConfig,\n };\n }),\n on(dropConnection, (state): UnrealState => {\n return { ...state, establishingConnection: false };\n }),\n on(resetDataChannelForReconnect, (state): UnrealState => {\n return {\n ...state,\n isReconnecting: true,\n dataChannelConnected: false,\n viewportReady: false,\n statusMessage: 'Reconnecting...',\n };\n }),\n on(setUnrealPlaywrightConfig, (state): UnrealState => {\n return {\n ...state,\n wasInitialized: true,\n isFirstSuccessLoad: true,\n cirrusConnected: true,\n viewportReady: true,\n dataChannelConnected: true,\n isVideoPlaying: true,\n };\n }),\n on(destroyUnrealScene, (): UnrealState => {\n return initialState;\n }),\n);\n","import { createFeature } from '@ngrx/store';\nimport { unrealReducer } from './unreal.reducer';\n\nexport const unrealFeature = createFeature({\n name: 'unrealFeature',\n reducer: unrealReducer,\n});\n","import { share, skip } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { unrealFeature } from '../store';\nimport { filter } from 'rxjs/operators';\nimport { Falsy } from '@3dsource/utils';\n\nexport class SubService {\n store = inject(Store);\n disconnect$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), share());\n}\n","import { Injectable } from '@angular/core';\nimport { distinctUntilChanged, filter, withLatestFrom } from 'rxjs/operators';\nimport {\n DEFAULT_AFK_TIMEOUT_PERIOD,\n EControlSchemeType,\n InputOptions,\n} from '../constants';\nimport { Truthy } from '@3dsource/utils';\nimport { SubService } from './sub.service';\nimport { DisconnectReason, UnrealInternalSignalEvents } from '../interfaces';\nimport {\n disconnectStream,\n selectWarnTimeout,\n setAfkTimerHide,\n setAfkTimerVisible,\n unrealFeature,\n} from '../store';\nimport { fromSignal, sendSignal } from '../helpers';\nimport { merge } from 'rxjs';\n\n@Injectable()\nexport class AFKService extends SubService {\n // Optionally detect if the user is not interacting (AFK) and disconnect them.\n private enabled = true; // Set to true to enable the AFK system.\n private readonly closeTimeout = DEFAULT_AFK_TIMEOUT_PERIOD; // The time after the warning when we disconnect the user.\n private active = false; // Whether the AFK system is currently looking for inactivity.\n private warnTimer!: ReturnType<typeof setTimeout>; // The timer which waits to show the inactivity warning overlay.\n private countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.\n private countdownTimer!: ReturnType<typeof setTimeout>; // The timer used to tick the seconds shown on the inactivity warning overlay.\n private selectWarnTimeout = this.store.selectSignal(selectWarnTimeout);\n private isViewportReady = this.store.selectSignal(\n unrealFeature.selectViewportReady,\n );\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n merge(\n this.store.select(selectWarnTimeout),\n fromSignal(UnrealInternalSignalEvents.RestAfkTimer),\n )\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(() => this.resetAfkWarningTimer());\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(distinctUntilChanged(), filter(Truthy))\n .subscribe(() => this.startAfkWarningTimer());\n this.disconnect$.subscribe(() => this.stop());\n }\n\n private hideOverlay() {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay);\n this.store.dispatch(setAfkTimerHide());\n }\n\n /**\n * Start a timer which when elapsed will warn the user they are inactive.\n */\n private startAfkWarningTimer() {\n this.active = this.enabled;\n this.resetAfkWarningTimer();\n }\n\n /**\n * If the user interacts, then reset the warning timer.\n */\n private resetAfkWarningTimer() {\n if (this.active) {\n this.clearTimers();\n this.warnTimer = setTimeout(() => {\n this.showAfkOverlay();\n }, this.selectWarnTimeout() * 1000);\n }\n }\n\n /**\n * Update the count-down spans number for the overlay\n * @param countdown the count down number to be inserted into the span for updating\n */\n private updateCountDown(countdown: number) {\n this.dispatchMessage(String(countdown));\n }\n\n /**\n * Update the text overlays inner text\n * @param message the update text to be inserted into the overlay\n */\n private dispatchMessage(message: string) {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay, {\n message,\n isActivityDetected: true,\n className: 'clickableState',\n onOverlayClick: () => this.reset(),\n });\n }\n\n private clearTimers() {\n clearInterval(this.countdownTimer);\n clearTimeout(this.warnTimer);\n }\n\n private stop() {\n this.clearTimers();\n this.hideOverlay();\n }\n\n private reset() {\n this.hideOverlay();\n clearInterval(this.countdownTimer);\n this.startAfkWarningTimer();\n }\n\n private showAfkOverlay() {\n if (!this.isViewportReady()) {\n return;\n }\n // Pause the timer while the user is looking at the inactivity warning overlay.\n this.active = false;\n this.countdown = this.closeTimeout;\n this.store.dispatch(setAfkTimerVisible());\n this.updateCountDown(this.countdown);\n\n if (InputOptions.controlScheme === EControlSchemeType.LockedMouse) {\n document.exitPointerLock();\n }\n\n this.countdownTimer = setInterval(() => {\n this.countdown--;\n if (this.countdown === 0) {\n // The user failed to click so disconnect them\n this.hideOverlay();\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.Afk,\n message: `AFK timeout:${this.selectWarnTimeout()} seconds, popup timeout:${this.closeTimeout} seconds`,\n }),\n );\n clearInterval(this.countdownTimer);\n } else {\n this.updateCountDown(this.countdown);\n }\n }, 1000);\n }\n}\n","import { filter } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { setFreezeFrame, unrealFeature } from '../store';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { sendSignal } from '../helpers';\n\n@Injectable()\nexport class FreezeFrameService extends SubService {\n receiving = false;\n\n private size = 0;\n private jpeg!: Uint8Array | undefined;\n private freezeFrameOverlay = new Image();\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.invalidate());\n }\n\n setData(view: Uint8Array) {\n view = view.slice(1 + 4);\n\n if (!this.jpeg) {\n return;\n }\n\n const jpeg = new Uint8Array(this.jpeg.length + view.length);\n jpeg.set(this.jpeg, 0);\n jpeg.set(view, this.jpeg.length);\n this.jpeg = jpeg;\n if (this.jpeg.length === this.size) {\n this.receiving = false;\n Logger.info(`FRAME: Received complete freeze frame ${this.size}`);\n this.showFreezeFrame();\n } else if (this.jpeg.length > this.size) {\n Logger.error(\n `FRAME: Received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`,\n );\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: 0 }));\n\n this.jpeg = undefined;\n this.receiving = false;\n } else {\n this.dispatchInProgress();\n }\n }\n\n private dispatchInProgress() {\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: null,\n progress: (this.jpeg?.length || 0) / this.size,\n }),\n );\n }\n\n start(view: Uint8Array) {\n this.size = new DataView(view.slice(1, 5).buffer).getInt32(0, true);\n this.jpeg = view.slice(1 + 4);\n if (this.jpeg.length < this.size) {\n this.dispatchInProgress();\n sendSignal(UnrealInternalSignalEvents.FreezeFrameStart);\n Logger.info(\n `FRAME: Received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = true;\n } else {\n Logger.info(\n `FRAME: Received complete freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = false;\n this.showFreezeFrame();\n }\n }\n\n invalidate() {\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: null }));\n this.jpeg = undefined;\n this.receiving = false;\n }\n\n private showFreezeFrame() {\n if (!this.jpeg) {\n return;\n }\n\n const base64 = btoa(\n this.jpeg?.reduce((data, byte) => data + String.fromCharCode(byte), ''),\n );\n this.freezeFrameOverlay.src = 'data:image/jpeg;base64,' + base64;\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: this.freezeFrameOverlay.src,\n progress: 1,\n }),\n );\n }\n}\n","import type { Quality } from '../interfaces';\nimport { calculateMedian, clampf } from '@3dsource/utils';\nimport type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport interface DataFlowCheckResult {\n isDropDetected: boolean;\n dropPercentage: number;\n activeMedian: number;\n quality: Quality;\n message: string;\n dataHistory: number[];\n config: {\n yellowFlagThresholdPercentage: number;\n redFlagThresholdPercentage: number;\n historyBufferLength: number;\n splitPoint: number;\n };\n}\n\nexport class DataFlowMonitor {\n protected dataHistory: number[] = [];\n\n /**\n * Initializes the DataFlowMonitor monitor.\n * @param yellowFlagThresholdPercentage - The percentage drop to trigger a YELLOW warning (default: 15%).\n * @param redFlagThresholdPercentage - The percentage drop to trigger a RED warning (default: 30%).\n * @param historyBufferLength - buffer length (default: 100).\n * @param splitPoint - The point at which to split the history buffer into two halves (default: 0.5).\n */\n constructor(\n protected yellowFlagThresholdPercentage = 15,\n protected redFlagThresholdPercentage = 30,\n protected historyBufferLength = 100,\n protected splitPoint = 0.5,\n ) {}\n\n reset() {\n this.dataHistory.length = 0;\n }\n\n config(data: FilterSettings) {\n this.reset();\n this.yellowFlagThresholdPercentage = data.yellowFlag;\n this.redFlagThresholdPercentage = data.redFlag;\n }\n\n /**\n * Adds a new bitrate measurement and checks for significant drops.\n * @param currentValue - The current bitrate in kbps.\n * @returns BitrateCheckResult indicating if a drop was detected.\n */\n addValue(currentValue: number): DataFlowCheckResult {\n if (isNaN(currentValue) || currentValue < 1) {\n return {} as DataFlowCheckResult;\n }\n const historyLength = this.dataHistory.length;\n\n if (historyLength > this.historyBufferLength) {\n this.dataHistory.shift();\n }\n this.dataHistory.push(currentValue);\n\n if (historyLength < this.historyBufferLength) {\n this.dataHistory.length = this.historyBufferLength;\n this.dataHistory.fill(currentValue, 0, this.historyBufferLength);\n }\n\n const splitIndex = Math.floor(historyLength * this.splitPoint);\n const firstHalf = this.dataHistory.slice(0, splitIndex);\n const secondHalf = this.dataHistory.slice(splitIndex);\n const firstHalfMedian = calculateMedian(firstHalf);\n const secondHalfMedian = calculateMedian(secondHalf);\n\n const dropPercentage = clampf(\n 0,\n 100,\n ((firstHalfMedian - secondHalfMedian) / firstHalfMedian) * 100,\n );\n\n const isRedFlag = dropPercentage >= this.redFlagThresholdPercentage;\n if (dropPercentage >= this.yellowFlagThresholdPercentage) {\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: true,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: isRedFlag ? 'red' : 'orange',\n message: `Significant flow drop detected: ${dropPercentage.toFixed(2)}% (from ${firstHalfMedian} to ${secondHalfMedian})`,\n };\n }\n\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: false,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: 'lime',\n message: 'Stable flow',\n };\n }\n}\n","import { DataFlowMonitor } from '../../helpers/DataFlowMonitor';\n\nexport interface FilterSettings {\n /**\n * Minimum number of kilobits per second to trigger low bandwidth\n */\n minimumBitrate: number;\n /**\n * Amount of a percentage drop to trigger a yellow warning\n */\n\n yellowFlag: number;\n\n /**\n * Amount of a percentage drop to trigger a red warning\n */\n redFlag: number;\n\n /**\n * Minimum number of frames per second to trigger low bandwidth\n */\n minimumFps: number;\n\n /**\n * Time to wait before checking if we can switch to low bandwidth\n */\n monitoringDelayTime: number;\n\n // initial guess in kbps\n initialBitrateEstimate: number;\n\n // initial error covariance\n initialErrorCovariance: number;\n\n // Q: how much we expect the bitrate to change between measurements\n processNoise: number;\n\n // R: variance of measurement noise\n measurementNoise: number;\n\n panelOpen: boolean;\n}\n\n/**\n * Default LBM Filter Parameters\n */\nexport const DefaultFilterModel: FilterSettings = {\n minimumBitrate: 1600,\n yellowFlag: 30,\n redFlag: 50,\n minimumFps: 5,\n monitoringDelayTime: 5000,\n initialBitrateEstimate: 1600,\n initialErrorCovariance: 1,\n processNoise: 3,\n measurementNoise: 500,\n panelOpen: false,\n} as const;\n\n/**\n * Global LBM Filter Parameters\n */\nexport const FilterModel = { ...DefaultFilterModel };\n\n/**\n * Bitrate Monitor Static Class\n */\nexport const BITRATE_MONITOR = new DataFlowMonitor(\n FilterModel.yellowFlag,\n FilterModel.redFlag,\n 20,\n);\n","import { from, fromEvent, interval, map, of, share, Subject, take } from 'rxjs';\nimport { SubService } from './sub.service';\nimport { Injectable } from '@angular/core';\nimport {\n type IAggregatedStat,\n type InboundVideoStats,\n UnrealInternalSignalEvents,\n} from '../interfaces';\nimport { catchError, filter, switchMap } from 'rxjs/operators';\nimport {\n dispatchResize,\n KalmanFilter1D,\n LatencyTimings,\n mapQpToQuality,\n sendSignal,\n} from '../helpers';\nimport { changeStatusMainVideoOnScene } from '../store';\nimport { STREAMING_VIDEO_ID } from '../constants';\nimport { Signal, tapLog, Truthy } from '@3dsource/utils';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class VideoService extends SubService {\n video: HTMLVideoElement | null = null;\n audio: HTMLAudioElement | null = null;\n\n private container: HTMLDivElement | null = null;\n private latencyTestTimings = new LatencyTimings();\n\n private videoTrack$ = new Subject<{\n stream: MediaStream;\n pcClient: RTCPeerConnection;\n } | null>();\n\n private VideoEncoderQP = 0;\n private aggregatedStats = {} as InboundVideoStats;\n private kalmanFilter1D = new KalmanFilter1D(\n FilterModel.initialBitrateEstimate,\n FilterModel.initialErrorCovariance,\n FilterModel.processNoise,\n FilterModel.measurementNoise,\n );\n\n /**\n * Aggregate video stats and emit it as videoStats$\n */\n videoStats$ = this.videoTrack$.pipe(\n // If videoTrack$ emits null, switch to EMPTY → the current interval is canceled.\n switchMap((track) =>\n track\n ? // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values\n interval(250).pipe(\n map(() => track.pcClient),\n switchMap((pcClient) => from(this.getStats(pcClient))),\n filter(Truthy),\n )\n : of(null),\n ),\n filter(Truthy),\n share(),\n );\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n Signal.on('setKalmanParams').subscribe((data) => {\n this.kalmanFilter1D.config(data);\n BITRATE_MONITOR.config(data);\n });\n }\n\n setContainer(container: HTMLDivElement | null = null) {\n this.container = container;\n }\n\n setLatencyTimings(latencyTimings: string) {\n this.latencyTestTimings.SetUETimings(latencyTimings);\n }\n\n setEncoder(data: any) {\n this.VideoEncoderQP = Number(new TextDecoder('utf-16').decode(data));\n }\n\n create() {\n this.disconnect$.pipe(take(1)).subscribe(() => this.destroy());\n this.destroy();\n this.createWebRtcVideo();\n this.createWebRtcAudio();\n }\n\n attachVideoStream(stream: MediaStream, pcClient: RTCPeerConnection) {\n if (this.video) {\n this.video.srcObject = stream;\n this.videoTrack$.next({ stream, pcClient });\n } else {\n console.error('Video element is not defined.');\n }\n }\n\n attachAudioStream(stream: MediaStream) {\n // do nothing the video has the same media stream as the audio track we have here (they are linked)\n if (this.video?.srcObject === stream) {\n return;\n }\n // the video element has some other media stream not associated with this audio track\n else if (\n this.audio &&\n this.video?.srcObject &&\n this.video?.srcObject !== stream\n ) {\n this.audio.srcObject = stream;\n this.playAudio(this.audio);\n }\n }\n\n play() {\n void this.safePlay(this.video);\n }\n\n async safePlay(video: HTMLVideoElement | null) {\n if (!video) {\n return;\n }\n\n try {\n await video.play();\n return;\n } catch (e: any) {\n if (e?.name !== 'NotAllowedError') throw e;\n\n // Try silent inline autoplay\n video.muted = true;\n video.setAttribute('playsinline', '');\n try {\n await video.play();\n return;\n } catch {\n /* fall through */\n }\n\n // Last resort: wait for the next real user gesture and play with/without sound\n const resume = async () => {\n try {\n // choose whether to unmute here\n // video.muted = false;\n await video.play();\n } catch {\n /* ignore, maybe another gesture needed */\n } finally {\n window.removeEventListener('pointerdown', resume, true);\n window.removeEventListener('keydown', resume, true);\n }\n };\n\n window.addEventListener('pointerdown', resume, {\n once: true,\n capture: true,\n });\n window.addEventListener('keydown', resume, { once: true, capture: true });\n }\n }\n\n private async getStats(\n pcClient: RTCPeerConnection | null,\n ): Promise<IAggregatedStat | null> {\n if (!pcClient || pcClient.connectionState === 'closed') {\n return null;\n }\n\n try {\n const stats = await pcClient.getStats(null);\n return this.generateAggregatedStatsFunction(stats);\n } catch (err) {\n // Handle InvalidStateError or any transient WebRTC errors gracefully\n if (err instanceof DOMException && err.name === 'InvalidStateError') {\n console.warn('Peer connection is closed or unusable, skipping stats.');\n return null;\n }\n throw err;\n }\n }\n\n private generateAggregatedStatsFunction(\n stats: RTCStatsReport,\n ): IAggregatedStat {\n const newStat: InboundVideoStats = {} as InboundVideoStats;\n\n // store each type of codec we can get stats on\n newStat.codecs = {};\n newStat.currentRoundTripTime = -1;\n\n stats.forEach((report) => {\n // Get the inbound-rtp for video\n if (report.type === 'inbound-rtp' && report.kind === 'video') {\n Object.assign(newStat, report);\n\n newStat.bytesReceivedStart =\n this.aggregatedStats && this.aggregatedStats.bytesReceivedStart\n ? this.aggregatedStats.bytesReceivedStart\n : report.bytesReceived;\n\n newStat.framesDecodedStart =\n this.aggregatedStats && this.aggregatedStats.framesDecodedStart\n ? this.aggregatedStats.framesDecodedStart\n : report.framesDecoded;\n\n newStat.timestampStart =\n this.aggregatedStats && this.aggregatedStats.timestampStart\n ? this.aggregatedStats.timestampStart\n : report.timestamp;\n\n if (this.aggregatedStats && this.aggregatedStats.timestamp) {\n // Get the mimetype of the video codec being used\n if (\n report.codecId &&\n this.aggregatedStats.codecs &&\n Object.hasOwn(this.aggregatedStats.codecs, report.codecId)\n ) {\n newStat.videoCodec = this.aggregatedStats.codecs[report.codecId];\n }\n\n if (this.aggregatedStats.bytesReceived) {\n // bitrate = bits received since last time / number of ms since last time\n // This is automatically in kbits (where k=1000) since time is in ms and stat we want is in seconds (so a '* 1000' then a '/ 1000' would negate each other)\n newStat.bitrate = Math.floor(\n (8 *\n (newStat.bytesReceived! - this.aggregatedStats.bytesReceived)) /\n (newStat.timestamp - this.aggregatedStats.timestamp),\n );\n }\n\n if (this.aggregatedStats.bytesReceivedStart) {\n newStat.avgBitrate = Math.floor(\n (8 *\n (newStat?.bytesReceived! -\n this.aggregatedStats.bytesReceivedStart)) /\n (newStat.timestamp - this.aggregatedStats.timestampStart),\n );\n }\n\n if (this.aggregatedStats.framesDecodedStart) {\n newStat.avgFrameRate = Math.floor(\n (newStat.framesDecoded! -\n this.aggregatedStats.framesDecodedStart) /\n ((newStat.timestamp - this.aggregatedStats.timestampStart) /\n 1000),\n );\n }\n }\n }\n\n if (\n report.type === 'candidate-pair' &&\n Object.hasOwn(report, 'currentRoundTripTime')\n ) {\n newStat.currentRoundTripTime = report.currentRoundTripTime ?? 0;\n }\n\n if (\n report.type === 'transport' &&\n Object.hasOwn(report, 'selectedCandidatePairId')\n ) {\n const selectedPair = (stats as any).get(report.selectedCandidatePairId);\n const local = (stats as any).get(selectedPair.localCandidateId);\n const remote = (stats as any).get(selectedPair.remoteCandidateId);\n newStat.selectedPair = {\n local: { type: local?.candidateType, url: local?.url },\n remote: { type: remote?.candidateType, url: remote?.url },\n };\n }\n\n // Store mimetype of each codec\n if (\n Object.hasOwn(newStat, 'codecs') &&\n report.type === 'codec' &&\n report.mimeType &&\n report.id\n ) {\n const codecId = report.id;\n newStat.codecs[codecId] = report.mimeType\n .replace('video/', '')\n .replace('audio/', '');\n }\n });\n\n newStat.pixelRatio = +window.devicePixelRatio.toFixed(2);\n if (this.aggregatedStats.receiveToCompositeMs) {\n newStat.receiveToCompositeMs = this.aggregatedStats.receiveToCompositeMs;\n this.latencyTestTimings.SetFrameDisplayDeltaTime(\n this.aggregatedStats.receiveToCompositeMs,\n );\n }\n\n // Calculate duration of run\n newStat.runTime = Math.floor(\n (newStat.timestamp - newStat.timestampStart) / 1000,\n );\n newStat.kalmanBitrate = Math.floor(\n this.kalmanFilter1D.update(\n newStat.bitrate || FilterModel.initialBitrateEstimate,\n ),\n );\n\n newStat.dataFlowCheckResult = BITRATE_MONITOR.addValue(\n newStat.kalmanBitrate,\n );\n\n newStat.bitrateDrop = Math.floor(\n newStat.dataFlowCheckResult.dropPercentage,\n );\n this.aggregatedStats = newStat;\n return this.onAggregatedStats(newStat);\n }\n\n private onAggregatedStats(aggregatedStats: InboundVideoStats) {\n return {\n quality: mapQpToQuality(this.VideoEncoderQP),\n\n aggregatedStats: {\n ...aggregatedStats,\n VideoEncoderQP: this.VideoEncoderQP,\n },\n };\n }\n\n private destroy() {\n this.video = null;\n this.audio = null;\n this.videoTrack$.next(null);\n\n while (this.container?.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: false }),\n );\n }\n\n private createWebRtcVideo() {\n dispatchResize();\n const video = document.createElement('video');\n video.id = STREAMING_VIDEO_ID;\n video.playsInline = true;\n video.muted = true;\n video.autoplay = true;\n video.preload = 'auto';\n video.disablePictureInPicture = true;\n\n this.video = video;\n this.container?.appendChild(this.video);\n\n this.video.addEventListener('play', () =>\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: true }),\n ),\n );\n\n fromEvent(this.video, 'loadedmetadata')\n .pipe(\n take(1),\n filter((data) => this.video === data.target),\n tapLog('VideoService loadedmetadata:'),\n )\n .subscribe(() => {\n if (this.video) {\n sendSignal(UnrealInternalSignalEvents.OnVideoInitialized, this.video);\n }\n });\n }\n\n private createWebRtcAudio() {\n const audio = new Audio();\n audio.id = 'streamingAudio';\n this.audio = audio;\n }\n\n private playAudio(audio: HTMLAudioElement) {\n from(audio.play())\n .pipe(\n catchError(() => fromEvent(document, 'click')),\n take(1),\n )\n .subscribe({\n next: () => audio.play(),\n error: () => ({}),\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { catchError, filter } from 'rxjs/operators';\nimport type { TelemetryType } from '../interfaces';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { of, take, timer } from 'rxjs';\nimport { fromSignal, sendSignal } from '../helpers';\nimport { generateUuid, Truthy } from '@3dsource/utils';\nimport { HttpClient } from '@angular/common/http';\nimport { UNREAL_CONFIG } from '../constants';\n\n@Injectable()\nexport class CommandTelemetryService {\n private readonly appId: string = 'metabox-telemetry';\n private commandsSent: Record<string, CommandToSend> = {};\n private exileTimeout = 60000;\n private pollingTime = 5000;\n private commandSequenceNumber = 0;\n\n /**\n * The time the telemetry service was started.\n * Initialized at a moment when connectToSignaling() was called.\n * @private\n */\n private startTime!: number;\n private lastTime!: number;\n private uuid!: string;\n private viewId!: string;\n private sessionId!: string;\n private userId!: string;\n private payloads: Payload[] = [];\n\n private readonly httpClient = inject(HttpClient);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG, {\n optional: true,\n });\n\n constructor() {\n this.init();\n }\n\n protected init() {\n if (!this.unrealInitialConfig?.commandTelemetryReceiver) {\n return;\n }\n\n this.reset();\n this.sessionId = sessionStorage.getItem(this.appId) || this.uuid;\n this.userId = localStorage.getItem(this.appId) || this.uuid;\n sessionStorage.setItem(this.appId, this.sessionId);\n localStorage.setItem(this.appId, this.userId);\n this.start();\n }\n\n private get timeNow() {\n return Date.now();\n }\n\n private get sessionTime() {\n return this.timeNow - this.startTime;\n }\n\n private get canSkipSending() {\n return !(this.timeNow - this.lastTime > this.pollingTime * 2);\n }\n\n decorate(funcToDecorate: IToBeDecorated) {\n this.listenCallbacks();\n return this.wrapper.bind(this, funcToDecorate);\n }\n\n protected start() {\n fromSignal(UnrealInternalSignalEvents.TelemetryStart).subscribe(\n ({ externalId }) => {\n this.trackStartCommand(`EXT-${externalId}`);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryStop).subscribe(\n ({ externalId, payload }) => {\n const trackingId = `EXT-${externalId}`;\n this.trackStopCommand(trackingId, undefined, payload?.multi, payload);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryReset).subscribe(() => {\n this.reset();\n });\n\n timer(0, this.pollingTime).subscribe(() => {\n this.send(this.payloads);\n });\n }\n\n private reset() {\n this.uuid = generateUuid();\n this.commandSequenceNumber = 0;\n this.viewId = this.uuid;\n this.startTime = this.timeNow;\n this.payloads.length = 0;\n this.commandsSent = {};\n }\n\n private trackStartCommand(trackingId: string) {\n const out = {\n command: trackingId,\n trackingId,\n };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer('commandSent', out, timers);\n this.trackTime(out);\n }\n\n private trackStopCommand(\n trackingId: string,\n timeStampsRaw?: TimeStampsRaw,\n multi = false,\n response: any = {},\n ) {\n const commandResponse = this.commandsSent[trackingId];\n if (!commandResponse) {\n return;\n }\n const totalRoundTripTime = this.timeNow - commandResponse.timeStampJs;\n\n /**\n * Time between telemetry was reset and command was sent.\n */\n const commandSentJsTime = commandResponse.timeStampJs - this.startTime;\n let unrealTimers = {};\n\n const t = timeStampsRaw?.timeStampCommand;\n if (t) {\n unrealTimers = {\n unrealRoundTripTime:\n t.onCompleteCommand.timestamp - t.onRequestCommand.timestamp,\n\n unrealExecutionDuration:\n t.onCompleteCommand.timestamp - t.onStartCommand.timestamp,\n\n timeDiffRequest:\n t.onRequestCommand.timestamp - commandResponse.timeStampJs,\n\n timeDiffCallBack: this.timeNow - t.onCompleteCommand.timestamp,\n };\n }\n\n const timers = {\n sessionElapsedTime: this.sessionTime,\n commandSentJsTime,\n totalRoundTripTime,\n ...unrealTimers,\n } as ComputedTimers;\n\n this.pushStatToBuffer(\n 'commandStop',\n { ...commandResponse.command, response },\n timers,\n timeStampsRaw,\n );\n if (!multi) {\n delete this.commandsSent[trackingId];\n }\n }\n\n private pushStatToBuffer(\n type: TelemetryType,\n commandContent: any,\n computedTimers: ComputedTimers,\n timeStampsRaw?: TimeStampsRaw,\n ) {\n this.pushData({\n type,\n commandSequenceNumber: this.commandSequenceNumber++,\n commandContent,\n timeStampsRaw,\n computedTimers,\n });\n }\n\n private trackTime(command: any) {\n this.commandsSent[command.trackingId] = {\n timeStampJs: this.timeNow,\n command,\n };\n }\n\n private send(payload: Payload[]) {\n if (payload.length === 0 || (this.canSkipSending && payload.length < 10)) {\n return;\n }\n this.lastTime = this.timeNow;\n const out: TelemetryBatch = {\n appId: this.appId,\n sessionId: this.sessionId,\n viewId: this.viewId,\n userId: this.userId,\n ua: navigator.userAgent,\n timeStamp: new Date(this.timeNow).toString(),\n href: location.href,\n resolution: {\n width: window.screen.width,\n height: window.screen.height,\n pixelRatio: window.devicePixelRatio,\n },\n payload,\n };\n const lastIndex = payload[payload.length - 1].commandSequenceNumber;\n this.httpClient\n .post(this.unrealInitialConfig?.commandTelemetryReceiver || '', out)\n .pipe(\n catchError(() => of(null)),\n take(1),\n )\n .subscribe(() => {\n this.payloads = this.payloads.filter(\n (p) => p.commandSequenceNumber > lastIndex,\n );\n });\n }\n\n /**\n * Listens for Unreal Engine callbacks.\n * Subscribes to the Unreal Engine event loop back and filters out events that do not have a tracking ID.\n * When a callback with a tracking ID is received,\n * it stops tracking the time for that command and filters out commands\n * that have exceeded the timeout limit.\n */\n protected listenCallbacks() {\n fromSignal(UnrealInternalSignalEvents.UnrealCallback)\n .pipe(\n filter(({ json }) => {\n const callback =\n 'commandCallback' in json ? json.commandCallback : json;\n\n return Truthy(callback?.trackingId);\n }),\n )\n .subscribe(({ json }: any) => {\n const callback = json.commandCallback;\n const timeStampsRaw = json.timeStamp;\n const trackingId = callback?.trackingId || '';\n\n this.trackStopCommand(trackingId, timeStampsRaw);\n this.removeExileCommands();\n });\n }\n\n private pushData(payload: Payload) {\n this.payloads.push(payload);\n }\n\n /**\n * Removes commands that have exceeded the timeout limit.\n * Iterates over all the commands sent and checks if the difference between the current time\n * and the time the command was sent is greater than the timeout limit.\n * If it is, the command is marked for deletion.\n * After checking all commands, those marked for deletion are removed from the commands sent.\n * This method is used to ensure that commands that are not responded to within a certain time frame\n * do not remain in the commandsSent object indefinitely, which could lead to memory leaks over time.\n */\n private removeExileCommands() {\n const time: number = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries<CommandToSend>(this.commandsSent).forEach(\n ([trackingId, { timeStampJs }]) => {\n if (time - timeStampJs > this.exileTimeout) {\n markForDelete.push(trackingId);\n }\n },\n );\n\n markForDelete.forEach((trackingId) => {\n delete this.commandsSent[trackingId];\n });\n }\n\n /**\n * Wraps the provided function with telemetry tracking.\n * Generates a unique tracking ID and adds it to the data object.\n * Pushes the command sent to the payloads with the tracking ID.\n * Starts tracking the time for the command.\n * Finally, calls the provided function with the modified data object.\n *\n * @param {IToBeDecorated} funcToDecorate - The function to be decorated with telemetry tracking.\n * @param {any} data - The data object to be passed to the function. It will be augmented with a unique tracking ID.\n */\n private wrapper(funcToDecorate: IToBeDecorated, data: any) {\n const out = { ...data, trackingId: generateUuid() };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer(\n 'commandSent',\n {\n ...out,\n trackingId: `${out.trackingId}`,\n },\n timers,\n );\n this.trackTime(out);\n funcToDecorate(out);\n }\n}\n\ntype IToBeDecorated = (data: any) => unknown;\n\ninterface TelemetryBatch {\n appId: string;\n sessionId: string;\n viewId: string;\n userId: string;\n ua: string;\n timeStamp: string;\n href: string;\n payload: Payload[];\n resolution: {\n width: number;\n height: number;\n pixelRatio: number;\n };\n}\n\ninterface Payload {\n type: TelemetryType;\n commandSequenceNumber: number;\n commandContent: any;\n timeStampsRaw?: TimeStampsRaw;\n computedTimers: ComputedTimers;\n}\n\ninterface TimeStampsRaw {\n timeStampPak: TimeStampPakCollection;\n timeStampCommand: TimeStampCommandCollection;\n}\n\ninterface TimeStampPakCollection {\n onLoadPak: TimeStampMemory;\n onRenderPak: TimeStampMemory;\n onSequencePak: TimeStampMemory;\n onSpawnPak: TimeStampMemory;\n}\n\ninterface TimeStampMemory {\n timestamp: number;\n ram: number;\n vRam: number;\n}\n\ninterface TimeStampCommandCollection {\n onRequestCommand: TimeStampMemory;\n onStartCommand: TimeStampMemory;\n onCompleteCommand: TimeStampMemory;\n}\n\ninterface ComputedTimers {\n unrealRoundTripTime: number;\n totalRoundTripTime: number;\n unrealExecutionDuration: number;\n sessionElapsedTime: number;\n timeDiffRequest: number;\n timeDiffCallBack: number;\n commandSentJsTime: number;\n}\n\nexport function TelemetryStart(externalId: string) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStart, { externalId });\n}\n\nexport function TelemetryStop(externalId: string, payload?: any) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStop, { externalId, payload });\n}\n\nexport function ResetTelemetry() {\n sendSignal(UnrealInternalSignalEvents.TelemetryReset);\n}\n\ninterface CommandToSend {\n timeStampJs: number;\n command: { trackingId: string };\n}\n","import type { SignallingService } from '../../services';\nimport type { StreamerListMessage } from '../../interfaces';\n\nexport function StreamerListHandler(\n this: SignallingService,\n msg: StreamerListMessage,\n) {\n this.send(\n JSON.stringify({\n type: 'subscribe',\n streamerId: msg.ids[0],\n }),\n );\n}\n","import type { SignallingService } from '../../services';\n\nexport function OfferHandler(\n this: SignallingService,\n msg: RTCSessionDescriptionInit,\n) {\n this.onOffer$.next(msg);\n}\n","export function httpUrlToWs(url: string) {\n return url.replace('http://', 'ws://').replace('https://', 'wss://');\n}\n","import { defer, Observable, throwError } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport { Logger } from '@3dsource/utils';\nimport { WS_TIMEOUT } from '../constants';\n\nexport function createWebSocket(wsUrl: string): Observable<WebSocket> {\n if (typeof window === 'undefined' || !('WebSocket' in window)) {\n return throwError(\n () => new Error(\"Your browser doesn't support WebSocket\"),\n );\n }\n\n Logger.info('Creating socket', wsUrl);\n\n return defer(\n () =>\n new Observable<WebSocket>((observer) => {\n const ws = new WebSocket(wsUrl);\n\n const onOpen = () => {\n observer.next(ws); // connection established\n };\n\n const onError = (ev: Event) => {\n const anyEv = ev as any;\n const err =\n anyEv?.error instanceof Error\n ? anyEv.error\n : new Error('WebSocket failed to connect');\n observer.error(err);\n };\n\n const onClose = (ev: CloseEvent) => {\n if (ws.readyState !== WebSocket.OPEN) {\n observer.error(\n new Error(`WebSocket closed before open (code ${ev.code})`),\n );\n }\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n\n return () => {\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n };\n }),\n ).pipe(\n timeout({\n first: WS_TIMEOUT, // fail if no 'open' event in this window\n with: () =>\n throwError(\n () =>\n new Error(`WebSocket connection timed out after ${WS_TIMEOUT}ms`),\n ),\n }),\n );\n}\n","/*\n * Copyright (c) 2024.\n * Sergii Karanda - All Rights Reserved\n */\n\nimport { disconnectStream } from '../../store';\nimport type { SignallingService } from '../../services';\nimport { DisconnectReason } from '../../interfaces';\n\nexport function PlayerDisconnectHandler(this: SignallingService) {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.OrchestrationPlayerDisconnected,\n message: 'Orchestration: PlayerDisconnectHandler',\n }),\n );\n}\nexport function StreamerDisconnectHandler(this: SignallingService) {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.OrchestrationStreamerDisconnected,\n message: 'Orchestration: StreamerDisconnectHandler',\n }),\n );\n}\n","import type { SignallingService } from '../../services';\nimport type { OrchestrationErrorMessage } from '../../interfaces';\nimport { POLLING_TIME } from '../../constants';\nimport { setOrchestrationMessage } from '../../store';\n\n// Structured constants holding code + description\nexport const ORCHESTRATION_ERROR_CODES = {\n NO_AVAILABLE_INSTANCES: {\n code: 4001,\n description: 'There are no instances to run for the requested environment.',\n },\n LIMIT_REACHED: {\n code: 4002,\n description:\n 'The limit of instances for the requested environment is reached.',\n },\n DIFFERENT_ORIGIN: {\n code: 4003,\n description:\n 'Origin instance and client are on different connection servers on instance.',\n },\n} as const;\n\n// Set for codes that should trigger a retry\nconst RETRY_CODES = new Set<number>([\n ORCHESTRATION_ERROR_CODES.NO_AVAILABLE_INSTANCES.code,\n ORCHESTRATION_ERROR_CODES.LIMIT_REACHED.code,\n]);\n\nexport function OrchestrationErrorHandler(\n this: SignallingService,\n msg: OrchestrationErrorMessage,\n) {\n if (RETRY_CODES.has(msg.payload.code)) {\n const errorInfo = Object.values(ORCHESTRATION_ERROR_CODES).find(\n ({ code }) => code === msg.payload.code,\n );\n this.store.dispatch(\n setOrchestrationMessage({ message: errorInfo?.description as string }),\n );\n setTimeout(() => this.sendRequestStream(), POLLING_TIME);\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport {\n ResetTelemetry,\n TelemetryStart,\n TelemetryStop,\n} from './command-telemetry.service';\nimport type { Observable } from 'rxjs';\nimport { defer, retry, Subject, switchMap, take, timeout, timer } from 'rxjs';\nimport { exhaustMap, filter, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n abortEstablishingConnection,\n dataChannelReady,\n selectClientAndViewIds,\n setAwsInstance,\n setEstablishingConnection,\n setStatusMessage,\n setStatusPercentSignallingServer,\n unrealFeature,\n} from '../store';\nimport { HttpClient } from '@angular/common/http';\nimport { SubService } from './sub.service';\nimport { POLLING_TIME, UnrealStatusMessage, WS_OPEN_STATE } from '../constants';\nimport type {\n AnySignalingMessage,\n AwsInstance,\n CloseReason,\n ConfigMessage,\n MessageBase,\n PollingOrchestrationMessage,\n SignalingMessageHandler,\n SignalingMessageMap,\n} from '../interfaces';\nimport { OrchestrationMessageTypes } from '../interfaces';\nimport {\n COLOR_CODES,\n generateUuid,\n Logger,\n tapLog,\n Truthy,\n} from '@3dsource/utils';\nimport {\n AnswerHandler,\n ConfigHandler,\n getActiveUrl,\n IceCandidateHandler,\n InstanceReadyHandler,\n InstanceReservedHandler,\n OnCloseHandler,\n OnErrorHandler,\n OnMessageHandler,\n OnOpenHandler,\n PingHandler,\n PlayerCountHandler,\n SSInfoHandler,\n} from '../helpers';\nimport { RegionsPingService } from '../services';\nimport { StreamerListHandler } from '../helpers/FromStreamerHandlers/StreamerListHandler';\nimport { OfferHandler } from '../helpers/FromStreamerHandlers/OfferHandler';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { httpUrlToWs } from '../helpers/httpToWsUrl';\nimport { createWebSocket } from '../helpers/create-websocket';\nimport {\n PlayerDisconnectHandler,\n StreamerDisconnectHandler,\n} from '../helpers/FromStreamerHandlers/ForceDisconnect';\nimport { OrchestrationErrorHandler } from '../helpers/FromStreamerHandlers/OrchestrationErrorHandler';\n\n@Injectable()\nexport class SignallingService extends SubService {\n private readonly action$ = inject(Actions);\n private readonly httpClient = inject(HttpClient);\n private readonly regionsPingService = inject(RegionsPingService);\n\n readonly region = signal('');\n\n readonly selectClientAndViewIds = this.store.selectSignal(\n selectClientAndViewIds,\n );\n readonly environmentId = this.store.selectSignal(\n unrealFeature.selectEnvironmentId,\n );\n readonly streamRequestContext = this.store.selectSignal(\n unrealFeature.selectStreamRequestContext,\n );\n\n onOffer$ = new Subject<RTCSessionDescriptionInit>();\n onConfig$ = new Subject<ConfigMessage>();\n onWebRtcIce$ = new Subject<RTCIceCandidate>();\n onWebRtcAnswer$ = new Subject<RTCSessionDescriptionInit | null>();\n abort$ = this.action$.pipe(ofType(abortEstablishingConnection));\n\n private ws!: WebSocket;\n\n private wsMsgHandlers: Partial<{\n [K in keyof SignalingMessageMap]: SignalingMessageHandler<K>;\n }> = {};\n\n protected correlationId!: string;\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.setHandlersFromStream();\n this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {\n this.send({\n type: 'p2pEstablished',\n source: 'front',\n sessionId: generateUuid(),\n });\n });\n\n this.action$\n .pipe(\n ofType(dataChannelReady),\n switchMap(() =>\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy), take(1)),\n ),\n )\n .subscribe(() => {\n this.send({\n type: 'streamPreparedForUserInteraction',\n correlationId: generateUuid(),\n });\n });\n }\n\n connectToSignaling(urlList: string[]) {\n Logger.log('CONNECT TO SIGNALLING');\n // Preparation for WebSocket Orchestration\n this.correlationId = generateUuid();\n\n ResetTelemetry();\n this.startEstablishingConnection();\n\n return defer(() =>\n this.getRegion().pipe(\n tap((region) => this.region.set(region!)),\n map((region) => this.adaptUrlsToRegion(urlList, region)),\n switchMap((urls) => this.getAwsInstance(urls).pipe(take(1))),\n tap((awsInstance) => this.store.dispatch(setAwsInstance(awsInstance))),\n switchMap(({ wsUrl }) => this.connectToCirrus(wsUrl!)),\n filter(Truthy),\n take(1),\n takeUntil(this.abort$),\n ),\n ).pipe(\n // Retry the whole attempt on error, advancing to the next URL each time.\n retry({\n delay: (err, attempt) => {\n Logger.info(\n `Retrying Signalling Connection in ${POLLING_TIME}ms. Attempt# ${attempt}.`,\n err?.message,\n );\n return timer(POLLING_TIME);\n },\n // count: 10, // Optional: cap the number of attempts.\n }),\n );\n }\n\n protected startEstablishingConnection() {\n this.showStatusMessage(UnrealStatusMessage.STARTING_YOUR_SESSION);\n this.store.dispatch(setEstablishingConnection({ value: true }));\n }\n\n private adaptUrlsToRegion(urlList: string[], region?: string) {\n return urlList.map((url) => {\n if (region && !url.includes(':region')) {\n return url.replace(\n /signallingserver/gi,\n `signallingserver/region:${region}`,\n );\n }\n return url;\n });\n }\n\n /**\n * Resolves an active AWS *signaling* instance and returns a WebSocket endpoint.\n *\n * The observable produced by this method is **cold** and executes inside a `defer`,\n * so each subscription (including those triggered by `retry`) pulls the **next**\n * URL candidate from a generator created by `getActiveUrl(urlsPool)`.\n *\n * ### Execution flow\n *\n * 1. **Telemetry** — Starts a `getSignaling` span for end-to-end timing.\n * 2. **Candidate URL selection** — A stateful generator (`urlGen`) is created\n * from `urlsPool`. Each resubscription (e.g. via `retry`) advances to the next URL.\n * 3. **Short-circuit for WS URLs** — If the picked candidate already matches\n * `ws://` or `wss://`, emit `{ wsUrl, pollingUrl: null, instanceName: null }`\n * immediately and complete (no HTTP request).\n * 4. **Await client/view identifiers** — `this.store.select(selectClientAndViewIds)`\n * is tapped for logging (missing IDs) and then filtered to require both `clientId`\n * and `viewId` to be truthy.\n * 5. **Single in-flight HTTP orchestration call** — Uses `exhaustMap` to issue\n * `GET {signalingUrl}{clientId}/{viewId}`. New `{clientId, viewId}` emissions\n * while the request is in flight are **ignored** until completion, preventing overlap.\n * 6. **Per-attempt timeout** — `timeout(WS_TIMEOUT)` caps how long we wait for a response.\n * On timeout, the attempt errors and the outer `retry` schedules the next URL.\n * 7. **Response validation & progress reporting** — A `filter`:\n * - Calls `TelemetryStop('getSignaling', { ...data, multi: true })` on receipt.\n * - If `data.signallingServer === ''` or `data.error`:\n * shows a status message, optionally dispatches `setStatusPercentSignallingServer`\n * with `data.info.percent`, and **throws** to fail the attempt (triggers `retry`).\n * 8. **Mapping to `AwsInstance`** — Converts the validated orchestration payload into:\n * - `wsUrl`: via `httpUrlToWs(\\`\\${location.protocol}//\\${data.signallingServer}\\`)`\n * - `pollingUrl`: the base `signalingUrl` that succeeded\n * - `instanceName`: the (validated) `data.signallingServer`\n * 9. **Retry policy** — On *any* upstream error (timeout, HTTP error, invalid payload),\n * `retry({ delay })`:\n * - Shows a “connecting” status,\n * - Logs the attempt number,\n * - Waits `WS_TIMEOUT` ms (via `timer`) and **resubscribes**, advancing `urlGen`.\n *\n * ### Concurrency semantics\n *\n * - `exhaustMap` guarantees a **single** HTTP request per attempt; subsequent\n * `{clientId, viewId}` emissions are ignored until the current request completes.\n *\n * ### Telemetry semantics\n *\n * - `TelemetryStart('getSignaling')` begins before work.\n * - `TelemetryStop('getSignaling', {...})` runs on receipt of an orchestration response.\n * If an attempt fails (e.g., timeout), stopping the span is the responsibility of\n * your telemetry layer or a `finalize` elsewhere if desired.\n *\n * ### Error & retry semantics\n *\n * - Missing/never-emitted IDs → timeout → retry with next URL.\n * - HTTP/network error → retry with next URL.\n * - Invalid orchestration payload (`error` set or empty `signallingServer`) → throw in\n * validation filter → retry with next URL.\n * - Short-circuit WS path **does not** retry (emits once, completes).\n *\n * @param urlsPool - Ordered list of base URLs to probe. Retries advance through this list\n * until a working signaling server is found. A candidate may also be a direct `ws://`/`wss://`\n * URL to short-circuit HTTP orchestration.\n *\n * @returns Observable that emits exactly one {@link AwsInstance} on success and then completes.\n * On failure, the stream errors; the built-in `retry` operator re-subscribes after `WS_TIMEOUT`\n * and advances to the next URL candidate.\n *\n * @throws Emits an error within the observable chain (not a thrown synchronous exception) when:\n * - The HTTP request fails or times out.\n * - The orchestration response indicates an error or an empty `signallingServer`.\n * - Any other operator in the chain surfaces an error.\n *\n * @remarks\n * - The URL generator (`urlGen`) is created **outside** `defer`, so resubscriptions\n * advance the pool. Creating it inside `defer` would restart from the first URL each retry.\n * - `location.protocol` is used to derive `ws` vs `wss`. If this may run in non-browser\n * contexts (e.g., SSR), guard or abstract this logic.\n * - Consider capping retries with `count` in `retry({ count, delay })` when appropriate.\n *\n * @example\n * ```ts\n * getAwsInstance(['https://signaling.example.com/', 'wss://direct.example.com'])\n * .subscribe({\n * next: ({ wsUrl }) => connect(wsUrl),\n * error: (e) => console.error('Unable to establish signaling:', e),\n * });\n * ```\n *\n * @see httpUrlToWs\n * @see selectClientAndViewIds\n * @see setStatusPercentSignallingServer\n */\n private getAwsInstance(urlsPool: string[]): Observable<AwsInstance> {\n TelemetryStart('getSignaling');\n\n // Stateful iterator over candidate URLs; retries advance this sequence.\n const urlGen = getActiveUrl(urlsPool);\n\n return defer(() => {\n const signalingUrl = `${urlGen.next().value}`;\n\n // Short-circuit if the candidate is already a WS endpoint.\n if (signalingUrl.match(/^ws(s?):\\/\\//i)) {\n return this.store.select(selectClientAndViewIds).pipe(\n filter(({ clientId, viewId }) => !!clientId && !!viewId),\n map(() => {\n return {\n wsUrl: signalingUrl,\n pollingUrl: null,\n instanceName: 'Direct Connection',\n };\n }),\n );\n }\n\n return this.store.select(selectClientAndViewIds).pipe(\n // Log missing IDs without altering the stream.\n tap(({ clientId, viewId }) => {\n if (!clientId || !viewId) {\n console.error('Client ID or View ID is not set');\n }\n }),\n\n // Only proceed when both identifiers are available.\n filter(({ clientId, viewId }) => !!clientId && !!viewId),\n\n // Take first value\n take(1),\n\n // Ensure a single in-flight HTTP request per attempt.\n exhaustMap(({ clientId, viewId }) =>\n this.httpClient.get<PollingOrchestrationMessage>(\n `${signalingUrl}${clientId}/${viewId}`,\n ),\n ),\n\n // Bound the time spent waiting for the orchestration response.\n timeout(POLLING_TIME),\n\n // Validate response; report progress; fail fast on invalid payloads.\n filter((data: PollingOrchestrationMessage) => {\n TelemetryStop('getSignaling', { ...data, multi: true });\n\n if (data.signallingServer === '' || data.error) {\n this.showStatusMessage(data?.mm_message || 'Server not found');\n\n if (data?.info) {\n this.store.dispatch(\n setStatusPercentSignallingServer({\n percent: data.info.percent,\n }),\n );\n }\n\n // Throwing here fails the attempt and activates the retry strategy.\n throw new Error(\n `Orchestration message => ${data?.mm_message || 'Polling retry'}`,\n );\n }\n\n return true;\n }),\n\n // Map a valid orchestration payload into the final AwsInstance.\n map((data: PollingOrchestrationMessage): AwsInstance => {\n const wsUrl = httpUrlToWs(\n `${location.protocol}//${data.signallingServer}`,\n );\n\n return {\n wsUrl,\n pollingUrl: signalingUrl,\n instanceName: data.signallingServer!,\n };\n }),\n );\n }).pipe(\n // Retry the whole attempt on error, advancing to the next URL each time.\n retry({\n delay: (err, attempt) => {\n this.showStatusMessage(UnrealStatusMessage.CONNECTING_TO_SESSION);\n Logger.log(\n `Retrying with new URL in ${POLLING_TIME}ms. Attempt# ${attempt}`,\n err?.message,\n );\n return timer(POLLING_TIME);\n },\n // count: 10, // Optional: cap the number of attempts.\n }),\n );\n }\n\n private connectToCirrus(wsUrl: string) {\n this.clearWs();\n return createWebSocket(wsUrl).pipe(\n tapLog('WS CREATED'),\n tap((ws) => {\n TelemetryStart('iceCandidate');\n this.addWsHandlers(ws);\n }),\n );\n }\n\n addWsHandlers(ws: WebSocket) {\n ws.onmessage = OnMessageHandler.bind(this);\n ws.onclose = OnCloseHandler.bind(this);\n ws.onerror = OnErrorHandler.bind(this);\n this.ws = ws;\n Logger.log('WS HANDLERS ADDED');\n OnOpenHandler.call(this);\n }\n\n showStatusMessage(statusMessage: string | null) {\n this.store.dispatch(setStatusMessage({ statusMessage }));\n }\n\n /**\n * Close the connection with the signaling server\n * @param data\n */\n close(data: CloseReason) {\n const { code, reason } = data;\n if (this.ws) Logger.warn('Closing existing WebSocket connection');\n this.ws?.close(code, reason);\n this.ws = null as never;\n }\n\n send(data: AnySignalingMessage) {\n let dataString = data;\n if (typeof dataString !== 'string') {\n dataString = JSON.stringify(data);\n }\n if (this.ws && this.ws.readyState === WS_OPEN_STATE) {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, JSON.parse(dataString));\n try {\n this.ws.send(dataString);\n } catch {\n Logger.error('No Websocket');\n }\n }\n }\n\n private clearWs() {\n this.onWebRtcAnswer$.next(null);\n if (this.ws) {\n this.ws.onmessage = () => null;\n this.ws.onerror = () => null;\n this.ws.onclose = () => null;\n this.ws.onopen = () => null;\n this.ws = null as never;\n }\n }\n\n protected handleMessage(msg: MessageBase) {\n try {\n Logger.colored(...COLOR_CODES.FROM_CIRRUS, msg);\n this.wsMsgHandlers[msg.type]!(msg as never);\n } catch {\n Logger.colored(\n ...COLOR_CODES.FROM_CIRRUS_ERROR,\n `Invalid CIRRUS message type: ${msg.type}`,\n );\n }\n }\n\n private setHandlersFromStream() {\n this.wsMsgHandlers.ping = PingHandler.bind(this);\n this.wsMsgHandlers.error = OrchestrationErrorHandler.bind(this);\n this.wsMsgHandlers.config = ConfigHandler.bind(this);\n this.wsMsgHandlers.answer = AnswerHandler.bind(this);\n this.wsMsgHandlers.ssInfo = SSInfoHandler.bind(this);\n this.wsMsgHandlers.playerCount = PlayerCountHandler.bind(this);\n this.wsMsgHandlers.streamerList = StreamerListHandler.bind(this);\n this.wsMsgHandlers.iceCandidate = IceCandidateHandler.bind(this);\n this.wsMsgHandlers.instanceReady = InstanceReadyHandler.bind(this);\n this.wsMsgHandlers.instanceReserved = InstanceReservedHandler.bind(this);\n this.wsMsgHandlers.playerDisconnected = PlayerDisconnectHandler.bind(this);\n this.wsMsgHandlers.streamerDisconnected =\n StreamerDisconnectHandler.bind(this);\n\n this.wsMsgHandlers.offer = OfferHandler.bind(this);\n }\n\n protected sendRequestStream() {\n this.send({\n type: OrchestrationMessageTypes.requestStream,\n correlationId: this.correlationId,\n payload: {\n region: this.region(),\n environmentId: this.environmentId()!,\n context: this.streamRequestContext()!,\n },\n });\n }\n\n /**\n * Check if the WebSocket connection is open and ready.\n */\n isConnected(): boolean {\n return this.ws && this.ws.readyState === WS_OPEN_STATE;\n }\n\n private getRegion() {\n Logger.log('Start Getting Region');\n return this.regionsPingService.getFastest().pipe(take(1));\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { fromEvent, share, Subject, take, tap } from 'rxjs';\nimport { filter, map, takeUntil, withLatestFrom } from 'rxjs/operators';\nimport {\n dataChannelConnected,\n disconnectStream,\n reconnectPeer,\n unrealFeature,\n} from '../store';\nimport { SubService } from './sub.service';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { TelemetryStart, TelemetryStop } from './command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces';\nimport { DisconnectReason } from '../interfaces';\nimport { SignallingService } from './signalling.service';\nimport { VideoService } from './video.service';\n\n@Injectable()\nexport class WebRtcPlayerService extends SubService {\n onDataChannelMessage$ = new Subject<ArrayBuffer>();\n\n private pcClient!: RTCPeerConnection | null;\n private signallingSrv = inject(SignallingService);\n private videoService = inject(VideoService);\n private cfg: RTCConfiguration = {};\n private useMic = false;\n private forceTURN = false;\n private forceMonoAudio = false;\n private dcClient!: RTCDataChannel | null;\n\n private isReconnecting = this.store.selectSignal(\n unrealFeature.selectIsReconnecting,\n );\n\n constructor() {\n super();\n this.init();\n Signal.on('dropDC').subscribe(() => this.dcClient?.close());\n Signal.on('dropPC').subscribe(() => this.pcClient?.close());\n }\n\n protected init() {\n const iceCandidateBuffer: RTCIceCandidate[] = [];\n\n const processBuffer = () => {\n iceCandidateBuffer.forEach((cnd) => {\n this.handleCandidateFromServer(cnd);\n });\n iceCandidateBuffer.length = 0;\n };\n\n this.signallingSrv.onConfig$.subscribe((config: ConfigMessage) => {\n this.videoService.create();\n this.setConfig(config);\n });\n\n this.signallingSrv.onWebRtcAnswer$\n .pipe(filter(Truthy))\n .subscribe((answer) => {\n this.receiveAnswer(answer);\n processBuffer();\n });\n\n this.signallingSrv.onOffer$.pipe(filter(Truthy)).subscribe(() => {\n void this.createWebRtcOffer();\n });\n\n this.signallingSrv.onWebRtcIce$\n .pipe(withLatestFrom(this.signallingSrv.onWebRtcAnswer$))\n .subscribe(([candidate, answerEstablished]) => {\n TelemetryStop('iceCandidate', {\n multi: true,\n });\n\n iceCandidateBuffer.push(candidate);\n if (answerEstablished) {\n processBuffer();\n }\n });\n }\n\n private async createWebRtcOffer(): Promise<void> {\n Logger.info('Creating offer');\n let offer: void;\n try {\n offer = await this.createPeerConnection(this.cfg);\n } catch {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.WebRTCError,\n message: 'WebRTCError: Offer Error',\n }),\n );\n }\n\n return offer;\n }\n\n private createDataChannel(\n pc: RTCPeerConnection,\n label: string,\n options: RTCDataChannelInit,\n ) {\n // This is the primary data channel code path when we are \"offering\"\n const datachannel = pc.createDataChannel(label, options);\n return this.setupDataChannelCallbacks(datachannel);\n }\n\n private receiveAnswer(answer: RTCSessionDescriptionInit) {\n this.pcClient?.setRemoteDescription(answer);\n }\n\n private handleCandidateFromServer(iceCandidate: RTCIceCandidate) {\n try {\n const candidate = new RTCIceCandidate(iceCandidate);\n Logger.info(\n '[Unreal ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n\n // if forcing TURN, reject any candidates not relay\n if (this.forceTURN) {\n // check if no relay address is found, if so, we are assuming it means no TURN server\n if (candidate.candidate.indexOf('relay') < 0) {\n Logger.warn(\n 'Dropping candidate because it was not TURN relay.',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n return;\n }\n }\n this.pcClient?.addIceCandidate(candidate).catch(function () {\n // Logger.error('Failed to add ICE candidate', e);\n });\n } catch (e) {\n Logger.error('Error handleCandidateFromServer', e);\n }\n }\n\n private mungeSDP(offer: RTCSessionDescriptionInit): void {\n let audioSDP = '';\n\n // set max bitrate to the highest bitrate Opus supports\n audioSDP += 'maxaveragebitrate=510000;';\n\n if (this.useMic) {\n // set the max capture rate to 48khz (so we can send high-quality audio from mic)\n audioSDP += 'sprop-maxcapturerate=48000;';\n }\n\n // Force mono or stereo based on whether ?forceMono was passed or not\n audioSDP += this.forceMonoAudio\n ? 'sprop-stereo=0;stereo=0;'\n : 'sprop-stereo=1;stereo=1;';\n\n // enable in-band forward error correction for opus audio\n audioSDP += 'useinbandfec=1';\n\n // We use the line 'useinbandfec=1' (which Opus uses) to set our Opus specific audio parameters.\n offer.sdp = offer.sdp?.replace('useinbandfec=1', audioSDP);\n }\n\n /**\n * Closes existing PeerConnection\n */\n closePC(): void {\n if (this.pcClient) Logger.warn('Closing existing PeerConnection');\n this.pcClient?.close();\n this.pcClient = null;\n\n if (this.dcClient) Logger.warn('Closing existing DataChannel');\n this.dcClient?.close();\n this.dcClient = null;\n }\n\n canSend() {\n return this.dcClient && this.dcClient.readyState === 'open';\n }\n\n send(data: ArrayBuffer) {\n if (this.canSend()) {\n this.dcClient?.send(data);\n } else {\n Logger.colored(\n 'black',\n 'yellow',\n `DataChannel connection not prepared or in state: ${this.dcClient?.readyState}`,\n );\n\n // Trigger peer reconnection if DC is not open and we're not already reconnecting\n this.tryReconnectOnSendFailure();\n }\n }\n\n /**\n * Attempts to reconnect the peer when send fails due to DataChannel not being open.\n * This handles cases where the DC connection is broken but no error events are fired.\n */\n private tryReconnectOnSendFailure(): void {\n // Skip if already reconnecting or signaling is not connected\n if (this.isReconnecting()) {\n Logger.info(\n '[Reconnect] Already reconnecting, skipping duplicate attempt',\n );\n return;\n }\n\n if (!this.signallingSrv.isConnected()) {\n Logger.warn('[Reconnect] Cannot reconnect: Signaling not connected');\n return;\n }\n\n // Check if DC exists but is in a non-open state (closing, closed, or connecting stuck)\n const dcState = this.dcClient?.readyState;\n if (dcState && dcState !== 'open') {\n Logger.warn(\n `[Reconnect] DataChannel in \"${dcState}\" state during send, initiating peer reconnection`,\n );\n this.store.dispatch(\n reconnectPeer({ attempt: 1, maxAttempts: 3, delay: 0 }),\n );\n }\n }\n\n /**\n * Reconnect only the WebRTC peer connection without re-establishing signaling.\n * This closes the current PeerConnection and creates a new offer through\n * the existing WebSocket connection.\n * @returns true if reconnection was initiated, false if signaling is not connected\n */\n reconnectPeer(): boolean {\n if (!this.signallingSrv.isConnected()) {\n Logger.error(\n '[Reconnect] Cannot reconnect peer: Signaling not connected',\n );\n return false;\n }\n\n if (!this.cfg || Object.keys(this.cfg).length === 0) {\n Logger.error('[Reconnect] Cannot reconnect peer: No config available');\n return false;\n }\n\n Logger.info('[Reconnect] Initiating peer reconnection');\n\n // Close only the PeerConnection, keep WebSocket alive\n this.closePC();\n\n // Create a new WebRTC offer using the stored config\n void this.createWebRtcOffer();\n\n return true;\n }\n\n private setConfig(parOptions = {} as ConfigMessage) {\n const urlParams = new URLSearchParams(window.location.search);\n\n //**********************\n //Config setup\n //**********************\n this.cfg = { ...parOptions.peerConnectionOptions };\n\n this.forceTURN = urlParams.has('ForceTURN');\n if (this.forceTURN) {\n Logger.info(\n 'Forcing TURN usage by setting ICE Transport Policy in peer connection config.',\n );\n this.cfg.iceTransportPolicy = 'relay';\n }\n\n this.cfg.bundlePolicy = urlParams.has('ForceMaxBundle')\n ? 'max-bundle'\n : 'balanced';\n\n //**********************\n //Variables\n //**********************\n this.pcClient = null;\n this.dcClient = null;\n\n // When ?useMic check for SSL or localhost\n const isLocalhostConnection =\n location.hostname === 'localhost' || location.hostname === '127.0.0.1';\n const isHttpsConnection = location.protocol === 'https:';\n if (this.useMic && !isLocalhostConnection && !isHttpsConnection) {\n this.useMic = false;\n Logger.error(\n 'Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access.',\n );\n Logger.error(\n \"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'\",\n );\n }\n }\n\n private async createPeerConnection(config: RTCConfiguration): Promise<void> {\n this.closePC();\n this.pcClient = new RTCPeerConnection(config);\n\n TelemetryStart('Browser ICE gathering');\n TelemetryStart('Browser ICE connection');\n TelemetryStart('Signaling state change');\n\n this.handlePeerConnectionEvents(this.pcClient);\n await this.setupTransceiversAsync(this.pcClient);\n\n this.dcClient = this.createDataChannel(\n this.pcClient,\n 'UnrealDcConnection',\n {\n // See https://www.w3.org/TR/webrtc/#dom-rtcdatachannelinit for values (this is needed for Firefox to be consistent with Chrome.)\n ordered: true,\n },\n );\n\n this.disconnect$.pipe(take(1)).subscribe(() => {\n this.closePC();\n });\n\n await this.createOffer(this.pcClient);\n }\n\n private handlePeerConnectionEvents(pcClient: RTCPeerConnection) {\n fromEvent(pcClient, 'signalingstatechange')\n .pipe(\n map(() => this.pcClient?.signalingState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Signaling state change] |', state, '|');\n TelemetryStop('Signaling state change', { state, multi: true });\n });\n\n fromEvent(pcClient, 'iceconnectionstatechange')\n .pipe(\n map(() => this.pcClient?.iceConnectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE connection] |', state, '|');\n TelemetryStop('Browser ICE connection', { state, multi: true });\n });\n\n fromEvent(pcClient, 'icegatheringstatechange')\n .pipe(\n map(() => this.pcClient?.iceGatheringState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE gathering] |', state, '|');\n TelemetryStop('Browser ICE gathering', { state, multi: true });\n });\n\n fromEvent(pcClient, 'connectionstatechange')\n .pipe(\n map(() => this.pcClient?.connectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[RTCPeerConnection state] |', state, '|');\n });\n\n fromEvent<RTCPeerConnectionIceEvent>(pcClient, 'icecandidate')\n .pipe(\n map((e: RTCPeerConnectionIceEvent) => e.candidate),\n filter(Truthy),\n tap((candidate: RTCIceCandidate) =>\n Logger.info(\n '[Browser ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n ),\n ),\n takeUntil(this.disconnect$),\n )\n .subscribe((candidate) =>\n this.signallingSrv.send({ type: 'iceCandidate', candidate }),\n );\n\n fromEvent<RTCDataChannelEvent>(pcClient, 'datachannel')\n .pipe(\n tap(() =>\n Logger.info(\n 'Data channel created for us by browser as we are a receiving peer.',\n ),\n ),\n map((e: RTCDataChannelEvent) => e.channel),\n takeUntil(this.disconnect$),\n )\n .subscribe((datachannel) => {\n this.dcClient = this.setupDataChannelCallbacks(datachannel);\n });\n\n const onTrack$ = fromEvent<RTCTrackEvent>(pcClient, 'track').pipe(\n takeUntil(this.disconnect$),\n filter((e) => !!e.track),\n tap((e) =>\n Logger.info(\n 'Got track - ' +\n e.track.kind +\n ' id=' +\n e.track.id +\n ' readyState=' +\n e.track.readyState,\n ),\n ),\n share(),\n );\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'audio'),\n map((e) => e.streams[0]),\n )\n .subscribe((stream) => this.videoService.attachAudioStream(stream));\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'video'),\n map((e) => e.streams[0]),\n tap(() => Logger.info('Set video source from video track ontrack.')),\n )\n .subscribe((stream) => {\n if (this.pcClient) {\n this.videoService.attachVideoStream(stream, this.pcClient);\n }\n });\n }\n\n private async setupTransceiversAsync(pc: RTCPeerConnection): Promise<void> {\n const hasTransceivers = pc.getTransceivers().length > 0;\n\n // Setup a transceiver for getting UE video\n pc.addTransceiver('video', { direction: 'recvonly' });\n\n // Setup a transceiver for sending mic audio to UE and receiving audio from UE\n if (!this.useMic) {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n } else {\n const audioSendOptions = this.useMic\n ? {\n autoGainControl: false,\n channelCount: 1,\n echoCancellation: false,\n latency: 0,\n noiseSuppression: false,\n sampleRate: 48000,\n sampleSize: 16,\n volume: 1.0,\n }\n : false;\n\n // Note using mic on android chrome requires SSL or chrome://flags/ \"unsafely-treat-insecure-origin-as-secure\"\n const stream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: audioSendOptions,\n });\n if (stream) {\n if (hasTransceivers) {\n for (const transceiver of pc.getTransceivers()) {\n if (\n transceiver &&\n transceiver.receiver &&\n transceiver.receiver.track &&\n transceiver.receiver.track.kind === 'audio'\n ) {\n for (const track of stream.getTracks()) {\n if (track.kind && track.kind === 'audio') {\n await transceiver.sender.replaceTrack(track);\n transceiver.direction = 'sendrecv';\n }\n }\n }\n }\n } else {\n for (const track of stream.getTracks()) {\n if (track.kind && track.kind === 'audio') {\n pc.addTransceiver(track, { direction: 'sendrecv' });\n }\n }\n }\n } else {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n }\n }\n }\n\n private setupDataChannelCallbacks(\n datachannel: RTCDataChannel,\n ): RTCDataChannel | null {\n try {\n Logger.log(\n `[DATACHANNEL] Setting up datachannel \"${datachannel.label}\" callbacks...`,\n );\n TelemetryStart('DataChannel Connection');\n // Inform browser we would like binary data as an ArrayBuffer (FF chooses Blob by default!)\n datachannel.binaryType = 'arraybuffer';\n\n fromEvent(datachannel, 'close')\n .pipe(\n // Only dispatch disconnect if not already reconnecting to avoid infinite loops\n filter(() => !this.isReconnecting()),\n take(1),\n )\n .subscribe((e) => {\n Logger.warn(\n `[DATACHANNEL] Data channel disconnected: ${datachannel.label}(${datachannel.id})`,\n e,\n );\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.DataChannelClosed,\n message: 'DataChannelClosed',\n }),\n );\n });\n\n fromEvent(datachannel, 'error')\n .pipe(takeUntil(this.disconnect$))\n .subscribe((e) => {\n const message = `[DATACHANNEL] Data channel \"${datachannel.label}\" error. id:${datachannel.id}`;\n Logger.error(message, e);\n });\n\n fromEvent(datachannel, 'open')\n .pipe(\n tap(() => {\n Logger.info(\n `[DATACHANNEL] Data channel \"${datachannel.label}\" connected. id:${datachannel.id}`,\n );\n }),\n takeUntil(this.disconnect$),\n )\n .subscribe(() => {\n TelemetryStop('DataChannel Connection');\n this.onDataChannelConnected();\n });\n\n fromEvent<MessageEvent>(datachannel, 'message')\n .pipe(\n map((e: MessageEvent) => e.data),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onDataChannelMessage$.next(data));\n\n return datachannel;\n } catch (e) {\n Logger.warn('[DATACHANNEL] Datachannel setup caused an exception: ', e);\n return null;\n }\n }\n\n private onDataChannelConnected() {\n let statusMessage = 'Session connected, video stream starting.';\n if (navigator.userAgent.includes('Firefox')) {\n statusMessage +=\n '\\n If you are experiencing connection problems please try Google Chrome';\n }\n\n this.store.dispatch(dataChannelConnected({ statusMessage }));\n }\n\n private async createOffer(pcClient: RTCPeerConnection): Promise<void> {\n try {\n const offer = await pcClient.createOffer({\n offerToReceiveAudio: false, //Note: if you don't need audio, you can get improved latency by turning this off.\n offerToReceiveVideo: true,\n });\n this.mungeSDP(offer);\n pcClient?.setLocalDescription(offer);\n this.signallingSrv.send(offer);\n } catch {\n Logger.error(\"Couldn't create offer\");\n }\n }\n}\n","export const deepEqual = (a: any, b: any) => {\n if (a === b) return true;\n\n // must both be objects (and not null)?\n if (\n typeof a === 'object' &&\n a !== null &&\n typeof b === 'object' &&\n b !== null\n ) {\n // arrays?\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n // plain objects\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n // `b` must have key, and values must match\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n // everything else (including mismatched types)\n return false;\n};\n","import { filter } from 'rxjs/operators';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { unrealFeature } from '../store';\nimport { Subject } from 'rxjs';\nimport type { ReceivedMimeType } from '../interfaces/ReceivedMimeTypes';\n\nexport class FileReceiverService extends SubService {\n public fileComplete$ = new Subject<ReceivedFile>();\n\n private valid = false;\n private chunks = 0;\n private mimetype = '' as ReceivedMimeType;\n private receiving = false;\n private extension = '';\n private timestampStart = 0;\n private data: Uint8Array<ArrayBuffer>[] = [];\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.reset());\n }\n\n public reset() {\n this.mimetype = '' as ReceivedMimeType;\n this.extension = '';\n this.receiving = false;\n this.valid = false;\n this.chunks = 0;\n this.data = [];\n this.timestampStart = new Date().getTime();\n // Logger.info('Received file state');\n }\n\n private resetOnStart() {\n this.reset();\n this.receiving = true;\n }\n\n /**\n * Processes a file extension when received over data channel\n * @param view - the file extension data\n */\n setExtensionFromBytes(view: Uint8Array) {\n // Reset this if we got a file message and we are not \"receiving\" it yet\n if (!this.receiving) {\n this.resetOnStart();\n }\n\n //Logger.info(extensionAsString);\n this.extension = new TextDecoder('utf-16').decode(view.slice(1));\n }\n\n /**\n * Processes a file mime type when received over data channel\n * @param view - the file mime type data\n */\n setMimeTypeFromBytes(view: Uint8Array) {\n // Reset this if we got a file message and we are not \"receiving\" it yet\n if (!this.receiving) {\n this.resetOnStart();\n }\n\n const mimeAsString = new TextDecoder('utf-16').decode(view.slice(1));\n // Logger.info(mimeAsString);\n this.mimetype = mimeAsString as ReceivedMimeType;\n }\n\n /*-------------------------------------------------------------------------------------------*/\n\n public setContentsFromBytes(view: Uint8Array) {\n // If we haven't received the initial setup instructions, return\n if (!this.receiving) return;\n\n const typeSize = 1;\n const intSize = 4;\n const maxMessageSize = 16 * 1024;\n const headerSize = typeSize + intSize;\n const maxPayloadSize = maxMessageSize - headerSize;\n\n // Calculate the total number of chunks from the total this size\n this.chunks = Math.ceil(\n new DataView(view.slice(typeSize, headerSize).buffer).getInt32(0, true) /\n maxPayloadSize,\n );\n\n // Get the file part of the payload\n const thisBytes = view.slice(headerSize);\n\n // Append to existing data that holds this\n this.data.push(thisBytes);\n\n // Uncomment for debug\n // Logger.info(`Received this chunk: ${this.data.length}/${this.chunks}`);\n\n if (this.data.length === this.chunks) {\n this.receiving = false;\n this.valid = true;\n /*Logger.info('Received complete file');\n const transferDuration = new Date().getTime() - this.timestampStart;\n const transferBitrate = Math.round(\n (this.chunks * maxMessageSize) / transferDuration,\n );\n Logger.info(\n `Average transfer bitrate: ${transferBitrate}kb/s over ${transferDuration / 1000} seconds`,\n );*/\n\n /**\n * Reconstruct the file\n * This code reconstructs the received data into the original this based on the mime type and extension provided\n */\n const blob = new Blob([...this.data], { type: this.mimetype });\n this.fileComplete$.next({\n blob,\n mimetype: this.mimetype,\n extension: this.extension,\n valid: this.valid,\n });\n this.reset();\n } else if (this.data.length > this.chunks) {\n Logger.error(\n `Received bigger this than advertised: ${this.data.length}/${this.chunks}`,\n );\n this.reset();\n }\n }\n}\nexport interface ReceivedFile {\n blob: Blob;\n mimetype: ReceivedMimeType;\n extension: string;\n valid: boolean;\n}\n","import { COLOR_CODES, Logger, Truthy, where } from '@3dsource/utils';\nimport { inject, Injectable } from '@angular/core';\nimport { merge, Subject } from 'rxjs';\nimport { distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';\nimport {\n EControlSchemeType,\n EToClientMessageType,\n InputOptions,\n SCREEN_LOCKER_CONTAINER_ID,\n UNREAL_CONFIG,\n} from '../constants';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport {\n selectStreamConfig,\n showUnrealErrorMessage,\n unrealFeature,\n} from '../store';\nimport { decodeData, sendSignal } from '../helpers';\nimport type { UnrealCommands } from '@3dsource/types-unreal';\nimport { deepEqual } from '../helpers/deepEqual';\nimport { SubService } from './sub.service';\nimport { FileReceiverService } from './file-receiver.service';\n\nconst filteredLogs = [\n {\n command: 'onChangeSequence',\n },\n];\n\n@Injectable()\nexport class AggregatorService extends SubService {\n private readonly selectStreamConfig =\n this.store.selectSignal(selectStreamConfig);\n private readonly videoService = inject(VideoService);\n private readonly webrtcPlayer = inject(WebRtcPlayerService);\n private readonly freezeFrame = inject(FreezeFrameService);\n private readonly fileReceiver = inject(FileReceiverService);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG);\n private readonly responseEventListeners = new Map<\n string,\n (data: unknown) => void\n >();\n\n /**\n * Never called for now\n */\n private readonly destroy$ = new Subject<void>();\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n this.listenWebRTC();\n this.initialize();\n }\n\n protected listenWebRTC() {\n this.webrtcPlayer.onDataChannelMessage$\n .pipe(takeUntil(this.destroy$))\n .subscribe((data) => this.dataChannelMessageHandler(data));\n }\n\n protected initialize() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(distinctUntilChanged())\n .subscribe((connected) => {\n this.resetResponseList();\n if (connected) {\n this.startListenCallbacks();\n }\n });\n\n const unlockViewport$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy));\n\n merge(unlockViewport$, this.disconnect$).subscribe(() => {\n this.removeLoadScreen();\n });\n\n if (\n !this.selectStreamConfig()?.autoStart ||\n location.href.match(/^http:/gi)\n ) {\n this.removeLoadScreen();\n }\n\n InputOptions.controlScheme = EControlSchemeType.HoveringMouse;\n }\n\n private addResponseEventListener(\n name: string,\n listener: (data: unknown) => void,\n ) {\n this.responseEventListeners.set(name, listener);\n }\n\n private showOnScreenKeyboard<T extends { showOnScreenKeyboard: boolean }>(\n command: T,\n ) {\n if (command.showOnScreenKeyboard) {\n // Show the 'edit text' button.\n //editTextButton.classList.remove('hiddenState');\n // Place the 'edit text' button near the UE4 input widget.\n //let pos = unquantizeAndDenormalizeUnsigned(command.x, command.y);\n //editTextButton.style.top = pos.y.toString() + 'px';\n //editTextButton.style.left = (pos.x - 40).toString() + 'px';\n } else {\n // Hide the 'edit text' button.\n //editTextButton.classList.add('hiddenState');\n // Hide the on-screen keyboard.\n // hiddenInput.blur();\n }\n }\n\n private removeLoadScreen() {\n document\n .getElementById(\n this.unrealInitialConfig?.screenLockerContainerId ||\n SCREEN_LOCKER_CONTAINER_ID,\n )\n ?.remove();\n }\n\n private startListenCallbacks() {\n Logger.info('Start Listen Unreal Callbacks');\n let previousJson: unknown = null;\n this.addResponseEventListener('unrealEvents', (data) => {\n try {\n if (typeof data !== 'string') {\n return;\n }\n const json = JSON.parse(data);\n\n if (!deepEqual(json, previousJson)) {\n if (json?.error) {\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL_ERROR,\n `${json.error}`,\n data,\n );\n this.store.dispatch(\n showUnrealErrorMessage({ code: json.code, error: json?.error }),\n );\n } else {\n this.showMessageFromUnreal(json);\n\n previousJson = json;\n sendSignal(UnrealInternalSignalEvents.UnrealCallback, { json });\n }\n } else {\n // Logger.warn('Duplicate message received');\n }\n } catch (e) {\n Logger.error(e);\n Logger.error('ERROR=>', data);\n }\n });\n }\n\n private showMessageFromUnreal<T extends UnrealCommands>(json: T) {\n if (filteredLogs.some(where({ command: json?.command }))) {\n return;\n }\n Logger.colored(...COLOR_CODES.FROM_UNREAL, json);\n }\n\n private resetResponseList() {\n this.responseEventListeners.clear();\n }\n\n private dataChannelMessageHandler(data: ArrayBuffer) {\n const view = new Uint8Array(data);\n const anyData = data.slice(1);\n\n if (this.freezeFrame.receiving) {\n this.freezeFrame.setData(view);\n return;\n }\n\n switch (view[0]) {\n case EToClientMessageType.QualityControlOwnership: {\n const ownership = view[1] !== 0;\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Received quality controller message, will control quality: ' +\n ownership,\n );\n break;\n }\n\n case EToClientMessageType.Response: {\n const response = decodeData(anyData);\n\n for (const listener of this.responseEventListeners.values()) {\n listener(response as never);\n }\n\n break;\n }\n\n case EToClientMessageType.Command: {\n const commandAsString = decodeData(anyData);\n Logger.colored(...COLOR_CODES.FROM_UNREAL, commandAsString);\n const command = JSON.parse(commandAsString);\n\n if (command.command === 'onScreenKeyboard') {\n this.showOnScreenKeyboard(command);\n }\n break;\n }\n case EToClientMessageType.FileExtension:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileExtension');\n this.fileReceiver.setExtensionFromBytes(view);\n break;\n\n case EToClientMessageType.FileMimeType:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileMimeType');\n this.fileReceiver.setMimeTypeFromBytes(view);\n break;\n\n case EToClientMessageType.FileContents:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileContents');\n this.fileReceiver.setContentsFromBytes(view);\n break;\n\n case EToClientMessageType.FreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Freeze frame');\n this.freezeFrame.start(view);\n break;\n\n case EToClientMessageType.UnfreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Un-Freeze frame');\n this.freezeFrame.invalidate();\n break;\n\n case EToClientMessageType.VideoEncoderAvgQP:\n this.videoService.setEncoder(anyData);\n break;\n\n case EToClientMessageType.LatencyTest: {\n const latencyTimings = decodeData(anyData);\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Got latency timings :',\n latencyTimings,\n );\n Logger.colored(...COLOR_CODES.FROM_UNREAL, latencyTimings);\n this.videoService.setLatencyTimings(latencyTimings);\n break;\n }\n\n case EToClientMessageType.InitialSettings:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InitialSettings message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.Protocol:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Protocol message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.InputControlOwnership:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InputControlOwnership message :',\n anyData,\n );\n break;\n\n default:\n Logger.warn(`unrecognized data received, packet ID ${view[0]}`);\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n changeLowBandwidth,\n disconnectStream,\n setConfig,\n setMaxFps,\n unrealFeature,\n} from '../store';\nimport { of, switchMap, take } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { Logger, Signal, tapLog } from '@3dsource/utils';\nimport { catchError, filter } from 'rxjs/operators';\nimport { DevModeService, SubService } from '../services';\nimport { DisconnectReason } from '../interfaces';\n\ninterface CustomWindow extends Window {\n emitUIInteraction: (data: unknown) => void;\n emitCommand: (data: unknown) => void;\n dropConnection: (data: unknown) => void;\n dropDC: (data: unknown) => void;\n dropPC: (data: unknown) => void;\n toggleBandwidth: (data: unknown) => void;\n setMaxFps: (data: number) => void;\n rebootInstance: (data: unknown) => void;\n startShowcase: (data: unknown) => void;\n restartApp: (data: unknown) => void;\n unrealHelp: (data: unknown) => void;\n setWarnTime: (data: number) => void;\n}\n\ndeclare let window: CustomWindow;\n\n@Injectable()\nexport class ConsoleExtensionsService extends SubService {\n #httpClient = inject(HttpClient);\n #isDevMode = inject(DevModeService).isDevMode;\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n if (!this.#isDevMode) {\n return;\n }\n window.dropConnection = () => {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.DropConnection,\n message: 'Manual Console Drop',\n }),\n );\n return true;\n };\n\n window.dropDC = () => {\n Signal.broadcast('dropDC');\n return true;\n };\n\n window.dropPC = () => {\n Signal.broadcast('dropPC');\n return true;\n };\n\n window.toggleBandwidth = () => {\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(take(1))\n .subscribe((isLow) =>\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: !isLow })),\n );\n return 'LowBandwidth => toggled';\n };\n window.setMaxFps = (maxFps: number) => {\n this.store.dispatch(setMaxFps({ maxFps }));\n return `Max Fps Set to ${maxFps}`;\n };\n window.restartApp = () => {\n this.store\n .select(unrealFeature.selectAwsInstance)\n .pipe(\n take(1),\n filter((data) => !!data.instanceName),\n tapLog('Instance', `Restart initiated`),\n switchMap((data) =>\n this.#httpClient.get(`//${data.instanceName}/restartapp`),\n ),\n catchError(() => of(null)),\n )\n .subscribe();\n };\n window.unrealHelp = () => this.unrealHelp();\n window.setWarnTime = (time: number) => {\n this.store.dispatch(setConfig({ config: { warnTimeout: time } }));\n };\n }\n\n private unrealHelp() {\n Logger.info(\n 'dropConnection() => Closes Web Socket and abort communication.',\n );\n Logger.info('toggleBandwidth() => toggles speed.');\n Logger.info('restartApp() => force restart Unreal app.');\n Logger.info('rebootInstance() => force reboot instance.');\n Logger.info('startShowcase(time) => start Showcase.');\n Logger.info('setWarnTime() => set time to appear the AFK window.');\n Logger.info('emitCommand(command) => send command to Unreal Engine.');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Truthy } from '@3dsource/utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DevModeService {\n get isDevMode() {\n return Truthy(localStorage.getItem('devMode'));\n }\n setDevMode(value: boolean) {\n return localStorage.setItem('devMode', value.toString());\n }\n}\n","import type { InputService } from '../services';\nimport { MouseButton } from '../constants';\nimport { fromEvent } from 'rxjs';\n\nexport default class TouchEmulator {\n private lastDistance = 0;\n private prevDistance = 0;\n private touchReset = true;\n private delta = 0;\n private moveSensitivityScale = 3;\n private prevX = 0;\n private prevY = 0;\n\n constructor(private host: InputService) {\n this.registerTouchEvents(host.video);\n }\n\n private getPosition({ clientX, clientY }: Position) {\n return {\n x: clientX - this.host.videoBoundingRect.left,\n y: clientY - this.host.videoBoundingRect.top,\n };\n }\n\n private getCenter(v1: Vector, v2: Vector) {\n return {\n x: (v2.x - v1.x) / 2 + v1.x,\n y: (v2.y - v1.y) / 2 + v1.y,\n };\n }\n\n private getDistance(v1: Vector, v2: Vector) {\n const quad = {\n x: Math.abs(v2.x - v1.x) ^ 2,\n y: Math.abs(v2.y - v1.y) ^ 2,\n };\n\n return Math.sqrt(quad.x + quad.y);\n }\n\n updateDistance(touches: TouchList) {\n const center = this.getCenter(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n this.lastDistance = this.getDistance(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n if (this.touchReset) {\n this.prevDistance = this.lastDistance;\n this.touchReset = false;\n }\n\n return center;\n }\n\n private touchToVector2({ clientX, clientY }: Position) {\n return {\n x: clientX,\n y: clientY,\n };\n }\n\n private twoFingersAction(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n\n this.lastDistance = 0;\n this.prevDistance = 0;\n this.prevX = center.x;\n this.prevY = center.y;\n this.host.emitMouseUp(MouseButton.MainButton, center.x, center.y);\n this.host.emitMouseDown(MouseButton.SecondaryButton, center.x, center.y);\n }\n\n private threeFingersActionMove(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n this.delta = this.lastDistance - this.prevDistance;\n\n const xx = center.x - this.prevX;\n const yy = center.y - this.prevY;\n\n this.host.emitMouseMove(\n center.x,\n center.y,\n this.moveSensitivityScale * xx,\n this.moveSensitivityScale * yy,\n );\n this.prevX = center.x;\n this.prevY = center.y;\n }\n\n private twoFingersActionZoom(touches: TouchList) {\n const center = this.updateDistance(touches);\n this.delta = this.lastDistance - this.prevDistance;\n\n if (Math.abs(this.delta) < 0.3) {\n return;\n }\n\n this.delta = (this.delta / Math.abs(this.delta)) * 2000;\n\n if (isNaN(this.delta)) {\n return;\n }\n\n this.prevDistance = this.lastDistance;\n this.host.emitMouseWheel(this.delta, center.x, center.y);\n }\n\n private registerTouchEvents(playerElement: HTMLVideoElement | null) {\n if (!playerElement) {\n return;\n }\n let finger: Finger | undefined;\n\n fromEvent<TouchEvent>(playerElement, 'touchstart', {\n passive: false,\n }).subscribe((e: TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const touches: TouchList = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersAction(touches);\n\n return;\n }\n\n /**\n * One finger actions below\n */\n\n this.prevDistance = 0;\n this.touchReset = true;\n\n if (finger === undefined) {\n const firstTouch = e.changedTouches[0];\n const { x, y } = this.getPosition(firstTouch);\n finger = {\n id: firstTouch.identifier,\n x,\n y,\n };\n // Hack: Mouse events require an enter and leave so we just\n // enter and leave manually with each touch as this event\n // is not fired with a touch device.\n playerElement.dispatchEvent(new MouseEvent('mouseenter', e));\n this.host.emitMouseDown(MouseButton.MainButton, finger.x, finger.y);\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchend', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < e.changedTouches.length; t++) {\n const touch = e.changedTouches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n this.host.emitMouseUp(MouseButton.MainButton, x, y);\n this.host.emitMouseUp(MouseButton.SecondaryButton, x, y);\n // Hack: Manual mouse leave event.\n playerElement.dispatchEvent(new MouseEvent('mouseleave', e));\n finger = undefined;\n\n break;\n }\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchmove', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n const touches = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n this.threeFingersActionMove(touches);\n\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersActionZoom(touches);\n\n return;\n }\n\n for (let t = 0; t < touches.length; t++) {\n const touch = e.touches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n\n this.host.emitMouseMove(\n x,\n y,\n this.moveSensitivityScale * (x - finger.x),\n this.moveSensitivityScale * (y - finger.y),\n );\n finger.x = x;\n finger.y = y;\n\n break;\n }\n }\n });\n }\n}\n\ninterface Vector {\n x: number;\n y: number;\n}\n\ninterface Finger extends Vector {\n id: number;\n}\n\ninterface Position {\n clientX: number;\n clientY: number;\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport { Subject } from 'rxjs';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { EMessageTypeValues } from '../constants';\nimport { EMessageType } from '../constants';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { fromSignal, resetAfk, sendSignal } from '../helpers';\nimport { COLOR_CODES, generateUuid, Logger } from '@3dsource/utils';\nimport { commandStarted, dataChannelReady, unrealFeature } from '../store';\nimport { Store } from '@ngrx/store';\nimport { Actions, ofType } from '@ngrx/effects';\n\n@Injectable()\nexport class UnrealCommunicatorService {\n private action$ = inject(Actions);\n private store = inject(Store);\n private commandTelemetryService = inject(CommandTelemetryService);\n private freezeFrameService = inject(FreezeFrameService);\n private webRtcPlayerService = inject(WebRtcPlayerService);\n private videoService = inject(VideoService);\n private destroy$ = new Subject<void>();\n\n private cirrusConnected = this.store.selectSignal(\n unrealFeature.selectCirrusConnected,\n );\n\n constructor() {\n this.init();\n }\n\n protected init() {\n this.emitUIInteraction = this.commandTelemetryService.decorate(\n this.emitUIInteraction.bind(this),\n );\n this.listenVideo();\n this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {\n this.requestInitialSettings();\n this.requestQualityControl();\n });\n }\n\n destroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n sendCommandToUnreal(data: MetaBoxCommandPacket) {\n if (this.webRtcPlayerService.canSend()) {\n const uniqId = data?.correlationId ?? generateUuid();\n const sendData: MetaBoxCommandPacket = { ...data, correlationId: uniqId };\n Logger.colored(...COLOR_CODES.TO_UNREAL, sendData);\n this.emitUIInteraction(sendData);\n\n this.store.dispatch(\n commandStarted({ id: uniqId, command: data.command as string }),\n );\n }\n }\n\n emitUIInteraction(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.UIInteraction, descriptor);\n }\n\n /**\n A build-in command can be sent to the UE4 client. The commands are defined by a\n JSON descriptor and will be executed automatically.\n The currently supported commands are:\n\n 1. A command to run any console command:\n \"{ ConsoleCommand: <string> }\"\n\n 2. A command to change the resolution to the given width and height.\n \"{ Resolution.Width: <value>, Resolution.Height: <value> }\"\n */\n emitCommand(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.Command, descriptor);\n }\n\n sendInputData(data: ArrayBuffer) {\n try {\n resetAfk();\n this.webRtcPlayerService.send(data);\n } catch (error) {\n if (this.cirrusConnected()) {\n Logger.error(error);\n }\n }\n }\n\n private emitDescriptor(\n messageType: EMessageTypeValues,\n descriptor: MetaBoxCommandPacket,\n ) {\n // Convert the descriptor object into a JSON string.\n const descriptorAsString = JSON.stringify(descriptor);\n\n // Add the UTF-16 JSON string to the array byte buffer, going two bytes at\n // a time.\n const data = new DataView(\n new ArrayBuffer(1 + 2 + 2 * descriptorAsString.length),\n );\n let byteIdx = 0;\n data.setUint8(byteIdx, messageType);\n byteIdx++;\n data.setUint16(byteIdx, descriptorAsString.length, true);\n byteIdx += 2;\n\n for (let i = 0; i < descriptorAsString.length; i++) {\n data.setUint16(byteIdx, descriptorAsString.charCodeAt(i), true);\n byteIdx += 2;\n }\n\n this.sendInputData(data.buffer);\n }\n\n private requestInitialSettings() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestInitialSettings]).buffer,\n );\n }\n\n private requestQualityControl() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestQualityControl]).buffer,\n );\n }\n\n protected listenVideo() {\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized).subscribe(() =>\n this.prepareScreen(),\n );\n }\n\n private prepareScreen() {\n this.showPlayOverlay();\n this.freezeFrameService.invalidate();\n }\n\n private showPlayOverlay() {\n const callback = () => {\n this.videoService.play();\n resetAfk();\n sendSignal(UnrealInternalSignalEvents.VideoPlayClick, {\n text: 'Play Clicked',\n });\n\n return true;\n };\n\n sendSignal(UnrealInternalSignalEvents.ShowPlayButton, {\n text: 'Play',\n callback,\n });\n }\n}\n","import type { IKeyCode, IKeyName } from '@3dsource/utils';\nimport {\n InvertedKeyMap,\n KeyboardNumericCode,\n Logger,\n Truthy,\n} from '@3dsource/utils';\nimport type {\n InputProps,\n NormalizeAndQuantizeSignedValue,\n NormalizeAndQuantizeUnsignedValue,\n UnquantizeAndDenormalizeUnsignedValue,\n} from '../interfaces';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport type { EMessageTypeValues } from '../constants';\nimport {\n EMessageType,\n InputOptions,\n MouseButton,\n MouseButtonsMask,\n SpecialKeyCodes,\n} from '../constants';\nimport type { Observable } from 'rxjs';\nimport { fromEvent, merge, startWith, Subject, takeUntil } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n} from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport TouchEmulator from '../helpers/TouchEmulator';\nimport { fromResizeObserver, fromSignal } from '../helpers';\nimport { UnrealCommunicatorService } from './unreal-communicator.service';\nimport { DevModeService, SubService, VideoService } from '../services';\nimport { unrealFeature } from '../store';\n\nexport class InputService extends SubService {\n private commandsSender = inject(UnrealCommunicatorService);\n private isDevMode = inject(DevModeService).isDevMode;\n private videoService = inject(VideoService);\n\n readonly defaultKeys = [\n KeyboardNumericCode.KeyW,\n KeyboardNumericCode.KeyS,\n KeyboardNumericCode.KeyA,\n KeyboardNumericCode.KeyD,\n KeyboardNumericCode.ArrowUp,\n KeyboardNumericCode.ArrowDown,\n KeyboardNumericCode.ArrowLeft,\n KeyboardNumericCode.ArrowRight,\n KeyboardNumericCode.NumpadAdd,\n KeyboardNumericCode.NumpadSubtract,\n KeyboardNumericCode.ControlRight,\n KeyboardNumericCode.Equal,\n KeyboardNumericCode.Minus,\n KeyboardNumericCode.NumpadDecimal,\n ];\n private availableKeys: IKeyCode[] = this.defaultKeys;\n private options!: InputProps;\n private reInit$ = new Subject<void>();\n private deactivatedVideoTrigger$!: Observable<unknown>;\n\n private normalizeAndQuantizeUnsigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeUnsignedValue;\n private unQuantizeAndDenormalizeUnsigned!: (\n x: number,\n y: number,\n ) => UnquantizeAndDenormalizeUnsignedValue;\n private normalizeAndQuantizeSigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeSignedValue;\n\n videoBoundingRect: DOMRect = new DOMRect(0, 0, 1, 1);\n fingerIds = new Map();\n maxByteValue = 255;\n fingers = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];\n\n private offsetParams: OffsetParams = {\n scaleX: 1,\n scaleY: 1,\n scaledHeight: 0,\n scaledWidth: 0,\n offsetByY: 0,\n offsetByX: 0,\n };\n\n constructor() {\n super();\n this.init();\n }\n\n protected init() {\n const visibilityHiddenTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'hidden'),\n filter(Truthy),\n );\n const visibilityVisibleTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n startWith(true),\n );\n\n this.deactivatedVideoTrigger$ = merge(\n this.disconnect$,\n this.reInit$,\n visibilityHiddenTrigger$,\n );\n\n merge(\n visibilityVisibleTrigger$,\n this.store.select(unrealFeature.selectViewportReady).pipe(filter(Truthy)),\n ).subscribe(() => this.setup());\n }\n\n useKeyboardKeys(keys: IKeyCode[]) {\n this.availableKeys = keys || [];\n }\n\n get video() {\n return this.videoService.video;\n }\n\n private setup() {\n const video = this.video;\n if (!video) {\n return;\n }\n Logger.log('DEBUG: video initialized: ', video);\n this.options = InputOptions;\n this.reInit$.next();\n\n merge(\n fromResizeObserver(video),\n fromSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer),\n )\n .pipe(debounceTime(300), takeUntil(this.deactivatedVideoTrigger$))\n .subscribe(() => {\n this.setupNormalizeAndQuantize(video);\n });\n\n this.setupNormalizeAndQuantize(video);\n this.registerInputs(video);\n }\n\n /**\n * We use `object-fit: cover` on the video element. Since the video can have\n * a different aspect ratio from its container (and potentially be larger),\n * we need to calculate offsets and scale factors to map container (e.g., mouse)\n * coordinates back to the actual video coordinates.\n *\n * @param videoElement The video element whose scaling and positioning we need\n * @returns Object containing offset and scale info for coordinate normalization\n * @private\n */\n private getObjectFitOffset(videoElement: HTMLVideoElement) {\n const { width, height } = this.videoBoundingRect;\n const { videoWidth, videoHeight } = videoElement;\n\n Logger.log('Video Quantizing with => ', this.videoBoundingRect, {\n videoWidth,\n videoHeight,\n });\n\n // Compute aspect ratios\n const containerRatio = width / height;\n const videoRatio = videoWidth / videoHeight;\n\n // Determine how much to scale the video to fit the container (cover mode)\n const scale =\n videoRatio > containerRatio ? height / videoHeight : width / videoWidth;\n\n // Calculate the displayed (scaled) dimensions of the video\n const scaledWidth = videoWidth * scale;\n const scaledHeight = videoHeight * scale;\n\n // Offsets in x/y directions (like \"padding\") once the video is scaled\n const offsetByX = (width - scaledWidth) / 2;\n const offsetByY = (height - scaledHeight) / 2;\n\n // Scale factors for coordinate transformation from container space to video space\n const scaleX = width / scaledWidth;\n const scaleY = height / scaledHeight;\n\n return {\n offsetByX,\n offsetByY,\n scaleX,\n scaleY,\n scaledWidth,\n scaledHeight,\n };\n }\n\n private setupNormalizeAndQuantize(videoElement: HTMLVideoElement) {\n if (videoElement) {\n this.videoBoundingRect = videoElement.getBoundingClientRect();\n this.offsetParams = this.getObjectFitOffset(videoElement);\n\n // Unsigned XY positions are the ratio (0.0..1.0) along a viewport axis,\n // quantized into an uint16 (0..65536).\n // Signed XY deltas are the ratio (-1.0..1.0) along a viewport axis,\n // quantized into an int16 (-32767..32767).\n // This allows the browser viewport and client viewport to have a different\n // size.\n // Hack: Currently we set an out-of-range position to an extreme (65535)\n // as we can't yet accurately detect mouse enter and leave events\n // precisely inside a video with an aspect ratio which causes mattes.\n\n this.normalizeAndQuantizeUnsigned = (x, y) => {\n const normalizedX = x / videoElement.clientWidth;\n const normalizedY = y / videoElement.clientHeight;\n\n if (\n normalizedX < 0.0 ||\n normalizedX > 1.0 ||\n normalizedY < 0.0 ||\n normalizedY > 1.0\n ) {\n return {\n inRange: false,\n x: 65535,\n y: 65535,\n };\n } else {\n return {\n inRange: true,\n x: normalizedX * 65536,\n y: normalizedY * 65536,\n };\n }\n };\n\n this.unQuantizeAndDenormalizeUnsigned = (x, y) => {\n const normalizedX = x / 65536;\n const normalizedY = y / 65536;\n return {\n x: normalizedX * videoElement.clientWidth,\n y: normalizedY * videoElement.clientHeight,\n };\n };\n\n // Signed.\n this.normalizeAndQuantizeSigned = (x, y) => {\n const normalizedX = x / (0.5 * videoElement.clientWidth);\n const normalizedY = y / (0.5 * videoElement.clientHeight);\n return {\n x: normalizedX * 32767,\n y: normalizedY * 32767,\n };\n };\n }\n }\n\n private sendInputData(data: ArrayBuffer) {\n this.commandsSender.sendInputData(data);\n }\n\n private registerInputs(video: HTMLVideoElement) {\n merge(\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(distinctUntilChanged(), filter(Truthy)),\n fromEvent(window, 'blur'),\n )\n .pipe(\n filter(() => !!video),\n takeUntil(this.deactivatedVideoTrigger$),\n )\n .subscribe(() => this.releaseMouseButtons(255, 0, 0));\n\n this.registerMouseEnterAndLeaveEvents(video);\n this.registerHoveringMouseEvents(video);\n this.registerKeyboardEvents(this.availableKeys);\n\n if (InputOptions.fakeMouseWithTouches) {\n new TouchEmulator(this);\n } else {\n this.registerTouchEvents(video);\n }\n }\n\n private getTouchPositionWithOffset({ clientX, clientY }: Touch) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (clientX - offsetByX - this.videoBoundingRect.left) * scaleX,\n y: (clientY - offsetByY - this.videoBoundingRect.top) * scaleY,\n };\n }\n\n private getMousePositionWithOffset({ offsetX, offsetY }: MouseEvent) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (offsetX - offsetByX) * scaleX,\n y: (offsetY - offsetByY) * scaleY,\n };\n }\n\n private registerTouchEvents(htmlVideoElement: HTMLVideoElement) {\n // We need to assign a unique identifier to each finger.\n // We do this by mapping each Touch object to the identifier.\n\n const rememberTouch = (touch: Touch) => {\n const finger = this.fingers.pop();\n if (finger === undefined) {\n Logger.info('exhausted touch identifiers');\n return;\n }\n this.fingerIds.set(touch.identifier, finger);\n };\n\n const forgetTouch = (touch: Touch) => {\n this.fingers.push(this.fingerIds.get(touch.identifier));\n // Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop\n this.fingers.sort(function (a, b) {\n return b - a;\n });\n this.fingerIds.delete(touch.identifier);\n };\n\n const emitTouchData = (type: EMessageTypeValues, touches: TouchList) => {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n let byte = 2;\n const numTouches = 1; // the number of touches to be sent this message\n const touch = touches[t];\n const { x, y } = this.getTouchPositionWithOffset(touch);\n Logger.info(`F${this.fingerIds.get(touch.identifier)}=(${x}, ${y})`);\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const data = new DataView(new ArrayBuffer(9));\n\n data.setUint8(0, type);\n data.setUint8(1, numTouches);\n data.setUint16(byte, coord.x, true);\n byte += 2;\n data.setUint16(byte, coord.y, true);\n byte += 2;\n data.setUint8(byte, this.fingerIds.get(touch.identifier));\n byte += 1;\n // force is between 0.0 and 1.0, so quantize into byte.\n // iOs bug: Forced to be always 0.5 on all devices as we do not use forced touch any way;/\n data.setUint8(byte, this.maxByteValue * 0.5);\n byte += 1;\n data.setUint8(byte, coord.inRange ? 1 : 0);\n byte += 1;\n this.sendInputData(data.buffer);\n }\n };\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchstart')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n this.focusWindow();\n const touches: TouchList = e.changedTouches;\n // Assign a unique identifier to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n rememberTouch(touches[t]);\n }\n Logger.info('touch start');\n emitTouchData(EMessageType.TouchStart, touches);\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchend')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.changedTouches;\n Logger.info('touch end');\n\n emitTouchData(EMessageType.TouchEnd, touches);\n\n // Re-cycle unique identifiers previously assigned to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n forgetTouch(touches[t]);\n }\n\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchmove')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n emitTouchData(EMessageType.TouchMove, e.touches);\n e.preventDefault();\n });\n }\n\n focusWindow() {\n window.focus();\n }\n\n emitMouseMove(x: number, y: number, deltaX: number, deltaY: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const delta = this.normalizeAndQuantizeSigned(deltaX, deltaY);\n const Data = new DataView(new ArrayBuffer(9));\n\n Data.setUint8(0, EMessageType.MouseMove);\n Data.setUint16(1, coord.x, true);\n Data.setUint16(3, coord.y, true);\n Data.setInt16(5, delta.x, true);\n Data.setInt16(7, delta.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseDown(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseDown);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseUp(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseUp);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseWheel(delta: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(7));\n Data.setUint8(0, EMessageType.MouseWheel);\n Data.setInt16(1, delta, true);\n Data.setUint16(3, coord.x, true);\n Data.setUint16(5, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n private releaseMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseUp(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseUp(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseUp(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseUp(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseUp(MouseButton.FifthButton, x, y);\n }\n }\n\n // If the user has any mouse buttons pressed then press them again.\n private pressMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseDown(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseDown(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseDown(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseDown(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseDown(MouseButton.FifthButton, x, y);\n }\n }\n\n private registerHoveringMouseEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmousemove = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseMove(x, y, e.movementX, e.movementY);\n e.preventDefault();\n };\n\n htmlVideoElement.onmousedown = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.focusWindow();\n this.emitMouseDown(e.button, x, y);\n e.preventDefault();\n };\n\n htmlVideoElement.onmouseup = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseUp(e.button, x, y);\n e.preventDefault();\n };\n\n // When the context menu is shown, then it is safest to release the button\n // pressed when the event happened. This will guarantee we will\n // get at least one mouse up corresponding to a mouse down event. Otherwise,\n // the mouse can get stuck.\n // https://github.com/facebook/react/issues/5531\n // playerElement.oncontextmenu = (e) => {\n // e.preventDefault();\n // this.emitMouseUp(e.button, e.offsetX, e.offsetY);\n // };\n\n fromEvent<WheelEvent>(htmlVideoElement, 'wheel')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e: WheelEvent) => {\n this.emitMouseWheel(e.deltaY * -120, e.offsetX, e.offsetY);\n e.preventDefault();\n });\n\n (htmlVideoElement as Clickable).pressMouseButtons = (e: MouseEvent) => {\n this.pressMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n\n (htmlVideoElement as Clickable).releaseMouseButtons = (e: MouseEvent) => {\n this.releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n }\n\n private registerMouseEnterAndLeaveEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmouseenter = (e) => {\n this.focusWindow();\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseEnter);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).pressMouseButtons(e);\n };\n\n htmlVideoElement.onmouseleave = (e) => {\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseLeave);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).releaseMouseButtons(e);\n };\n }\n\n // Browser keys do not have a charCode so we only need to test keyCode.\n private isKeyCodeBrowserKey(keyCode: number): boolean {\n // Function keys or tab key.\n return (keyCode >= 112 && keyCode <= 123) || keyCode === 9;\n }\n\n private getKeyCode(e: KeyboardEvent): number {\n if (e.keyCode === SpecialKeyCodes.Shift && e.code === 'ShiftRight')\n return SpecialKeyCodes.RightShift;\n else if (e.keyCode === SpecialKeyCodes.Control && e.code === 'ControlRight')\n return SpecialKeyCodes.RightControl;\n else if (e.keyCode === SpecialKeyCodes.Alt && e.code === 'AltRight')\n return SpecialKeyCodes.RightAlt;\n else return e.keyCode;\n }\n\n private registerKeyboardEvents(availableKeys: IKeyCode[]) {\n const availableKeyNames = Object.entries(availableKeys).map(([, value]) => {\n return InvertedKeyMap[value];\n });\n\n const keyBlock = (event: KeyboardEvent) => {\n const code: IKeyName = event.code as IKeyName;\n const isInputFieldFocused =\n (event.target as HTMLElement)?.localName === 'input';\n const keyMatch = availableKeyNames.includes(code);\n\n if (this.isDevMode && !keyMatch) {\n Logger.warn(\n 'Code=>',\n code,\n 'Keyboard event is not filtered in DEV Mode. App may behave inappropriately!',\n );\n return isInputFieldFocused;\n }\n\n return isInputFieldFocused || !keyMatch;\n };\n this.startListenKeys(keyBlock);\n }\n\n private startListenKeys(_filter?: (event: KeyboardEvent) => boolean) {\n const filter = _filter ?? (() => false);\n\n document.onkeydown = (e) => {\n if (filter(e)) {\n return;\n }\n\n const isCtrlOrCommand = e.ctrlKey || e.metaKey;\n\n const isPlusOrMinus =\n e.keyCode === KeyboardNumericCode.Equal ||\n e.keyCode === KeyboardNumericCode.Minus;\n if (isCtrlOrCommand && isPlusOrMinus) {\n return;\n }\n\n this.sendInputData(\n new Uint8Array([\n EMessageType.KeyDown,\n this.getKeyCode(e),\n Number(e.repeat),\n ]).buffer,\n );\n // Backspace is not considered a keypress in JavaScript, but we need it\n // to be so characters may be deleted in a UE4 text entry field.\n if (e.keyCode === SpecialKeyCodes.BackSpace) {\n (document as DocumentClickable).onkeypress({\n charCode: SpecialKeyCodes.BackSpace,\n });\n //document.dispatchEvent(new KeyboardEvent('keydown',{key: name, keyCode: SpecialKeyCodes.BackSpace, code: SpecialKeyCodes.BackSpace, repeat: false} ));\n }\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeyup = (e) => {\n if (filter(e)) {\n return;\n }\n this.sendInputData(\n new Uint8Array([EMessageType.KeyUp, this.getKeyCode(e)]).buffer,\n );\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeypress = (e) => {\n if (filter(e)) {\n return;\n }\n const data = new DataView(new ArrayBuffer(3));\n data.setUint8(0, EMessageType.KeyPress);\n data.setUint16(1, e.charCode, true);\n this.sendInputData(data.buffer);\n };\n }\n}\n\ninterface OffsetParams {\n scaleX: number;\n scaleY: number;\n scaledHeight: number;\n scaledWidth: number;\n offsetByY: number;\n offsetByX: number;\n}\n\ntype Clickable = HTMLVideoElement & {\n releaseMouseButtons: (e: MouseEvent) => void;\n pressMouseButtons: (e: MouseEvent) => void;\n};\n\ntype DocumentClickable = Document & {\n onkeypress: (data: unknown) => void;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Semaphore, tapLog } from '@3dsource/utils';\nimport { UNREAL_CONFIG } from '../constants';\n\n@Injectable()\nexport class RegionsPingService {\n private httpClient = inject(HttpClient);\n private unrealInitialConfig = inject(UNREAL_CONFIG, { optional: true });\n public config = {\n ping_count: 2,\n ping_timeout: 2000,\n max_parallel_requests: 10,\n bust_cache: true,\n };\n\n constructor() {\n if (!this.unrealInitialConfig?.regionsPingUrl) {\n return;\n }\n }\n\n public getFastest(\n regionListUrl = this.unrealInitialConfig?.regionsPingUrl || '',\n ): Observable<string | undefined> {\n return this.getProviders(regionListUrl).pipe(\n switchMap((providers: ProvidersData) => this.getPingResult(providers)),\n catchError(() => of(null)),\n tapLog('PingResult'),\n map((data) => data?.region_code),\n );\n }\n\n public getPingResult(\n providers: ProvidersData,\n ): Observable<PingResult | null> {\n const regions = providers.regions;\n this.config.ping_timeout = providers.timeout || this.config.ping_timeout;\n return from(this.startPinging(regions));\n }\n\n public getProviders(\n regionList = this.unrealInitialConfig?.regionsPingUrl || '',\n ) {\n return this.httpClient.get<ProvidersData>(regionList);\n }\n\n private startPinging(endpoints: Region[]): Promise<PingResult | null> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const pingResults: PingResult[] = [];\n const semaphore = new Semaphore(10);\n const tasks = endpoints.map(async ({ region_code, url, timeout }) => {\n await semaphore.acquire();\n try {\n const result = await this.checkLatency(url, timeout);\n const data = { region_code, result };\n pingResults.push({ region_code, result });\n resolve(data);\n } catch {\n pingResults.push({ region_code: undefined, result: [] });\n } finally {\n semaphore.release();\n }\n const okValues = pingResults.filter(\n (pingResult) => pingResult.result.length > 1,\n );\n if (okValues.length) {\n return okValues[0];\n }\n return okValues;\n });\n await Promise.all(tasks);\n resolve(null);\n });\n }\n\n private async checkLatency(\n endpoint: string,\n timeout: number = this.config.ping_timeout,\n ) {\n const pingResults = [];\n\n for (let i = 0; i < this.config.ping_count; i++) {\n const startTime = performance.now();\n try {\n await this.fetchWithTimeout(\n this.config.bust_cache\n ? `${endpoint}?&cache_buster=${performance.now()}`\n : endpoint,\n {\n method: 'GET',\n mode: 'no-cors',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n Pragma: 'no-cache',\n Expires: '0',\n },\n credentials: 'omit', // Optional: prevents sending or receiving cookies, which can affect caching.\n },\n timeout,\n );\n } catch {\n //Do not remove this block, else finally will not work!\n } finally {\n const latency = Math.round(performance.now() - startTime);\n pingResults.push(latency);\n }\n }\n return pingResults;\n }\n\n private async fetchWithTimeout(\n url: string,\n options: any = {},\n timeout: number,\n ) {\n const controller = new AbortController();\n options.signal = controller.signal;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\ninterface ProvidersData {\n timeout?: number;\n regions: Region[];\n}\n\ninterface Region {\n region_code: string;\n url: string;\n timeout?: number;\n}\n\ninterface PingResult {\n region_code: string | undefined;\n result: number[];\n}\n","import { Store } from '@ngrx/store';\nimport { inject, Injectable } from '@angular/core';\nimport { auditTime } from 'rxjs';\nimport { filter, map, withLatestFrom } from 'rxjs/operators';\nimport { trackMixpanelEvent, unrealFeature } from '../store';\nimport type {\n AwsInstance,\n IAggregatedStat,\n InboundVideoStats,\n LBMStats,\n} from '../interfaces';\nimport { VideoService } from './video.service';\n\n@Injectable()\nexport class StreamStatusTelemetryService {\n #store = inject(Store);\n #videoService = inject(VideoService);\n\n constructor() {\n this.init();\n }\n\n protected init() {\n this.#videoService.videoStats$\n .pipe(\n withLatestFrom(\n this.#store.select(unrealFeature.selectAwsInstance),\n this.#store.select(unrealFeature.selectLowBandwidth),\n this.#store.select(unrealFeature.selectLowBandwidthStats),\n this.#store.select(unrealFeature.selectCirrusConnected),\n ),\n auditTime(5000),\n filter(([, , , , cirrusConnected]) => cirrusConnected),\n map(([data, signalingServer, isLowBandwidth, lbmStats]) =>\n this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats),\n ),\n )\n .subscribe((data) => this.trackEventToMixPanel(data));\n }\n\n private mapEventData(\n data: IAggregatedStat,\n signalingServer: AwsInstance,\n isLowBandwidth: boolean,\n lbmStats: LBMStats | undefined,\n ) {\n const {\n bitrate,\n VideoEncoderQP,\n framesPerSecond,\n frameWidth,\n frameHeight,\n jitter,\n packetsLost,\n currentRoundTripTime,\n } = data.aggregatedStats;\n\n return {\n runTime: data.aggregatedStats.runTime,\n frameWidth,\n frameHeight,\n isLowBandwidth,\n client: signalingServer.wsUrl,\n pixelRatio: window.devicePixelRatio,\n framesPerSecond,\n jitter,\n packetsLost,\n instanceName: signalingServer.instanceName,\n bitrate,\n lbmStats,\n rtt: currentRoundTripTime,\n VideoEncoderQP,\n };\n }\n\n private trackEventToMixPanel(data: Partial<InboundVideoStats>) {\n this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AFKService } from '../afk.service';\n\n@Injectable()\nexport class AfkPlaywrightService extends AFKService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SignallingService } from '../index';\nimport { EMPTY } from 'rxjs';\nimport { dataChannelConnected, setUnrealPlaywrightConfig } from '../../store';\n\n@Injectable()\nexport class SignallingPlaywrightService extends SignallingService {\n constructor() {\n super();\n }\n\n override init() {\n return;\n }\n\n override connectToSignaling() {\n this.store.dispatch(setUnrealPlaywrightConfig());\n this.store.dispatch(\n dataChannelConnected({\n statusMessage: 'Playwright set data channel connected',\n }),\n );\n return EMPTY;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { UnrealCommunicatorService } from '../unreal-communicator.service';\n\n@Injectable()\nexport class UnrealCommunicatorPlaywrightService extends UnrealCommunicatorService {\n override init() {\n return;\n }\n\n override sendCommandToUnreal() {\n return;\n }\n\n override sendInputData() {\n return;\n }\n\n override listenVideo() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AggregatorService } from '../aggregator.service';\n\n@Injectable()\nexport class AggregatorPlaywrightService extends AggregatorService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FreezeFrameService } from '../freeze-frame.service';\n\n@Injectable()\nexport class FreezeFramePlaywrightService extends FreezeFrameService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CommandTelemetryService } from '../command-telemetry.service';\n\n@Injectable()\nexport class CommandTelemetryPlaywrightService extends CommandTelemetryService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { StreamStatusTelemetryService } from '../stream-status-telemetry.service';\n\n@Injectable()\nexport class StreamStatusTelemetryPlaywrightService extends StreamStatusTelemetryService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ConsoleExtensionsService } from '../console-extensions.service';\n\n@Injectable()\nexport class ConsoleExtensionsPlaywrightService extends ConsoleExtensionsService {\n override init() {\n return;\n }\n}\n","import { FileReceiverService } from '../file-receiver.service';\n\nexport class FileReceiverPlaywrightService extends FileReceiverService {\n override init() {\n return;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { InputService } from '../index';\n\n@Injectable()\nexport class InputPlaywrightService extends InputService {\n override init() {\n return;\n }\n}\n","/*\n * Copyright (c) 2025.\n * 3DSource.com. Sergii Karanda steve@3dsource.com. All Rights Reserved.\n */\n\nexport const ReceivedMimeTypes = {\n ApplicationJson: 'application/json',\n} as const;\nexport type ReceivedMimeType =\n (typeof ReceivedMimeTypes)[keyof typeof ReceivedMimeTypes];\n","import { inject, Injectable } from '@angular/core';\nimport type { ReceivedFile } from './file-receiver.service';\nimport { FileReceiverService } from './file-receiver.service';\nimport { generateUuid, Logger, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap, take, timeout } from 'rxjs';\nimport type { ObservedCallbackResponse } from '../helpers';\nimport { catchError, filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@3dsource/types-unreal';\nimport type { ReceivedMimeType } from '../interfaces/ReceivedMimeTypes';\nimport { ReceivedMimeTypes } from '../interfaces/ReceivedMimeTypes';\n\ntype FileHandlers = Record<\n ReceivedMimeType,\n (data: ReceivedFile, correlationId: string) => Observable<unknown>\n>;\n\n@Injectable()\nexport class FileHandlerService {\n private fileService = inject(FileReceiverService);\n private fileHandlers: FileHandlers = {\n [ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),\n };\n\n private handleJsonFile(data: ReceivedFile, correlationId: string) {\n const { blob } = data;\n return from(blob.text()).pipe(\n map((text: string) => JSON.parse(text)),\n filter(({ commandCallback }) => {\n return commandCallback.correlationId === correlationId;\n }),\n );\n }\n\n observeFileResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n >(\n mimetype: ReceivedMimeType,\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n ): Observable<{ commandCallback: ObservedCallbackResponse<T> } | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = this.fileService.fileComplete$.pipe(\n switchMap((data) => {\n const { valid } = data;\n if (valid && this.fileHandlers[mimetype]) {\n return this.fileHandlers[mimetype](data, correlationId).pipe(\n filter(Truthy),\n );\n }\n return of(null);\n }),\n timeout(timeOut),\n catchError((e) => {\n Logger.error(e);\n return of(null);\n }),\n take(1),\n );\n setTimeout(() => sender(out), 0);\n return observable as never;\n }\n}\n","import type { Observable } from 'rxjs';\nimport {\n filter,\n fromEvent,\n map,\n merge,\n Subject,\n takeUntil,\n throttleTime,\n} from 'rxjs';\nimport { inject, Injectable } from '@angular/core';\nimport { distinctUntilChanged, tap } from 'rxjs/operators';\nimport { saveAnalyticsEvent, unrealFeature } from '../store';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, Truthy } from '@3dsource/utils';\n\n@Injectable()\nexport class AnalyticsService {\n #store = inject(Store);\n #destroy$ = new Subject<void>();\n\n sendEventToMixPanel(\n name: string,\n params: Record<string, unknown> = {},\n ): void {\n Logger.log('Analytics Event:', name, params);\n this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));\n }\n\n constructor() {\n const abortSignal$ = this.#store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n filter(Falsy),\n map(() => void 0),\n );\n this.#store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n tap(() => this.monitorMouse(abortSignal$)),\n )\n .subscribe();\n }\n\n private monitorMouse(abortSignal$: Observable<void>) {\n this.#destroy$.next();\n const stop$ = merge(this.#destroy$.asObservable(), abortSignal$);\n const element = document.getElementById('streamingVideo');\n\n if (!element) {\n return;\n }\n\n // Monitor mousewheel events\n const mousewheel$ = fromEvent<WheelEvent>(element, 'wheel').pipe(\n takeUntil(stop$),\n throttleTime(1000),\n );\n\n // Monitor mouse button states\n const mousedown$ = fromEvent<MouseEvent>(element, 'mousedown').pipe(\n takeUntil(stop$),\n );\n const touchStart$ = fromEvent<TouchEvent>(element, 'touchstart').pipe(\n takeUntil(stop$),\n );\n const touchMove$ = fromEvent<TouchEvent>(element, 'touchmove').pipe(\n takeUntil(stop$),\n throttleTime(200),\n );\n\n // Track mouse movement while the left or right button is pressed\n mousedown$\n .pipe(\n filter((event) => event.button === 0 || event.button === 2),\n tap((downEvent) => {\n const { offsetX, offsetY } = this.getOffset(downEvent, element);\n this.sendEventToMixPanel('mouse_interaction', {\n viewX: offsetX / element.clientWidth,\n viewY: offsetY / element.clientHeight,\n action: downEvent.button === 0 ? 'spinning' : 'panning',\n });\n }),\n )\n .subscribe();\n\n // Track mouse movement while the left or right button is pressed\n touchStart$\n .pipe(\n tap((downEvent) => {\n const totalTouches = downEvent.touches.length;\n const touch = downEvent.touches[0];\n const { offsetX, offsetY } = this.getOffset(touch, element);\n this.sendEventToMixPanel('touch_interaction', {\n viewX: offsetX / element.clientWidth,\n viewY: offsetY / element.clientHeight,\n action: totalTouches === 1 ? 'spinning' : 'panning',\n });\n }),\n )\n .subscribe();\n\n let initialTouchDistance = 0;\n // Subscribe to mousewheel events\n touchMove$.subscribe((event: TouchEvent) => {\n const totalTouches = event.touches.length;\n if (totalTouches < 2) {\n return;\n }\n\n // Calculate the current distance between two touches\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n const offset1 = this.getOffset(touch1, element);\n const offset2 = this.getOffset(touch2, element);\n const currentDistance = Math.sqrt(\n Math.pow(offset2.offsetX - offset1.offsetX, 2) +\n Math.pow(offset2.offsetY - offset1.offsetY, 2),\n );\n\n // Determine if zooming in or out based on distance change\n const deltaDistance = currentDistance - initialTouchDistance;\n const isZoomingIn = deltaDistance > 0;\n\n // Only send event if there's a significant change (avoid noise)\n if (Math.abs(deltaDistance) > 10) {\n this.sendEventToMixPanel('touch_zoom_interaction', {\n delta: isZoomingIn ? 1 : -1,\n action: isZoomingIn ? 'zoomin' : 'zoomout',\n });\n\n // Update initial distance for next comparison\n initialTouchDistance = currentDistance;\n }\n });\n\n mousewheel$.subscribe((event: WheelEvent) => {\n this.sendEventToMixPanel('mouse_zoom_interaction', {\n delta: -(event.deltaY / Math.abs(event.deltaY)),\n action: event.deltaY < 0 ? 'zoomin' : 'zoomout',\n });\n });\n }\n\n private getOffset(event: MouseEvent | Touch, element: HTMLElement) {\n const rect = element.getBoundingClientRect(); // in viewport coords\n const offsetX = event.clientX - rect.left; // relative to element\n const offsetY = event.clientY - rect.top;\n\n return { offsetX, offsetY };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { filter, withLatestFrom } from 'rxjs/operators';\nimport { clampf, Logger } from '@3dsource/utils';\nimport { VideoService } from './video.service';\nimport { setMaxFps, unrealFeature } from '../store';\nimport type { IAggregatedStat } from '../interfaces';\nimport { mapQpToQuality } from '../helpers';\n\ntype Decision = 'decrease' | 'hold' | 'increase';\n\n/**\n * Adaptive FPS controller that monitors the incoming WebRTC video stream\n * quality and dynamically adjusts Unreal Engine's `t.MaxFPS` console variable.\n *\n * ## How it works\n *\n * The service subscribes to `VideoService.videoStats$` (emitted every 250 ms)\n * and collects samples of FPS, bitrate, and QP (Quantisation Parameter).\n * Every {@link SAMPLE_WINDOW} ticks (~2 s) it averages the collected samples\n * and feeds them into a set of **fuzzy-logic membership functions** that\n * classify each metric into overlapping quality bands.\n *\n * ### Input signals\n *\n * **1. FPS ratio** = `actualFPS / currentTargetFPS` (0..1+)\n *\n * | Band | Range | Meaning |\n * |--------|---------------------|-----------------------------------------------|\n * | low | ratio < 0.7 → 1.0, linear ramp 0.7..0.9 → 0 | Stream cannot keep up with the target |\n * | ok | triangle 0.8..1.0, peak at 0.95 | Stream roughly matches the target |\n * | high | ratio 0.9..1.0 → ramp, >1.0 → 1.0 | Stream meets or exceeds the target |\n *\n * **2. Bitrate load** = `currentBitrate / MAX_BITRATE` (0..1+)\n *\n * `MAX_BITRATE` = 20 Mbit/s — the reference ceiling for the encoder.\n *\n * | Band | Range | Meaning |\n * |--------|-------------------------------------------------|-----------------------------------------------|\n * | high | load 0.5..0.8 → ramp, >0.8 → 1.0 | Encoder is using most of the available bandwidth |\n * | not high | load < 0.5 → 0.0 | Bandwidth headroom is available |\n *\n * **3. Quality** — mapped from QP via `mapQpToQuality()` (see {@link Quality}):\n *\n * | Quality | QP range | Meaning |\n * |----------|-----------|-------------------------------------------------|\n * | `lime` | QP <= 26 | Good — encoder has enough headroom |\n * | `orange` | QP 27..35 | Fair — encoder is under moderate pressure |\n * | `red` | QP > 35 | Poor — heavy compression, visible artefacts |\n *\n * ### Decision rules (evaluated in priority order, first match wins)\n *\n * | # | Condition | Decision |\n * |---|------------------------------------------------------------|--------------|\n * | 1 | FPS ratio is **low** (membership > 0.5) | **decrease** |\n * | 2 | FPS ratio is **ok** AND quality is `red` | **decrease** |\n * | 3 | FPS ratio is **ok** AND bitrate **high** AND quality is `orange` | **hold** |\n * | 4 | FPS ratio is **high** AND quality is `lime` AND bitrate **not high** | **increase** |\n * | — | Everything else | **hold** |\n *\n * ## Cooldown-based throttling\n *\n * The service continuously evaluates fuzzy rules every sample window.\n * After each FPS step change it enforces a cooldown before the next\n * change can be applied. The cooldown duration depends on the\n * (previous decision → next decision) pair:\n *\n * | Previous | Next | Cooldown |\n * |-----------|-----------|-----------------------------------------------------|\n * | decrease | decrease | {@link COOLDOWN_DECREASE_AFTER_DECREASE_MS} (2 s) |\n * | decrease | increase | {@link COOLDOWN_INCREASE_AFTER_DECREASE_MS} (10 s) |\n * | increase | decrease | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |\n * | increase | increase | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |\n *\n * This means the system reacts quickly after an increase (2 s in any\n * direction) but is cautious about stepping back up after a decrease\n * (10 s), while still allowing consecutive decreases at 2 s intervals.\n *\n * ## FPS dispatch\n *\n * FPS changes are dispatched via the NgRx `setMaxFps` action, which triggers\n * the existing `UnrealEffects.setMaxFps$` effect that sends the\n * `t.MaxFPS <value>` console command to Unreal Engine.\n */\n@Injectable()\nexport class FpsMonitorService {\n private videoService = inject(VideoService);\n private store = inject(Store);\n\n /** Discrete FPS targets the controller can switch between (ascending order). */\n private readonly FPS_STEPS = [30, 40, 50, 60] as const;\n\n /** Reference ceiling for bitrate (bits/sec) used to normalise bitrate load to 0..1. */\n private readonly MAX_BITRATE = 20_000_000;\n\n /**\n * Cooldown (ms) for any decision (increase or decrease) following an increase.\n * After an increase the system should react faster.\n */\n private readonly COOLDOWN_AFTER_INCREASE_MS = 2_000;\n\n /**\n * Cooldown (ms) for a decrease following a previous decrease.\n */\n private readonly COOLDOWN_DECREASE_AFTER_DECREASE_MS = 2_000;\n\n /**\n * Cooldown (ms) for an increase following a previous decrease.\n * The stream needs more time to stabilise before stepping back up.\n */\n private readonly COOLDOWN_INCREASE_AFTER_DECREASE_MS = 10_000;\n\n /**\n * Number of videoStats$ ticks to accumulate before evaluating.\n * At 250 ms per tick this gives a ~2 s sliding evaluation window,\n * long enough to smooth out single-frame jitter.\n */\n private readonly SAMPLE_WINDOW = 8;\n\n /** Current FPS target; starts at max (60 FPS) and adapts downward/upward. */\n private currentFpsTarget: number = this.FPS_STEPS[this.FPS_STEPS.length - 1];\n private samples: { fps: number; bitrate: number; qp: number }[] = [];\n private lastDecisionTime = Date.now();\n private lastUpgrade: Decision = 'hold';\n\n constructor() {\n this.init();\n }\n\n protected init() {\n this.videoService.videoStats$\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(([stats]) => this.processTick(stats));\n }\n\n /**\n * Called on every videoStats$ emission (~250 ms).\n * Accumulates samples and evaluates once per SAMPLE_WINDOW.\n */\n private processTick(stats: IAggregatedStat) {\n const { framesPerSecond, bitrate, VideoEncoderQP } = stats.aggregatedStats;\n\n this.samples.push({\n fps: framesPerSecond ?? 0,\n bitrate: bitrate ?? 0,\n qp: VideoEncoderQP ?? 0,\n });\n\n // Wait until we have enough samples for a reliable average.\n if (this.samples.length < this.SAMPLE_WINDOW) {\n return;\n }\n\n const avg = this.averageSamples();\n this.samples = [];\n\n this.handleMonitoring(avg, this.currentFpsTarget);\n }\n\n private handleMonitoring(\n avg: { fps: number; bitrate: number; qp: number },\n currentTarget: number,\n ) {\n const decision = this.evaluateDecision(avg, currentTarget);\n this.upgradeFps(decision, avg.qp);\n }\n\n /**\n * Combines fuzzy membership values into a single discrete decision.\n * Rules are evaluated in priority order — first match wins.\n *\n * Inputs:\n * - `fpsRatio` = avgFPS / currentTargetFPS (e.g. 45/60 = 0.75)\n * - `bitrateLoad` = avgBitrate / 20 Mbit/s (e.g. 12M/20M = 0.6)\n * - `quality` = mapQpToQuality(avgQP) → 'lime' | 'orange' | 'red'\n */\n private evaluateDecision(\n avg: { fps: number; bitrate: number; qp: number },\n currentTarget: number,\n ): Decision {\n const fpsRatio = currentTarget > 0 ? avg.fps / currentTarget : 1;\n const bitrateLoad = avg.bitrate / this.MAX_BITRATE;\n\n const fpsLow = this.membershipFpsLow(fpsRatio);\n const fpsOk = this.membershipFpsOk(fpsRatio);\n const fpsHigh = this.membershipFpsHigh(fpsRatio);\n\n const bitrateHigh = this.membershipBitrateHigh(bitrateLoad);\n\n // Quality is derived from QP: lime (QP <= 26), orange (QP 27..35), red (QP > 35).\n const quality = mapQpToQuality(avg.qp);\n\n // Rule 1: FPS clearly below target (ratio roughly < 0.8) → step down immediately.\n if (fpsLow > 0.5) {\n return 'decrease';\n }\n\n // Rule 2: FPS looks acceptable numerically, but encoder quality is 'red'\n // (QP > 35 — heavy compression artefacts). Reducing target FPS frees\n // encoder headroom and improves visual quality.\n if (fpsOk > 0.4 && quality === 'red') {\n return 'decrease';\n }\n\n // Rule 3: FPS is ok, but bitrate is above ~50-80% of 20 Mbit/s ceiling\n // and quality is 'orange' (QP 27..35). Near capacity — don't push higher.\n if (fpsOk > 0.4 && bitrateHigh > 0.5 && quality === 'orange') {\n return 'hold';\n }\n\n // Rule 4: FPS meets/exceeds target (ratio >= ~0.95), quality is 'lime'\n // (QP <= 26), and bitrate is below 50% of ceiling — safe to step up.\n if (\n fpsHigh > 0.5 &&\n quality === 'lime' &&\n bitrateHigh < 0.5 &&\n this.currentFpsTarget < this.FPS_STEPS[this.FPS_STEPS.length - 1]\n ) {\n return 'increase';\n }\n\n return 'hold';\n }\n\n // ---------------------------------------------------------------------------\n // Fuzzy membership functions\n //\n // Each function maps a normalised input (0..1+) to a membership degree (0..1).\n // Overlapping trapezoid/triangle shapes let multiple categories be partially\n // active at the same time, which makes the rules less brittle than hard thresholds.\n // ---------------------------------------------------------------------------\n\n /**\n * FPS ratio membership \"low\".\n * Input: ratio = actualFPS / targetFPS (e.g. 42/60 = 0.70).\n *\n * ratio < 0.7 → 1.0 (clearly failing, e.g. 40/60)\n * ratio 0.7..0.9 → linear ramp down (e.g. 0.8 → 0.5)\n * ratio > 0.9 → 0.0 (keeping up)\n */\n private membershipFpsLow(ratio: number): number {\n if (ratio < 0.7) return 1.0;\n if (ratio > 0.9) return 0.0;\n return (0.9 - ratio) / 0.2;\n }\n\n /**\n * FPS ratio membership \"ok\" — triangle shape.\n * Input: ratio = actualFPS / targetFPS.\n *\n * ratio < 0.8 → 0.0\n * ratio 0.8..0.95 → ramp up, peak at 0.95 (e.g. 57/60)\n * ratio 0.95..1.0 → ramp down\n * ratio > 1.0 → 0.0\n */\n private membershipFpsOk(ratio: number): number {\n if (ratio < 0.8) return 0.0;\n if (ratio < 0.95) return (ratio - 0.8) / 0.15;\n if (ratio <= 1.0) return (1.0 - ratio) / 0.05;\n return 0.0;\n }\n\n /**\n * FPS ratio membership \"high\".\n * Input: ratio = actualFPS / targetFPS.\n *\n * ratio < 0.9 → 0.0\n * ratio 0.9..1.0 → linear ramp up (e.g. 0.95 → 0.5)\n * ratio >= 1.0 → 1.0 (meeting or exceeding target, e.g. 60/60)\n */\n private membershipFpsHigh(ratio: number): number {\n if (ratio < 0.9) return 0.0;\n if (ratio > 1.0) return 1.0;\n return (ratio - 0.9) / 0.1;\n }\n\n /**\n * Bitrate load membership \"high\".\n * Input: load = currentBitrate / MAX_BITRATE (20 Mbit/s).\n *\n * load < 0.5 → 0.0 (below 10 Mbit/s — plenty of headroom)\n * load 0.5..0.8 → linear ramp (e.g. 13M/20M = 0.65 → 0.5)\n * load > 0.8 → 1.0 (above 16 Mbit/s — near capacity)\n */\n private membershipBitrateHigh(load: number): number {\n if (load < 0.5) return 0.0;\n if (load > 0.8) return 1.0;\n return (load - 0.5) / 0.3;\n }\n\n // ---------------------------------------------------------------------------\n // Step actions\n // ---------------------------------------------------------------------------\n\n private upgradeFps(decision: Decision, qp: number) {\n if (decision === 'hold') return;\n\n const now = Date.now();\n\n // Throttle: cooldown depends on (previous decision → current decision) pair.\n const isStepUp = decision === 'increase';\n const cooldown =\n this.lastUpgrade === 'decrease'\n ? isStepUp\n ? this.COOLDOWN_INCREASE_AFTER_DECREASE_MS\n : this.COOLDOWN_DECREASE_AFTER_DECREASE_MS\n : this.COOLDOWN_AFTER_INCREASE_MS;\n\n if (now - this.lastDecisionTime < cooldown) {\n return;\n }\n\n this.lastUpgrade = decision;\n\n const quality = mapQpToQuality(qp);\n const newTarget = this.getNextFpsTarget(this.currentFpsTarget, decision);\n\n Logger.info(\n `[FpsMonitor] Decision: ${decision} → FPS: ${newTarget}, Quality: ${quality}`,\n );\n\n if (newTarget !== this.currentFpsTarget) {\n this.currentFpsTarget = newTarget;\n this.store.dispatch(setMaxFps({ maxFps: newTarget }));\n }\n\n this.lastDecisionTime = now;\n this.samples = [];\n }\n\n /**\n * Get the next FPS target based on current target and decision.\n * Clamps to valid FPS_STEPS range.\n */\n private getNextFpsTarget(currentTarget: number, decision: Decision): number {\n const currentIndex = this.FPS_STEPS.indexOf(\n currentTarget as (typeof this.FPS_STEPS)[number],\n );\n\n // If current target is not in FPS_STEPS, find closest one\n const validIndex =\n currentIndex === -1\n ? this.findClosestFpsIndex(currentTarget)\n : currentIndex;\n\n const delta = decision === 'increase' ? 1 : -1;\n const newIndex = clampf(0, this.FPS_STEPS.length - 1, validIndex + delta);\n\n return this.FPS_STEPS[newIndex];\n }\n\n /**\n * Find the closest FPS step index for a given target value.\n */\n private findClosestFpsIndex(target: number): number {\n let closestIndex = 0;\n let closestDiff = Math.abs(this.FPS_STEPS[0] - target);\n\n for (let i = 1; i < this.FPS_STEPS.length; i++) {\n const diff = Math.abs(this.FPS_STEPS[i] - target);\n if (diff < closestDiff) {\n closestDiff = diff;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n /** Average all collected samples for the current evaluation window. */\n private averageSamples(): { fps: number; bitrate: number; qp: number } {\n const len = this.samples.length;\n if (len === 0) return { fps: 0, bitrate: 0, qp: 0 };\n\n let fps = 0;\n let bitrate = 0;\n let qp = 0;\n\n for (const s of this.samples) {\n fps += s.fps;\n bitrate += s.bitrate;\n qp += s.qp;\n }\n\n return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-unreal-error-modal',\n templateUrl: './unreal-error-modal.component.html',\n styleUrl: './unreal-error-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class UnrealErrorModalComponent {\n dialogRef = inject(DialogRef);\n dialogData = inject<{ content: string }>(DIALOG_DATA);\n\n close() {\n this.dialogRef.close();\n }\n}\n","<div class=\"src-modal src-modal--small\">\n <div class=\"src-modal__header\">\n <div\n [attr.data-testid]=\"'unreal-error-header-title'\"\n class=\"src-modal__title\"\n >\n Warning\n </div>\n </div>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button (onClick)=\"close()\"> Ok </src-button>\n </div>\n</div>\n","import { concatLatestFrom } from '@ngrx/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport {\n debounceTime,\n EMPTY,\n fromEvent,\n map,\n merge,\n mergeMap,\n of,\n switchMap,\n take,\n timeout,\n timer,\n} from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport {\n abortEstablishingConnection,\n changeLowBandwidth,\n changeStreamResolutionAction,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n dataChannelConnected,\n dataChannelReady,\n destroyRemoteConnections,\n destroyUnrealScene,\n disconnectStream,\n dropConnection,\n initSignalling,\n reconnectPeer,\n reconnectPeerFailed,\n reconnectPeerSuccess,\n resetAfkAction,\n resetConfig,\n resetDataChannelForReconnect,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusDisconnected,\n setConfig,\n setFreezeFrame,\n setLoopBackCommandIsCompleted,\n setMaxFps,\n setOrchestrationParameters,\n setOrchestrationProgress,\n setStatusPercentSignallingServer,\n setViewportNotReady,\n setViewportReady,\n showUnrealErrorMessage,\n startStream,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { unrealFeature } from './unreal.feature';\nimport {\n catchError,\n distinctUntilChanged,\n exhaustMap,\n filter,\n takeUntil,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n fromSignal,\n getRtcErrorMessage,\n observeCommandResponse,\n resetAfk,\n} from '../helpers';\nimport {\n CONSOLE_COMMAND_PIXEL_QUALITY,\n DATA_CHANNEL_CONNECTION_TIMEOUT,\n DEFAULT_RECONNECT_DELAY_MS,\n DEFAULT_RECONNECT_ENABLED,\n DEFAULT_RECONNECT_MAX_ATTEMPTS,\n DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE,\n DEFAULT_RECONNECT_ON_ICE_FAILURE,\n MINIMAL_FPS,\n UNREAL_CONFIG,\n} from '../constants';\nimport { selectCommandsInProgress, selectIsAutostart } from '../store';\nimport { WebrtcErrorModalComponent } from '../components';\nimport {\n DevModeService,\n SignallingService,\n TelemetryStart,\n TelemetryStop,\n UnrealCommunicatorService,\n VideoService,\n WebRtcPlayerService,\n} from '../services';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport { ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport type { AwsInstance, WrappedMetaBoxCommandPacket } from '../interfaces';\nimport {\n DisconnectReason,\n UnrealInternalSignalEvents,\n WSCloseCode_FORCE_CIRRUS_CLOSE,\n} from '../interfaces';\nimport type { FLoopBackCommand } from '@3dsource/types-unreal';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\nimport { UnrealErrorModalComponent } from '../components/unreal-error-modal/unreal-error-modal.component';\n\n@Injectable()\nexport class UnrealEffects {\n private actions$ = inject(Actions);\n private dialog = inject(Dialog);\n private http = inject(HttpClient);\n private store = inject(Store);\n private isDevMode = inject(DevModeService).isDevMode;\n private scrollStrategy = inject(ScrollStrategyOptions).block();\n private unrealInitialConfig = inject(UNREAL_CONFIG);\n private webRtcPlayerService = inject(WebRtcPlayerService);\n private commandsSender = inject(UnrealCommunicatorService);\n private signallingService = inject(SignallingService);\n private videoService = inject(VideoService);\n private dataChannelConnectionTimeout =\n this.unrealInitialConfig?.dataChannelConnectionTimeout ??\n DATA_CHANNEL_CONNECTION_TIMEOUT;\n private connectionCompleted$ = this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy));\n\n // ==================== PEER RECONNECTION EFFECTS ====================\n\n private reconnectConfig = {\n enabled:\n this.unrealInitialConfig?.reconnect?.enabled ?? DEFAULT_RECONNECT_ENABLED,\n maxAttempts:\n this.unrealInitialConfig?.reconnect?.maxAttempts ??\n DEFAULT_RECONNECT_MAX_ATTEMPTS,\n delayMs:\n this.unrealInitialConfig?.reconnect?.delayMs ??\n DEFAULT_RECONNECT_DELAY_MS,\n onIceFailure:\n this.unrealInitialConfig?.reconnect?.onIceFailure ??\n DEFAULT_RECONNECT_ON_ICE_FAILURE,\n onDataChannelClose:\n this.unrealInitialConfig?.reconnect?.onDataChannelClose ??\n DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE,\n };\n\n disconnectReasonHandling$ = createEffect(() => {\n const destroyReasons = [\n DisconnectReason.Afk,\n DisconnectReason.DataChannelClosed,\n DisconnectReason.DataChannelTimeout,\n DisconnectReason.WebSocketError,\n DisconnectReason.WebSocketClose,\n DisconnectReason.WebRTCError,\n DisconnectReason.DropConnection,\n DisconnectReason.IceConnectionFailed,\n DisconnectReason.ReconnectFailed,\n ];\n return this.actions$.pipe(\n ofType(disconnectStream),\n filter(({ reason }) => {\n // Skip DataChannelClosed if peer reconnection is enabled and signaling is connected\n // The peer reconnection effect will handle this case\n if (\n reason === DisconnectReason.DataChannelClosed &&\n this.reconnectConfig.enabled &&\n this.reconnectConfig.onDataChannelClose &&\n this.signallingService.isConnected()\n ) {\n Logger.info(\n '[Reconnect] Skipping destroy for DataChannelClosed - peer reconnection will handle',\n );\n return false;\n }\n return destroyReasons.some((r) => r === reason);\n }),\n tap(({ reason, message }) => {\n Logger.log(\n `Disconnect Call=> reason:'${reason}', message:'${message}'`,\n );\n }),\n map(({ reason }) => destroyRemoteConnections({ reason })),\n );\n });\n destroyConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyUnrealScene),\n tap(() => {\n this.commandsSender.destroy();\n this.videoService.setContainer(null);\n }),\n map(() => destroyRemoteConnections({ reason: DisconnectReason.Destroy })),\n );\n });\n destroyRemoteConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n tap(({ reason }) => {\n this.signallingService.close({\n code: WSCloseCode_FORCE_CIRRUS_CLOSE,\n reason,\n });\n this.webRtcPlayerService.closePC();\n }),\n filter(({ reason }) => reason === DisconnectReason.DropConnection),\n map(() => dropConnection()),\n );\n });\n webrtcErrorModalComponent$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(disconnectStream),\n filter(({ reason }) => reason === DisconnectReason.WebRTCError),\n debounceTime(400),\n switchMap(() =>\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(take(1), filter(Falsy)),\n ),\n tap(() => this.dialog.open(WebrtcErrorModalComponent)),\n );\n },\n { dispatch: false },\n );\n changeStreamResolution$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeStreamResolutionAction),\n filter((size) => !!(size?.width && size?.height)),\n concatLatestFrom(() =>\n this.store.select(unrealFeature.selectStreamResolution),\n ),\n filter(\n ([newSizes, savedSizes]) =>\n !(\n newSizes.width === savedSizes.width &&\n newSizes.height === savedSizes.height\n ),\n ),\n map(([sizes]) =>\n changeStreamResolutionSuccessAction({\n width: sizes.width,\n height: sizes.height,\n }),\n ),\n );\n });\n forceLBMOff$ = createEffect(() => {\n return fromEvent(document, 'visibilitychange').pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n withLatestFrom(this.store.select(unrealFeature.selectLowBandwidth)),\n filter(([, isLowBandwidth]) => isLowBandwidth),\n tapLog('forceLBMOff$'),\n map(() => changeLowBandwidth({ lowBandwidth: false })),\n );\n });\n resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeLowBandwidth),\n map(({ lowBandwidth }) => lowBandwidth),\n distinctUntilChanged(),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n sendLbmStat$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n exhaustMap(() =>\n this.actions$.pipe(\n ofType(changeLowBandwidth),\n filter(({ lowBandwidth }) => lowBandwidth),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n take(1),\n exhaustMap(([, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n message: {\n type: 'front',\n error: 'low_bandwidth_mode',\n signalling: instance.pollingUrl,\n },\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n })\n .pipe(catchError(() => EMPTY)),\n ),\n ),\n ),\n )\n .subscribe();\n resetAfk$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setConfig, resetWarnTimeout, resetConfig),\n map(() => resetAfkAction()),\n );\n });\n abortEstablishingConnection$ = createEffect(() => {\n const viewportReady$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n filter(Truthy),\n map(() => abortEstablishingConnection()),\n );\n\n const disconnectEvents$ = this.actions$.pipe(\n ofType(setCirrusDisconnected, destroyUnrealScene, dropConnection),\n map(() => abortEstablishingConnection()),\n );\n\n return merge(viewportReady$, disconnectEvents$).pipe(tapLog('ABORT'));\n });\n setMaxFps$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setMaxFps),\n tap(({ maxFps }) => {\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: `t.MaxFPS ${maxFps}` },\n });\n }),\n );\n },\n { dispatch: false },\n );\n resetAfkAction$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(resetAfkAction),\n tap(() => resetAfk()),\n );\n },\n { dispatch: false },\n );\n setSignalingTo100$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n map(() => setStatusPercentSignallingServer({ percent: 100 })),\n );\n });\n setOrchestrationParameters$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setOrchestrationParameters),\n map(({ eta }) => eta),\n filter((value) => value > 0),\n switchMap((total) => {\n // Emit every second: 0,1,2,...,total (inclusive)\n return timer(0, 1000).pipe(\n takeUntil(this.connectionCompleted$),\n take(total + 1),\n map((sec) => sec / total),\n distinctUntilChanged(),\n map((progressComplete) =>\n setOrchestrationProgress({ progressComplete }),\n ),\n );\n }),\n );\n });\n setDataChannelTimeoutCheck$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n // require wsUrl present on the action payload\n filter((action) => !!action.wsUrl),\n // for each awsInstance action capture one ssData snapshot, then wait for dataChannelConnected\n switchMap((awsInstance: AwsInstance) => {\n return this.actions$.pipe(\n ofType(updateCirrusInfo),\n take(1),\n tap(() =>\n Logger.log(\n `DataChannel timeout check started with next timeout: ${this.dataChannelConnectionTimeout}ms`,\n ),\n ),\n switchMap(({ ssData }) => {\n const abort$ = this.actions$.pipe(\n ofType(\n setCirrusDisconnected, // ← \"Cirrus closed\" action\n ),\n take(1),\n );\n\n return this.actions$.pipe(\n ofType(dataChannelConnected),\n take(1),\n\n // 🚫 If Cirrus (or anything else) disconnects first, abort BEFORE timeout fires.\n takeUntil(abort$),\n\n // if it becomes true within timeout -> complete without dispatching any action\n timeout(this.dataChannelConnectionTimeout),\n\n // successfully connect → no action\n mergeMap(() => EMPTY),\n\n // ⏱️ Only actual timeout (or real upstream error) ends up here.\n catchError(() => {\n const error = `⏱️ DataChannel connection timeout ${this.dataChannelConnectionTimeout}ms, requesting new signaling.`;\n Logger.error(error);\n\n const body = {\n awsInstance,\n connectionId: ssData?.connectionId,\n href: location.href,\n userAgent: navigator.userAgent,\n error,\n };\n\n return this.http.post(awsInstance.pollingUrl || '', body).pipe(\n catchError((postError: unknown) => {\n Logger.error('Error sending timeout info:', postError);\n return of(null);\n }),\n // map response to the destroy action which ngrx will dispatch\n map(() =>\n disconnectStream({\n reason: DisconnectReason.DataChannelTimeout,\n message: 'Data Channel Timeout',\n }),\n ),\n );\n }),\n );\n }),\n );\n }),\n );\n });\n destroyConnectionAndRestart$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n filter(({ reason }) => reason === DisconnectReason.DataChannelTimeout),\n switchMap(() =>\n this.actions$.pipe(ofType(setCirrusDisconnected), take(1)),\n ),\n map(() => initSignalling()),\n );\n });\n showUnrealError$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n map(({ code }) => getRtcErrorMessage(code)),\n distinctUntilChanged(),\n filter(Truthy),\n switchMap(\n (content: string) =>\n this.dialog.open(UnrealErrorModalComponent, {\n scrollStrategy: this.scrollStrategy,\n data: { content },\n }).closed,\n ),\n map(() => showUnrealErrorMessage({ code: null })),\n );\n });\n sendStatisticsToUnreal$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n filter(({ code }) => code === 404),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n switchMap(([action, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n message: {\n type: 'front',\n error: 'pak_not_found',\n info: action?.error ?? '',\n },\n })\n .pipe(\n tap(() =>\n Logger.log(\n `successfully send to ${this.unrealInitialConfig?.customErrorsEndpoint}`,\n ),\n ),\n catchError(() => {\n Logger.error(\n `get error from ${this.unrealInitialConfig?.customErrorsEndpoint}`,\n );\n return EMPTY;\n }),\n ),\n ),\n );\n },\n { dispatch: false },\n );\n\n unrealReceiverReady$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(dataChannelConnected),\n concatLatestFrom(() =>\n this.store.select(unrealFeature.selectIsReconnecting),\n ),\n filter(([, isReconnecting]) => !isReconnecting),\n map(() => dataChannelReady()),\n );\n });\n\n initAppBySetDataChannelConnected$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(dataChannelReady),\n tap(() => {\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: CONSOLE_COMMAND_PIXEL_QUALITY },\n });\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FDebugModeCommand,\n payload: { value: this.isDevMode },\n });\n TelemetryStart('SetViewportReady');\n }),\n switchMap(() =>\n this.store.select(selectCommandsInProgress).pipe(\n debounceTime(100), // !IMPORTANT last command detection time\n take(1),\n switchMap(() =>\n observeCommandResponse<FLoopBackCommand['command']>(\n { command: MetaBoxCommand.FLoopBackCommand },\n (data) => this.commandsSender.sendCommandToUnreal(data),\n ),\n ),\n switchMap(() => this.videoService.videoStats$),\n filter(\n (videoStats) =>\n !!videoStats.aggregatedStats.framesPerSecond &&\n videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&\n (videoStats.aggregatedStats.framesDecoded || 0) > 15,\n ),\n take(1),\n map(() => setLoopBackCommandIsCompleted()),\n ),\n ),\n );\n });\n setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setLoopBackCommandIsCompleted, reconnectPeerSuccess),\n tap(() => TelemetryStop('SetViewportReady', { ready: true })),\n map(() => setViewportReady()),\n );\n });\n startStream$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(startStream),\n tapLog('Start Stream Pressed'),\n map(() => initSignalling()),\n );\n });\n listenUnrealCallbackByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n filter(() => !this.unrealInitialConfig?.playwright),\n switchMap(() =>\n fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(\n ({ json }) =>\n (json as WrappedMetaBoxCommandPacket)?.commandCallback\n ?.correlationId,\n ),\n filter(Truthy),\n map((id) => commandCompleted({ id })),\n ),\n ),\n );\n });\n connectToSignaling$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(initSignalling),\n withLatestFrom(\n this.store.select(unrealFeature.selectMatchUrls),\n this.store.select(selectIsAutostart),\n this.store.select(unrealFeature.selectCirrusConnected),\n ),\n filter(([, , autoStart, cirrusConnected]) => {\n if (cirrusConnected) {\n Logger.warn(\n `SIGNALING REQUEST can't be called when cirrus connection is already established.`,\n );\n }\n return autoStart && !cirrusConnected;\n }),\n map(([, matchMakerUrls]) => [...matchMakerUrls].filter(Truthy)),\n filter((urls) => urls.length > 0),\n // Ensure a single in-flight request per attempt.\n exhaustMap((urls) => this.signallingService.connectToSignaling(urls)),\n );\n },\n { dispatch: false },\n );\n /**\n * Effect: `forceViewportNotReady$`\n *\n * Ensures the viewport is explicitly marked as *not ready* to prevent\n * a temporary black screen flash when disconnecting.\n *\n * ### Why\n * - The video stream is disconnected immediately.\n * - The DataChannel closes slightly later.\n * - Closing the DataChannel resets the Unreal scene,\n * which also sets `viewPortReady` to `false`.\n *\n * Without this effect, the order of these events may cause\n * a visible flicker (video flashing to black).\n */\n forceViewportNotReady$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n map(() => setViewportNotReady()),\n );\n });\n\n /**\n * Effect: `handleDataChannelClosed$`\n *\n * Triggers peer reconnection when DataChannel closes unexpectedly.\n * Only triggers if reconnection is enabled, onDataChannelClose is true,\n * and the signaling WebSocket is still connected.\n */\n handleDataChannelClosed$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(disconnectStream),\n filter(\n ({ reason }) =>\n reason === DisconnectReason.DataChannelClosed &&\n this.reconnectConfig.enabled &&\n this.reconnectConfig.onDataChannelClose &&\n this.signallingService.isConnected(),\n ),\n tap(() => {\n Logger.warn(\n '[Reconnect] DataChannel closed, initiating peer reconnection',\n );\n }),\n map(() =>\n reconnectPeer({\n attempt: 1,\n maxAttempts: this.reconnectConfig.maxAttempts,\n delay: 0,\n }),\n ),\n );\n });\n\n /**\n * Effect: `resetStateForPeerReconnect$`\n *\n * Resets the data channel state when peer reconnection starts.\n */\n resetStateForPeerReconnect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(reconnectPeer),\n filter(() => this.reconnectConfig.enabled),\n filter(({ attempt }) => attempt === 1), // Only reset on the first attempt\n map(() => resetDataChannelForReconnect()),\n );\n });\n\n /**\n * Effect: `executePeerReconnect$`\n *\n * Executes the actual peer reconnection attempt.\n * This only re-establishes the WebRTC connection, not the signaling.\n */\n executePeerReconnect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(reconnectPeer),\n filter(() => this.reconnectConfig.enabled),\n tap(({ attempt, maxAttempts }) => {\n Logger.info(\n `[Reconnect] Peer reconnection attempt ${attempt}/${maxAttempts} in ${this.reconnectConfig.delayMs}ms`,\n );\n }),\n switchMap(({ attempt, maxAttempts, delay }) =>\n timer(delay ?? this.reconnectConfig.delayMs).pipe(\n switchMap(() => {\n Logger.info(\n `[Reconnect] Starting peer reconnection attempt ${attempt}`,\n );\n // Initiate peer reconnection through WebRtcPlayerService\n const success = this.webRtcPlayerService.reconnectPeer();\n if (!success) {\n Logger.error('[Reconnect] Failed to initiate peer reconnection');\n if (attempt < maxAttempts) {\n return of(reconnectPeer({ attempt: attempt + 1, maxAttempts }));\n }\n return of(\n reconnectPeerFailed({\n reason: 'Signaling connection lost during peer reconnection',\n }),\n );\n }\n // Monitor for successful data channel connection\n return this.actions$.pipe(\n ofType(dataChannelConnected),\n take(1),\n timeout(this.dataChannelConnectionTimeout),\n tap(() =>\n Logger.info('[Reconnect] Peer reconnection successful!'),\n ),\n map(() => reconnectPeerSuccess()),\n catchError(() => {\n if (attempt < maxAttempts) {\n Logger.warn(\n `[Reconnect] Peer reconnection attempt ${attempt} timed out, scheduling retry`,\n );\n return of(\n reconnectPeer({\n attempt: attempt + 1,\n maxAttempts,\n }),\n );\n } else {\n Logger.error(\n `[Reconnect] All ${maxAttempts} peer reconnection attempts exhausted`,\n );\n return of(\n reconnectPeerFailed({\n reason: `Peer reconnection failed after ${maxAttempts} attempts`,\n }),\n );\n }\n }),\n );\n }),\n // Cancel if scene is destroyed\n takeUntil(this.actions$.pipe(ofType(destroyUnrealScene), take(1))),\n ),\n ),\n );\n });\n\n /**\n * Effect: `handlePeerReconnectFailed$`\n *\n * Handles the case when all peer reconnection attempts have failed.\n * Falls back to full disconnection which may trigger full reconnection.\n */\n handlePeerReconnectFailed$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(reconnectPeerFailed),\n tap(({ reason }) => {\n Logger.error(`[Reconnect] Peer reconnection failed: ${reason}`);\n }),\n map(({ reason }) =>\n disconnectStream({\n reason: DisconnectReason.ReconnectFailed,\n message: reason,\n }),\n ),\n );\n });\n\n /**\n * Effect: `logPeerReconnectSuccess$`\n *\n * Logs successful peer reconnection for telemetry.\n */\n logPeerReconnectSuccess$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(reconnectPeerSuccess),\n tap(() => {\n Logger.info('[Reconnect] Peer connection restored successfully');\n }),\n );\n },\n { dispatch: false },\n );\n}\n","import { createSelector } from '@ngrx/store';\nimport { unrealFeature } from './unreal.feature';\nimport { DEFAULT_AFK_TIMEOUT, SIGNALLING_PERCENT_VALUE } from '../constants';\nimport { clampf, lerp } from '@3dsource/utils';\n\nexport const selectFreezeFrameDataUrlFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.dataUrl || null,\n);\nexport const selectFreezeFrameProgressMessageFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.progress || null,\n);\nexport const selectFreezeFrameDataUrl = createSelector(\n unrealFeature.selectFreezeFrame,\n unrealFeature.selectLowBandwidth,\n (freezeFrame, isLow) =>\n freezeFrame?.dataUrl && isLow ? freezeFrame?.dataUrl : null,\n);\nexport const selectIsFreezeFrameLoading = createSelector(\n unrealFeature.selectFreezeFrame,\n (freezeFrame) =>\n freezeFrame?.progress\n ? freezeFrame.progress > 0 && freezeFrame.progress < 1\n : false,\n);\nexport const selectFreezeFrameCombinedDataUrl = createSelector(\n selectFreezeFrameDataUrlFromVideo,\n selectFreezeFrameDataUrl,\n (dataUrlFromVideo, remoteDataUrl) =>\n dataUrlFromVideo || remoteDataUrl || null,\n);\nexport const selectStreamConfig = createSelector(\n unrealFeature.selectStreamConfig,\n (config) => config,\n);\nexport const selectWarnTimeout = createSelector(\n selectStreamConfig,\n (config) => config?.warnTimeout || DEFAULT_AFK_TIMEOUT,\n);\nexport const selectIsExistMatchUrls = createSelector(\n unrealFeature.selectMatchUrls,\n (urls) => urls?.length > 0,\n);\nexport const selectIsAutostart = createSelector(\n selectStreamConfig,\n (config) => config?.autoStart,\n);\nexport const showPopupWithoutAutoStart = createSelector(\n selectStreamConfig,\n unrealFeature.selectWasInitialized,\n (config, wasInitialized) => !config.autoStart && !wasInitialized,\n);\nexport const selectShowReconnectPopup = createSelector(\n unrealFeature.selectCirrusConnected,\n unrealFeature.selectEstablishingConnection,\n (connected, establishing) => !connected && !establishing,\n);\nexport const selectShowLoader = createSelector(\n selectShowReconnectPopup,\n unrealFeature.selectViewportReady,\n (showPopup, viewportReady) => !showPopup && !viewportReady,\n);\nexport const selectIsVideoPlayingAndDataChannelConnected = createSelector(\n unrealFeature.selectIsVideoPlaying,\n unrealFeature.selectDataChannelConnected,\n (isVideoPlaying, isDataChannelConnected) =>\n isVideoPlaying && isDataChannelConnected,\n);\nexport const selectSignalingParameters = createSelector(\n unrealFeature.selectSsData,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectSsInfo,\n (data, instance, ssInfo) => {\n const info = [];\n if (data) {\n info.push(\n `${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`,\n );\n info.push(`Unreal App Version: ${data.streamerVersion}`);\n info.push(`APP: ${data.streamPath}${data.streamApp}`);\n } else {\n info.push(ssInfo);\n }\n info.push(`Polling: ${instance.pollingUrl}`);\n info.push(`WS: ${instance.wsUrl}`);\n return info.join('<br>');\n },\n);\nexport const selectLoaderCommands = createSelector(\n unrealFeature.selectLoaderCommands,\n (loaderCommands) => loaderCommands,\n);\nexport const selectCommandsInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => loaderCommands.commandsInProgress.length,\n);\nexport const selectCommandProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => {\n if (loaderCommands.totalCommandsStarted > 0) {\n return (\n loaderCommands.totalCommandsCompleted /\n loaderCommands.totalCommandsStarted\n );\n }\n return 0;\n },\n);\nexport const selectLastCommandInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) =>\n loaderCommands.commandsInProgress?.length\n ? loaderCommands.commandsInProgress[\n loaderCommands.commandsInProgress.length - 1\n ]\n : null,\n);\n/**\n * Returns Scene load progress as a float value in between 0-1\n */\nexport const selectTotalProgress = createSelector(\n unrealFeature.selectStatusPercentSignallingServer,\n selectCommandProgress,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectDataChannelConnected,\n (\n statusPercentSignallingServer,\n commandProgress,\n awsInstance,\n dataChannelConnected,\n ) => {\n //TODO make better mechanism to detect is new orchestration\n const isNewOrchestration = String(awsInstance?.wsUrl).match(\n /^wss:\\/\\/orchestration-websocket/i,\n );\n\n const newOrchestrationProgressComplete = dataChannelConnected\n ? 100\n : (awsInstance?.progressComplete || 0) * 100;\n /**\n * Set 57% {@link SIGNALLING_PERCENT_VALUE} immediately when signalingServer?.signalingUrl is available\n * Up to 56% {@link SIGNALLING_PERCENT_VALUE} - 1 of the progress is reserved for signaling server polling\n */\n\n const signalingPercentValue = isNewOrchestration\n ? newOrchestrationProgressComplete\n : statusPercentSignallingServer;\n\n const SIGNALLING_MAX = SIGNALLING_PERCENT_VALUE / 100;\n const splitPoint = awsInstance?.wsUrl\n ? SIGNALLING_MAX + 0.01\n : SIGNALLING_MAX;\n\n const progressSignaling = lerp(\n 0.001,\n splitPoint,\n (signalingPercentValue ?? 0) / 100,\n );\n const progressRest = lerp(0, 1 - splitPoint, commandProgress);\n return clampf(0, 1, progressSignaling + progressRest);\n },\n);\n\nexport const selectClientAndViewIds = createSelector(\n unrealFeature.selectStreamClientCompanyId,\n unrealFeature.selectStreamViewId,\n (clientId, viewId) => ({ clientId, viewId }),\n);\nexport const isLoaderScreenVisible = createSelector(\n unrealFeature.selectViewportReady,\n unrealFeature.selectDataChannelConnected,\n unrealFeature.selectCirrusConnected,\n (viewReady, cirrusConnected, dataChannelConnected) =>\n !viewReady || !cirrusConnected || !dataChannelConnected,\n);\n","import type { InstanceReserved } from '../../interfaces';\nimport type { SignallingService } from '../../services';\nimport { setOrchestrationParameters } from '../../store';\n\nexport function InstanceReservedHandler(\n this: SignallingService,\n msg: InstanceReserved,\n) {\n this.store.dispatch(\n setOrchestrationParameters({\n instanceName: msg.payload.instanceId,\n streamRequestId: msg.payload.streamRequestId,\n eta: msg.payload.eta ?? 150,\n }),\n );\n}\n","import type { SignallingService } from '../../services';\n\nexport function PingHandler(this: SignallingService) {\n this.send(\n JSON.stringify({\n type: 'pong',\n source: 'front',\n }),\n );\n}\n","import type { SignallingService } from '../../services';\nimport type { PlayerCountMessage } from '../../interfaces';\nimport { Logger } from '@3dsource/utils';\n\nexport function PlayerCountHandler(\n this: SignallingService,\n msg: PlayerCountMessage,\n) {\n Logger.log(msg);\n}\n","import type { SignallingService } from '../../services';\nimport type { SSInfo } from '../../interfaces';\nimport { updateCirrusInfo } from '../../store';\n\nexport function SSInfoHandler(this: SignallingService, msg: SSInfo) {\n this.store.dispatch(\n updateCirrusInfo({ ssInfo: msg.message, ssData: msg.data }),\n );\n return null;\n}\n","import type { SignallingService } from '../../services';\nimport { dropConnection, setCirrusDisconnected } from '../../store';\nimport { Logger } from '@3dsource/utils';\nimport {\n WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n WSCloseCode_UNKNOWN,\n} from '../../interfaces';\n\nconst dropCodes = [\n WSCloseCode_UNKNOWN,\n WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n];\nexport function OnCloseHandler(this: SignallingService, e: CloseEvent): void {\n const message = `WebSocket closed: ${JSON.stringify(e.code)} - ${e.reason}`;\n Logger.warn(message);\n this.store.dispatch(setCirrusDisconnected());\n\n if (dropCodes.includes(e.code)) {\n this.store.dispatch(dropConnection());\n }\n}\n","import type { SignallingService } from '../../services';\nimport { Logger } from '@3dsource/utils';\nimport { disconnectStream } from '../../store';\nimport { DisconnectReason } from '../../interfaces';\n\nexport function OnErrorHandler(this: SignallingService, e: Event): void {\n Logger.warn(`WS error: ${JSON.stringify(e)}`);\n\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.WebSocketError,\n message: 'WebSocket Error',\n }),\n );\n}\n","import type { SignallingService } from '../../services';\n\nexport function OnMessageHandler(\n this: SignallingService,\n e: MessageEvent<string | Blob>,\n): void {\n const handleData = (data: string) => {\n //Logger.colored(...COLOR_CODES.FROM_SIGNALING, data);\n const msg = JSON.parse(data);\n this.handleMessage(msg);\n };\n\n if (typeof e.data === 'string') {\n handleData(e.data);\n } else if (e.data instanceof Blob) {\n e.data.text().then(handleData);\n }\n}\n","import type { SignallingService } from '../../services';\nimport { setCirrusConnected } from '../../store';\n\nexport function OnOpenHandler(this: SignallingService) {\n this.store.dispatch(setCirrusConnected());\n\n this.sendRequestStream();\n}\n","import type { Observable } from 'rxjs';\nimport { map, merge, scan } from 'rxjs';\n\ninterface ResetEvent {\n readonly type: 'reset';\n}\ninterface ValueEvent {\n readonly type: 'value';\n readonly value: number;\n}\ntype Event = ResetEvent | ValueEvent;\n\n/**\n * Keeps the max of numbers seen so far; resets to 0 whenever `reset$` emits.\n * Emits `0` immediately on reset.\n */\nexport const keepMaxUntilReset = (\n reset$: Observable<unknown>,\n): ((source: Observable<number>) => Observable<number>) => {\n return (source$: Observable<number>) =>\n merge(\n source$.pipe(map((value): Event => ({ type: 'value', value }) as const)),\n reset$.pipe(map((): Event => ({ type: 'reset' }) as const)),\n ).pipe(\n scan(\n (max, evt) => (evt.type === 'reset' ? 0 : Math.max(max, evt.value)),\n 0,\n ),\n );\n};\n","import type {\n MetaBoxCommandList,\n MetaBoxCommandPacket,\n} from '@3dsource/types-unreal';\nimport type { Observable } from 'rxjs';\nimport { of, take, timeout } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport { catchError, filter, map } from 'rxjs/operators';\nimport { fromSignal } from '../helpers';\nimport { generateUuid, tapLog, Truthy } from '@3dsource/utils';\n\nexport function observeCommandResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n>(\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n dispatchOnTimeout = true,\n): Observable<ObservedCallbackResponse<T> | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(({ json }) => {\n // Some callbacks do not have commandCallback wrapper,\n // so first we check if it exists,\n // then fallback to JSON itself\n return 'commandCallback' in json\n ? { json }\n : { json: { commandCallback: json } };\n }),\n filter(({ json }) => {\n return json.commandCallback.correlationId === correlationId;\n }),\n timeout(timeOut),\n catchError(() =>\n dispatchOnTimeout\n ? of({ json: { commandCallback: { correlationId: 'timeout' } } })\n : of(null),\n ),\n take(1),\n tapLog('Command Response Observer'),\n filter(Truthy),\n );\n\n setTimeout(() => sender(out), 0);\n\n return observable as never;\n}\n\n// Suppose MetaBoxCommandPacket is your base command shape.\n// This type ensures that after filtering, json.commandCallback\n// has the same type as you passed in to observeCommandResponse.\nexport interface ObservedCallbackResponse<T extends MetaBoxCommandPacket> {\n json: {\n commandCallback: T;\n };\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function decodeData(anyData: any) {\n try {\n return new TextDecoder('utf-16').decode(anyData);\n } catch {\n return '';\n }\n}\n","import type { SignalDescriptor } from '../interfaces';\nimport { UnrealInternalSignalEvents } from '../interfaces';\nimport type { Observable } from 'rxjs';\nimport { Signal } from '@3dsource/utils';\nimport { filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@3dsource/types-unreal';\n\ntype Descriptor = MetaBoxCommandList & SignalDescriptor;\n\n/**\n * UnrealInternalSignalEvents commands list wrapper listener\n * @param event\n */\nexport function fromSignal<K extends keyof Descriptor>(\n event: K,\n): Observable<Descriptor[K]> {\n return Signal.on(event).pipe(\n //tapLog('fromSignal', event), // <== for debugging, do not remove\n map((data: unknown) =>\n data && typeof data === 'object' && 'detail' in data ? data.detail : '',\n ),\n );\n}\n\ntype ArgumentType<K extends keyof Descriptor> = Descriptor[K] extends void\n ? never\n : Descriptor[K];\n\n/**\n * UnrealInternalSignalEvents commands list wrapper sender\n * @param event\n * @param args\n */\nexport function sendSignal<K extends keyof Descriptor>(\n event: K,\n ...args: ArgumentType<K> extends never ? [] : [ArgumentType<K>]\n) {\n Signal.broadcast(event, { detail: args?.[0] || null });\n}\n\nexport function fromUnrealCallBackSignal<K extends keyof Descriptor>(\n command: K,\n): Observable<Descriptor[K]> {\n return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map((data) => data?.json),\n map((json) => {\n if ('commandCallback' in json) {\n return json?.commandCallback;\n }\n\n return json;\n }),\n filter((json) => json.command === command),\n map((data) => data),\n map((data) => {\n if ('payload' in data) {\n return {\n command: data.command,\n payload: data?.payload,\n } as Descriptor[K];\n }\n\n return {\n command: data.command,\n } as Descriptor[K];\n }),\n );\n}\n","import { sendSignal } from './EventWrapper';\nimport { UnrealInternalSignalEvents } from '../interfaces';\n\nexport const dispatchResize = () => {\n window.dispatchEvent(new Event('resize'));\n};\n\nexport const forceResizeUnrealVideo = () => {\n sendSignal(UnrealInternalSignalEvents.ForceResizeViewport);\n};\n","const errorCodes: Record<`code${number}`, string | undefined> = {\n code404:\n 'Your asset is being synced on Metabox servers and is not yet available in Metabox Studio or Metabox Configurator. Please check again later after syncing is complete. ',\n};\n\nexport function getRtcErrorMessage(code: number | null): string | undefined {\n if (code === null) return undefined;\n\n return errorCodes[`code${code}`];\n}\n","import type { Observable } from 'rxjs';\nimport { animationFrameScheduler, concatMap, interval, of, scan } from 'rxjs';\nimport { distinctUntilChanged, map, takeWhile } from 'rxjs/operators';\nimport { clampf, lerp } from '@3dsource/utils';\n\nexport const floatToSmoothPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) => ({\n previous: acc.current,\n current: value,\n previousTs: acc.currentTs,\n currentTs:\n typeof performance !== 'undefined' ? performance.now() : Date.now(),\n }),\n {\n previous: 0,\n current: 0,\n previousTs: 0,\n currentTs: 0,\n } as {\n previous: number;\n current: number;\n previousTs: number;\n currentTs: number;\n },\n ),\n\n concatMap(({ previous, current, previousTs, currentTs }) => {\n // time delta in milliseconds\n const dt = previousTs ? currentTs - previousTs : 0;\n if (Math.abs(current - previous) > 0.95) {\n // Assume that a big difference seems like switch between 0 and 1 immediately after resetLoaderState(),\n // so it should go to 'current' without transitions\n return of(current);\n }\n\n // Max 300ms duration for smooth transition\n return smoothTransition(previous, current, Math.min(dt, 300));\n }),\n\n map((value) => clampf(0, 100, Math.round(value * 100))),\n );\n};\n\n/**\n * Creates an observable that emits values transitioning smoothly from the start value to the end value over a specified duration.\n * The transition is performed using linear interpolation (lerp) and clamped to the range [0, 1].\n *\n * @param {number} start - The starting value of the transition.\n * @param {number} end - The ending value of the transition.\n * @param {number} duration - The duration of the transition in milliseconds.\n * @returns {Observable<number>} An observable that emits the interpolated values from start to end over the specified duration.\n */\nexport const smoothTransition = (\n start: number,\n end: number,\n duration: number,\n): Observable<number> => {\n const startTime = animationFrameScheduler.now();\n return interval(0, animationFrameScheduler).pipe(\n map(() => {\n const elapsed = (animationFrameScheduler.now() - startTime) / duration;\n return clampf(0, 1, elapsed);\n }),\n distinctUntilChanged(),\n takeWhile((fraction) => fraction < 1, true),\n map((fraction) => lerp(start, end, fraction)),\n );\n};\n","import {\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n STREAMING_VIDEO_ID,\n} from '../constants';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport { getCanvasCached, getSnapshot } from '@3dsource/utils';\nimport type { StreamResolutionProps } from '../interfaces';\n\nexport const getImageFromVideoStream = (\n takeSizeFrom: 'video' | 'constant' = 'video',\n imageOutput?: ImageOutputValues,\n sizes?: StreamResolutionProps,\n) => {\n try {\n const video = document.getElementById(\n STREAMING_VIDEO_ID,\n ) as HTMLVideoElement;\n const { canvas, ctx } = getCanvasCached('video');\n\n canvas.width =\n takeSizeFrom === 'video'\n ? sizes?.width || video?.clientWidth || FULL_HD_WIDTH\n : FULL_HD_WIDTH;\n canvas.height =\n takeSizeFrom === 'video'\n ? sizes?.height || video?.clientHeight || FULL_HD_HEIGHT\n : FULL_HD_HEIGHT;\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n return getSnapshot(canvas, canvas.width, imageOutput) as string;\n } catch {\n return null;\n }\n};\n","/**\n * Generator for loop through urls\n * Each time it will return the next url, based on an index which MUST NOT be re-initialized inside function\n * @param urls\n */\nlet index = 0;\nexport function* getActiveUrl(urls: string[]) {\n while (true) {\n yield urls[index++ % urls.length];\n }\n}\n","import type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport class KalmanFilter1D {\n private estimate: number;\n private uncertainty: number;\n private processNoise: number;\n private measurementNoise: number;\n\n /**\n * @param initialEstimate Initial guess of the state.\n * @param initialUncertainty Initial uncertainty in the guess.\n * @param processNoise Process variance (Q) representing model uncertainty.\n * @param measurementNoise Measurement variance (R) representing noise in measurements.\n */\n constructor(\n initialEstimate: number,\n initialUncertainty: number,\n processNoise: number,\n measurementNoise: number,\n ) {\n this.estimate = initialEstimate;\n this.uncertainty = initialUncertainty;\n this.processNoise = processNoise;\n this.measurementNoise = measurementNoise;\n }\n\n /**\n * Incorporates a new measurement and returns the updated estimate.\n * @param measurement The new measurement value.\n */\n update(measurement: number): number {\n // === Prediction Step ===\n // For a constant model, the predicted state is the previous estimate.\n const predictedEstimate = this.estimate;\n // Increase the uncertainty by the process noise.\n const predictedUncertainty = this.uncertainty + this.processNoise;\n\n // === Update Step ===\n // Compute the innovation or measurement residual.\n const innovation = measurement - predictedEstimate;\n // Compute the innovation covariance.\n const innovationCovariance = predictedUncertainty + this.measurementNoise;\n // Compute the Kalman Gain.\n const kalmanGain = predictedUncertainty / innovationCovariance;\n\n // Update the estimate with the measurement, weighted by the Kalman Gain.\n this.estimate = predictedEstimate + kalmanGain * innovation;\n // Update the uncertainty.\n this.uncertainty = (1 - kalmanGain) * predictedUncertainty;\n\n return this.estimate;\n }\n\n config(data: FilterSettings) {\n const {\n initialBitrateEstimate,\n initialErrorCovariance,\n processNoise,\n measurementNoise,\n } = data;\n this.estimate = initialBitrateEstimate;\n this.uncertainty = initialErrorCovariance;\n this.processNoise = processNoise;\n this.measurementNoise = measurementNoise;\n }\n}\n","export class LatencyTimings {\n TestStartTimeMs!: number | null;\n UEReceiptTimeMs!: number | null;\n UEEncodeMs!: number | null;\n UECaptureToSendMs!: number | null;\n UETransmissionTimeMs!: number | null;\n BrowserReceiptTimeMs!: number | null;\n FrameDisplayDeltaTimeMs!: number | null;\n\n Reset() {\n this.TestStartTimeMs = null;\n this.UEReceiptTimeMs = null;\n this.UEEncodeMs = null;\n this.UECaptureToSendMs = null;\n this.UETransmissionTimeMs = null;\n this.BrowserReceiptTimeMs = null;\n this.FrameDisplayDeltaTimeMs = null;\n }\n\n SetUETimings(UETimings: any) {\n this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;\n this.UEEncodeMs = UETimings.EncodeMs;\n this.UECaptureToSendMs = UETimings.CaptureToSendMs;\n this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;\n this.BrowserReceiptTimeMs = Date.now();\n this.OnAllLatencyTimingsReady(this);\n }\n\n SetFrameDisplayDeltaTime(DeltaTimeMs: number) {\n if (this.FrameDisplayDeltaTimeMs == null) {\n this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);\n this.OnAllLatencyTimingsReady(this);\n }\n }\n\n OnAllLatencyTimingsReady(_: any) {}\n}\n","import type { Quality } from '../interfaces';\n\nexport const mapQpToQuality = (VideoEncoderQP: number): Quality => {\n const orangeQP = 26;\n const redQP = 35;\n\n let quality: Quality = 'lime';\n if (VideoEncoderQP > redQP) {\n quality = 'red';\n } else if (VideoEncoderQP > orangeQP) {\n quality = 'orange';\n }\n return quality;\n};\n","import { whereNot } from '@3dsource/utils';\nimport type { CommandsLoaderState } from '../store';\n\nexport const removeExileCommands = (\n state: CommandsLoaderState,\n idToRemove: string,\n) => {\n const exileTimeout = 10000;\n const out = { ...state };\n out.commandsInProgress = out.commandsInProgress.filter(\n whereNot({ id: idToRemove }),\n );\n out.totalCommandsCompleted++;\n const time = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries(out.commandsInProgress).forEach(([, { id, timeStamp }]) => {\n if (time - timeStamp > exileTimeout) {\n markForDelete.push(id);\n }\n });\n out.totalCommandsCompleted += markForDelete.length;\n out.commandsInProgress = out.commandsInProgress.filter(\n (command) => !markForDelete.includes(command.id),\n );\n return out;\n};\n","import { UnrealInternalSignalEvents } from '../interfaces';\nimport { sendSignal } from './EventWrapper';\n\nexport const resetAfk = () => {\n sendSignal(UnrealInternalSignalEvents.RestAfkTimer);\n};\n","import { Observable } from 'rxjs';\n\nexport function fromResizeObserver(\n elem: HTMLElement,\n): Observable<ResizeObserverEntry[]> {\n return new Observable((subscriber) => {\n const observer = new window.ResizeObserver((entries) =>\n subscriber.next(entries),\n );\n observer.observe(elem);\n\n return () => observer.unobserve(elem);\n });\n}\n","export class VideoRecorder {\n private recordedChunks!: any[];\n private mediaRecorder!: MediaRecorder;\n\n capture(canvas: any) {\n // Optional frames per second argument can be set in captureStream().\n const stream = (canvas as HTMLCanvasElement).captureStream();\n\n this.recordedChunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n this.mediaRecorder = new MediaRecorder(stream, options);\n this.mediaRecorder.ondataavailable = this.handleDataAvailable.bind(this);\n this.mediaRecorder.start();\n\n // demo: to download after 9sec\n /*\n setTimeout((event) => {\n mediaRecorder.stop();\n }, 9000);\n */\n }\n\n stop() {\n this.mediaRecorder?.stop();\n }\n\n handleDataAvailable(event: any) {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n this.download();\n }\n }\n\n download() {\n const blob = new Blob(this.recordedChunks, {\n type: 'video/webm',\n });\n\n const url = URL.createObjectURL(blob);\n const a: any = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = 'test.webm';\n a.click();\n URL.revokeObjectURL(url);\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { UnrealInternalSignalEvents } from '../../interfaces';\nimport { fromSignal } from '../../helpers';\nimport { CommonModule } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-clickable-overlay',\n templateUrl: './clickable-overlay.component.html',\n styleUrl: './clickable-overlay.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, SourceButtonComponent],\n})\nexport class ClickableOverlayComponent {\n readonly state = toSignal(\n fromSignal(UnrealInternalSignalEvents.ClickableOverlay).pipe(\n map((data) => (typeof data === 'object' ? data : null)),\n ),\n );\n}\n","@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [isFullWidth]=\"true\"\n [data-testid]=\"'continue-session'\"\n weight=\"primary\"\n size=\"lg\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport {\n selectFreezeFrameCombinedDataUrl,\n selectFreezeFrameProgressMessageFromVideo,\n} from '../../store';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-freeze-frame',\n templateUrl: './freeze-frame.component.html',\n styleUrl: './freeze-frame.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreezeFrameComponent {\n private store = inject(Store);\n\n readonly freezeFrameProgressMessageFromVideo = toSignal(\n this.store.select(selectFreezeFrameProgressMessageFromVideo),\n );\n readonly combinedFreeze = toSignal(\n this.store.select(selectFreezeFrameCombinedDataUrl),\n );\n}\n","<div class=\"freeze-images\">\n @if (combinedFreeze()) {\n <img\n [src]=\"combinedFreeze()\"\n class=\"videoStillImage\"\n alt=\"freezeFrameImage\"\n />\n }\n\n @if (freezeFrameProgressMessageFromVideo()) {\n <div class=\"progress-status\">\n {{ freezeFrameProgressMessageFromVideo() }}\n </div>\n }\n</div>\n","import type { PipeTransform } from '@angular/core';\nimport { inject, Pipe } from '@angular/core';\nimport type {\n SafeHtml,\n SafeResourceUrl,\n SafeScript,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safe',\n})\nexport class SafePipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n transform(\n value: any,\n type: string,\n ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\n if (!value) {\n return value;\n }\n\n switch (type) {\n case 'html':\n return this.sanitizer.bypassSecurityTrustHtml(value);\n case 'style':\n return this.sanitizer.bypassSecurityTrustStyle(value);\n case 'script':\n return this.sanitizer.bypassSecurityTrustScript(value);\n case 'url':\n return this.sanitizer.bypassSecurityTrustUrl(value);\n case 'resourceUrl':\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\n default:\n throw new Error(`Invalid safe type specified: ${type}`);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { DialogRef } from '@angular/cdk/dialog';\n\nimport { SafePipe } from '../../pipes';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-low-bandwidth-modal',\n templateUrl: './low-bandwidth-modal.component.html',\n styleUrl: './low-bandwidth-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SafePipe, SourceButtonComponent],\n})\nexport class LowBandwidthModalComponent {\n dialogRef = inject(DialogRef);\n\n close(value?: boolean) {\n this.dialogRef.close(value || false);\n }\n}\n","<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { isLoaderScreenVisible, unrealFeature } from '../../store';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\n\n@Component({\n selector: 'app-image-loading-src',\n templateUrl: './image-loading-src.component.html',\n styleUrl: './image-loading-src.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgOptimizedImage],\n})\nexport class ImageLoadingSrcComponent {\n store = inject(Store);\n\n isLoaderScreenVisible = this.store.selectSignal(isLoaderScreenVisible);\n imageLoadingSrc = this.store.selectSignal(\n unrealFeature.selectImageLoadingSrc,\n );\n}\n","@if (isLoaderScreenVisible()) {\n <div class=\"preload\">\n <div class=\"back\">\n @if (imageLoadingSrc()) {\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n }\n </div>\n </div>\n}\n","import type { AfterViewInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n inject,\n Input,\n input,\n ViewChild,\n} from '@angular/core';\nimport {\n HEXtoRGB,\n HSVtoRGB,\n inverseLerp,\n RGBtoHEX,\n RGBtoHSV,\n} from '@3dsource/utils';\n\n@Component({\n selector: 'app-stat-graph',\n templateUrl: './stat-graph.component.html',\n styleUrl: './stat-graph.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatGraphComponent implements AfterViewInit {\n private el = inject(ElementRef);\n @ViewChild('graph') graph!: ElementRef;\n private canvas!: HTMLCanvasElement;\n private ctx!: CanvasRenderingContext2D;\n\n readonly color = input('#417bc9');\n readonly tickStep = input(3);\n readonly label = input.required<string>();\n private scaleY!: number;\n\n @Input() set dataTick(data: { value: number; hash: number } | null) {\n this.pushData(data?.value ?? null);\n }\n\n private data: (number | null)[] = [];\n\n max = 0;\n min = 0;\n current = 0;\n\n ngAfterViewInit() {\n this.canvas = this.graph.nativeElement;\n this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n }\n\n @HostListener('window:resize', ['$event'])\n resize(e: Event) {\n this.draw();\n }\n\n private draw() {\n if (!this.canvas) {\n return;\n }\n\n const all = this.data.filter((r) => r !== null && !isNaN(r)) as number[];\n this.max = Math.max(...all);\n this.min = Math.min(...all);\n this.scaleY = this.canvas.height / (this.max || 1);\n this.current = all[all.length - 1] || 0;\n this.ctx.save();\n const bounds = this.el.nativeElement.getBoundingClientRect();\n this.canvas.width = bounds.width;\n this.canvas.height = bounds.height - 30; // -p height\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n [...this.data].reverse().forEach((val, index) => {\n const h = (val || 0) * this.scaleY;\n\n this.ctx.fillStyle = this.getColor(this.color(), h as number);\n this.ctx.fillRect(\n index * this.tickStep(),\n this.canvas.height - h,\n this.tickStep(),\n h,\n );\n });\n this.ctx.restore();\n }\n\n private getColor(fillStyle: string, value = 0) {\n const { r, g, b } = HEXtoRGB(fillStyle);\n /* eslint-disable-next-line prefer-const */\n let [h, s, v] = RGBtoHSV(r, g, b);\n v = inverseLerp(0, this.canvas.height, value);\n {\n const [r, g, b] = HSVtoRGB(h, s, v);\n return '#' + RGBtoHEX(r, g, b);\n }\n }\n\n private pushData(value: number | null) {\n this.data.push(value);\n\n if (!this.canvas) {\n return;\n }\n\n if (this.data.length > this.canvas.width / this.tickStep()) {\n this.data.shift();\n }\n\n this.draw();\n }\n}\n","<div class=\"content\">\n <p>{{ label() }}: {{ current }} | Min:{{ min }} | Max:{{ max }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Falsy, tapLog, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { combineLatestWith, merge, of, skip, Subject, switchMap } from 'rxjs';\nimport {\n debounceTime,\n delay,\n distinctUntilChanged,\n filter,\n map,\n tap,\n} from 'rxjs/operators';\nimport {\n selectShowLoader,\n selectTotalProgress,\n unrealFeature,\n} from '../../store';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { SCREEN_LOCKER_CONTAINER_ID, UNREAL_CONFIG } from '../../constants';\nimport { floatToSmoothPercents, keepMaxUntilReset } from '../../helpers';\nimport { SourceLoadingComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-unreal-status',\n templateUrl: './unreal-status.component.html',\n styleUrl: './unreal-status.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceLoadingComponent],\n})\nexport class UnrealStatusComponent implements OnInit {\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG);\n private readonly destroyRef = inject(DestroyRef);\n private readonly store = inject(Store);\n\n private readonly resetPercentageSignal$ = this.store\n .select(selectShowLoader)\n .pipe(filter(Falsy));\n\n readonly showLoader = this.store.selectSignal(selectShowLoader);\n /**\n * An observable that emits smoothed percentage values from 0 to 100.\n */\n readonly messagePercents = toSignal(\n this.store.select(selectTotalProgress).pipe(\n keepMaxUntilReset(this.resetPercentageSignal$),\n floatToSmoothPercents(),\n distinctUntilChanged(),\n map((progress) => (progress || 0) + '%'),\n combineLatestWith(this.store.select(unrealFeature.selectIsReconnecting)),\n map(([percent, isReconnecting]) =>\n isReconnecting ? 'Reconnecting...' : percent,\n ),\n ),\n );\n\n readonly awsInstance = this.store.selectSignal(\n unrealFeature.selectAwsInstance,\n );\n\n ngOnInit() {\n /**\n * A subject that emits null values to trigger nullification.\n */\n const nullify$ = new Subject<null>();\n\n /**\n * An observable that emits null values with a delay of 2000 milliseconds.\n */\n const nullifyObs$: Observable<null> = nullify$\n .asObservable()\n .pipe(delay(2000));\n\n /**\n * An observable that emits the status message from the Unreal feature store.\n */\n const signalingStatus$ = this.store.select(\n unrealFeature.selectStatusMessage,\n );\n\n /**\n * An observable that emits connection status messages based on the Cirrus connection state.\n * Then call side effect to nullify the message.\n */\n const cirrusConnected$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(\n skip(1),\n switchMap((connected) =>\n connected\n ? of('Creating Socket...')\n : of('Connection closed.').pipe(tap(() => nullify$.next(null))),\n ),\n );\n\n /**\n * An observable that emits the viewport visibility state.\n */\n const viewportTrigger$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n\n /**\n * An observable that will nullify any message displayed after 500 mSec, when viewport changes its state.\n */\n const streamToggle$ = merge(\n viewportTrigger$.pipe(filter(Falsy), skip(1)),\n viewportTrigger$.pipe(filter(Truthy)),\n ).pipe(\n delay(500),\n map(() => null),\n );\n\n /**\n * A subscription that merges various status observables and emits debounced status via postMessage.\n */\n merge(nullifyObs$, cirrusConnected$, signalingStatus$, streamToggle$)\n .pipe(\n debounceTime(0),\n tapLog('STATUS=>'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((status) => this.sendMessageToIndex(status as string));\n }\n\n /**\n * Sends a message to the embedded iframe identified by the default value '3dsource_start_screen' ID.\n * This function tries to post a message to the iframe's content window. If the content\n * window is not accessible (e.g., due to cross-origin policies), the function fails silently.\n *\n * @param {string} text The message to be sent to the iframe. This could be a status update\n * or any other relevant information that the iframe needs to process.\n */\n private sendMessageToIndex(text: string) {\n const objectElement = document.getElementById(\n this.unrealInitialConfig?.screenLockerContainerId ||\n SCREEN_LOCKER_CONTAINER_ID,\n ) as HTMLIFrameElement;\n\n try {\n const objectDocument = objectElement.contentWindow;\n objectDocument?.postMessage(text, '*');\n } catch {\n // Fails silently if the iframe's content window cannot be accessed\n }\n }\n}\n","@if (showLoader()) {\n <div class=\"status-box\">\n @if (awsInstance().message) {\n <p>{{ awsInstance().message }}</p>\n } @else {\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents() }}\n </div>\n }\n </div>\n}\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { BehaviorSubject, combineLatestWith, of } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport type { InboundVideoStats } from '../../interfaces';\nimport { selectSignalingParameters, unrealFeature } from '../../store';\nimport { StatGraphComponent } from '../stat-graph/stat-graph.component';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { Store } from '@ngrx/store';\nimport { DevModeService, VideoService } from '../../services';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { SafePipe } from '../../pipes';\n\n@Component({\n selector: 'app-video-stats',\n templateUrl: './video-stats.component.html',\n styleUrl: './video-stats.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe],\n})\nexport class VideoStatsComponent implements OnInit {\n collapsed = false;\n private store = inject(Store);\n private videoService = inject(VideoService);\n private isDevMode = inject(DevModeService).isDevMode;\n private obs$ = this.videoService.videoStats$;\n\n readonly viewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n readonly ssInfo = toSignal(this.store.select(selectSignalingParameters));\n readonly fpsTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.framesPerSecond || 0,\n hash: index,\n })),\n ),\n );\n readonly fpsAvgTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.avgFrameRate,\n hash: index,\n })),\n ),\n );\n readonly bitrateTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.bitrate,\n hash: index,\n })),\n ),\n );\n readonly videoQP = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.VideoEncoderQP,\n hash: index,\n })),\n ),\n );\n readonly bitrateAverageTick = toSignal(\n this.obs$.pipe(\n map((stat, index) => ({\n value: stat.aggregatedStats.avgBitrate,\n hash: index,\n })),\n ),\n );\n readonly videoStatus = toSignal(\n this.obs$.pipe(\n map(\n (event) =>\n this.isDevMode &&\n ({\n ...event.aggregatedStats,\n quality: event.quality,\n } as InboundVideoStats),\n ),\n filter(Boolean),\n map((data: any) => {\n return this.fields\n .map((key) => {\n return {\n key,\n value: data[key],\n };\n })\n .filter((r) => !this.elementsToShow.includes(r.key));\n }),\n ),\n );\n fields!: string[];\n graphList: any[] = [];\n graphList$!: Observable<any>;\n private idKey = 'com.source3d.unreal.stat';\n private elementsToShow: string[] = [];\n\n private trigger$ = new BehaviorSubject<void>(undefined);\n\n constructor() {\n this.getFields();\n }\n\n ngOnInit() {\n this.fields = [\n 'kalmanBitrate',\n 'bitrateDrop',\n 'runTime',\n 'pixelRatio',\n 'frameHeight',\n 'frameWidth',\n ':-------------',\n 'jitter',\n 'MBytesReceived',\n 'framesDecoded',\n 'framesDropped',\n 'framesReceived',\n 'keyFramesDecoded',\n 'currentRoundTripTime',\n 'packetsLost',\n ':-------------',\n 'quality',\n 'videoCodec',\n 'kind',\n 'type',\n 'codecs',\n 'selectedPair',\n //'pliCount',\n //'sliCount',\n //'transportId',\n //'id',\n ];\n\n this.updateGraph();\n }\n\n updateGraph() {\n this.graphList = this.fields.map((key: any) => {\n const stat = this.obs$.pipe(\n map((val, index) => {\n const value = (val.aggregatedStats as any)[key];\n return { value, hash: index } as any;\n }),\n );\n\n return {\n key,\n color: Math.floor(Math.random() * 16777216),\n stat,\n };\n });\n\n this.graphList$ = of(this.graphList).pipe(\n combineLatestWith(this.trigger$),\n map(([graphList]) =>\n graphList.filter((r) => this.elementsToShow.includes(r.key)),\n ),\n );\n }\n\n toggle() {\n this.collapsed = !this.collapsed;\n this.writeFields();\n }\n\n toggleGraph($event: MouseEvent, el: string, value?: any) {\n $event.stopPropagation();\n if ((value && typeof value !== 'number') || isNaN(value)) {\n return;\n }\n if (this.elementsToShow.includes(el)) {\n this.elementsToShow = this.elementsToShow.filter((item) => item !== el);\n } else {\n this.elementsToShow.push(el);\n }\n this.writeFields();\n this.trigger$.next();\n }\n\n private getFields() {\n try {\n const { elements, collapsed } =\n JSON.parse(localStorage.getItem(this.idKey) as string) || [];\n this.elementsToShow = elements || [];\n this.collapsed = collapsed;\n } catch {\n this.elementsToShow = [];\n }\n }\n\n private writeFields() {\n localStorage.setItem(\n this.idKey,\n JSON.stringify({\n collapsed: this.collapsed,\n elements: this.elementsToShow,\n }),\n );\n }\n}\n","@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats</button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()!\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()!\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()!\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n}\n","import type { AfterViewInit, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { VideoService } from '../../services';\nimport {\n isLoaderScreenVisible,\n selectIsExistMatchUrls,\n selectShowReconnectPopup,\n selectStreamConfig,\n startStream,\n unrealFeature,\n} from '../../store';\nimport { filter, skip } from 'rxjs/operators';\nimport type { SignalDescriptor } from '../../interfaces';\nimport { UnrealInternalSignalEvents } from '../../interfaces';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Falsy, Logger } from '@3dsource/utils';\nimport { fromSignal } from '../../helpers';\nimport { Store } from '@ngrx/store';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-resume-stream-button',\n templateUrl: './resume-stream-button.component.html',\n styleUrl: './resume-stream-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class ResumeStreamButtonComponent implements AfterViewInit, OnInit {\n store = inject(Store);\n videoService = inject(VideoService);\n destroyRef = inject(DestroyRef);\n\n showReconnectPopup = this.store.selectSignal(selectShowReconnectPopup);\n isLoaderScreenVisible = this.store.selectSignal(isLoaderScreenVisible);\n\n streamConfig = this.store.selectSignal(selectStreamConfig);\n isExistMatchUrls = this.store.selectSignal(selectIsExistMatchUrls);\n readonly isSecondStart = signal(\n !!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)),\n );\n readonly isShowResumeButton = computed(\n () =>\n this.isLoaderScreenVisible() &&\n this.showReconnectPopup() &&\n this.isExistMatchUrls(),\n );\n\n playCallBack: null | (() => void) = null;\n\n ngOnInit() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onDisconnect());\n }\n\n ngAfterViewInit() {\n fromSignal(UnrealInternalSignalEvents.ShowPlayButton)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: SignalDescriptor['ShowPlayButton']) => {\n this.playCallBack = event.callback;\n\n if (this.videoService.video?.paused) {\n Logger.info('Simulate Press Play');\n this.playCallBack();\n }\n });\n }\n\n connect() {\n this.store.dispatch(startStream({ config: { autoStart: true } }));\n }\n\n onDisconnect() {\n this.isSecondStart.set(true);\n this.playCallBack = null;\n }\n}\n","@if (isShowResumeButton()) {\n <div class=\"resume-box\">\n @if (isSecondStart()) {\n <div class=\"resume-box__text\">\n Your stream has been paused due to inactivity\n </div>\n }\n\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [data-testid]=\"'connect-button'\"\n size=\"lg\"\n weight=\"primary\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n}\n","import type { ElementRef } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\nimport { resetIntroSrc, unrealFeature } from '../../store';\n\n@Component({\n selector: 'app-intro-src',\n templateUrl: './intro-src.component.html',\n styleUrl: './intro-src.component.scss',\n imports: [NgOptimizedImage],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IntroSrcComponent {\n private readonly videoElement =\n viewChild<ElementRef<HTMLDivElement>>('videoPlayerCover');\n private store = inject(Store);\n protected imageIntroSrc = this.store.selectSignal(\n unrealFeature.selectImageIntroSrc,\n );\n protected videoIntroSrc = this.store.selectSignal(\n unrealFeature.selectVideoIntroSrc,\n );\n private viewportReady = this.store.selectSignal(\n unrealFeature.selectViewportReady,\n );\n\n constructor() {\n effect(() => {\n const viewportReady = this.viewportReady();\n const videoIntroSrc = this.videoIntroSrc();\n const imageIntroSrc = this.imageIntroSrc();\n untracked(() => {\n if (viewportReady && (videoIntroSrc || imageIntroSrc)) {\n this.store.dispatch(resetIntroSrc());\n }\n });\n });\n effect(() => {\n const videoIntroSrc = this.videoIntroSrc();\n const videoElement = this.videoElement();\n if (!videoIntroSrc || !videoElement) {\n return;\n }\n untracked(() =>\n this.createVideo(videoIntroSrc, videoElement.nativeElement),\n );\n });\n }\n\n private createVideo(src: string, videoContainer: HTMLDivElement) {\n const matchAbsolutePath = !!src.match(/.*\\.(mp4|WebM)(\\?.*)?$/i);\n // Select the parent layout where the video will be inserted\n videoContainer.innerHTML = ''; // This will remove all existing content within the layout\n // Create the video element\n const videoElement = document.createElement('video');\n videoElement.autoplay = true;\n videoElement.muted = true;\n videoElement.loop = true;\n if (!matchAbsolutePath) {\n videoElement.poster = `${src}/cover.webp`;\n }\n\n videoElement.style.position = 'absolute';\n videoElement.style.width = '100%';\n videoElement.style.height = '100%';\n videoElement.style.objectFit = 'cover';\n\n const sourceElement = document.createElement('source');\n if (matchAbsolutePath) {\n sourceElement.src = src;\n } else {\n sourceElement.src = `${src}/video.mp4`;\n }\n\n sourceElement.type = 'video/mp4';\n // Append the source element to the video element\n videoElement.appendChild(sourceElement);\n // Handle browser fallback text\n videoElement.innerHTML += 'Browser not supported';\n // Append the video element to the layout\n videoContainer.appendChild(videoElement);\n }\n}\n","@let imageSrc = imageIntroSrc();\n@if (imageSrc) {\n <div class=\"backImage\">\n <img [ngSrc]=\"imageSrc\" fill alt=\"imageSrc\" />\n </div>\n} @else if (videoIntroSrc()) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { distinctUntilChanged, filter, map, tap } from 'rxjs/operators';\nimport {\n combineLatestWith,\n debounceTime,\n fromEvent,\n merge,\n switchMap,\n take,\n timer,\n} from 'rxjs';\nimport {\n DevModeService,\n UnrealCommunicatorService,\n VideoService,\n} from '../../services';\nimport { UnrealInternalSignalEvents } from '../../interfaces';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport type { Area, Size } from '@3dsource/utils';\nimport { fitIntoRectangle, fpIsASameAsB, Truthy } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport {\n changeStreamResolutionAction,\n destroyUnrealScene,\n initSignalling,\n selectIsExistMatchUrls,\n selectIsFreezeFrameLoading,\n unrealFeature,\n} from '../../store';\nimport {\n DEBOUNCE_TO_MANY_RESIZE_CALLS,\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n SAME_SIZE_THRESHOLD,\n} from '../../constants';\nimport { fromSignal, sendSignal } from '../../helpers';\nimport { ClickableOverlayComponent } from '../clickable-overlay/clickable-overlay.component';\nimport { UnrealStatusComponent } from '../unreal-status/unreal-status.component';\nimport { FreezeFrameComponent } from '../freeze-frame/freeze-frame.component';\nimport { VideoStatsComponent } from '../video-stats/video-stats.component';\nimport { ResumeStreamButtonComponent } from '../resume-stream-button/resume-stream-button.component';\nimport { ImageLoadingSrcComponent } from '../image-loading-src/image-loading-src.component';\nimport { IntroSrcComponent } from '../intro-src/intro-src.component';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\n\n@Component({\n selector: 'app-unreal-scene',\n templateUrl: './unreal-scene.component.html',\n styleUrl: './unreal-scene.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ClickableOverlayComponent,\n UnrealStatusComponent,\n FreezeFrameComponent,\n VideoStatsComponent,\n ResumeStreamButtonComponent,\n ImageLoadingSrcComponent,\n IntroSrcComponent,\n ],\n})\nexport class UnrealSceneComponent {\n readonly isStudio = input(false);\n readonly useContainerAsSizeProvider = input(true);\n readonly studioResolutionSize = input<{ width: number; height: number }>({\n width: FULL_HD_WIDTH,\n height: FULL_HD_HEIGHT,\n });\n studioResolutionValues = toObservable(\n computed(() => {\n const values = this.studioResolutionSize();\n return { width: values.width, height: values.height };\n }),\n );\n readonly videoElement =\n viewChild<ElementRef<HTMLDivElement>>('videoContainer');\n changeMouseOverScene = output<boolean>();\n private width = FULL_HD_WIDTH;\n private height = FULL_HD_HEIGHT;\n private store = inject(Store);\n private isExistMatchUrls = this.store.selectSignal(selectIsExistMatchUrls);\n readonly isDevMode = inject(DevModeService).isDevMode;\n readonly lightMode = this.store.selectSignal(\n unrealFeature.selectLowBandwidth,\n );\n private isFreezeFrameLoading = this.store.selectSignal(\n selectIsFreezeFrameLoading,\n );\n private commandsSender = inject(UnrealCommunicatorService);\n private videoService = inject(VideoService);\n private element = inject(ElementRef);\n private destroyRef = inject(DestroyRef);\n\n private get resizeValues() {\n if (!this.isStudio()) {\n return this.getResizeValuesUniversal();\n }\n return this.getResizeValues();\n }\n\n private get pixelRatio() {\n return window.devicePixelRatio;\n }\n\n @HostListener('mouseover')\n onMouseOver() {\n this.changeMouseOverScene.emit(true);\n }\n @HostListener('mouseout')\n onMouseOut() {\n this.changeMouseOverScene.emit(false);\n }\n\n constructor() {\n this.destroyRef.onDestroy(() => this.store.dispatch(destroyUnrealScene()));\n effect(() => {\n const videoElement = this.videoElement();\n const isExistMatchUrls = this.isExistMatchUrls();\n if (videoElement && isExistMatchUrls) {\n this.store.dispatch(initSignalling());\n }\n });\n\n afterNextRender({\n read: () => {\n const videoElement = this.videoElement();\n if (videoElement) {\n this.videoService.setContainer(videoElement.nativeElement);\n\n if (this.element?.nativeElement) {\n fromEvent<Event>(this.element?.nativeElement, 'contextmenu')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: Event) => event.preventDefault());\n }\n this.listenResizeValues();\n }\n },\n });\n }\n\n private listenResizeValues() {\n const customSizeInputChanged$ = this.studioResolutionValues.pipe(\n filter(Truthy),\n distinctUntilChanged(),\n filter(\n ({ width, height }) => this.width !== width || this.height !== height,\n ),\n map(({ width, height }) => ({ width, height })),\n tap(({ width, height }) => {\n this.width = width;\n this.height = height;\n }),\n );\n\n const resizeRequired$ = merge(\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized),\n fromEvent(window, 'resize'),\n );\n\n const videoStreamSizeChanged$ = this.videoService?.videoStats$.pipe(\n filter(() => !this.isFreezeFrameLoading()),\n map((stats) => ({\n w: stats.aggregatedStats.frameWidth || 0,\n h: stats.aggregatedStats.frameHeight || 0,\n })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n );\n\n merge(customSizeInputChanged$, resizeRequired$, videoStreamSizeChanged$)\n .pipe(\n debounceTime(DEBOUNCE_TO_MANY_RESIZE_CALLS),\n switchMap(() => {\n const key = Math.random();\n // Monitoring the size of the video stream\n return timer(0, 300).pipe(\n take(3),\n map(() => key),\n );\n }),\n map((key) => ({ key, ...this.resizeValues })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD) &&\n previous.key === current.key,\n ),\n tap((size) => this.adaptVideo(size)),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n combineLatestWith(\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy)),\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([size]) => {\n this.store.dispatch(\n changeStreamResolutionAction({ width: size.w, height: size.h }),\n );\n this.sendResize(size);\n });\n\n fromSignal(UnrealInternalSignalEvents.ForceResizeViewport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.sendResize(this.resizeValues);\n });\n }\n\n private adaptVideo(size: Size) {\n const video = this.videoService.video;\n const areaSize = this.resizeValues;\n\n if (video?.style) {\n const pR = this.pixelRatio;\n video.width = this.makeEven(size.w / pR / areaSize.scale);\n video.height = this.makeEven(size.h / pR / areaSize.scale);\n\n if (!this.isStudio()) {\n video.style.overflow = 'hidden';\n video.style.objectFit = 'cover';\n video.style.width = `${video.width}px`;\n video.style.height = `${video.height}px`;\n }\n }\n\n sendSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer);\n }\n\n /**\n * This method calculates the dimensions for resizing a layout in a configurator stream.\n * It takes into account the pixel ratio of the device's screen and the orientation of the layout.\n * The method uses the `fitIntoRectangle` function to calculate the dimensions that would allow the layout to fit into the maximum space while maintaining its aspect ratio.\n * It also sets the maximum limits for the width and height based on the layout's orientation.\n * If the scale of the fitted dimensions is less than 1, it assigns the fitted dimensions to the output. Otherwise, it sets the scale of the output to 1.\n * @returns {Area} An object of type `Area` that contains the calculated dimensions for resizing the layout.\n */\n private getResizeValuesUniversal(): Area {\n const pR = this.pixelRatio;\n let containerW = window.innerWidth || 2;\n let containerH = window.innerHeight || 2;\n\n if (this.useContainerAsSizeProvider()) {\n containerW = this.videoElement()?.nativeElement.offsetWidth || 2;\n containerH = this.videoElement()?.nativeElement.offsetHeight || 2;\n }\n\n const maxSpace = { w: containerW * pR, h: containerH * pR };\n\n const isVertical = containerW < containerH;\n let maxH = FULL_HD_HEIGHT;\n let maxW = FULL_HD_WIDTH;\n\n const params = new URLSearchParams(location.search);\n const maxRes = params.get('maxresolution');\n\n if (Truthy(maxRes)) {\n maxH = FULL_HD_HEIGHT * 2;\n maxW = FULL_HD_WIDTH * 2;\n }\n\n const maxLimits = isVertical\n ? { w: maxH, h: maxW, x: 0, y: 0 }\n : { w: maxW, h: maxH, x: 0, y: 0 };\n\n const props = fitIntoRectangle(\n { x: 0, y: 0, w: containerW, h: containerH },\n { x: 0, y: 0, ...maxSpace },\n );\n\n let out = { ...props };\n\n const fitIntoMax = fitIntoRectangle(props, maxLimits);\n if (fitIntoMax.scale < 1) {\n // If reducing size to 1920x1080 is required, do it\n out = fitIntoMax;\n } else {\n // Otherwise, use the lowest resolution because the layout size is smaller than 1920x1080\n out.scale = 1;\n }\n\n /**\n * Ensure that the size is always even.\n */\n out.w = this.makeEven(out.w);\n out.h = this.makeEven(out.h);\n\n return { ...out };\n }\n\n private getResizeValues(): Area {\n const pR = this.pixelRatio;\n const containerW =\n pR * (this.videoElement()?.nativeElement.offsetWidth || 2);\n const containerH =\n pR * (this.videoElement()?.nativeElement.offsetHeight || 2);\n const maxSpace = { w: containerW, h: containerH };\n\n const videoSizePixelPerfect = fitIntoRectangle(\n { x: 0, y: 0, w: this.width, h: this.height },\n { x: 0, y: 0, ...maxSpace },\n );\n\n const out = fitIntoRectangle(videoSizePixelPerfect, {\n x: 0,\n y: 0,\n w: Math.min(containerW, FULL_HD_WIDTH),\n h: Math.min(containerH, FULL_HD_HEIGHT),\n });\n\n /**\n * Ensure that the size is always even.\n */\n out.w = this.makeEven(out.w);\n out.h = this.makeEven(out.h);\n return out;\n }\n\n private sendResize(size: Size) {\n this.commandsSender.sendCommandToUnreal({\n command: MetaBoxCommand.FChangeResolutionCommand,\n payload: { resolution: { x: size.w, y: size.h } },\n });\n }\n\n private makeEven(value: number) {\n return Math.floor((value + 1) / 2) * 2;\n }\n}\n","<div class=\"frame unreal-container\">\n <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-intro-src />\n <app-image-loading-src />\n <app-resume-stream-button />\n <app-unreal-status />\n <app-freeze-frame />\n <app-clickable-overlay />\n\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n\n @if (isDevMode) {\n <app-video-stats />\n }\n</div>\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { disconnectStream, unrealFeature } from '../../store';\nimport { DisconnectReason } from '../../interfaces';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\nimport { take } from 'rxjs';\n\n@Component({\n selector: 'app-webrtc-error-modal',\n templateUrl: './webrtc-error-modal.component.html',\n styleUrl: './webrtc-error-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class WebrtcErrorModalComponent {\n private dialogRef = inject(DialogRef);\n private store = inject(Store);\n\n close() {\n this.dialogRef.close();\n }\n\n closeModalWithCirrusDisconnect() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(take(1))\n .subscribe((isConnected) => {\n if (!isConnected) {\n this.store.dispatch(\n disconnectStream({\n reason: DisconnectReason.DropConnection,\n message: 'Modal Drop Connection',\n }),\n );\n }\n this.close();\n });\n }\n}\n","<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { DefaultFilterModel, FilterModel } from '../DataFlowConstants';\n\n@Component({\n selector: 'app-filter-settings',\n templateUrl: './filter-settings.component.html',\n styleUrl: './filter-settings.component.scss',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSettingsComponent implements OnInit {\n private readonly storageKey = 'LBMFilterSettings';\n readonly defaultFilterModel = { ...DefaultFilterModel };\n settings = { ...DefaultFilterModel };\n\n ngOnInit(): void {\n const savedSettings = localStorage.getItem(this.storageKey);\n if (savedSettings) {\n this.dispatch(JSON.parse(savedSettings));\n }\n }\n\n togglePanel() {\n this.settings.panelOpen = !this.settings.panelOpen;\n this.saveSettings();\n }\n\n saveSettings() {\n const valid = Object.entries(this.settings).reduce((acc, [key, value]) => {\n return Truthy(value) ? { ...acc, [key]: value } : acc;\n }, {});\n this.dispatch({ ...DefaultFilterModel, ...valid });\n }\n\n dispatch(model: typeof DefaultFilterModel) {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(model));\n } catch (e) {\n Logger.error('Storage not available, Error saving filter settings:', e);\n }\n Object.assign(this.settings, model);\n Object.assign(FilterModel, model);\n Signal.broadcast('setKalmanParams', model);\n }\n\n reset() {\n this.dispatch({\n ...DefaultFilterModel,\n panelOpen: this.settings.panelOpen,\n });\n }\n}\n","<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n @if (settings.panelOpen) {\n <div class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n }\n</div>\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { filter, tap } from 'rxjs/operators';\nimport { LowBandwidthModalComponent } from '../low-bandwidth-modal/low-bandwidth-modal.component';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport { changeLowBandwidth, unrealFeature } from '../../store';\nimport { Dialog } from '@angular/cdk/dialog';\nimport {\n combineLatestWith,\n concat,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n of,\n share,\n skip,\n switchMap,\n take,\n takeUntil,\n timer,\n} from 'rxjs';\nimport { DevModeService, VideoService } from '../../services';\nimport type { Quality } from '../../interfaces';\nimport type { DataFlowCheckResult } from '../../helpers';\nimport { FilterSettingsComponent } from './filter-settings/filter-settings.component';\nimport { BITRATE_MONITOR, FilterModel } from './DataFlowConstants';\n\n@Component({\n selector: 'app-low-bandwidth-detector',\n templateUrl: './low-bandwidth-detector.component.html',\n styleUrl: './low-bandwidth-detector.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FilterSettingsComponent],\n})\nexport class LowBandwidthDetectorComponent implements OnInit {\n private readonly store = inject(Store);\n private readonly dialog = inject(Dialog);\n private readonly destroyRef = inject(DestroyRef);\n private readonly videoService = inject(VideoService);\n readonly isDevMode = inject(DevModeService).isDevMode;\n\n private readonly viewportReady$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n private readonly isLowBandwidth$ = this.store.select(\n unrealFeature.selectLowBandwidth,\n );\n private readonly lowBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Truthy),\n );\n private readonly highBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly viewPortDestroyedTrigger$ = this.viewportReady$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly aggregatedStats$ = this.videoService.videoStats$.pipe(\n map((data) => data.aggregatedStats),\n share(),\n );\n private readonly nativeQuality$ = this.videoService.videoStats$.pipe(\n map((data) => data.quality),\n );\n\n private readonly monitoringTrigger$ = this.viewportReady$\n .pipe(\n combineLatestWith(this.isLowBandwidth$),\n map(\n ([viewPortReady, isLowBandwidth]) => viewPortReady && !isLowBandwidth,\n ),\n )\n .pipe(share());\n\n private readonly reTrigger$ = this.monitoringTrigger$.pipe(\n map(() => ({ quality: 'lime' as Quality })),\n );\n\n private readonly canSwitchToLowBand$ = this.monitoringTrigger$.pipe(\n debounceTime(100),\n switchMap((canSwitch) =>\n concat(\n of(false),\n timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch)),\n ).pipe(take(2), takeUntil(this.monitoringTrigger$)),\n ),\n distinctUntilChanged(),\n tapLog('DROP: [LOWBANDWIDTH] Monitoring Active =>'),\n share(),\n );\n\n private readonly videoQuality$ = merge(\n this.nativeQuality$,\n this.reTrigger$,\n ).pipe(share(), takeUntil(this.viewPortDestroyedTrigger$));\n\n private readonly fps$ = this.aggregatedStats$.pipe(\n map((data) => data.framesPerSecond || 0),\n );\n\n private readonly bitrateDrop$ = this.aggregatedStats$.pipe(\n map((data) => data.dataFlowCheckResult),\n filter((br) => br.isDropDetected),\n takeUntil(merge(this.viewPortDestroyedTrigger$, this.reTrigger$)),\n );\n\n readonly fps = toSignal(this.fps$, { initialValue: 0 });\n readonly nativeQuality = toSignal(this.nativeQuality$);\n readonly isLowBandwidth = toSignal(this.isLowBandwidth$);\n readonly aggregatedStats = toSignal(this.aggregatedStats$);\n readonly isReducedQuality = signal(false);\n readonly isIndicatorExpanded = signal(false);\n\n readonly isIndicatorExpandedTrigger$ = toObservable(\n this.isIndicatorExpanded,\n ).pipe(skip(1), distinctUntilChanged(), filter(Falsy));\n\n ngOnInit() {\n this.lowBandwidthTrigger$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.toggleIndicator(true));\n\n merge(this.viewPortDestroyedTrigger$, this.highBandwidthTrigger$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isReducedQuality.set(false));\n\n this.canSwitchToLowBand$\n .pipe(\n filter(Truthy),\n tap(() => {\n BITRATE_MONITOR.reset();\n this.isReducedQuality.set(false);\n }),\n switchMap(() => this.bitrateDrop$),\n tap(this.trySetLowBandwidth.bind(this)),\n map((dataFlowResult) => dataFlowResult?.isDropDetected),\n distinctUntilChanged(),\n tap(() => {\n this.isReducedQuality.set(true);\n }),\n switchMap(() => this.videoQuality$),\n filter((quality) => quality === 'lime'),\n tap(() => this.isReducedQuality.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private trySetLowBandwidth(dataFlowResult: DataFlowCheckResult) {\n // Evaluate FPS and native quality\n const isFpsLow = this.fps() < FilterModel.minimumFps;\n const isNativeQualityRed = this.nativeQuality() === 'red';\n const shouldSwitch = isNativeQualityRed || isFpsLow;\n\n // Exit if conditions are not met or already in low bandwidth\n if (!shouldSwitch || this.isLowBandwidth()) return;\n\n const { quality, activeMedian } = dataFlowResult;\n const isQualityRed = quality === 'red';\n const isLowBitrate = activeMedian < FilterModel.minimumBitrate;\n\n // Final check for a red drop or low bitrate, or low FPS\n if (isQualityRed || isLowBitrate || isFpsLow) {\n let reason: string;\n\n if (isFpsLow) {\n reason = `FPS < ${FilterModel.minimumFps}`;\n } else if (quality === 'red') {\n reason = `Drop > ${FilterModel.redFlag}%`;\n } else {\n reason = `Speed < ${FilterModel.minimumBitrate}`;\n }\n\n Logger.info(\n `LBM DETECTED: ${reason}, switching to low bandwidth; `,\n dataFlowResult.message,\n );\n\n this.store.dispatch(\n changeLowBandwidth({\n lowBandwidth: true,\n stats: {\n dataFlowResult,\n reason,\n triggerTime: this.aggregatedStats()?.runTime ?? 0,\n },\n }),\n );\n }\n }\n\n toggleIndicator(value: boolean) {\n this.isIndicatorExpanded.set(value);\n\n if (value) {\n this.hideIndicatorAfterDelay();\n }\n }\n\n hideIndicatorAfterDelay() {\n timer(3000)\n .pipe(take(1), takeUntil(this.isIndicatorExpandedTrigger$))\n .subscribe(() => this.toggleIndicator(false));\n }\n\n openLBMDialog() {\n this.dialog\n .open(LowBandwidthModalComponent)\n .closed.pipe(filter(Truthy))\n .subscribe(() => {\n this.toggleIndicator(false);\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));\n });\n }\n}\n","@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-filter-settings />\n}\n","import { provideState } from '@ngrx/store';\nimport { provideEffects } from '@ngrx/effects';\nimport { UnrealEffects, unrealFeature } from '../store';\nimport {\n AfkPlaywrightService,\n AFKService,\n AggregatorPlaywrightService,\n AggregatorService,\n AnalyticsService,\n CommandTelemetryPlaywrightService,\n CommandTelemetryService,\n ConsoleExtensionsPlaywrightService,\n ConsoleExtensionsService,\n FileHandlerService,\n FileReceiverPlaywrightService,\n FileReceiverService,\n FpsMonitorService,\n FreezeFramePlaywrightService,\n FreezeFrameService,\n InputService,\n RegionsPingService,\n SignallingPlaywrightService,\n SignallingService,\n StreamStatusTelemetryPlaywrightService,\n StreamStatusTelemetryService,\n UnrealCommunicatorPlaywrightService,\n UnrealCommunicatorService,\n VideoService,\n WebRtcPlayerService,\n} from '../services';\nimport {\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\n\nexport function provideAngularUnrealModule(config?: { playwright: boolean }) {\n return makeEnvironmentProviders([\n provideState(unrealFeature),\n provideEffects([UnrealEffects]),\n ConsoleExtensionsService,\n InputService,\n VideoService,\n WebRtcPlayerService,\n RegionsPingService,\n FileReceiverService,\n FileHandlerService,\n FpsMonitorService,\n AnalyticsService,\n {\n provide: StreamStatusTelemetryService,\n useClass: config?.playwright\n ? StreamStatusTelemetryPlaywrightService\n : StreamStatusTelemetryService,\n },\n {\n provide: CommandTelemetryService,\n useClass: config?.playwright\n ? CommandTelemetryPlaywrightService\n : CommandTelemetryService,\n },\n {\n provide: AggregatorService,\n useClass: config?.playwright\n ? AggregatorPlaywrightService\n : AggregatorService,\n },\n {\n provide: FreezeFrameService,\n useClass: config?.playwright\n ? FreezeFramePlaywrightService\n : FreezeFrameService,\n },\n {\n provide: UnrealCommunicatorService,\n useClass: config?.playwright\n ? UnrealCommunicatorPlaywrightService\n : UnrealCommunicatorService,\n },\n {\n provide: AFKService,\n useClass: config?.playwright ? AfkPlaywrightService : AFKService,\n },\n {\n provide: SignallingService,\n useClass: config?.playwright\n ? SignallingPlaywrightService\n : SignallingService,\n },\n {\n provide: ConsoleExtensionsService,\n useClass: config?.playwright\n ? ConsoleExtensionsPlaywrightService\n : ConsoleExtensionsService,\n },\n {\n provide: FileReceiverService,\n useClass: config?.playwright\n ? FileReceiverPlaywrightService\n : FileReceiverService,\n },\n provideEnvironmentInitializer(() => {\n inject(AggregatorService);\n inject(InputService);\n inject(StreamStatusTelemetryService);\n inject(ConsoleExtensionsService);\n inject(AFKService);\n inject(FreezeFrameService);\n inject(AnalyticsService);\n inject(FpsMonitorService);\n }),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["switchMap","map","timeout","tap","takeUntil","filter","debounceTime","skip","i1","distinctUntilChanged"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAO,MAAM,0BAA0B,GAAG;AACnC,MAAM,8BAA8B,GAAG;AACvC,MAAM,oCAAoC,GAAG;AAC7C,MAAM,8BAA8B,GAAG;AAEvC,MAAM,mBAAmB,GAAG;AAE5B,MAAM,sCAAsC,GAAG;AAC/C,MAAM,mCAAmC,GAAG;AAC5C,MAAM,oCAAoC,GAAG;AAC7C,MAAM,wCAAwC,GAAG;AAEjD,MAAM,YAAY,GAAG;IAC1B,0BAA0B;IAC1B,8BAA8B;IAC9B,oCAAoC;IACpC,8BAA8B;IAC9B,mBAAmB;IACnB,sCAAsC;IACtC,mCAAmC;IACnC,oCAAoC;IACpC,wCAAwC;;;ACrBnC,MAAM,gBAAgB,GAAG;AAC9B,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,kBAAkB,EAAE,oBAAoB;AACxC,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,+BAA+B,EAAE,iCAAiC;AAClE,IAAA,iCAAiC,EAAE,mCAAmC;AACtE,IAAA,mBAAmB,EAAE,qBAAqB;AAC1C,IAAA,eAAe,EAAE,iBAAiB;;;ACbpC;;;;AAIE;AAIK,MAAM,yBAAyB,GAAG;AACvC,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,gBAAgB,EAAE,kBAAkB;AACpC,IAAA,kBAAkB,EAAE,oBAAoB;AACxC,IAAA,gCAAgC,EAAE,kCAAkC;AACpE,IAAA,oBAAoB,EAAE,sBAAsB;AAC5C,IAAA,qBAAqB,EAAE,uBAAuB;;;ACtBzC,MAAM,0BAA0B,GAAG;AACxC,IAAA,kBAAkB,EAAE,oBAAoB;AACxC,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,gBAAgB,EAAE,kBAAkB;AACpC,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,gBAAgB,EAAE,kBAAkB;AACpC,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,mBAAmB,EAAE,qBAAqB;AAC1C,IAAA,uBAAuB,EAAE,yBAAyB;AAClD,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,cAAc,EAAE,gBAAgB;;;ACd5B,SAAU,aAAa,CAE3B,GAA8B,EAAA;AAE9B,IAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;AAChC;;ACJM,SAAU,aAAa,CAA0B,GAAkB,EAAA;AACvE,IAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B;;ACHM,SAAU,mBAAmB,CAEjC,GAAmC,EAAA;IAEnC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC;;SCJgB,oBAAoB,GAAA;IAClC,IAAI,CAAC,IAAI,CAAC;QACR,IAAI,EAAE,yBAAyB,CAAC,aAAa;QAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;AAClC,KAAA,CAAC;AACJ;;ACCA,MAAM,MAAM,GAAG,CAAC,cAAoC,KAClD,CAAA,SAAA,EAAY,cAAc,CAAC,CAAC,CAAC,EAAE;AAC1B,MAAM,kBAAkB,GAAG,YAAY,CAC5C,MAAM,CAAA,CAAA,oBAAA,CAAsB,EAC5B,KAAK,EAAqC;AAErC,MAAM,kBAAkB,GAAG,YAAY,CAC5C,MAAM,CAAA,CAAA,oBAAA,CAAsB,EAC5B,KAAK,EAGD;AAEC,MAAM,SAAS,GAAG,YAAY,CACnC,MAAM,CAAA,CAAA,UAAA,CAAY,EAClB,KAAK,EAAsB;AAEtB,MAAM,wBAAwB,GAAG,YAAY,CAClD,MAAM,CAAA,CAAA,wBAAA,CAA0B,EAChC,KAAK,EAAoC;AAEpC,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,kBAAA,CAAoB;AAClE,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,eAAA,CAAiB;AAC/D,MAAM,qBAAqB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,kBAAA,CAAoB;AACrE,MAAM,4BAA4B,GAAG,YAAY,CACtD,MAAM,CAAA,CAAA,iCAAA,CAAmC,EACzC,KAAK,EAA+B;AAE/B,MAAM,cAAc,GAAG,YAAY,CACxC,MAAM,CAAA,CAAA,gBAAA,CAAkB,EACxB,KAAK,EAID;AAEC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,kBAAA,CAAoB,EAC1B,KAAK,EAAoC;AAEpC,MAAM,gCAAgC,GAAG,YAAY,CAC1D,MAAM,CAAA,CAAA,uCAAA,CAAyC,EAC/C,KAAK,EAA8B;AAE9B,MAAM,cAAc,GAAG,YAAY,CACxC,MAAM,CAAA,CAAA,gBAAA,CAAkB,EACxB,KAAK,EAGD;AAEC,MAAM,wBAAwB,GAAG,YAAY,CAClD,MAAM,CAAA,CAAA,4BAAA,CAA8B,EACpC,KAAK,EAAkB;AAElB,MAAM,eAAe,GAAG,YAAY,CACzC,MAAM,CAAA,CAAA,kBAAA,CAAoB,EAC1B,KAAK,EAAkB;AAElB,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,mBAAA,CAAqB,EAC3B,KAAK,EAAmB;AAGnB,MAAM,kBAAkB,GAAG,YAAY,CAC5C,MAAM,CAAA,CAAA,qBAAA,CAAuB,EAC7B,KAAK,EAAmB;AAEnB,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,mBAAA,CAAqB,EAC3B,KAAK,EAAmB;AAEnB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,eAAA,CAAiB;AAC1D,MAAM,uBAAuB,GAAG,YAAY,CACjD,MAAM,CAAA,CAAA,2BAAA,CAA6B,EACnC,KAAK,EAGD;AAEC,MAAM,yBAAyB,GAAG,YAAY,CACnD,MAAM,CAAA,CAAA,2BAAA,CAA6B,EACnC,KAAK,EAAsB;AAE7B;;AAEG;AACI,MAAM,uBAAuB,GAAG,YAAY,CACjD,MAAM,CAAA,CAAA,0BAAA,CAA4B,EAClC,KAAK,EAA6B;AAE7B,MAAM,oBAAoB,GAAG,YAAY,CAC9C,MAAM,CAAA,CAAA,sBAAA,CAAwB,EAC9B,KAAK,EAA6B;AAE7B,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,gBAAA,CAAkB;AAC9D,MAAM,SAAS,GAAG,YAAY,CACnC,MAAM,CAAA,CAAA,UAAA,CAAY,EAClB,KAAK,EAAqC;AAErC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,gBAAA,CAAkB,EACxB,KAAK,EAGD;AAEC,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,cAAA,CAAgB;AAC1D,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,kBAAA,CAAoB;AAChE,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,sBAAA,CAAwB;AACvE,MAAM,4BAA4B,GAAG,YAAY,CACtD,MAAM,CAAA,CAAA,wBAAA,CAA0B,EAChC,KAAK,EAGD;AAEC,MAAM,mCAAmC,GAAG,YAAY,CAC7D,MAAM,CAAA,CAAA,uCAAA,CAAyC,EAC/C,KAAK,EAGD;AAEC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,oBAAA,CAAsB,EAC5B,KAAK,EAA4B;AAE5B,MAAM,0BAA0B,GAAG,YAAY,CACpD,MAAM,CAAA,CAAA,4BAAA,CAA8B,EACpC,KAAK,EAAkE;AAElE,MAAM,uBAAuB,GAAG,YAAY,CACjD,MAAM,CAAA,CAAA,yBAAA,CAA2B,EACjC,KAAK,EAAuB;AAEvB,MAAM,wBAAwB,GAAG,YAAY,CAClD,MAAM,CAAA,CAAA,0BAAA,CAA4B,EAClC,KAAK,EAAgC;AAEhC,MAAM,uBAAuB,GAAG,YAAY,CACjD,MAAM,CAAA,CAAA,wBAAA,CAA0B,EAChC,KAAK,EAID;AAEC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,cAAA,CAAgB,EACtB,KAAK,EAGD;AAEC,MAAM,cAAc,GAAG,YAAY,CACxC,MAAM,CAAA,CAAA,eAAA,CAAiB,EACvB,KAAK,EAAmC;AAEnC,MAAM,gBAAgB,GAAG,YAAY,CAC1C,MAAM,CAAA,CAAA,iBAAA,CAAmB,EACzB,KAAK,EAAkB;AAElB,MAAM,6BAA6B,GAAG,YAAY,CACvD,MAAM,CAAA,CAAA,iCAAA,CAAmC;AAEpC,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,qBAAA,CAAuB;AACrE,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,kBAAA,CAAoB;AAC/D,MAAM,sBAAsB,GAAG,YAAY,CAChD,MAAM,CAAA,CAAA,yBAAA,CAA2B,EACjC,KAAK,EAA2C;AAE3C,MAAM,cAAc,GAAG,YAAY,CACxC,MAAM,CAAA,CAAA,eAAA,CAAiB,EACvB,CACE,IAAA,GAA8C;AAC5C,IAAA,wBAAwB,EAAE,IAAI;CAC/B,MACG;IACJ,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;AACxD,CAAA,CAAC;AAEG,MAAM,WAAW,GAAG,YAAY,CACrC,MAAM,CAAA,CAAA,WAAA,CAAa,EACnB,KAAK,EAAqC;AAErC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,YAAA,CAAc;AACrD,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,gBAAA,CAAkB;AAC5D,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAA,CAAA,yBAAA,CAA2B;AACvE,MAAM,2BAA2B,GAAG,YAAY,CACrD,MAAM,CAAA,CAAA,2BAAA,CAA6B;AAE9B,MAAM,yBAAyB,GAAG,YAAY,CACnD,MAAM,CAAA,CAAA,4BAAA,CAA8B;AAE/B,MAAM,kBAAkB,GAAG,YAAY,CAC5C,MAAM,CAAA,CAAA,oBAAA,CAAsB,EAC5B,KAAK,EAAgE;AAGvE;AACO,MAAM,aAAa,GAAG,YAAY,CACvC,MAAM,CAAA,CAAA,cAAA,CAAgB,EACtB,KAAK,EAA4D;AAGnE;AACO,MAAM,4BAA4B,GAAG,YAAY,CACtD,MAAM,CAAA,CAAA,gCAAA,CAAkC;AAG1C;AACO,MAAM,oBAAoB,GAAG,YAAY,CAC9C,MAAM,CAAA,CAAA,sBAAA,CAAwB;AAGhC;AACO,MAAM,mBAAmB,GAAG,YAAY,CAC7C,MAAM,CAAA,CAAA,qBAAA,CAAuB,EAC7B,KAAK,EAAsB;AAG7B;AACO,MAAM,mBAAmB,GAAG,YAAY,CAC7C,MAAM,CAAA,CAAA,qBAAA,CAAuB,EAC7B,KAAK,EAAoC;;AC1OpC,MAAM,eAAe,GAAG;AAC7B,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,GAAG,EAAE,EAAE;AACP,IAAA,UAAU,EAAE,GAAG;AACf,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,QAAQ,EAAE,GAAG;;AAGf;AACO,MAAM,WAAW,GAAG;IACzB,UAAU,EAAE,CAAC;IACb,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,CAAC;IAClB,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;;AAGhB;AACO,MAAM,gBAAgB,GAAG;IAC9B,aAAa,EAAE,CAAC;IAChB,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,CAAC;IAClB,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,EAAE;;;ACzBV,MAAM,kBAAkB,GAAG;;;;AAIhC,IAAA,WAAW,EAAE,CAAC;;;AAId,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,OAAO,EAAE,CAAC;;;ACTZ;AAEO,MAAM,YAAY,GAAG;AAC1B;;AAEG;AACH,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,qBAAqB,EAAE,CAAC;AACxB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,qBAAqB,EAAE,CAAC;AACxB,IAAA,cAAc,EAAE,CAAC;AACjB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,WAAW,EAAE,CAAC;AACd,IAAA,sBAAsB,EAAE,CAAC;AAEzB;;AAEG;;AAGH,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,OAAO,EAAE,EAAE;;AAGX,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,QAAQ,EAAE,EAAE;;AAGZ,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,EAAE;;AAGd,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,SAAS,EAAE,EAAE;;;ACvCR,MAAM,oBAAoB,GAAG;AAClC,IAAA,uBAAuB,EAAE,CAAC;AAC1B,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,WAAW,EAAE,CAAC;AACd,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,iBAAiB,EAAE,CAAC;AACpB,IAAA,WAAW,EAAE,CAAC;AACd,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,QAAQ,EAAE,GAAG;;;MCZF,aAAa,GAAG,IAAI,cAAc,CAC7C,8BAA8B;;ACDzB,MAAM,YAAY,GAAe;IACtC,aAAa,EAAE,kBAAkB,CAAC,OAAO;AACzC,IAAA,mBAAmB,EAAE,IAAI;AACzB,IAAA,oBAAoB,EAAE,KAAK;;;ACNtB,MAAM,mBAAmB,GAAG;AACjC,IAAA,qBAAqB,EAAE,wBAAwB;AAC/C,IAAA,qBAAqB,EAAE,uBAAuB;;;ACFzC,MAAM,6BAA6B,GAAG;AACtC,MAAM,mBAAmB,GAAG;AAC5B,MAAM,WAAW,GAAG;AACpB,MAAM,kBAAkB,GAAG;AAC3B,MAAM,+BAA+B,GAAG;AACxC,MAAM,gCAAgC,GAAG;AACzC,MAAM,6BAA6B,GACxC;AACK,MAAM,aAAa,GAAG;AACtB,MAAM,cAAc,GAAG;AACvB,MAAM,UAAU,GAAG;AACnB,MAAM,YAAY,GAAG;AACrB,MAAM,aAAa,GAAG;AACtB,MAAM,0BAA0B,GAAG;AACnC,MAAM,mBAAmB,GAAG;AAC5B,MAAM,+BAA+B,GAAG,KAAK;AAC7C,MAAM,wBAAwB,GAAG;AACjC,MAAM,0BAA0B,GAAG;AAE1C;AACO,MAAM,yBAAyB,GAAG;AAClC,MAAM,8BAA8B,GAAG;AACvC,MAAM,0BAA0B,GAAG;AACnC,MAAM,gCAAgC,GAAG;AACzC,MAAM,sCAAsC,GAAG;;ACsF/C,MAAM,YAAY,GAAgB;AACvC,IAAA,oBAAoB,EAAE,IAAI;AAC1B,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,iBAAiB,EAAE,SAAS;AAC5B,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,kBAAkB,EAAE,KAAK;AACzB,IAAA,iBAAiB,EAAE,KAAK;AACxB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,sBAAsB,EAAE,KAAK;AAC7B,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,oBAAoB,EAAE,KAAK;AAC3B,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,6BAA6B,EAAE,IAAI;AACnC,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,MAAM,EAAE,IAAI;IACZ,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/C,oBAAoB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvD,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC,IAAI;AACvC,IAAA,WAAW,EAAE;AACX,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,gBAAgB,EAAE,CAAC;AACpB,KAAA;AACD,IAAA,YAAY,EAAE;AACZ,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,WAAW,EAAE,mBAAmB;AACjC,KAAA;AACD,IAAA,cAAc,EAAE;AACd,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,oBAAoB,EAAE,CAAC;AACvB,QAAA,sBAAsB,EAAE,CAAC;AAC1B,KAAA;AACD,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,YAAY,EAAE,SAAS;AACvB,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,aAAa,EAAE,IAAI;AACnB,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,cAAc,EAAE,IAAI;;MAET,aAAa,GAAG,aAAa,CACxC,YAAY,EACZ,EAAE,CACA,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAmB;AAChD,IAAA,GAAG,KAAK;AACR,IAAA,YAAY,EAAE,YAAY;IAC1B,iBAAiB,EAAE,YAAY,GAAG,KAAK,GAAG,SAAS;AACpD,CAAA,CAAC,CACH,EACD,EAAE,CAAC,4BAA4B,EAAE,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAiB;IAC1E,OAAO,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE;AACrD,CAAC,CAAC,EACF,EAAE,CACA,cAAc,EACd,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,KAAiB;AAC1D,IAAA,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;AACvE,CAAC,CACF,EACD,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,KAAiB;IAC1C,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,YAAY,EAAE,IAAI;KACnB;AACH,CAAC,CAAC,EACF,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,KAAiB;IAC7C,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;AAC3C,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAiB;IAC9D,OAAO;AACL,QAAA,GAAG,KAAK;QACR,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,MAAM;KACf;AACH,CAAC,CAAC,EACF,EAAE,CACA,mCAAmC,EACnC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAiB;AACxC,IAAA,OAAO,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;AACzE,CAAC,CACF,EACD,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAiB;IACrD,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,WAAW,EAAE;AACX,YAAA,OAAO,EACL,WAAW,CAAC,QAAQ,KAAK,CAAC;gBAC1B,WAAW,CAAC,QAAQ,KAAK,CAAC;gBAC1B,WAAW,CAAC,QAAQ,KAAK;kBACrB,WAAW,CAAC;AACd,kBAAE,KAAK,CAAC,WAAW,CAAC,OAAO;AAC/B,YAAA,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,IAAI;AACvC,SAAA;KACF;AACH,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAiB;IACxD,IACE,KAAK,CAAC,oBAAoB;AAC1B,QAAA,KAAK,CAAC,gBAAgB,KAAK,gBAAgB,CAAC,OAAO,EACnD;AACA,QAAA,OAAO,KAAK;IACd;IACA,OAAO;AACL,QAAA,GAAG,KAAK;QACR,YAAY;AACZ,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,cAAc,EAAE,IAAI;KACrB;AACH,CAAC,CAAC,EACF,EAAE,CAAC,uBAAuB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAiB;IACvE,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,oBAAoB,EAAE;YACpB,OAAO,EAAE,oBAAoB,CAAC,OAAO;AACrC,YAAA,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,IAAI,IAAI;AAChD,SAAA;KACF;AACH,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,KAAiB;AAC7D,IAAA,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE;AACpC,CAAC,CAAC,EACF,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAiB;IAC9D,OAAO,EAAE,GAAG,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE;AACpD,CAAC,CAAC,EACF,EAAE,CAAC,gCAAgC,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAiB;IACvE,OAAO,EAAE,GAAG,KAAK,EAAE,6BAA6B,EAAE,OAAO,EAAE;AAC7D,CAAC,CAAC,EACF,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,KAAiB;IACjE,OAAO;AACL,QAAA,GAAG,KAAK;QACR,aAAa;AACb,QAAA,oBAAoB,EAAE,IAAI;AAC1B,QAAA,sBAAsB,EAAE,KAAK;AAC7B,QAAA,cAAc,EAAE,IAAI;KACrB;AACH,CAAC,CAAC,EACF,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAiB;AAC5D,IAAA,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,MAAM,EAAE,EAAE;AACzE,CAAC,CAAC,EACF,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,KAAiB;IACrC,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,YAAY,EAAE;AAC9D,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,KAAiB;IAC1C,OAAO;AACL,QAAA,GAAG,KAAK;QACR,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE;KAC1E;AACH,CAAC,CAAC,EACF,EAAE,CACA,cAAc,EACd,CAAC,KAAK,EAAE,EAAE,wBAAwB,GAAG,IAAI,EAAE,KAAiB;IAC1D,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,gBAAgB,EAAE;cACd,gBAAgB,CAAC;cACjB,KAAK,CAAC,gBAAgB;KAC3B;AACH,CAAC,CACF,EACD,EAAE,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAiB;IAC9D,IAAI,KAAK,CAAC,gBAAgB,KAAK,gBAAgB,CAAC,OAAO,EAAE;AACvD,QAAA,OAAO,KAAK;IACd;IACA,OAAO,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE;AAC/C,CAAC,CAAC,EAEF,EAAE,CAAC,oBAAoB,EAAE,CAAC,KAAK,KAAiB;IAC9C,OAAO,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE;AAC5C,CAAC,CAAC,EAEF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,KAAiB;AAC5D,IAAA,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE;AAC1E,CAAC,CAAC,EACF,EAAE,CACA,0BAA0B,EAC1B,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,KAAiB;IAC7D,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,WAAW,EAAE;YACX,GAAG,KAAK,CAAC,WAAW;AACpB,YAAA,OAAO,EAAE,SAAS;YAClB,YAAY;YACZ,eAAe;YACf,GAAG;AACJ,SAAA;KACF;AACH,CAAC,CACF,EACD,EAAE,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,KAAiB;IACxE,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,WAAW,EAAE;YACX,GAAG,KAAK,CAAC,WAAW;YACpB,gBAAgB;AACjB,SAAA;KACF;AACH,CAAC,CAAC,EACF,EAAE,CAAC,uBAAuB,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAiB;IAC9D,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,WAAW,EAAE;YACX,GAAG,KAAK,CAAC,WAAW;YACpB,OAAO;AACR,SAAA;KACF;AACH,CAAC,CAAC,EACF,EAAE,CAAC,6BAA6B,EAAE,CAAC,KAAK,KAAiB;IACvD,OAAO,EAAE,GAAG,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE;AAC/C,CAAC,CAAC,EACF,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAK,KAAiB;IAC5C,OAAO,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE;AAC9C,CAAC,CAAC,EACF,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,KAAiB;IACzC,OAAO,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE;AAC/C,CAAC,CAAC,EACF,EAAE,CACA,uBAAuB,EACvB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,oBAAoB,EAAE,KAAiB;IACpE,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,SAAS,EAAE,IAAI;QACf,aAAa;QACb,oBAAoB;KACrB;AACH,CAAC,CACF,EACD,EAAE,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAiB;IAC1D,OAAO,EAAE,GAAG,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE;AAChD,CAAC,CAAC,EACF,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAiB;IACjD,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;AACvC,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAiB;IACnD,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE;AACzC,CAAC,CAAC,EACF,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAiB;IACrD,OAAO,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE;AAC3C,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAiB;IACnD,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE;AACzC,CAAC,CAAC,EACF,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,KAAiB;AACvC,IAAA,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;AAC3D,CAAC,CAAC,EACF,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAkB,EAAE,EAAE,KAAK,EAAE,KAAiB;IACpE,OAAO,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE;AAC5C,CAAC,CAAC,EACF,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAiB;IACzD,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,cAAc,EAAE;YACd,GAAG,KAAK,CAAC,cAAc;AACvB,YAAA,oBAAoB,EAAE,KAAK,CAAC,cAAc,CAAC,oBAAoB,GAAG,CAAC;AACnE,YAAA,kBAAkB,EAAE;AAClB,gBAAA,GAAG,KAAK,CAAC,cAAc,CAAC,kBAAkB;AAC1C,gBAAA,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;AACjD,aAAA;AACF,SAAA;KACF;AACH,CAAC,CAAC,EACF,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAiB;IAClD,OAAO;AACL,QAAA,GAAG,KAAK;QACR,cAAc,EAAE,mBAAmB,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;KAC9D;AACH,CAAC,CAAC,EACF,EAAE,CAAC,kBAAkB,EAAE,CAAC,KAAK,KAAiB;IAC5C,OAAO,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE;AAC5C,CAAC,CAAC,EACF,EAAE,CAAC,qBAAqB,EAAE,CAAC,KAAK,KAAiB;IAC/C,OAAO;AACL,QAAA,GAAG,YAAY;QACf,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC;AACH,CAAC,CAAC,EACF,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,KAAiB;IACxC,OAAO,EAAE,GAAG,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE;AACpD,CAAC,CAAC,EACF,EAAE,CAAC,4BAA4B,EAAE,CAAC,KAAK,KAAiB;IACtD,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,cAAc,EAAE,IAAI;AACpB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,aAAa,EAAE,KAAK;AACpB,QAAA,aAAa,EAAE,iBAAiB;KACjC;AACH,CAAC,CAAC,EACF,EAAE,CAAC,yBAAyB,EAAE,CAAC,KAAK,KAAiB;IACnD,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,cAAc,EAAE,IAAI;AACpB,QAAA,kBAAkB,EAAE,IAAI;AACxB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,oBAAoB,EAAE,IAAI;AAC1B,QAAA,cAAc,EAAE,IAAI;KACrB;AACH,CAAC,CAAC,EACF,EAAE,CAAC,kBAAkB,EAAE,MAAkB;AACvC,IAAA,OAAO,YAAY;AACrB,CAAC,CAAC;;AC3aG,MAAM,aAAa,GAAG,aAAa,CAAC;AACzC,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,OAAO,EAAE,aAAa;AACvB,CAAA;;MCCY,UAAU,CAAA;AAAvB,IAAA,WAAA,GAAA;AACE,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC;AAChB,aAAA,MAAM,CAAC,aAAa,CAAC,qBAAqB;AAC1C,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1C;AAAC;;ACSK,MAAO,UAAW,SAAQ,UAAU,CAAA;AAaxC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;AAZD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC;AACN,QAAA,IAAA,CAAA,YAAY,GAAG,0BAA0B,CAAC;AACnD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC;AAEf,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAC;QAEd,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC;QAC9D,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC/C,aAAa,CAAC,mBAAmB,CAClC;QAIC,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,KAAK,CACH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACpC,UAAU,CAAC,0BAA0B,CAAC,YAAY,CAAC;aAElD,IAAI,CACH,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,EACpE,MAAM,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,aAAa,CAAC;aAE7C,SAAS,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;aACxC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;aAC3C,SAAS,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C;IAEQ,WAAW,GAAA;AACjB,QAAA,UAAU,CAAC,0BAA0B,CAAC,gBAAgB,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACxC;AAEA;;AAEG;IACK,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO;QAC1B,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEA;;AAEG;IACK,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;gBAC/B,IAAI,CAAC,cAAc,EAAE;YACvB,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC;QACrC;IACF;AAEA;;;AAGG;AACK,IAAA,eAAe,CAAC,SAAiB,EAAA;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC;AAEA;;;AAGG;AACK,IAAA,eAAe,CAAC,OAAe,EAAA;AACrC,QAAA,UAAU,CAAC,0BAA0B,CAAC,gBAAgB,EAAE;YACtD,OAAO;AACP,YAAA,kBAAkB,EAAE,IAAI;AACxB,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,cAAc,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE;AACnC,SAAA,CAAC;IACJ;IAEQ,WAAW,GAAA;AACjB,QAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;AAClC,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9B;IAEQ,IAAI,GAAA;QACV,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,EAAE;IACpB;IAEQ,KAAK,GAAA;QACX,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;QAClC,IAAI,CAAC,oBAAoB,EAAE;IAC7B;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC3B;QACF;;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY;QAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;QAEpC,IAAI,YAAY,CAAC,aAAa,KAAK,kBAAkB,CAAC,WAAW,EAAE;YACjE,QAAQ,CAAC,eAAe,EAAE;QAC5B;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAK;YACrC,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE;;gBAExB,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;oBACf,MAAM,EAAE,gBAAgB,CAAC,GAAG;oBAC5B,OAAO,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,iBAAiB,EAAE,CAAA,wBAAA,EAA2B,IAAI,CAAC,YAAY,CAAA,QAAA,CAAU;AACvG,iBAAA,CAAC,CACH;AACD,gBAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;YACpC;iBAAO;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YACtC;QACF,CAAC,EAAE,IAAI,CAAC;IACV;8GA/HW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAV,UAAU,EAAA,CAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB;;;ACXK,MAAO,kBAAmB,SAAQ,UAAU,CAAA;AAOhD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAPT,IAAA,CAAA,SAAS,GAAG,KAAK;QAET,IAAA,CAAA,IAAI,GAAG,CAAC;AAER,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,KAAK,EAAE;QAItC,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;AACxC,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;aACnB,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IACvC;AAEA,IAAA,OAAO,CAAC,IAAgB,EAAA;QACtB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AAExB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAChB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE;AAClC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,MAAM,CAAC,IAAI,CAAC,CAAA,sCAAA,EAAyC,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;YACjE,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;AACvC,YAAA,MAAM,CAAC,KAAK,CACV,CAAA,qDAAA,EAAwD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAA,CAAE,CACxF;AACD,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAEnE,YAAA,IAAI,CAAC,IAAI,GAAG,SAAS;AACrB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QACxB;aAAO;YACL,IAAI,CAAC,kBAAkB,EAAE;QAC3B;IACF;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,cAAc,CAAC;AACb,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;AAC/C,SAAA,CAAC,CACH;IACH;AAEA,IAAA,KAAK,CAAC,IAAgB,EAAA;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;YAChC,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,UAAU,CAAC,0BAA0B,CAAC,gBAAgB,CAAC;AACvD,YAAA,MAAM,CAAC,IAAI,CACT,CAAA,6CAAA,EAAgD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAA,CAAE,CAChF;AACD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CACT,CAAA,uCAAA,EAA0C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAA,CAAE,CAC1E;AACD,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,IAAI,GAAG,SAAS;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;IACxB;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CACjB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CACxE;QACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,GAAG,yBAAyB,GAAG,MAAM;AAChE,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,cAAc,CAAC;AACb,YAAA,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG;AACpC,YAAA,QAAQ,EAAE,CAAC;AACZ,SAAA,CAAC,CACH;IACH;8GAhGW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAlB,kBAAkB,EAAA,CAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MCWY,eAAe,CAAA;AAG1B;;;;;;AAMG;IACH,WAAA,CACY,6BAAA,GAAgC,EAAE,EAClC,0BAAA,GAA6B,EAAE,EAC/B,mBAAA,GAAsB,GAAG,EACzB,UAAA,GAAa,GAAG,EAAA;QAHhB,IAAA,CAAA,6BAA6B,GAA7B,6BAA6B;QAC7B,IAAA,CAAA,0BAA0B,GAA1B,0BAA0B;QAC1B,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QACnB,IAAA,CAAA,UAAU,GAAV,UAAU;QAbZ,IAAA,CAAA,WAAW,GAAa,EAAE;IAcjC;IAEH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;IAC7B;AAEA,IAAA,MAAM,CAAC,IAAoB,EAAA;QACzB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,UAAU;AACpD,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,OAAO;IAChD;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,YAAoB,EAAA;QAC3B,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE;AAC3C,YAAA,OAAO,EAAyB;QAClC;AACA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM;AAE7C,QAAA,IAAI,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QAC1B;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AAEnC,QAAA,IAAI,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE;YAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB;AAClD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAClE;AAEA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC;AAC9D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;AACrD,QAAA,MAAM,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC;AAClD,QAAA,MAAM,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC;QAEpD,MAAM,cAAc,GAAG,MAAM,CAC3B,CAAC,EACD,GAAG,EACH,CAAC,CAAC,eAAe,GAAG,gBAAgB,IAAI,eAAe,IAAI,GAAG,CAC/D;AAED,QAAA,MAAM,SAAS,GAAG,cAAc,IAAI,IAAI,CAAC,0BAA0B;AACnE,QAAA,IAAI,cAAc,IAAI,IAAI,CAAC,6BAA6B,EAAE;YACxD,OAAO;AACL,gBAAA,MAAM,EAAE;oBACN,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;oBACjE,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;oBAC3D,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;oBAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,iBAAA;AACD,gBAAA,cAAc,EAAE,IAAI;gBACpB,cAAc;AACd,gBAAA,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;AAClC,gBAAA,YAAY,EAAE,gBAAgB;gBAC9B,OAAO,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ;AACrC,gBAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,QAAA,EAAW,eAAe,CAAA,IAAA,EAAO,gBAAgB,CAAA,CAAA,CAAG;aAC1H;QACH;QAEA,OAAO;AACL,YAAA,MAAM,EAAE;gBACN,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;gBACjE,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;gBAC3D,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,aAAA;AACD,YAAA,cAAc,EAAE,KAAK;YACrB,cAAc;AACd,YAAA,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;AAClC,YAAA,YAAY,EAAE,gBAAgB;AAC9B,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,OAAO,EAAE,aAAa;SACvB;IACH;AACD;;ACrED;;AAEG;AACI,MAAM,kBAAkB,GAAmB;AAChD,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,mBAAmB,EAAE,IAAI;AACzB,IAAA,sBAAsB,EAAE,IAAI;AAC5B,IAAA,sBAAsB,EAAE,CAAC;AACzB,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,gBAAgB,EAAE,GAAG;AACrB,IAAA,SAAS,EAAE,KAAK;CACR;AAEV;;AAEG;AACI,MAAM,WAAW,GAAG,EAAE,GAAG,kBAAkB,EAAE;AAEpD;;AAEG;AACI,MAAM,eAAe,GAAG,IAAI,eAAe,CAChD,WAAW,CAAC,UAAU,EACtB,WAAW,CAAC,OAAO,EACnB,EAAE,CACH;;AC9CK,MAAO,YAAa,SAAQ,UAAU,CAAA;AAwC1C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAxCT,IAAA,CAAA,KAAK,GAA4B,IAAI;QACrC,IAAA,CAAA,KAAK,GAA4B,IAAI;QAE7B,IAAA,CAAA,SAAS,GAA0B,IAAI;AACvC,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,cAAc,EAAE;AAEzC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,OAAO,EAGtB;QAEH,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,eAAe,GAAG,EAAuB;QACzC,IAAA,CAAA,cAAc,GAAG,IAAI,cAAc,CACzC,WAAW,CAAC,sBAAsB,EAClC,WAAW,CAAC,sBAAsB,EAClC,WAAW,CAAC,YAAY,EACxB,WAAW,CAAC,gBAAgB,CAC7B;AAED;;AAEG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI;;AAEjC,QAAA,SAAS,CAAC,CAAC,KAAK,KACd;AACE;AACE,gBAAA,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAChB,GAAG,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,EACzB,SAAS,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EACtD,MAAM,CAAC,MAAM,CAAC;AAElB,cAAE,EAAE,CAAC,IAAI,CAAC,CACb,EACD,MAAM,CAAC,MAAM,CAAC,EACd,KAAK,EAAE,CACR;QAIC,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;QACZ,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC9C,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;AAChC,YAAA,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,YAAY,CAAC,YAAmC,IAAI,EAAA;AAClD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;AAEA,IAAA,iBAAiB,CAAC,cAAsB,EAAA;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,cAAc,CAAC;IACtD;AAEA,IAAA,UAAU,CAAC,IAAS,EAAA;AAClB,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtE;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9D,IAAI,CAAC,OAAO,EAAE;QACd,IAAI,CAAC,iBAAiB,EAAE;QACxB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEA,iBAAiB,CAAC,MAAmB,EAAE,QAA2B,EAAA;AAChE,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM;YAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC7C;aAAO;AACL,YAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC;QAChD;IACF;AAEA,IAAA,iBAAiB,CAAC,MAAmB,EAAA;;QAEnC,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,EAAE;YACpC;QACF;;aAEK,IACH,IAAI,CAAC,KAAK;YACV,IAAI,CAAC,KAAK,EAAE,SAAS;AACrB,YAAA,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,EAChC;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM;AAC7B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B;IACF;IAEA,IAAI,GAAA;QACF,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC;IAEA,MAAM,QAAQ,CAAC,KAA8B,EAAA;QAC3C,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,CAAC,IAAI,EAAE;YAClB;QACF;QAAE,OAAO,CAAM,EAAE;AACf,YAAA,IAAI,CAAC,EAAE,IAAI,KAAK,iBAAiB;AAAE,gBAAA,MAAM,CAAC;;AAG1C,YAAA,KAAK,CAAC,KAAK,GAAG,IAAI;AAClB,YAAA,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,CAAC;AACrC,YAAA,IAAI;AACF,gBAAA,MAAM,KAAK,CAAC,IAAI,EAAE;gBAClB;YACF;AAAE,YAAA,MAAM;;YAER;;AAGA,YAAA,MAAM,MAAM,GAAG,YAAW;AACxB,gBAAA,IAAI;;;AAGF,oBAAA,MAAM,KAAK,CAAC,IAAI,EAAE;gBACpB;AAAE,gBAAA,MAAM;;gBAER;wBAAU;oBACR,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC;oBACvD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC;gBACrD;AACF,YAAA,CAAC;AAED,YAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE;AAC7C,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,OAAO,EAAE,IAAI;AACd,aAAA,CAAC;AACF,YAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3E;IACF;IAEQ,MAAM,QAAQ,CACpB,QAAkC,EAAA;QAElC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE;AACtD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC3C,YAAA,OAAO,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC;QACpD;QAAE,OAAO,GAAG,EAAE;;YAEZ,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACnE,gBAAA,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC;AACtE,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,MAAM,GAAG;QACX;IACF;AAEQ,IAAA,+BAA+B,CACrC,KAAqB,EAAA;QAErB,MAAM,OAAO,GAAsB,EAAuB;;AAG1D,QAAA,OAAO,CAAC,MAAM,GAAG,EAAE;AACnB,QAAA,OAAO,CAAC,oBAAoB,GAAG,CAAC,CAAC;AAEjC,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;;AAEvB,YAAA,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAC5D,gBAAA,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;AAE9B,gBAAA,OAAO,CAAC,kBAAkB;AACxB,oBAAA,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC;AAC3C,0BAAE,IAAI,CAAC,eAAe,CAAC;AACvB,0BAAE,MAAM,CAAC,aAAa;AAE1B,gBAAA,OAAO,CAAC,kBAAkB;AACxB,oBAAA,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC;AAC3C,0BAAE,IAAI,CAAC,eAAe,CAAC;AACvB,0BAAE,MAAM,CAAC,aAAa;AAE1B,gBAAA,OAAO,CAAC,cAAc;AACpB,oBAAA,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC;AAC3C,0BAAE,IAAI,CAAC,eAAe,CAAC;AACvB,0BAAE,MAAM,CAAC,SAAS;gBAEtB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;;oBAE1D,IACE,MAAM,CAAC,OAAO;wBACd,IAAI,CAAC,eAAe,CAAC,MAAM;AAC3B,wBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAC1D;AACA,wBAAA,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;oBAClE;AAEA,oBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE;;;wBAGtC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAC1B,CAAC,CAAC;6BACC,OAAO,CAAC,aAAc,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;6BAC5D,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CACvD;oBACH;AAEA,oBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE;wBAC3C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAC7B,CAAC,CAAC;6BACC,OAAO,EAAE,aAAc;AACtB,gCAAA,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;6BACzC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAC5D;oBACH;AAEA,oBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE;wBAC3C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAC/B,CAAC,OAAO,CAAC,aAAc;AACrB,4BAAA,IAAI,CAAC,eAAe,CAAC,kBAAkB;6BACtC,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc;gCACvD,IAAI,CAAC,CACV;oBACH;gBACF;YACF;AAEA,YAAA,IACE,MAAM,CAAC,IAAI,KAAK,gBAAgB;gBAChC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAC7C;gBACA,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,CAAC;YACjE;AAEA,YAAA,IACE,MAAM,CAAC,IAAI,KAAK,WAAW;gBAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAChD;gBACA,MAAM,YAAY,GAAI,KAAa,CAAC,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC;gBACvE,MAAM,KAAK,GAAI,KAAa,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;gBAC/D,MAAM,MAAM,GAAI,KAAa,CAAC,GAAG,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACjE,OAAO,CAAC,YAAY,GAAG;AACrB,oBAAA,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;AACtD,oBAAA,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;iBAC1D;YACH;;AAGA,YAAA,IACE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAChC,MAAM,CAAC,IAAI,KAAK,OAAO;AACvB,gBAAA,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,EAAE,EACT;AACA,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE;gBACzB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;AAC9B,qBAAA,OAAO,CAAC,QAAQ,EAAE,EAAE;AACpB,qBAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC1B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE;YAC7C,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB;YACxE,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,CAC9C,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAC1C;QACH;;AAGA,QAAA,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAC1B,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CACpD;QACD,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAChC,IAAI,CAAC,cAAc,CAAC,MAAM,CACxB,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,sBAAsB,CACtD,CACF;QAED,OAAO,CAAC,mBAAmB,GAAG,eAAe,CAAC,QAAQ,CACpD,OAAO,CAAC,aAAa,CACtB;AAED,QAAA,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAC9B,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAC3C;AACD,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAC9B,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;IACxC;AAEQ,IAAA,iBAAiB,CAAC,eAAkC,EAAA;QAC1D,OAAO;AACL,YAAA,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;AAE5C,YAAA,eAAe,EAAE;AACf,gBAAA,GAAG,eAAe;gBAClB,cAAc,EAAE,IAAI,CAAC,cAAc;AACpC,aAAA;SACF;IACH;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AAE3B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QACvD;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,4BAA4B,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CACxD;IACH;IAEQ,iBAAiB,GAAA;AACvB,QAAA,cAAc,EAAE;QAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,EAAE,GAAG,kBAAkB;AAC7B,QAAA,KAAK,CAAC,WAAW,GAAG,IAAI;AACxB,QAAA,KAAK,CAAC,KAAK,GAAG,IAAI;AAClB,QAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,QAAA,KAAK,CAAC,OAAO,GAAG,MAAM;AACtB,QAAA,KAAK,CAAC,uBAAuB,GAAG,IAAI;AAEpC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAEvC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,4BAA4B,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CACvD,CACF;AAED,QAAA,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB;aACnC,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,EAC5C,MAAM,CAAC,8BAA8B,CAAC;aAEvC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;gBACd,UAAU,CAAC,0BAA0B,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC;YACvE;AACF,QAAA,CAAC,CAAC;IACN;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;AACzB,QAAA,KAAK,CAAC,EAAE,GAAG,gBAAgB;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEQ,IAAA,SAAS,CAAC,KAAuB,EAAA;AACvC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACd,aAAA,IAAI,CACH,UAAU,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,EAC9C,IAAI,CAAC,CAAC,CAAC;AAER,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE;AACxB,YAAA,KAAK,EAAE,OAAO,EAAE,CAAC;AAClB,SAAA,CAAC;IACN;8GAhXW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAZ,YAAY,EAAA,CAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;MCbY,uBAAuB,CAAA;AAyBlC,IAAA,WAAA,GAAA;QAxBiB,IAAA,CAAA,KAAK,GAAW,mBAAmB;QAC5C,IAAA,CAAA,YAAY,GAAkC,EAAE;QAChD,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,WAAW,GAAG,IAAI;QAClB,IAAA,CAAA,qBAAqB,GAAG,CAAC;QAazB,IAAA,CAAA,QAAQ,GAAc,EAAE;AAEf,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,aAAa,EAAE;AAC3D,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;QAGA,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,wBAAwB,EAAE;YACvD;QACF;QAEA,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI;AAChE,QAAA,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI;QAC3D,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;QAClD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE;IACnB;AAEA,IAAA,IAAY,WAAW,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS;IACtC;AAEA,IAAA,IAAY,cAAc,GAAA;AACxB,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IAC/D;AAEA,IAAA,QAAQ,CAAC,cAA8B,EAAA;QACrC,IAAI,CAAC,eAAe,EAAE;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;IAChD;IAEU,KAAK,GAAA;AACb,QAAA,UAAU,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,SAAS,CAC7D,CAAC,EAAE,UAAU,EAAE,KAAI;AACjB,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,UAAU,CAAA,CAAE,CAAC;AAC7C,QAAA,CAAC,CACF;AAED,QAAA,UAAU,CAAC,0BAA0B,CAAC,aAAa,CAAC,CAAC,SAAS,CAC5D,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAI;AAC1B,YAAA,MAAM,UAAU,GAAG,CAAA,IAAA,EAAO,UAAU,EAAE;AACtC,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;AACvE,QAAA,CAAC,CACF;QAED,UAAU,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,MAAK;YACnE,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,CAAC;QAEF,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1B,QAAA,CAAC,CAAC;IACJ;IAEQ,KAAK,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE;AAC1B,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;IACxB;AAEQ,IAAA,iBAAiB,CAAC,UAAkB,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG;AACV,YAAA,OAAO,EAAE,UAAU;YACnB,UAAU;SACX;AACD,QAAA,MAAM,MAAM,GAAG;YACb,kBAAkB,EAAE,IAAI,CAAC,WAAW;SACnB;QACnB,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IACrB;IAEQ,gBAAgB,CACtB,UAAkB,EAClB,aAA6B,EAC7B,KAAK,GAAG,KAAK,EACb,QAAA,GAAgB,EAAE,EAAA;QAElB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE;YACpB;QACF;QACA,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW;AAErE;;AAEG;QACH,MAAM,iBAAiB,GAAG,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS;QACtE,IAAI,YAAY,GAAG,EAAE;AAErB,QAAA,MAAM,CAAC,GAAG,aAAa,EAAE,gBAAgB;QACzC,IAAI,CAAC,EAAE;AACL,YAAA,YAAY,GAAG;gBACb,mBAAmB,EACjB,CAAC,CAAC,iBAAiB,CAAC,SAAS,GAAG,CAAC,CAAC,gBAAgB,CAAC,SAAS;gBAE9D,uBAAuB,EACrB,CAAC,CAAC,iBAAiB,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS;gBAE5D,eAAe,EACb,CAAC,CAAC,gBAAgB,CAAC,SAAS,GAAG,eAAe,CAAC,WAAW;gBAE5D,gBAAgB,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,iBAAiB,CAAC,SAAS;aAC/D;QACH;AAEA,QAAA,MAAM,MAAM,GAAG;YACb,kBAAkB,EAAE,IAAI,CAAC,WAAW;YACpC,iBAAiB;YACjB,kBAAkB;AAClB,YAAA,GAAG,YAAY;SACE;AAEnB,QAAA,IAAI,CAAC,gBAAgB,CACnB,aAAa,EACb,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,EACxC,MAAM,EACN,aAAa,CACd;QACD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;QACtC;IACF;AAEQ,IAAA,gBAAgB,CACtB,IAAmB,EACnB,cAAmB,EACnB,cAA8B,EAC9B,aAA6B,EAAA;QAE7B,IAAI,CAAC,QAAQ,CAAC;YACZ,IAAI;AACJ,YAAA,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EAAE;YACnD,cAAc;YACd,aAAa;YACb,cAAc;AACf,SAAA,CAAC;IACJ;AAEQ,IAAA,SAAS,CAAC,OAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG;YACtC,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,OAAO;SACR;IACH;AAEQ,IAAA,IAAI,CAAC,OAAkB,EAAA;AAC7B,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE;YACxE;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO;AAC5B,QAAA,MAAM,GAAG,GAAmB;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,EAAE,EAAE,SAAS,CAAC,SAAS;YACvB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;YAC5C,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,YAAA,UAAU,EAAE;AACV,gBAAA,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;AAC1B,gBAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gBAC5B,UAAU,EAAE,MAAM,CAAC,gBAAgB;AACpC,aAAA;YACD,OAAO;SACR;AACD,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB;AACnE,QAAA,IAAI,CAAC;aACF,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,wBAAwB,IAAI,EAAE,EAAE,GAAG;AAClE,aAAA,IAAI,CACH,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,CAAC;aAER,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClC,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,GAAG,SAAS,CAC3C;AACH,QAAA,CAAC,CAAC;IACN;AAEA;;;;;;AAMG;IACO,eAAe,GAAA;AACvB,QAAA,UAAU,CAAC,0BAA0B,CAAC,cAAc;aACjD,IAAI,CACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;AAClB,YAAA,MAAM,QAAQ,GACZ,iBAAiB,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI;AAEzD,YAAA,OAAO,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;AACrC,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC,CAAC,EAAE,IAAI,EAAO,KAAI;AAC3B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe;AACrC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS;AACpC,YAAA,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,IAAI,EAAE;AAE7C,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC;YAChD,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,QAAQ,CAAC,OAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7B;AAEA;;;;;;;;AAQG;IACK,mBAAmB,GAAA;QACzB,MAAM,IAAI,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;QACzC,MAAM,aAAa,GAAa,EAAE;AAClC,QAAA,MAAM,CAAC,OAAO,CAAgB,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CACtD,CAAC,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,KAAI;YAChC,IAAI,IAAI,GAAG,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE;AAC1C,gBAAA,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;YAChC;AACF,QAAA,CAAC,CACF;AAED,QAAA,aAAa,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;AACnC,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;AACtC,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;;;;AASG;IACK,OAAO,CAAC,cAA8B,EAAE,IAAS,EAAA;QACvD,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE;AACnD,QAAA,MAAM,MAAM,GAAG;YACb,kBAAkB,EAAE,IAAI,CAAC,WAAW;SACnB;AACnB,QAAA,IAAI,CAAC,gBAAgB,CACnB,aAAa,EACb;AACE,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,CAAA,EAAG,GAAG,CAAC,UAAU,CAAA,CAAE;SAChC,EACD,MAAM,CACP;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACnB,cAAc,CAAC,GAAG,CAAC;IACrB;8GApSW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAvB,uBAAuB,EAAA,CAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC;;AAoWK,SAAU,cAAc,CAAC,UAAkB,EAAA;IAC/C,UAAU,CAAC,0BAA0B,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC;AACvE;AAEM,SAAU,aAAa,CAAC,UAAkB,EAAE,OAAa,EAAA;IAC7D,UAAU,CAAC,0BAA0B,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC/E;SAEgB,cAAc,GAAA;AAC5B,IAAA,UAAU,CAAC,0BAA0B,CAAC,cAAc,CAAC;AACvD;;ACrXM,SAAU,mBAAmB,CAEjC,GAAwB,EAAA;AAExB,IAAA,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;AACb,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACvB,KAAA,CAAC,CACH;AACH;;ACXM,SAAU,YAAY,CAE1B,GAA8B,EAAA;AAE9B,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AACzB;;ACPM,SAAU,WAAW,CAAC,GAAW,EAAA;AACrC,IAAA,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;AACtE;;ACGM,SAAU,eAAe,CAAC,KAAa,EAAA;AAC3C,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,EAAE,WAAW,IAAI,MAAM,CAAC,EAAE;QAC7D,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAC1D;IACH;AAEA,IAAA,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC;IAErC,OAAO,KAAK,CACV,MACE,IAAI,UAAU,CAAY,CAAC,QAAQ,KAAI;AACrC,QAAA,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpB,QAAA,CAAC;AAED,QAAA,MAAM,OAAO,GAAG,CAAC,EAAS,KAAI;YAC5B,MAAM,KAAK,GAAG,EAAS;AACvB,YAAA,MAAM,GAAG,GACP,KAAK,EAAE,KAAK,YAAY;kBACpB,KAAK,CAAC;AACR,kBAAE,IAAI,KAAK,CAAC,6BAA6B,CAAC;AAC9C,YAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACrB,QAAA,CAAC;AAED,QAAA,MAAM,OAAO,GAAG,CAAC,EAAc,KAAI;YACjC,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;AACpC,gBAAA,QAAQ,CAAC,KAAK,CACZ,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,EAAE,CAAC,IAAI,CAAA,CAAA,CAAG,CAAC,CAC5D;YACH;AACF,QAAA,CAAC;AAED,QAAA,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AACnC,QAAA,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;AACrC,QAAA,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;AAErC,QAAA,OAAO,MAAK;AACV,YAAA,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;AACtC,YAAA,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;AACxC,YAAA,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;AAC1C,QAAA,CAAC;AACH,IAAA,CAAC,CAAC,CACL,CAAC,IAAI,CACJ,OAAO,CAAC;QACN,KAAK,EAAE,UAAU;AACjB,QAAA,IAAI,EAAE,MACJ,UAAU,CACR,MACE,IAAI,KAAK,CAAC,CAAA,qCAAA,EAAwC,UAAU,CAAA,EAAA,CAAI,CAAC,CACpE;AACJ,KAAA,CAAC,CACH;AACH;;AC5DA;;;AAGG;SAMa,uBAAuB,GAAA;AACrC,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;QACf,MAAM,EAAE,gBAAgB,CAAC,+BAA+B;AACxD,QAAA,OAAO,EAAE,wCAAwC;AAClD,KAAA,CAAC,CACH;AACH;SACgB,yBAAyB,GAAA;AACvC,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;QACf,MAAM,EAAE,gBAAgB,CAAC,iCAAiC;AAC1D,QAAA,OAAO,EAAE,0CAA0C;AACpD,KAAA,CAAC,CACH;AACH;;ACnBA;AACO,MAAM,yBAAyB,GAAG;AACvC,IAAA,sBAAsB,EAAE;AACtB,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,WAAW,EAAE,8DAA8D;AAC5E,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,WAAW,EACT,kEAAkE;AACrE,KAAA;AACD,IAAA,gBAAgB,EAAE;AAChB,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,WAAW,EACT,6EAA6E;AAChF,KAAA;CACO;AAEV;AACA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS;IAClC,yBAAyB,CAAC,sBAAsB,CAAC,IAAI;IACrD,yBAAyB,CAAC,aAAa,CAAC,IAAI;AAC7C,CAAA,CAAC;AAEI,SAAU,yBAAyB,CAEvC,GAA8B,EAAA;IAE9B,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAC7D,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CACxC;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,uBAAuB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,WAAqB,EAAE,CAAC,CACvE;QACD,UAAU,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,YAAY,CAAC;IAC1D;AACF;;AC0BM,MAAO,iBAAkB,SAAQ,UAAU,CAAA;AA+B/C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AA/BQ,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEvD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,kDAAC;QAEnB,IAAA,CAAA,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CACvD,sBAAsB,CACvB;QACQ,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC9C,aAAa,CAAC,mBAAmB,CAClC;QACQ,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CACrD,aAAa,CAAC,0BAA0B,CACzC;AAED,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAA6B;AACnD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAiB;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAmB;AAC7C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,OAAO,EAAoC;AACjE,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAIvD,IAAA,CAAA,aAAa,GAEhB,EAAE;QAML,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;QACZ,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,YAAY,EAAE;AAC1B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,MAAM,CAAC,gBAAgB,CAAC,EACxBA,WAAS,CAAC,MACR,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;AACxC,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CACjC;aAEF,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,IAAI,EAAE,kCAAkC;gBACxC,aAAa,EAAE,YAAY,EAAE;AAC9B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,kBAAkB,CAAC,OAAiB,EAAA;AAClC,QAAA,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC;;AAEnC,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY,EAAE;AAEnC,QAAA,cAAc,EAAE;QAChB,IAAI,CAAC,2BAA2B,EAAE;AAElC,QAAA,OAAO,KAAK,CAAC,MACX,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CACnB,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAO,CAAC,CAAC,EACzCC,KAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EACxDD,WAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5D,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,EACtEA,WAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,KAAM,CAAC,CAAC,EACtD,MAAM,CAAC,MAAM,CAAC,EACd,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CACvB,CACF,CAAC,IAAI;;AAEJ,QAAA,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAI;AACtB,gBAAA,MAAM,CAAC,IAAI,CACT,CAAA,kCAAA,EAAqC,YAAY,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA,CAAG,EAC3E,GAAG,EAAE,OAAO,CACb;AACD,gBAAA,OAAO,KAAK,CAAC,YAAY,CAAC;YAC5B,CAAC;;AAEF,SAAA,CAAC,CACH;IACH;IAEU,2BAA2B,GAAA;AACnC,QAAA,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,qBAAqB,CAAC;AACjE,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE;IAEQ,iBAAiB,CAAC,OAAiB,EAAE,MAAe,EAAA;AAC1D,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACzB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;gBACtC,OAAO,GAAG,CAAC,OAAO,CAChB,oBAAoB,EACpB,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAE,CACpC;YACH;AACA,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0FG;AACK,IAAA,cAAc,CAAC,QAAkB,EAAA;QACvC,cAAc,CAAC,cAAc,CAAC;;AAG9B,QAAA,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;QAErC,OAAO,KAAK,CAAC,MAAK;YAChB,MAAM,YAAY,GAAG,CAAA,EAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA,CAAE;;AAG7C,YAAA,IAAI,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;AACvC,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CACnD,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,EACxDC,KAAG,CAAC,MAAK;oBACP,OAAO;AACL,wBAAA,KAAK,EAAE,YAAY;AACnB,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,YAAY,EAAE,mBAAmB;qBAClC;gBACH,CAAC,CAAC,CACH;YACH;YAEA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI;;YAEnD,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAI;AAC3B,gBAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC;gBAClD;AACF,YAAA,CAAC,CAAC;;AAGF,YAAA,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC;;YAGxD,IAAI,CAAC,CAAC,CAAC;;YAGP,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,CAAA,EAAG,YAAY,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CACvC,CACF;;YAGDC,SAAO,CAAC,YAAY,CAAC;;AAGrB,YAAA,MAAM,CAAC,CAAC,IAAiC,KAAI;AAC3C,gBAAA,aAAa,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBAEvD,IAAI,IAAI,CAAC,gBAAgB,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;oBAC9C,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,IAAI,kBAAkB,CAAC;AAE9D,oBAAA,IAAI,IAAI,EAAE,IAAI,EAAE;AACd,wBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gCAAgC,CAAC;AAC/B,4BAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;AAC3B,yBAAA,CAAC,CACH;oBACH;;oBAGA,MAAM,IAAI,KAAK,CACb,CAAA,yBAAA,EAA4B,IAAI,EAAE,UAAU,IAAI,eAAe,CAAA,CAAE,CAClE;gBACH;AAEA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;;AAGF,YAAAD,KAAG,CAAC,CAAC,IAAiC,KAAiB;AACrD,gBAAA,MAAM,KAAK,GAAG,WAAW,CACvB,GAAG,QAAQ,CAAC,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAC,gBAAgB,CAAA,CAAE,CACjD;gBAED,OAAO;oBACL,KAAK;AACL,oBAAA,UAAU,EAAE,YAAY;oBACxB,YAAY,EAAE,IAAI,CAAC,gBAAiB;iBACrC;YACH,CAAC,CAAC,CACH;QACH,CAAC,CAAC,CAAC,IAAI;;AAEL,QAAA,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAI;AACtB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,qBAAqB,CAAC;AACjE,gBAAA,MAAM,CAAC,GAAG,CACR,CAAA,yBAAA,EAA4B,YAAY,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,EACjE,GAAG,EAAE,OAAO,CACb;AACD,gBAAA,OAAO,KAAK,CAAC,YAAY,CAAC;YAC5B,CAAC;;AAEF,SAAA,CAAC,CACH;IACH;AAEQ,IAAA,eAAe,CAAC,KAAa,EAAA;QACnC,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAChC,MAAM,CAAC,YAAY,CAAC,EACpB,GAAG,CAAC,CAAC,EAAE,KAAI;YACT,cAAc,CAAC,cAAc,CAAC;AAC9B,YAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACxB,CAAC,CAAC,CACH;IACH;AAEA,IAAA,aAAa,CAAC,EAAa,EAAA;QACzB,EAAE,CAAC,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,EAAE,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC,EAAE,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,QAAA,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC/B,QAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1B;AAEA,IAAA,iBAAiB,CAAC,aAA4B,EAAA;AAC5C,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1D;AAEA;;;AAGG;AACH,IAAA,KAAK,CAAC,IAAiB,EAAA;AACrB,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;QAC7B,IAAI,IAAI,CAAC,EAAE;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC;QACjE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;AAC5B,QAAA,IAAI,CAAC,EAAE,GAAG,IAAa;IACzB;AAEA,IAAA,IAAI,CAAC,IAAyB,EAAA;QAC5B,IAAI,UAAU,GAAG,IAAI;AACrB,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AAClC,YAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACnC;AACA,QAAA,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,aAAa,EAAE;AACnD,YAAA,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAChE,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1B;AAAE,YAAA,MAAM;AACN,gBAAA,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;YAC9B;QACF;IACF;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,IAAI,CAAC,EAAE,EAAE;YACX,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,IAAI;YAC9B,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,MAAM,IAAI;YAC5B,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,MAAM,IAAI;YAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,IAAI;AAC3B,YAAA,IAAI,CAAC,EAAE,GAAG,IAAa;QACzB;IACF;AAEU,IAAA,aAAa,CAAC,GAAgB,EAAA;AACtC,QAAA,IAAI;YACF,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAY,CAAC;QAC7C;AAAE,QAAA,MAAM;AACN,YAAA,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,iBAAiB,EAChC,CAAA,6BAAA,EAAgC,GAAG,CAAC,IAAI,CAAA,CAAE,CAC3C;QACH;IACF;IAEQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/D,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClE,IAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1E,IAAI,CAAC,aAAa,CAAC,oBAAoB;AACrC,YAAA,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAEtC,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD;IAEU,iBAAiB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,yBAAyB,CAAC,aAAa;YAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,YAAA,OAAO,EAAE;AACP,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,gBAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAG;AACpC,gBAAA,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAG;AACtC,aAAA;AACF,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,aAAa;IACxD;IAEQ,SAAS,GAAA;AACf,QAAA,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAClC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D;8GAlaW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAjB,iBAAiB,EAAA,CAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;ACjDK,MAAO,mBAAoB,SAAQ,UAAU,CAAA;AAgBjD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AAhBT,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,OAAO,EAAe;AAG1C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACzC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAA,CAAA,GAAG,GAAqB,EAAE;QAC1B,IAAA,CAAA,MAAM,GAAG,KAAK;QACd,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,cAAc,GAAG,KAAK;QAGtB,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC9C,aAAa,CAAC,oBAAoB,CACnC;QAIC,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC3D,QAAA,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7D;IAEU,IAAI,GAAA;QACZ,MAAM,kBAAkB,GAAsB,EAAE;QAEhD,MAAM,aAAa,GAAG,MAAK;AACzB,YAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACjC,gBAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;AACrC,YAAA,CAAC,CAAC;AACF,YAAA,kBAAkB,CAAC,MAAM,GAAG,CAAC;AAC/B,QAAA,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAqB,KAAI;AAC/D,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACxB,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACnB,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,YAAA,aAAa,EAAE;AACjB,QAAA,CAAC,CAAC;AAEJ,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;AAC9D,YAAA,KAAK,IAAI,CAAC,iBAAiB,EAAE;AAC/B,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC;aAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;aACvD,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,iBAAiB,CAAC,KAAI;YAC5C,aAAa,CAAC,cAAc,EAAE;AAC5B,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA,CAAC;AAEF,YAAA,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,IAAI,iBAAiB,EAAE;AACrB,gBAAA,aAAa,EAAE;YACjB;AACF,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,MAAM,iBAAiB,GAAA;AAC7B,QAAA,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC7B,QAAA,IAAI,KAAW;AACf,QAAA,IAAI;YACF,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;QACnD;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;gBACf,MAAM,EAAE,gBAAgB,CAAC,WAAW;AACpC,gBAAA,OAAO,EAAE,0BAA0B;AACpC,aAAA,CAAC,CACH;QACH;AAEA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,iBAAiB,CACvB,EAAqB,EACrB,KAAa,EACb,OAA2B,EAAA;;QAG3B,MAAM,WAAW,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;AACxD,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC;IACpD;AAEQ,IAAA,aAAa,CAAC,MAAiC,EAAA;AACrD,QAAA,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC;IAC7C;AAEQ,IAAA,yBAAyB,CAAC,YAA6B,EAAA;AAC7D,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC;AACnD,YAAA,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,SAAS,EACT,SAAS,CAAC,IAAI,EACd,aAAa,EACb,SAAS,CAAC,QAAQ,EAClB,YAAY,EACZ,SAAS,CAAC,OAAO,EACjB,SAAS,EACT,SAAS,CAAC,IAAI,EACd,GAAG,CACJ;;AAGD,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;;gBAElB,IAAI,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC5C,oBAAA,MAAM,CAAC,IAAI,CACT,mDAAmD,EACnD,SAAS,EACT,SAAS,CAAC,IAAI,EACd,aAAa,EACb,SAAS,CAAC,QAAQ,EAClB,YAAY,EACZ,SAAS,CAAC,OAAO,EACjB,SAAS,EACT,SAAS,CAAC,IAAI,EACd,GAAG,CACJ;oBACD;gBACF;YACF;YACA,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAA;;AAEhD,YAAA,CAAC,CAAC;QACJ;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC;QACpD;IACF;AAEQ,IAAA,QAAQ,CAAC,KAAgC,EAAA;QAC/C,IAAI,QAAQ,GAAG,EAAE;;QAGjB,QAAQ,IAAI,2BAA2B;AAEvC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;;YAEf,QAAQ,IAAI,6BAA6B;QAC3C;;QAGA,QAAQ,IAAI,IAAI,CAAC;AACf,cAAE;cACA,0BAA0B;;QAG9B,QAAQ,IAAI,gBAAgB;;AAG5B,QAAA,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IAC5D;AAEA;;AAEG;IACH,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC;AACjE,QAAA,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QAEpB,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC;AAC9D,QAAA,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEA,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,MAAM;IAC7D;AAEA,IAAA,IAAI,CAAC,IAAiB,EAAA;AACpB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;QAC3B;aAAO;AACL,YAAA,MAAM,CAAC,OAAO,CACZ,OAAO,EACP,QAAQ,EACR,CAAA,iDAAA,EAAoD,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAA,CAAE,CAChF;;YAGD,IAAI,CAAC,yBAAyB,EAAE;QAClC;IACF;AAEA;;;AAGG;IACK,yBAAyB,GAAA;;AAE/B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,YAAA,MAAM,CAAC,IAAI,CACT,8DAA8D,CAC/D;YACD;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE;AACrC,YAAA,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC;YACpE;QACF;;AAGA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU;AACzC,QAAA,IAAI,OAAO,IAAI,OAAO,KAAK,MAAM,EAAE;AACjC,YAAA,MAAM,CAAC,IAAI,CACT,+BAA+B,OAAO,CAAA,iDAAA,CAAmD,CAC1F;YACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACxD;QACH;IACF;AAEA;;;;;AAKG;IACH,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE;AACrC,YAAA,MAAM,CAAC,KAAK,CACV,4DAA4D,CAC7D;AACD,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACnD,YAAA,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC;AACtE,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC;;QAGvD,IAAI,CAAC,OAAO,EAAE;;AAGd,QAAA,KAAK,IAAI,CAAC,iBAAiB,EAAE;AAE7B,QAAA,OAAO,IAAI;IACb;IAEQ,SAAS,CAAC,aAAa,EAAmB,EAAA;QAChD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;;;;QAK7D,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,UAAU,CAAC,qBAAqB,EAAE;QAElD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,MAAM,CAAC,IAAI,CACT,+EAA+E,CAChF;AACD,YAAA,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO;QACvC;QAEA,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB;AACpD,cAAE;cACA,UAAU;;;;AAKd,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;;AAGpB,QAAA,MAAM,qBAAqB,GACzB,QAAQ,CAAC,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,KAAK,WAAW;AACxE,QAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,KAAK,QAAQ;QACxD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,qBAAqB,IAAI,CAAC,iBAAiB,EAAE;AAC/D,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,YAAA,MAAM,CAAC,KAAK,CACV,4GAA4G,CAC7G;AACD,YAAA,MAAM,CAAC,KAAK,CACV,8IAA8I,CAC/I;QACH;IACF;IAEQ,MAAM,oBAAoB,CAAC,MAAwB,EAAA;QACzD,IAAI,CAAC,OAAO,EAAE;QACd,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAE7C,cAAc,CAAC,uBAAuB,CAAC;QACvC,cAAc,CAAC,wBAAwB,CAAC;QACxC,cAAc,CAAC,wBAAwB,CAAC;AAExC,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9C,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEhD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CACpC,IAAI,CAAC,QAAQ,EACb,oBAAoB,EACpB;;AAEE,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CACF;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YAC5C,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC;QAEF,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;IACvC;AAEQ,IAAA,0BAA0B,CAAC,QAA2B,EAAA;AAC5D,QAAA,SAAS,CAAC,QAAQ,EAAE,sBAAsB;AACvC,aAAA,IAAI,CACHA,KAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EACxC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAE5B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,CAAC;YACrD,aAAa,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACjE,QAAA,CAAC,CAAC;AAEJ,QAAA,SAAS,CAAC,QAAQ,EAAE,0BAA0B;AAC3C,aAAA,IAAI,CACHA,KAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAC5C,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAE5B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,CAAC;YACrD,aAAa,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACjE,QAAA,CAAC,CAAC;AAEJ,QAAA,SAAS,CAAC,QAAQ,EAAE,yBAAyB;AAC1C,aAAA,IAAI,CACHA,KAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAC3C,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAE5B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAG,CAAC;YACpD,aAAa,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAChE,QAAA,CAAC,CAAC;AAEJ,QAAA,SAAS,CAAC,QAAQ,EAAE,uBAAuB;AACxC,aAAA,IAAI,CACHA,KAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EACzC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAE5B,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,GAAG,CAAC;AACxD,QAAA,CAAC,CAAC;AAEJ,QAAA,SAAS,CAA4B,QAAQ,EAAE,cAAc;AAC1D,aAAA,IAAI,CACHA,KAAG,CAAC,CAAC,CAA4B,KAAK,CAAC,CAAC,SAAS,CAAC,EAClD,MAAM,CAAC,MAAM,CAAC,EACdE,KAAG,CAAC,CAAC,SAA0B,KAC7B,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,SAAS,EACT,SAAS,CAAC,IAAI,EACd,aAAa,EACb,SAAS,CAAC,QAAQ,EAClB,YAAY,EACZ,SAAS,CAAC,OAAO,EACjB,SAAS,EACT,SAAS,CAAC,IAAI,EACd,GAAG,CACJ,CACF,EACD,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;aAE5B,SAAS,CAAC,CAAC,SAAS,KACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAC7D;AAEH,QAAA,SAAS,CAAsB,QAAQ,EAAE,aAAa;AACnD,aAAA,IAAI,CACHA,KAAG,CAAC,MACF,MAAM,CAAC,IAAI,CACT,oEAAoE,CACrE,CACF,EACDF,KAAG,CAAC,CAAC,CAAsB,KAAK,CAAC,CAAC,OAAO,CAAC,EAC1C,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAE5B,aAAA,SAAS,CAAC,CAAC,WAAW,KAAI;YACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC;AAC7D,QAAA,CAAC,CAAC;AAEJ,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAgB,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAC/D,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAC3B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EACxBE,KAAG,CAAC,CAAC,CAAC,KACJ,MAAM,CAAC,IAAI,CACT,cAAc;YACZ,CAAC,CAAC,KAAK,CAAC,IAAI;YACZ,MAAM;YACN,CAAC,CAAC,KAAK,CAAC,EAAE;YACV,cAAc;YACd,CAAC,CAAC,KAAK,CAAC,UAAU,CACrB,CACF,EACD,KAAK,EAAE,CACR;QAED;AACG,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EACtDF,KAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEzB,aAAA,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAErE;aACG,IAAI,CACH,MAAM,CAAC,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EACtDA,KAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EACxBE,KAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;AAErE,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;AACpB,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC5D;AACF,QAAA,CAAC,CAAC;IACN;IAEQ,MAAM,sBAAsB,CAAC,EAAqB,EAAA;QACxD,MAAM,eAAe,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC;;QAGvD,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;AAGrD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QACvD;aAAO;AACL,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC5B,kBAAE;AACE,oBAAA,eAAe,EAAE,KAAK;AACtB,oBAAA,YAAY,EAAE,CAAC;AACf,oBAAA,gBAAgB,EAAE,KAAK;AACvB,oBAAA,OAAO,EAAE,CAAC;AACV,oBAAA,gBAAgB,EAAE,KAAK;AACvB,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,UAAU,EAAE,EAAE;AACd,oBAAA,MAAM,EAAE,GAAG;AACZ;kBACD,KAAK;;YAGT,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;AACvD,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,KAAK,EAAE,gBAAgB;AACxB,aAAA,CAAC;YACF,IAAI,MAAM,EAAE;gBACV,IAAI,eAAe,EAAE;oBACnB,KAAK,MAAM,WAAW,IAAI,EAAE,CAAC,eAAe,EAAE,EAAE;AAC9C,wBAAA,IACE,WAAW;AACX,4BAAA,WAAW,CAAC,QAAQ;4BACpB,WAAW,CAAC,QAAQ,CAAC,KAAK;4BAC1B,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAC3C;4BACA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE;gCACtC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;oCACxC,MAAM,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;AAC5C,oCAAA,WAAW,CAAC,SAAS,GAAG,UAAU;gCACpC;4BACF;wBACF;oBACF;gBACF;qBAAO;oBACL,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE;wBACtC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;4BACxC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;wBACrD;oBACF;gBACF;YACF;iBAAO;gBACL,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;YACvD;QACF;IACF;AAEQ,IAAA,yBAAyB,CAC/B,WAA2B,EAAA;AAE3B,QAAA,IAAI;YACF,MAAM,CAAC,GAAG,CACR,CAAA,sCAAA,EAAyC,WAAW,CAAC,KAAK,CAAA,cAAA,CAAgB,CAC3E;YACD,cAAc,CAAC,wBAAwB,CAAC;;AAExC,YAAA,WAAW,CAAC,UAAU,GAAG,aAAa;AAEtC,YAAA,SAAS,CAAC,WAAW,EAAE,OAAO;iBAC3B,IAAI;;AAEH,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EACpC,IAAI,CAAC,CAAC,CAAC;AAER,iBAAA,SAAS,CAAC,CAAC,CAAC,KAAI;AACf,gBAAA,MAAM,CAAC,IAAI,CACT,CAAA,yCAAA,EAA4C,WAAW,CAAC,KAAK,CAAA,CAAA,EAAI,WAAW,CAAC,EAAE,CAAA,CAAA,CAAG,EAClF,CAAC,CACF;AACD,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;oBACf,MAAM,EAAE,gBAAgB,CAAC,iBAAiB;AAC1C,oBAAA,OAAO,EAAE,mBAAmB;AAC7B,iBAAA,CAAC,CACH;AACH,YAAA,CAAC,CAAC;AAEJ,YAAA,SAAS,CAAC,WAAW,EAAE,OAAO;AAC3B,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAChC,iBAAA,SAAS,CAAC,CAAC,CAAC,KAAI;gBACf,MAAM,OAAO,GAAG,CAAA,4BAAA,EAA+B,WAAW,CAAC,KAAK,CAAA,YAAA,EAAe,WAAW,CAAC,EAAE,CAAA,CAAE;AAC/F,gBAAA,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1B,YAAA,CAAC,CAAC;AAEJ,YAAA,SAAS,CAAC,WAAW,EAAE,MAAM;AAC1B,iBAAA,IAAI,CACHA,KAAG,CAAC,MAAK;AACP,gBAAA,MAAM,CAAC,IAAI,CACT,CAAA,4BAAA,EAA+B,WAAW,CAAC,KAAK,CAAA,gBAAA,EAAmB,WAAW,CAAC,EAAE,CAAA,CAAE,CACpF;YACH,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;iBAE5B,SAAS,CAAC,MAAK;gBACd,aAAa,CAAC,wBAAwB,CAAC;gBACvC,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,CAAC,CAAC;AAEJ,YAAA,SAAS,CAAe,WAAW,EAAE,SAAS;AAC3C,iBAAA,IAAI,CACHF,KAAG,CAAC,CAAC,CAAe,KAAK,CAAC,CAAC,IAAI,CAAC,EAChC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AAE5B,iBAAA,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE7D,YAAA,OAAO,WAAW;QACpB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE,CAAC,CAAC;AACvE,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,sBAAsB,GAAA;QAC5B,IAAI,aAAa,GAAG,2CAA2C;QAC/D,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC3C,aAAa;AACX,gBAAA,yEAAyE;QAC7E;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9D;IAEQ,MAAM,WAAW,CAAC,QAA2B,EAAA;AACnD,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC;gBACvC,mBAAmB,EAAE,KAAK;AAC1B,gBAAA,mBAAmB,EAAE,IAAI;AAC1B,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,YAAA,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAChC;AAAE,QAAA,MAAM;AACN,YAAA,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACvC;IACF;8GAnkBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAnB,mBAAmB,EAAA,CAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACjBM,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,CAAM,KAAI;IAC1C,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;;IAGxB,IACE,OAAO,CAAC,KAAK,QAAQ;AACrB,QAAA,CAAC,KAAK,IAAI;QACV,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI,EACV;;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE;AACnE,gBAAA,OAAO,KAAK;YACd;AACA,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,gBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC1C;AACA,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAE/C,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;;AAEvB,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AACjD,gBAAA,OAAO,KAAK;YACd;AACA,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AAC9B,gBAAA,OAAO,KAAK;YACd;QACF;AACA,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,OAAO,KAAK;AACd,CAAC;;ACjCK,MAAO,mBAAoB,SAAQ,UAAU,CAAA;AAWjD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AAXF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAgB;QAE1C,IAAA,CAAA,KAAK,GAAG,KAAK;QACb,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,QAAQ,GAAG,EAAsB;QACjC,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,SAAS,GAAG,EAAE;QACd,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,IAAI,GAA8B,EAAE;QAI1C,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;AACxC,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;aACnB,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAClC;IAEO,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAsB;AACtC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC;AACf,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE;QACd,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;;IAE5C;IAEQ,YAAY,GAAA;QAClB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;IACvB;AAEA;;;AAGG;AACH,IAAA,qBAAqB,CAAC,IAAgB,EAAA;;AAEpC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,YAAY,EAAE;QACrB;;AAGA,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClE;AAEA;;;AAGG;AACH,IAAA,oBAAoB,CAAC,IAAgB,EAAA;;AAEnC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,YAAY,EAAE;QACrB;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;AAEpE,QAAA,IAAI,CAAC,QAAQ,GAAG,YAAgC;IAClD;;AAIO,IAAA,oBAAoB,CAAC,IAAgB,EAAA;;QAE1C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,MAAM,QAAQ,GAAG,CAAC;QAClB,MAAM,OAAO,GAAG,CAAC;AACjB,QAAA,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI;AAChC,QAAA,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO;AACrC,QAAA,MAAM,cAAc,GAAG,cAAc,GAAG,UAAU;;QAGlD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CACrB,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;AACrE,YAAA,cAAc,CACjB;;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;;AAGxC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;;;QAKzB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AACpC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB;;;;;;;AAOI;AAEJ;;;AAGG;YACH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBACtB,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;AAClB,aAAA,CAAC;YACF,IAAI,CAAC,KAAK,EAAE;QACd;aAAO,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AACzC,YAAA,MAAM,CAAC,KAAK,CACV,CAAA,sCAAA,EAAyC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA,CAAE,CAC3E;YACD,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AACD;;AC3GD,MAAM,YAAY,GAAG;AACnB,IAAA;AACE,QAAA,OAAO,EAAE,kBAAkB;AAC5B,KAAA;CACF;AAGK,MAAO,iBAAkB,SAAQ,UAAU,CAAA;AAkB/C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QAlBQ,IAAA,CAAA,kBAAkB,GACjC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC;AAC5B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,GAAG,EAG9C;AAEH;;AAEG;AACc,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAI7C,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;QACZ,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,UAAU,EAAE;IACnB;IAEU,YAAY,GAAA;QACpB,IAAI,CAAC,YAAY,CAAC;AACf,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,aAAA,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC9D;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,qBAAqB;aAC1C,IAAI,CAAC,oBAAoB,EAAE;AAC3B,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;YACvB,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,oBAAoB,EAAE;YAC7B;AACF,QAAA,CAAC,CAAC;AAEJ,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;AAC1B,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;AACxC,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvB,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAK;YACtD,IAAI,CAAC,gBAAgB,EAAE;AACzB,QAAA,CAAC,CAAC;AAEF,QAAA,IACE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS;YACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAC/B;YACA,IAAI,CAAC,gBAAgB,EAAE;QACzB;AAEA,QAAA,YAAY,CAAC,aAAa,GAAG,kBAAkB,CAAC,aAAa;IAC/D;IAEQ,wBAAwB,CAC9B,IAAY,EACZ,QAAiC,EAAA;QAEjC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;IACjD;AAEQ,IAAA,oBAAoB,CAC1B,OAAU,EAAA;AAEV,QAAA,IAAI,OAAO,CAAC,oBAAoB,EAAE;;;;;;;QAOlC;aAAO;;;;;QAKP;IACF;IAEQ,gBAAgB,GAAA;QACtB;AACG,aAAA,cAAc,CACb,IAAI,CAAC,mBAAmB,EAAE,uBAAuB;AAC/C,YAAA,0BAA0B;cAE5B,MAAM,EAAE;IACd;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC;QAC5C,IAAI,YAAY,GAAY,IAAI;QAChC,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC,IAAI,KAAI;AACrD,YAAA,IAAI;AACF,gBAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;oBAC5B;gBACF;gBACA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAE7B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;AAClC,oBAAA,IAAI,IAAI,EAAE,KAAK,EAAE;AACf,wBAAA,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,iBAAiB,EAChC,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,CAAE,EACf,IAAI,CACL;wBACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAChE;oBACH;yBAAO;AACL,wBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;wBAEhC,YAAY,GAAG,IAAI;wBACnB,UAAU,CAAC,0BAA0B,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;oBACjE;gBACF;qBAAO;;gBAEP;YACF;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACf,gBAAA,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,qBAAqB,CAA2B,IAAO,EAAA;AAC7D,QAAA,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;YACxD;QACF;QACA,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC;IAClD;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE;IACrC;AAEQ,IAAA,yBAAyB,CAAC,IAAiB,EAAA;AACjD,QAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAE7B,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC9B,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B;QACF;AAEA,QAAA,QAAQ,IAAI,CAAC,CAAC,CAAC;AACb,YAAA,KAAK,oBAAoB,CAAC,uBAAuB,EAAE;gBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/B,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,WAAW,EAC1B,6DAA6D;AAC3D,oBAAA,SAAS,CACZ;gBACD;YACF;AAEA,YAAA,KAAK,oBAAoB,CAAC,QAAQ,EAAE;AAClC,gBAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC;gBAEpC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE;oBAC3D,QAAQ,CAAC,QAAiB,CAAC;gBAC7B;gBAEA;YACF;AAEA,YAAA,KAAK,oBAAoB,CAAC,OAAO,EAAE;AACjC,gBAAA,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC;gBAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,eAAe,CAAC;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;AAE3C,gBAAA,IAAI,OAAO,CAAC,OAAO,KAAK,kBAAkB,EAAE;AAC1C,oBAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACpC;gBACA;YACF;YACA,KAAK,oBAAoB,CAAC,aAAa;gBACrC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,eAAe,CAAC;AAC3D,gBAAA,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAC7C;YAEF,KAAK,oBAAoB,CAAC,YAAY;gBACpC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC;AAC1D,gBAAA,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAC5C;YAEF,KAAK,oBAAoB,CAAC,YAAY;gBACpC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC;AAC1D,gBAAA,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAC5C;YAEF,KAAK,oBAAoB,CAAC,WAAW;gBACnC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC;AAC1D,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC5B;YAEF,KAAK,oBAAoB,CAAC,aAAa;gBACrC,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,iBAAiB,CAAC;AAC7D,gBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;gBAC7B;YAEF,KAAK,oBAAoB,CAAC,iBAAiB;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;gBACrC;AAEF,YAAA,KAAK,oBAAoB,CAAC,WAAW,EAAE;AACrC,gBAAA,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC;AAC1C,gBAAA,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,WAAW,EAC1B,uBAAuB,EACvB,cAAc,CACf;gBACD,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC;AAC1D,gBAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,cAAc,CAAC;gBACnD;YACF;YAEA,KAAK,oBAAoB,CAAC,eAAe;gBACvC,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,WAAW,EAC1B,2BAA2B,EAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAChC;gBACD;YAEF,KAAK,oBAAoB,CAAC,QAAQ;gBAChC,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,WAAW,EAC1B,oBAAoB,EACpB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAChC;gBACD;YAEF,KAAK,oBAAoB,CAAC,qBAAqB;AAC7C,gBAAA,MAAM,CAAC,OAAO,CACZ,GAAG,WAAW,CAAC,WAAW,EAC1B,iCAAiC,EACjC,OAAO,CACR;gBACD;AAEF,YAAA;gBACE,MAAM,CAAC,IAAI,CAAC,CAAA,sCAAA,EAAyC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;;IAErE;8GA5PW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAjB,iBAAiB,EAAA,CAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;ACCK,MAAO,wBAAyB,SAAQ,UAAU,CAAA;AACtD,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;AAE7C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB;QACF;AACA,QAAA,MAAM,CAAC,cAAc,GAAG,MAAK;AAC3B,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;gBACf,MAAM,EAAE,gBAAgB,CAAC,cAAc;AACvC,gBAAA,OAAO,EAAE,qBAAqB;AAC/B,aAAA,CAAC,CACH;AACD,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,YAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC1B,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,YAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;AAC1B,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,eAAe,GAAG,MAAK;AAC5B,YAAA,IAAI,CAAC;AACF,iBAAA,MAAM,CAAC,aAAa,CAAC,kBAAkB;AACvC,iBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;iBACZ,SAAS,CAAC,CAAC,KAAK,KACf,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAClE;AACH,YAAA,OAAO,yBAAyB;AAClC,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,SAAS,GAAG,CAAC,MAAc,KAAI;AACpC,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAE;AACnC,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,UAAU,GAAG,MAAK;AACvB,YAAA,IAAI,CAAC;AACF,iBAAA,MAAM,CAAC,aAAa,CAAC,iBAAiB;iBACtC,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EACrC,MAAM,CAAC,UAAU,EAAE,CAAA,iBAAA,CAAmB,CAAC,EACvCD,WAAS,CAAC,CAAC,IAAI,KACb,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,CAAA,WAAA,CAAa,CAAC,CAC1D,EACD,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;AAE3B,iBAAA,SAAS,EAAE;AAChB,QAAA,CAAC;QACD,MAAM,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;AAC3C,QAAA,MAAM,CAAC,WAAW,GAAG,CAAC,IAAY,KAAI;AACpC,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACnE,QAAA,CAAC;IACH;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,CAAC,IAAI,CACT,gEAAgE,CACjE;AACD,QAAA,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC;AAClD,QAAA,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC;AACxD,QAAA,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC;AACzD,QAAA,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC;AACrD,QAAA,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC;AAClE,QAAA,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC;IACvE;8GA5EW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAxB,wBAAwB,EAAA,CAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC;;;MC1BY,cAAc,CAAA;AACzB,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChD;AACA,IAAA,UAAU,CAAC,KAAc,EAAA;QACvB,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1D;8GANW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACDa,MAAO,aAAa,CAAA;AAShC,IAAA,WAAA,CAAoB,IAAkB,EAAA;QAAlB,IAAA,CAAA,IAAI,GAAJ,IAAI;QARhB,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,UAAU,GAAG,IAAI;QACjB,IAAA,CAAA,KAAK,GAAG,CAAC;QACT,IAAA,CAAA,oBAAoB,GAAG,CAAC;QACxB,IAAA,CAAA,KAAK,GAAG,CAAC;QACT,IAAA,CAAA,KAAK,GAAG,CAAC;AAGf,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC;AAEQ,IAAA,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAY,EAAA;QAChD,OAAO;YACL,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI;YAC7C,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG;SAC7C;IACH;IAEQ,SAAS,CAAC,EAAU,EAAE,EAAU,EAAA;QACtC,OAAO;AACL,YAAA,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3B,YAAA,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;SAC5B;IACH;IAEQ,WAAW,CAAC,EAAU,EAAE,EAAU,EAAA;AACxC,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5B,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SAC7B;AAED,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnC;AAEA,IAAA,cAAc,CAAC,OAAkB,EAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAC3B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAC7B;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAClC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAC7B;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACrC,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACzB;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAY,EAAA;QACnD,OAAO;AACL,YAAA,CAAC,EAAE,OAAO;AACV,YAAA,CAAC,EAAE,OAAO;SACX;IACH;AAEQ,IAAA,gBAAgB,CAAC,OAAkB,EAAA;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAChC;AAED,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E;AAEQ,IAAA,sBAAsB,CAAC,OAAkB,EAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAChC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;QAElD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;QAEhC,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,EACR,IAAI,CAAC,oBAAoB,GAAG,EAAE,EAC9B,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAC/B;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACvB;AAEQ,IAAA,oBAAoB,CAAC,OAAkB,EAAA;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;QAElD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;YAC9B;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;AAEvD,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACrB;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D;AAEQ,IAAA,mBAAmB,CAAC,aAAsC,EAAA;QAChE,IAAI,CAAC,aAAa,EAAE;YAClB;QACF;AACA,QAAA,IAAI,MAA0B;AAE9B,QAAA,SAAS,CAAa,aAAa,EAAE,YAAY,EAAE;AACjD,YAAA,OAAO,EAAE,KAAK;AACf,SAAA,CAAC,CAAC,SAAS,CAAC,CAAC,CAAa,KAAI;YAC7B,CAAC,CAAC,cAAc,EAAE;YAClB,CAAC,CAAC,eAAe,EAAE;YACnB,MAAM,OAAO,GAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,cAAc;AAExD,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACxB;YACF;AAEA,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;gBAE9B;YACF;AAEA;;AAEG;AAEH,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AAEtB,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;gBACxB,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACtC,gBAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AAC7C,gBAAA,MAAM,GAAG;oBACP,EAAE,EAAE,UAAU,CAAC,UAAU;oBACzB,CAAC;oBACD,CAAC;iBACF;;;;gBAID,aAAa,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACrE;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,SAAS,CAAa,aAAa,EAAE,UAAU,EAAE;AAC/C,YAAA,OAAO,EAAE,KAAK;AACf,SAAA,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YACjB,CAAC,CAAC,cAAc,EAAE;YAClB,CAAC,CAAC,eAAe,EAAE;;AAGnB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChD,MAAM,KAAK,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;gBAEjC,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,EAAE,EAAE,EAAE;AACnC,oBAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACxC,oBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,oBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;;oBAExD,aAAa,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBAC5D,MAAM,GAAG,SAAS;oBAElB;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,SAAS,CAAa,aAAa,EAAE,WAAW,EAAE;AAChD,YAAA,OAAO,EAAE,KAAK;AACf,SAAA,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YACjB,CAAC,CAAC,cAAc,EAAE;YAClB,CAAC,CAAC,eAAe,EAAE;YACnB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,cAAc;AAE7C,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;gBAEpC;YACF;AAEA,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBAElC;YACF;AAEA,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAE1B,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,EAAE,EAAE,EAAE;AACnC,oBAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAExC,oBAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,CAAC,EACD,CAAC,EACD,IAAI,CAAC,oBAAoB,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAC1C,IAAI,CAAC,oBAAoB,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAC3C;AACD,oBAAA,MAAM,CAAC,CAAC,GAAG,CAAC;AACZ,oBAAA,MAAM,CAAC,CAAC,GAAG,CAAC;oBAEZ;gBACF;YACF;AACF,QAAA,CAAC,CAAC;IACJ;AACD;;MCjNY,yBAAyB,CAAA;AAapC,IAAA,WAAA,GAAA;AAZQ,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACzD,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAE9B,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC/C,aAAa,CAAC,qBAAqB,CACpC;QAGC,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAC5D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAClC;QACD,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,qBAAqB,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAEA,IAAA,mBAAmB,CAAC,IAA0B,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,EAAE,aAAa,IAAI,YAAY,EAAE;YACpD,MAAM,QAAQ,GAAyB,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE;YACzE,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC;AAClD,YAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAEhC,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,cAAc,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAiB,EAAE,CAAC,CAChE;QACH;IACF;AAEA,IAAA,iBAAiB,CAAC,UAAgC,EAAA;QAChD,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC;IAC7D;AAEA;;;;;;;;;;AAUG;AACH,IAAA,WAAW,CAAC,UAAgC,EAAA;QAC1C,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC;IACvD;AAEA,IAAA,aAAa,CAAC,IAAiB,EAAA;AAC7B,QAAA,IAAI;AACF,YAAA,QAAQ,EAAE;AACV,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QACrC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,gBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACrB;QACF;IACF;IAEQ,cAAc,CACpB,WAA+B,EAC/B,UAAgC,EAAA;;QAGhC,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;;AAIrD,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CACvB,IAAI,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CACvD;QACD,IAAI,OAAO,GAAG,CAAC;AACf,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;AACnC,QAAA,OAAO,EAAE;QACT,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;QACxD,OAAO,IAAI,CAAC;AAEZ,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClD,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,aAAa,CAChB,IAAI,UAAU,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAC7D;IACH;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAChB,IAAI,UAAU,CAAC,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAC5D;IACH;IAEU,WAAW,GAAA;AACnB,QAAA,UAAU,CAAC,0BAA0B,CAAC,kBAAkB,CAAC,CAAC,SAAS,CAAC,MAClE,IAAI,CAAC,aAAa,EAAE,CACrB;IACH;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;IACtC;IAEQ,eAAe,GAAA;QACrB,MAAM,QAAQ,GAAG,MAAK;AACpB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,QAAQ,EAAE;AACV,YAAA,UAAU,CAAC,0BAA0B,CAAC,cAAc,EAAE;AACpD,gBAAA,IAAI,EAAE,cAAc;AACrB,aAAA,CAAC;AAEF,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,UAAU,CAAC,0BAA0B,CAAC,cAAc,EAAE;AACpD,YAAA,IAAI,EAAE,MAAM;YACZ,QAAQ;AACT,SAAA,CAAC;IACJ;8GA5IW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAzB,yBAAyB,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC;;;ACqBK,MAAO,YAAa,SAAQ,UAAU,CAAA;AAqD1C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AArDD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAClD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;AAC5C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AAElC,QAAA,IAAA,CAAA,WAAW,GAAG;AACrB,YAAA,mBAAmB,CAAC,IAAI;AACxB,YAAA,mBAAmB,CAAC,IAAI;AACxB,YAAA,mBAAmB,CAAC,IAAI;AACxB,YAAA,mBAAmB,CAAC,IAAI;AACxB,YAAA,mBAAmB,CAAC,OAAO;AAC3B,YAAA,mBAAmB,CAAC,SAAS;AAC7B,YAAA,mBAAmB,CAAC,SAAS;AAC7B,YAAA,mBAAmB,CAAC,UAAU;AAC9B,YAAA,mBAAmB,CAAC,SAAS;AAC7B,YAAA,mBAAmB,CAAC,cAAc;AAClC,YAAA,mBAAmB,CAAC,YAAY;AAChC,YAAA,mBAAmB,CAAC,KAAK;AACzB,YAAA,mBAAmB,CAAC,KAAK;AACzB,YAAA,mBAAmB,CAAC,aAAa;SAClC;AACO,QAAA,IAAA,CAAA,aAAa,GAAe,IAAI,CAAC,WAAW;AAE5C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;AAgBrC,QAAA,IAAA,CAAA,iBAAiB,GAAY,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAE;QACrB,IAAA,CAAA,YAAY,GAAG,GAAG;QAClB,IAAA,CAAA,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhC,QAAA,IAAA,CAAA,YAAY,GAAiB;AACnC,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,SAAS,EAAE,CAAC;SACb;QAIC,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,MAAM,wBAAwB,GAAG,SAAS,CACxC,QAAQ,EACR,kBAAkB,CACnB,CAAC,IAAI,CACJC,KAAG,CAAC,MAAM,QAAQ,CAAC,eAAe,KAAK,QAAQ,CAAC,EAChD,MAAM,CAAC,MAAM,CAAC,CACf;AACD,QAAA,MAAM,yBAAyB,GAAG,SAAS,CACzC,QAAQ,EACR,kBAAkB,CACnB,CAAC,IAAI,CACJA,KAAG,CAAC,MAAM,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC,EACjD,MAAM,CAAC,MAAM,CAAC,EACd,SAAS,CAAC,IAAI,CAAC,CAChB;AAED,QAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CACnC,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,EACZ,wBAAwB,CACzB;AAED,QAAA,KAAK,CACH,yBAAyB,EACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAC1E,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACjC;AAEA,IAAA,eAAe,CAAC,IAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE;IACjC;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK;IAChC;IAEQ,KAAK,GAAA;AACX,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACxB,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAC/C,QAAA,IAAI,CAAC,OAAO,GAAG,YAAY;AAC3B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AAEnB,QAAA,KAAK,CACH,kBAAkB,CAAC,KAAK,CAAC,EACzB,UAAU,CAAC,0BAA0B,CAAC,uBAAuB,CAAC;AAE7D,aAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAEG,WAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC;aAChE,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;AACvC,QAAA,CAAC,CAAC;AAEJ,QAAA,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;IAC5B;AAEA;;;;;;;;;AASG;AACK,IAAA,kBAAkB,CAAC,YAA8B,EAAA;QACvD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB;AAChD,QAAA,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,YAAY;QAEhD,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC9D,UAAU;YACV,WAAW;AACZ,SAAA,CAAC;;AAGF,QAAA,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM;AACrC,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,WAAW;;AAG3C,QAAA,MAAM,KAAK,GACT,UAAU,GAAG,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU;;AAGzE,QAAA,MAAM,WAAW,GAAG,UAAU,GAAG,KAAK;AACtC,QAAA,MAAM,YAAY,GAAG,WAAW,GAAG,KAAK;;QAGxC,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,WAAW,IAAI,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,YAAY,IAAI,CAAC;;AAG7C,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,WAAW;AAClC,QAAA,MAAM,MAAM,GAAG,MAAM,GAAG,YAAY;QAEpC,OAAO;YACL,SAAS;YACT,SAAS;YACT,MAAM;YACN,MAAM;YACN,WAAW;YACX,YAAY;SACb;IACH;AAEQ,IAAA,yBAAyB,CAAC,YAA8B,EAAA;QAC9D,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,qBAAqB,EAAE;YAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;YAYzD,IAAI,CAAC,4BAA4B,GAAG,CAAC,CAAC,EAAE,CAAC,KAAI;AAC3C,gBAAA,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC,WAAW;AAChD,gBAAA,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY;gBAEjD,IACE,WAAW,GAAG,GAAG;AACjB,oBAAA,WAAW,GAAG,GAAG;AACjB,oBAAA,WAAW,GAAG,GAAG;oBACjB,WAAW,GAAG,GAAG,EACjB;oBACA,OAAO;AACL,wBAAA,OAAO,EAAE,KAAK;AACd,wBAAA,CAAC,EAAE,KAAK;AACR,wBAAA,CAAC,EAAE,KAAK;qBACT;gBACH;qBAAO;oBACL,OAAO;AACL,wBAAA,OAAO,EAAE,IAAI;wBACb,CAAC,EAAE,WAAW,GAAG,KAAK;wBACtB,CAAC,EAAE,WAAW,GAAG,KAAK;qBACvB;gBACH;AACF,YAAA,CAAC;YAED,IAAI,CAAC,gCAAgC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAI;AAC/C,gBAAA,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK;AAC7B,gBAAA,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK;gBAC7B,OAAO;AACL,oBAAA,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC,WAAW;AACzC,oBAAA,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC,YAAY;iBAC3C;AACH,YAAA,CAAC;;YAGD,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,EAAE,CAAC,KAAI;gBACzC,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC;gBACxD,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC;gBACzD,OAAO;oBACL,CAAC,EAAE,WAAW,GAAG,KAAK;oBACtB,CAAC,EAAE,WAAW,GAAG,KAAK;iBACvB;AACH,YAAA,CAAC;QACH;IACF;AAEQ,IAAA,aAAa,CAAC,IAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC;IACzC;AAEQ,IAAA,cAAc,CAAC,KAAuB,EAAA;QAC5C,KAAK,CACH,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,kBAAkB;AACvC,aAAA,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;AAExB,aAAA,IAAI,CACH,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EACrBA,WAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAEzC,aAAA,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC;AAE/C,QAAA,IAAI,YAAY,CAAC,oBAAoB,EAAE;AACrC,YAAA,IAAI,aAAa,CAAC,IAAI,CAAC;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;QACjC;IACF;AAEQ,IAAA,0BAA0B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAS,EAAA;AAC5D,QAAA,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY;QAElE,OAAO;AACL,YAAA,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,MAAM;AAC/D,YAAA,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,MAAM;SAC/D;IACH;AAEQ,IAAA,0BAA0B,CAAC,EAAE,OAAO,EAAE,OAAO,EAAc,EAAA;AACjE,QAAA,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY;QAElE,OAAO;AACL,YAAA,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,IAAI,MAAM;AACjC,YAAA,CAAC,EAAE,CAAC,OAAO,GAAG,SAAS,IAAI,MAAM;SAClC;IACH;AAEQ,IAAA,mBAAmB,CAAC,gBAAkC,EAAA;;;AAI5D,QAAA,MAAM,aAAa,GAAG,CAAC,KAAY,KAAI;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AACjC,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC;gBAC1C;YACF;YACA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC;AAC9C,QAAA,CAAC;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,KAAY,KAAI;AACnC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;YAEvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAA;gBAC9B,OAAO,CAAC,GAAG,CAAC;AACd,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;AACzC,QAAA,CAAC;AAED,QAAA,MAAM,aAAa,GAAG,CAAC,IAAwB,EAAE,OAAkB,KAAI;;AAErE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,IAAI,GAAG,CAAC;AACZ,gBAAA,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AACxB,gBAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,CAAA,CAAG,CAAC;gBACpE,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAE7C,gBAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;AACtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBACnC,IAAI,IAAI,CAAC;gBACT,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBACnC,IAAI,IAAI,CAAC;AACT,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACzD,IAAI,IAAI,CAAC;;;gBAGT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;gBAC5C,IAAI,IAAI,CAAC;AACT,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC;AACT,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC;AACF,QAAA,CAAC;AAED,QAAA,SAAS,CAAa,gBAAgB,EAAE,YAAY;AACjD,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC7C,aAAA,SAAS,CAAC,CAAC,CAAC,KAAI;YACf,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,MAAM,OAAO,GAAc,CAAC,CAAC,cAAc;;;AAG3C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3B;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;AAC1B,YAAA,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;YAC/C,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC,CAAC;AAEJ,QAAA,SAAS,CAAa,gBAAgB,EAAE,UAAU;AAC/C,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC7C,aAAA,SAAS,CAAC,CAAC,CAAC,KAAI;AACf,YAAA,MAAM,OAAO,GAAc,CAAC,CAAC,cAAc;AAC3C,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAExB,YAAA,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;;;AAI7C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gBAAA,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB;YAEA,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC,CAAC;AAEJ,QAAA,SAAS,CAAa,gBAAgB,EAAE,WAAW;AAChD,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC7C,aAAA,SAAS,CAAC,CAAC,CAAC,KAAI;YACf,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC;YAChD,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;QACT,MAAM,CAAC,KAAK,EAAE;IAChB;AAEA,IAAA,aAAa,CAAC,CAAS,EAAE,CAAS,EAAE,MAAc,EAAE,MAAc,EAAA;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;AAEA,IAAA,aAAa,CAAC,MAAc,EAAE,CAAS,EAAE,CAAS,EAAA;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;AAEA,IAAA,WAAW,CAAC,MAAc,EAAE,CAAS,EAAE,CAAS,EAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;AAEA,IAAA,cAAc,CAAC,KAAa,EAAE,CAAS,EAAE,CAAS,EAAA;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;AAEQ,IAAA,mBAAmB,CAAC,OAAe,EAAE,CAAS,EAAE,CAAS,EAAA;AAC/D,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,aAAa,EAAE;YAC5C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAChD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,eAAe,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,eAAe,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE;YAC3C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,WAAW,EAAE;YAC1C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD;IACF;;AAGQ,IAAA,iBAAiB,CAAC,OAAe,EAAE,CAAS,EAAE,CAAS,EAAA;AAC7D,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,aAAa,EAAE;YAC5C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,eAAe,EAAE;YAC9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,eAAe,EAAE;YAC9C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD;AACA,QAAA,IAAI,OAAO,GAAG,gBAAgB,CAAC,WAAW,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD;IACF;AAEQ,IAAA,2BAA2B,CAAC,gBAAkC,EAAA;AACpE,QAAA,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAC,KAAI;AACnC,YAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC;AAED,QAAA,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAC,KAAI;AACnC,YAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC;AAED,QAAA,gBAAgB,CAAC,SAAS,GAAG,CAAC,CAAC,KAAI;AACjC,YAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC;;;;;;;;;;AAYD,QAAA,SAAS,CAAa,gBAAgB,EAAE,OAAO;AAC5C,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC7C,aAAA,SAAS,CAAC,CAAC,CAAa,KAAI;AAC3B,YAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;YAC1D,CAAC,CAAC,cAAc,EAAE;AACpB,QAAA,CAAC,CAAC;AAEH,QAAA,gBAA8B,CAAC,iBAAiB,GAAG,CAAC,CAAa,KAAI;AACpE,YAAA,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AACzD,QAAA,CAAC;AAEA,QAAA,gBAA8B,CAAC,mBAAmB,GAAG,CAAC,CAAa,KAAI;AACtE,YAAA,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AAC3D,QAAA,CAAC;IACH;AAEQ,IAAA,gCAAgC,CAAC,gBAAkC,EAAA;AACzE,QAAA,gBAAgB,CAAC,YAAY,GAAG,CAAC,CAAC,KAAI;YACpC,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,YAAA,gBAA8B,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACtD,QAAA,CAAC;AAED,QAAA,gBAAgB,CAAC,YAAY,GAAG,CAAC,CAAC,KAAI;YACpC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,YAAA,gBAA8B,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACxD,QAAA,CAAC;IACH;;AAGQ,IAAA,mBAAmB,CAAC,OAAe,EAAA;;AAEzC,QAAA,OAAO,CAAC,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,KAAK,OAAO,KAAK,CAAC;IAC5D;AAEQ,IAAA,UAAU,CAAC,CAAgB,EAAA;AACjC,QAAA,IAAI,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAChE,OAAO,eAAe,CAAC,UAAU;AAC9B,aAAA,IAAI,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;YACzE,OAAO,eAAe,CAAC,YAAY;AAChC,aAAA,IAAI,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YACjE,OAAO,eAAe,CAAC,QAAQ;;YAC5B,OAAO,CAAC,CAAC,OAAO;IACvB;AAEQ,IAAA,sBAAsB,CAAC,aAAyB,EAAA;AACtD,QAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAI;AACxE,YAAA,OAAO,cAAc,CAAC,KAAK,CAAC;AAC9B,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAoB,KAAI;AACxC,YAAA,MAAM,IAAI,GAAa,KAAK,CAAC,IAAgB;YAC7C,MAAM,mBAAmB,GACtB,KAAK,CAAC,MAAsB,EAAE,SAAS,KAAK,OAAO;YACtD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEjD,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE;gBAC/B,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,IAAI,EACJ,6EAA6E,CAC9E;AACD,gBAAA,OAAO,mBAAmB;YAC5B;AAEA,YAAA,OAAO,mBAAmB,IAAI,CAAC,QAAQ;AACzC,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;IAChC;AAEQ,IAAA,eAAe,CAAC,OAA2C,EAAA;QACjE,MAAM,MAAM,GAAG,OAAO,KAAK,MAAM,KAAK,CAAC;AAEvC,QAAA,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,KAAI;AACzB,YAAA,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;gBACb;YACF;YAEA,MAAM,eAAe,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;YAE9C,MAAM,aAAa,GACjB,CAAC,CAAC,OAAO,KAAK,mBAAmB,CAAC,KAAK;AACvC,gBAAA,CAAC,CAAC,OAAO,KAAK,mBAAmB,CAAC,KAAK;AACzC,YAAA,IAAI,eAAe,IAAI,aAAa,EAAE;gBACpC;YACF;AAEA,YAAA,IAAI,CAAC,aAAa,CAChB,IAAI,UAAU,CAAC;AACb,gBAAA,YAAY,CAAC,OAAO;AACpB,gBAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAClB,gBAAA,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;aACjB,CAAC,CAAC,MAAM,CACV;;;YAGD,IAAI,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,SAAS,EAAE;gBAC1C,QAA8B,CAAC,UAAU,CAAC;oBACzC,QAAQ,EAAE,eAAe,CAAC,SAAS;AACpC,iBAAA,CAAC;;YAEJ;AACA,YAAA,IACE,IAAI,CAAC,OAAO,CAAC,mBAAmB;gBAChC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,EACnC;gBACA,CAAC,CAAC,cAAc,EAAE;YACpB;AACF,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,KAAI;AACvB,YAAA,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;gBACb;YACF;YACA,IAAI,CAAC,aAAa,CAChB,IAAI,UAAU,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAChE;AACD,YAAA,IACE,IAAI,CAAC,OAAO,CAAC,mBAAmB;gBAChC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,EACnC;gBACA,CAAC,CAAC,cAAc,EAAE;YACpB;AACF,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,KAAI;AAC1B,YAAA,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;gBACb;YACF;YACA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AACjC,QAAA,CAAC;IACH;AACD;;MCpoBY,kBAAkB,CAAA;AAU7B,IAAA,WAAA,GAAA;AATQ,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChE,QAAA,IAAA,CAAA,MAAM,GAAG;AACd,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,qBAAqB,EAAE,EAAE;AACzB,YAAA,UAAU,EAAE,IAAI;SACjB;AAGC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,EAAE;YAC7C;QACF;IACF;IAEO,UAAU,CACf,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,cAAc,IAAI,EAAE,EAAA;QAE9D,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,IAAI,CAC1CJ,WAAS,CAAC,CAAC,SAAwB,KAAK,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EACtE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,EAC1B,MAAM,CAAC,YAAY,CAAC,EACpBC,KAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,WAAW,CAAC,CACjC;IACH;AAEO,IAAA,aAAa,CAClB,SAAwB,EAAA;AAExB,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;QACxE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC;IAEO,YAAY,CACjB,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,cAAc,IAAI,EAAE,EAAA;QAE3D,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAgB,UAAU,CAAC;IACvD;AAEQ,IAAA,YAAY,CAAC,SAAmB,EAAA;;AAEtC,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,OAAO,KAAI;YACnC,MAAM,WAAW,GAAiB,EAAE;AACpC,YAAA,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;AACnC,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,KAAI;AAClE,gBAAA,MAAM,SAAS,CAAC,OAAO,EAAE;AACzB,gBAAA,IAAI;oBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC;AACpD,oBAAA,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE;oBACpC,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC;gBACf;AAAE,gBAAA,MAAM;AACN,oBAAA,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBAC1D;wBAAU;oBACR,SAAS,CAAC,OAAO,EAAE;gBACrB;AACA,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CACjC,CAAC,UAAU,KAAK,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAC7C;AACD,gBAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;AACnB,oBAAA,OAAO,QAAQ,CAAC,CAAC,CAAC;gBACpB;AACA,gBAAA,OAAO,QAAQ;AACjB,YAAA,CAAC,CAAC;AACF,YAAA,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC;AACf,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,YAAY,CACxB,QAAgB,EAChB,UAAkB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAA;QAE1C,MAAM,WAAW,GAAG,EAAE;AAEtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;AACnC,YAAA,IAAI;gBACF,MAAM,IAAI,CAAC,gBAAgB,CACzB,IAAI,CAAC,MAAM,CAAC;sBACR,GAAG,QAAQ,CAAA,eAAA,EAAkB,WAAW,CAAC,GAAG,EAAE,CAAA;sBAC9C,QAAQ,EACZ;AACE,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,OAAO,EAAE;AACP,wBAAA,eAAe,EAAE,qCAAqC;AACtD,wBAAA,MAAM,EAAE,UAAU;AAClB,wBAAA,OAAO,EAAE,GAAG;AACb,qBAAA;oBACD,WAAW,EAAE,MAAM;iBACpB,EACD,OAAO,CACR;YACH;AAAE,YAAA,MAAM;;YAER;oBAAU;AACR,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;AACzD,gBAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;YAC3B;QACF;AACA,QAAA,OAAO,WAAW;IACpB;IAEQ,MAAM,gBAAgB,CAC5B,GAAW,EACX,OAAA,GAAe,EAAE,EACjB,OAAe,EAAA;AAEf,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;AACxC,QAAA,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;AAClC,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC;AAE/D,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;YAC1C,YAAY,CAAC,SAAS,CAAC;AACvB,YAAA,OAAO,QAAQ;QACjB;QAAE,OAAO,KAAK,EAAE;YACd,YAAY,CAAC,SAAS,CAAC;AACvB,YAAA,MAAM,KAAK;QACb;IACF;8GA3HW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAlB,kBAAkB,EAAA,CAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MCMY,4BAA4B,CAAA;AACvC,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AACtB,IAAA,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC;AAEpC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;QACZ,IAAI,CAAC,aAAa,CAAC;aAChB,IAAI,CACH,cAAc,CACZ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,EACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,EACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,uBAAuB,CAAC,EACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,CACxD,EACD,SAAS,CAAC,IAAI,CAAC,EACf,MAAM,CAAC,CAAC,SAAS,eAAe,CAAC,KAAK,eAAe,CAAC,EACtDA,KAAG,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,CAAC,KACpD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,CAAC,CACnE;AAEF,aAAA,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACzD;AAEQ,IAAA,YAAY,CAClB,IAAqB,EACrB,eAA4B,EAC5B,cAAuB,EACvB,QAA8B,EAAA;QAE9B,MAAM,EACJ,OAAO,EACP,cAAc,EACd,eAAe,EACf,UAAU,EACV,WAAW,EACX,MAAM,EACN,WAAW,EACX,oBAAoB,GACrB,GAAG,IAAI,CAAC,eAAe;QAExB,OAAO;AACL,YAAA,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO;YACrC,UAAU;YACV,WAAW;YACX,cAAc;YACd,MAAM,EAAE,eAAe,CAAC,KAAK;YAC7B,UAAU,EAAE,MAAM,CAAC,gBAAgB;YACnC,eAAe;YACf,MAAM;YACN,WAAW;YACX,YAAY,EAAE,eAAe,CAAC,YAAY;YAC1C,OAAO;YACP,QAAQ;AACR,YAAA,GAAG,EAAE,oBAAoB;YACzB,cAAc;SACf;IACH;AAEQ,IAAA,oBAAoB,CAAC,IAAgC,EAAA;AAC3D,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E;8GA/DW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA5B,4BAA4B,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;ACTK,MAAO,oBAAqB,SAAQ,UAAU,CAAA;IACzC,IAAI,GAAA;QACX;IACF;8GAHW,oBAAoB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAApB,oBAAoB,EAAA,CAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACGK,MAAO,2BAA4B,SAAQ,iBAAiB,CAAA;AAChE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;IACT;IAES,IAAI,GAAA;QACX;IACF;IAES,kBAAkB,GAAA;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,yBAAyB,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,oBAAoB,CAAC;AACnB,YAAA,aAAa,EAAE,uCAAuC;AACvD,SAAA,CAAC,CACH;AACD,QAAA,OAAO,KAAK;IACd;8GAjBW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA3B,2BAA2B,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;;ACDK,MAAO,mCAAoC,SAAQ,yBAAyB,CAAA;IACvE,IAAI,GAAA;QACX;IACF;IAES,mBAAmB,GAAA;QAC1B;IACF;IAES,aAAa,GAAA;QACpB;IACF;IAES,WAAW,GAAA;QAClB;IACF;8GAfW,mCAAmC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAnC,mCAAmC,EAAA,CAAA,CAAA;;2FAAnC,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAD/C;;;ACCK,MAAO,2BAA4B,SAAQ,iBAAiB,CAAA;IACvD,IAAI,GAAA;QACX;IACF;8GAHW,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA3B,2BAA2B,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;;ACCK,MAAO,4BAA6B,SAAQ,kBAAkB,CAAA;IACzD,IAAI,GAAA;QACX;IACF;8GAHW,4BAA4B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA5B,4BAA4B,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;ACCK,MAAO,iCAAkC,SAAQ,uBAAuB,CAAA;IACnE,IAAI,GAAA;QACX;IACF;8GAHW,iCAAiC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAjC,iCAAiC,EAAA,CAAA,CAAA;;2FAAjC,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAD7C;;;ACCK,MAAO,sCAAuC,SAAQ,4BAA4B,CAAA;IAC7E,IAAI,GAAA;QACX;IACF;8GAHW,sCAAsC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAtC,sCAAsC,EAAA,CAAA,CAAA;;2FAAtC,sCAAsC,EAAA,UAAA,EAAA,CAAA;kBADlD;;;ACCK,MAAO,kCAAmC,SAAQ,wBAAwB,CAAA;IACrE,IAAI,GAAA;QACX;IACF;8GAHW,kCAAkC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAlC,kCAAkC,EAAA,CAAA,CAAA;;2FAAlC,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAD9C;;;ACDK,MAAO,6BAA8B,SAAQ,mBAAmB,CAAA;IAC3D,IAAI,GAAA;QACX;IACF;AACD;;ACFK,MAAO,sBAAuB,SAAQ,YAAY,CAAA;IAC7C,IAAI,GAAA;QACX;IACF;8GAHW,sBAAsB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAtB,sBAAsB,EAAA,CAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;ACHD;;;AAGG;AAEI,MAAM,iBAAiB,GAAG;AAC/B,IAAA,eAAe,EAAE,kBAAkB;CAC3B;;MCWG,kBAAkB,CAAA;AAD/B,IAAA,WAAA,GAAA;AAEU,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,QAAA,IAAA,CAAA,YAAY,GAAiB;AACnC,YAAA,CAAC,iBAAiB,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;SACpE;AA4CF,IAAA;IA1CS,cAAc,CAAC,IAAkB,EAAE,aAAqB,EAAA;AAC9D,QAAA,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI;AACrB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAC3BA,KAAG,CAAC,CAAC,IAAY,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EACvC,MAAM,CAAC,CAAC,EAAE,eAAe,EAAE,KAAI;AAC7B,YAAA,OAAO,eAAe,CAAC,aAAa,KAAK,aAAa;QACxD,CAAC,CAAC,CACH;IACH;IAEA,mBAAmB,CAIjB,QAA0B,EAC1B,IAAO,EACP,MAAyB,EACzB,OAAO,GAAG,KAAK,EAAA;AAEf,QAAA,MAAM,aAAa,GAAG,YAAY,EAAE;QACpC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE;AAEtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CACpDD,WAAS,CAAC,CAAC,IAAI,KAAI;AACjB,YAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;YACtB,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AACxC,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,IAAI,CAC1D,MAAM,CAAC,MAAM,CAAC,CACf;YACH;AACA,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,QAAA,CAAC,CAAC,EACFE,SAAO,CAAC,OAAO,CAAC,EAChB,UAAU,CAAC,CAAC,CAAC,KAAI;AACf,YAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACf,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,QAAA,CAAC,CAAC,EACF,IAAI,CAAC,CAAC,CAAC,CACR;QACD,UAAU,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAChC,QAAA,OAAO,UAAmB;IAC5B;8GA/CW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAlB,kBAAkB,EAAA,CAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MCAY,gBAAgB,CAAA;AAC3B,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AACtB,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ;AAE/B,IAAA,mBAAmB,CACjB,IAAY,EACZ,MAAA,GAAkC,EAAE,EAAA;QAEpC,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,MAAM,CAAC;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvE;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC;AACvB,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;AACxC,aAAA,IAAI,CACHG,QAAM,CAAC,KAAK,CAAC,EACb,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAClB;AACH,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;aACxC,IAAI,CACH,oBAAoB,EAAE,EACtBA,QAAM,CAAC,MAAM,CAAC,EACd,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;AAE3C,aAAA,SAAS,EAAE;IAChB;AAEQ,IAAA,YAAY,CAAC,YAA8B,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC;QAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC;QAEzD,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;;QAGA,MAAM,WAAW,GAAG,SAAS,CAAa,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAC9DD,WAAS,CAAC,KAAK,CAAC,EAChB,YAAY,CAAC,IAAI,CAAC,CACnB;;AAGD,QAAA,MAAM,UAAU,GAAG,SAAS,CAAa,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CACjEA,WAAS,CAAC,KAAK,CAAC,CACjB;AACD,QAAA,MAAM,WAAW,GAAG,SAAS,CAAa,OAAO,EAAE,YAAY,CAAC,CAAC,IAAI,CACnEA,WAAS,CAAC,KAAK,CAAC,CACjB;QACD,MAAM,UAAU,GAAG,SAAS,CAAa,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CACjEA,WAAS,CAAC,KAAK,CAAC,EAChB,YAAY,CAAC,GAAG,CAAC,CAClB;;QAGD;aACG,IAAI,CACHC,QAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAC3D,GAAG,CAAC,CAAC,SAAS,KAAI;AAChB,YAAA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;AAC/D,YAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE;AAC5C,gBAAA,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW;AACpC,gBAAA,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY;AACrC,gBAAA,MAAM,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,SAAS;AACxD,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;;QAGd;AACG,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,SAAS,KAAI;AAChB,YAAA,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM;YAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAClC,YAAA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE;AAC5C,gBAAA,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW;AACpC,gBAAA,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY;gBACrC,MAAM,EAAE,YAAY,KAAK,CAAC,GAAG,UAAU,GAAG,SAAS;AACpD,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;QAEd,IAAI,oBAAoB,GAAG,CAAC;;AAE5B,QAAA,UAAU,CAAC,SAAS,CAAC,CAAC,KAAiB,KAAI;AACzC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM;AACzC,YAAA,IAAI,YAAY,GAAG,CAAC,EAAE;gBACpB;YACF;;YAGA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;AAC/C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5C,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CACjD;;AAGD,YAAA,MAAM,aAAa,GAAG,eAAe,GAAG,oBAAoB;AAC5D,YAAA,MAAM,WAAW,GAAG,aAAa,GAAG,CAAC;;YAGrC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE;AAChC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE;oBACjD,KAAK,EAAE,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC3B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS;AAC3C,iBAAA,CAAC;;gBAGF,oBAAoB,GAAG,eAAe;YACxC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,WAAW,CAAC,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC1C,YAAA,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE;AACjD,gBAAA,KAAK,EAAE,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/C,gBAAA,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS;AAChD,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEQ,SAAS,CAAC,KAAyB,EAAE,OAAoB,EAAA;QAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AAExC,QAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;IAC7B;8GAvIW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAhB,gBAAgB,EAAA,CAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;ACLD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEG;MAEU,iBAAiB,CAAA;AAwC5B,IAAA,WAAA,GAAA;AAvCQ,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;;QAGZ,IAAA,CAAA,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU;;QAGrC,IAAA,CAAA,WAAW,GAAG,UAAU;AAEzC;;;AAGG;QACc,IAAA,CAAA,0BAA0B,GAAG,KAAK;AAEnD;;AAEG;QACc,IAAA,CAAA,mCAAmC,GAAG,KAAK;AAE5D;;;AAGG;QACc,IAAA,CAAA,mCAAmC,GAAG,MAAM;AAE7D;;;;AAIG;QACc,IAAA,CAAA,aAAa,GAAG,CAAC;;AAG1B,QAAA,IAAA,CAAA,gBAAgB,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACpE,IAAA,CAAA,OAAO,GAAmD,EAAE;AAC5D,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE;QAC7B,IAAA,CAAA,WAAW,GAAa,MAAM;QAGpC,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;QACZ,IAAI,CAAC,YAAY,CAAC;aACf,IAAI,CACH,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,EACpE,MAAM,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,aAAa,CAAC;AAE7C,aAAA,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpD;AAEA;;;AAGG;AACK,IAAA,WAAW,CAAC,KAAsB,EAAA;QACxC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,eAAe;AAE1E,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,eAAe,IAAI,CAAC;YACzB,OAAO,EAAE,OAAO,IAAI,CAAC;YACrB,EAAE,EAAE,cAAc,IAAI,CAAC;AACxB,SAAA,CAAC;;QAGF,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YAC5C;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;QAEjB,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACnD;IAEQ,gBAAgB,CACtB,GAAiD,EACjD,aAAqB,EAAA;QAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;IACnC;AAEA;;;;;;;;AAQG;IACK,gBAAgB,CACtB,GAAiD,EACjD,aAAqB,EAAA;AAErB,QAAA,MAAM,QAAQ,GAAG,aAAa,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,aAAa,GAAG,CAAC;QAChE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW;QAElD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAEhD,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC;;QAG3D,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGtC,QAAA,IAAI,MAAM,GAAG,GAAG,EAAE;AAChB,YAAA,OAAO,UAAU;QACnB;;;;QAKA,IAAI,KAAK,GAAG,GAAG,IAAI,OAAO,KAAK,KAAK,EAAE;AACpC,YAAA,OAAO,UAAU;QACnB;;;AAIA,QAAA,IAAI,KAAK,GAAG,GAAG,IAAI,WAAW,GAAG,GAAG,IAAI,OAAO,KAAK,QAAQ,EAAE;AAC5D,YAAA,OAAO,MAAM;QACf;;;QAIA,IACE,OAAO,GAAG,GAAG;AACb,YAAA,OAAO,KAAK,MAAM;AAClB,YAAA,WAAW,GAAG,GAAG;AACjB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EACjE;AACA,YAAA,OAAO,UAAU;QACnB;AAEA,QAAA,OAAO,MAAM;IACf;;;;;;;;AAUA;;;;;;;AAOG;AACK,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;QAC3B,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;AAC3B,QAAA,OAAO,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG;IAC5B;AAEA;;;;;;;;AAQG;AACK,IAAA,eAAe,CAAC,KAAa,EAAA;QACnC,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;QAC3B,IAAI,KAAK,GAAG,IAAI;AAAE,YAAA,OAAO,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI;QAC7C,IAAI,KAAK,IAAI,GAAG;AAAE,YAAA,OAAO,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI;AAC7C,QAAA,OAAO,GAAG;IACZ;AAEA;;;;;;;AAOG;AACK,IAAA,iBAAiB,CAAC,KAAa,EAAA;QACrC,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;QAC3B,IAAI,KAAK,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;AAC3B,QAAA,OAAO,CAAC,KAAK,GAAG,GAAG,IAAI,GAAG;IAC5B;AAEA;;;;;;;AAOG;AACK,IAAA,qBAAqB,CAAC,IAAY,EAAA;QACxC,IAAI,IAAI,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;QAC1B,IAAI,IAAI,GAAG,GAAG;AAAE,YAAA,OAAO,GAAG;AAC1B,QAAA,OAAO,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG;IAC3B;;;;IAMQ,UAAU,CAAC,QAAkB,EAAE,EAAU,EAAA;QAC/C,IAAI,QAAQ,KAAK,MAAM;YAAE;AAEzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;;AAGtB,QAAA,MAAM,QAAQ,GAAG,QAAQ,KAAK,UAAU;AACxC,QAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,WAAW,KAAK;AACnB,cAAE;kBACE,IAAI,CAAC;kBACL,IAAI,CAAC;AACT,cAAE,IAAI,CAAC,0BAA0B;QAErC,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,QAAQ,EAAE;YAC1C;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ;AAE3B,QAAA,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,CAAC;AAClC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC;QAExE,MAAM,CAAC,IAAI,CACT,CAAA,uBAAA,EAA0B,QAAQ,CAAA,QAAA,EAAW,SAAS,CAAA,WAAA,EAAc,OAAO,CAAA,CAAE,CAC9E;AAED,QAAA,IAAI,SAAS,KAAK,IAAI,CAAC,gBAAgB,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAC3B,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;IACnB;AAEA;;;AAGG;IACK,gBAAgB,CAAC,aAAqB,EAAE,QAAkB,EAAA;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CACzC,aAAgD,CACjD;;AAGD,QAAA,MAAM,UAAU,GACd,YAAY,KAAK,CAAC;AAChB,cAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa;cACtC,YAAY;AAElB,QAAA,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;AAEzE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;IACjC;AAEA;;AAEG;AACK,IAAA,mBAAmB,CAAC,MAAc,EAAA;QACxC,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAEtD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AACjD,YAAA,IAAI,IAAI,GAAG,WAAW,EAAE;gBACtB,WAAW,GAAG,IAAI;gBAClB,YAAY,GAAG,CAAC;YAClB;QACF;AAEA,QAAA,OAAO,YAAY;IACrB;;IAGQ,cAAc,GAAA;AACpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;QAC/B,IAAI,GAAG,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;QAEnD,IAAI,GAAG,GAAG,CAAC;QACX,IAAI,OAAO,GAAG,CAAC;QACf,IAAI,EAAE,GAAG,CAAC;AAEV,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;AAC5B,YAAA,GAAG,IAAI,CAAC,CAAC,GAAG;AACZ,YAAA,OAAO,IAAI,CAAC,CAAC,OAAO;AACpB,YAAA,EAAE,IAAI,CAAC,CAAC,EAAE;QACZ;AAEA,QAAA,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE;IACjE;8GA/SW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAjB,iBAAiB,EAAA,CAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;MCzEY,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAsB,WAAW,CAAC;AAKtD,IAAA;IAHC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;8GANW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXtC,2aAgBA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPY,qBAAqB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEpB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,mBAGjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,qBAAqB,CAAC,EAAA,QAAA,EAAA,2aAAA,EAAA;;;MEgGrB,aAAa,CAAA;AAD1B,IAAA,WAAA,GAAA;AAEU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAC1B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;QAC5C,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE;AACtD,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAClD,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,4BAA4B,GAClC,IAAI,CAAC,mBAAmB,EAAE,4BAA4B;AACtD,YAAA,+BAA+B;QACzB,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC;AACjC,aAAA,MAAM,CAAC,aAAa,CAAC,0BAA0B;AAC/C,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;;AAIf,QAAA,IAAA,CAAA,eAAe,GAAG;YACxB,OAAO,EACL,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,OAAO,IAAI,yBAAyB;AAC3E,YAAA,WAAW,EACT,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,WAAW;gBAChD,8BAA8B;AAChC,YAAA,OAAO,EACL,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,OAAO;gBAC5C,0BAA0B;AAC5B,YAAA,YAAY,EACV,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,YAAY;gBACjD,gCAAgC;AAClC,YAAA,kBAAkB,EAChB,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE,kBAAkB;gBACvD,sCAAsC;SACzC;AAED,QAAA,IAAA,CAAA,yBAAyB,GAAG,YAAY,CAAC,MAAK;AAC5C,YAAA,MAAM,cAAc,GAAG;AACrB,gBAAA,gBAAgB,CAAC,GAAG;AACpB,gBAAA,gBAAgB,CAAC,iBAAiB;AAClC,gBAAA,gBAAgB,CAAC,kBAAkB;AACnC,gBAAA,gBAAgB,CAAC,cAAc;AAC/B,gBAAA,gBAAgB,CAAC,cAAc;AAC/B,gBAAA,gBAAgB,CAAC,WAAW;AAC5B,gBAAA,gBAAgB,CAAC,cAAc;AAC/B,gBAAA,gBAAgB,CAAC,mBAAmB;AACpC,gBAAA,gBAAgB,CAAC,eAAe;aACjC;AACD,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,gBAAgB,CAAC,EACxB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;;;AAGpB,gBAAA,IACE,MAAM,KAAK,gBAAgB,CAAC,iBAAiB;oBAC7C,IAAI,CAAC,eAAe,CAAC,OAAO;oBAC5B,IAAI,CAAC,eAAe,CAAC,kBAAkB;AACvC,oBAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,EACpC;AACA,oBAAA,MAAM,CAAC,IAAI,CACT,oFAAoF,CACrF;AACD,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC;YACjD,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAI;gBAC1B,MAAM,CAAC,GAAG,CACR,CAAA,0BAAA,EAA6B,MAAM,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,CAAG,CAC7D;AACH,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAC1D;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,mBAAmB,GAAG,YAAY,CAAC,MAAK;AACtC,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,kBAAkB,CAAC,EAC1B,GAAG,CAAC,MAAK;AACP,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC7B,gBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC;AACtC,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,MAAM,wBAAwB,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAC1E;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,yBAAyB,GAAG,YAAY,CAAC,MAAK;AAC5C,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,wBAAwB,CAAC,EAChC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;AACjB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC3B,oBAAA,IAAI,EAAE,8BAA8B;oBACpC,MAAM;AACP,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACpC,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,KAAK,gBAAgB,CAAC,cAAc,CAAC,EAClE,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAC5B;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,0BAA0B,GAAG,YAAY,CACvC,MAAK;AACH,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,gBAAgB,CAAC,EACxB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,KAAK,gBAAgB,CAAC,WAAW,CAAC,EAC/DC,cAAY,CAAC,GAAG,CAAC,EACjBN,WAAS,CAAC,MACR,IAAI,CAAC;AACF,iBAAA,MAAM,CAAC,aAAa,CAAC,0BAA0B;AAC/C,iBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAChC,EACD,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CACvD;AACH,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AACD,QAAA,IAAA,CAAA,uBAAuB,GAAG,YAAY,CAAC,MAAK;AAC1C,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,4BAA4B,CAAC,EACpC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,gBAAgB,CAAC,MACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,sBAAsB,CAAC,CACxD,EACD,MAAM,CACJ,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,KACrB,EACE,QAAQ,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK;AACnC,gBAAA,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CACtC,CACJ,EACD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KACV,mCAAmC,CAAC;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CACH,CACF;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,YAAY,GAAG,YAAY,CAAC,MAAK;AAC/B,YAAA,OAAO,SAAS,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,IAAI,CACjD,GAAG,CAAC,MAAM,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC,EACjD,MAAM,CAAC,MAAM,CAAC,EACd,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,EACnE,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,cAAc,CAAC,EAC9C,MAAM,CAAC,cAAc,CAAC,EACtB,GAAG,CAAC,MAAM,kBAAkB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CACvD;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,wCAAwC,GAAG,YAAY,CAAC,MAAK;YAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,kBAAkB,CAAC,EAC1B,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,YAAY,CAAC,EACvC,oBAAoB,EAAE,EACtB,GAAG,CAAC,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAC7D;AACH,QAAA,CAAC,CAAC;QACF,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC;AACjB,aAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;aACxC,IAAI,CACH,oBAAoB,EAAE,EACtB,MAAM,CAAC,MAAM,CAAC,EACd,UAAU,CAAC,MACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,MAAM,CAAC,kBAAkB,CAAC,EAC1B,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,YAAY,CAAC,EAC1C,cAAc,CACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAClD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,2BAA2B,CAAC,EAC5D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CACpD,EACD,IAAI,CAAC,CAAC,CAAC,EACP,UAAU,CAAC,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,KACzC,IAAI,CAAC;aACF,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,IAAI,EAAE,EAAE;AAC1D,YAAA,OAAO,EAAE;AACP,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE,oBAAoB;gBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;AAChC,aAAA;YACD,MAAM,EAAE,QAAQ,CAAC,UAAU;AAC3B,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,aAAa,EAAE,MAAM;SACtB;AACA,aAAA,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CACjC,CACF,CACF;AAEF,aAAA,SAAS,EAAE;AACd,QAAA,IAAA,CAAA,SAAS,GAAG,YAAY,CAAC,MAAK;YAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,SAAS,EAAE,gBAAgB,EAAE,WAAW,CAAC,EAChD,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAC5B;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,4BAA4B,GAAG,YAAY,CAAC,MAAK;AAC/C,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC;AACzB,iBAAA,MAAM,CAAC,aAAa,CAAC,mBAAmB;AACxC,iBAAA,IAAI,CACH,MAAM,CAAC,MAAM,CAAC,EACd,GAAG,CAAC,MAAM,2BAA2B,EAAE,CAAC,CACzC;YAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC1C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,cAAc,CAAC,EACjE,GAAG,CAAC,MAAM,2BAA2B,EAAE,CAAC,CACzC;AAED,YAAA,OAAO,KAAK,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACvE,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,UAAU,GAAG,YAAY,CACvB,MAAK;AACH,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,SAAS,CAAC,EACjB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;AACjB,gBAAA,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC;oBACtC,OAAO,EAAE,cAAc,CAAC,6BAA6B;AACrD,oBAAA,OAAO,EAAE,EAAE,KAAK,EAAE,CAAA,SAAA,EAAY,MAAM,EAAE,EAAE;AACzC,iBAAA,CAAC;YACJ,CAAC,CAAC,CACH;AACH,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AACD,QAAA,IAAA,CAAA,eAAe,GAAG,YAAY,CAC5B,MAAK;YACH,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,cAAc,CAAC,EACtB,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,CACtB;AACH,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AACD,QAAA,IAAA,CAAA,kBAAkB,GAAG,YAAY,CAAC,MAAK;YACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,cAAc,CAAC,EACtB,GAAG,CAAC,MAAM,gCAAgC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAC9D;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,2BAA2B,GAAG,YAAY,CAAC,MAAK;AAC9C,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,0BAA0B,CAAC,EAClC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EACrB,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,EAC5BA,WAAS,CAAC,CAAC,KAAK,KAAI;;gBAElB,OAAO,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CACxB,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,EACpC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EACf,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,KAAK,CAAC,EACzB,oBAAoB,EAAE,EACtB,GAAG,CAAC,CAAC,gBAAgB,KACnB,wBAAwB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAC/C,CACF;YACH,CAAC,CAAC,CACH;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,2BAA2B,GAAG,YAAY,CAAC,MAAK;YAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,cAAc,CAAC;;YAEtB,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;AAElC,YAAAA,WAAS,CAAC,CAAC,WAAwB,KAAI;AACrC,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,gBAAgB,CAAC,EACxB,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MACF,MAAM,CAAC,GAAG,CACR,wDAAwD,IAAI,CAAC,4BAA4B,CAAA,EAAA,CAAI,CAC9F,CACF,EACDA,WAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;AACvB,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC/B,MAAM,CACJ,qBAAqB,CACtB,EACD,IAAI,CAAC,CAAC,CAAC,CACR;AAED,oBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,oBAAoB,CAAC,EAC5B,IAAI,CAAC,CAAC,CAAC;;oBAGP,SAAS,CAAC,MAAM,CAAC;;AAGjB,oBAAAE,SAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC;;AAG1C,oBAAA,QAAQ,CAAC,MAAM,KAAK,CAAC;;oBAGrB,UAAU,CAAC,MAAK;AACd,wBAAA,MAAM,KAAK,GAAG,CAAA,kCAAA,EAAqC,IAAI,CAAC,4BAA4B,+BAA+B;AACnH,wBAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AAEnB,wBAAA,MAAM,IAAI,GAAG;4BACX,WAAW;4BACX,YAAY,EAAE,MAAM,EAAE,YAAY;4BAClC,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,SAAS,EAAE,SAAS,CAAC,SAAS;4BAC9B,KAAK;yBACN;wBAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAC5D,UAAU,CAAC,CAAC,SAAkB,KAAI;AAChC,4BAAA,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,SAAS,CAAC;AACtD,4BAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,wBAAA,CAAC,CAAC;;AAEF,wBAAA,GAAG,CAAC,MACF,gBAAgB,CAAC;4BACf,MAAM,EAAE,gBAAgB,CAAC,kBAAkB;AAC3C,4BAAA,OAAO,EAAE,sBAAsB;yBAChC,CAAC,CACH,CACF;oBACH,CAAC,CAAC,CACH;gBACH,CAAC,CAAC,CACH;YACH,CAAC,CAAC,CACH;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,4BAA4B,GAAG,YAAY,CAAC,MAAK;YAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,wBAAwB,CAAC,EAChC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,KAAK,gBAAgB,CAAC,kBAAkB,CAAC,EACtEF,WAAS,CAAC,MACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAC3D,EACD,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAC5B;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,gBAAgB,GAAG,YAAY,CAAC,MAAK;YACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,sBAAsB,CAAC,EAC9B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAC3C,oBAAoB,EAAE,EACtB,MAAM,CAAC,MAAM,CAAC,EACdA,WAAS,CACP,CAAC,OAAe,KACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAC1C,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,IAAI,EAAE,EAAE,OAAO,EAAE;AAClB,aAAA,CAAC,CAAC,MAAM,CACZ,EACD,GAAG,CAAC,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAClD;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,uBAAuB,GAAG,YAAY,CACpC,MAAK;AACH,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,sBAAsB,CAAC,EAC9B,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,EAClC,cAAc,CACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAClD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,2BAA2B,CAAC,EAC5D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CACpD,EACDA,WAAS,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,KAC9C,IAAI,CAAC;iBACF,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,IAAI,EAAE,EAAE;gBAC1D,MAAM,EAAE,QAAQ,CAAC,UAAU;AAC3B,gBAAA,YAAY,EAAE,SAAS;AACvB,gBAAA,aAAa,EAAE,MAAM;AACrB,gBAAA,OAAO,EAAE;AACP,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,KAAK,EAAE,eAAe;AACtB,oBAAA,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,iBAAA;aACF;iBACA,IAAI,CACH,GAAG,CAAC,MACF,MAAM,CAAC,GAAG,CACR,CAAA,qBAAA,EAAwB,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAA,CAAE,CACzE,CACF,EACD,UAAU,CAAC,MAAK;gBACd,MAAM,CAAC,KAAK,CACV,CAAA,eAAA,EAAkB,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAA,CAAE,CACnE;AACD,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAC,CACH,CACJ,CACF;AACH,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AAED,QAAA,IAAA,CAAA,oBAAoB,GAAG,YAAY,CAAC,MAAK;YACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,oBAAoB,CAAC,EAC5B,gBAAgB,CAAC,MACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,CACtD,EACD,MAAM,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,EAC/C,GAAG,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAC9B;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,IAAA,CAAA,iCAAiC,GAAG,YAAY,CAAC,MAAK;AACpD,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,gBAAgB,CAAC,EACxB,GAAG,CAAC,MAAK;AACP,gBAAA,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC;oBACtC,OAAO,EAAE,cAAc,CAAC,6BAA6B;AACrD,oBAAA,OAAO,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE;AAClD,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC;oBACtC,OAAO,EAAE,cAAc,CAAC,iBAAiB;AACzC,oBAAA,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE;AACnC,iBAAA,CAAC;gBACF,cAAc,CAAC,kBAAkB,CAAC;YACpC,CAAC,CAAC,EACFA,WAAS,CAAC,MACR,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAC9CM,cAAY,CAAC,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,CAAC,CAAC,EACPN,WAAS,CAAC,MACR,sBAAsB,CACpB,EAAE,OAAO,EAAE,cAAc,CAAC,gBAAgB,EAAE,EAC5C,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,CACxD,CACF,EACDA,WAAS,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAC9C,MAAM,CACJ,CAAC,UAAU,KACT,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe;AAC5C,gBAAA,UAAU,CAAC,eAAe,CAAC,eAAe,GAAG,WAAW;AACxD,gBAAA,CAAC,UAAU,CAAC,eAAe,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CACvD,EACD,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,6BAA6B,EAAE,CAAC,CAC3C,CACF,CACF;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,gDAAgD,GAAG,YAAY,CAAC,MAAK;AACnE,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,6BAA6B,EAAE,oBAAoB,CAAC,EAC3D,GAAG,CAAC,MAAM,aAAa,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7D,GAAG,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAC9B;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,YAAY,GAAG,YAAY,CAAC,MAAK;YAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,WAAW,CAAC,EACnB,MAAM,CAAC,sBAAsB,CAAC,EAC9B,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAC5B;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,qCAAqC,GAAG,YAAY,CAAC,MAAK;YACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,cAAc,CAAC,EACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,EACnDA,WAAS,CAAC,MACR,UAAU,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,IAAI,CACxD,GAAG,CACD,CAAC,EAAE,IAAI,EAAE,KACN,IAAoC,EAAE;kBACnC,aAAa,CACpB,EACD,MAAM,CAAC,MAAM,CAAC,EACd,GAAG,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACtC,CACF,CACF;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAA,CAAA,mBAAmB,GAAG,YAAY,CAChC,MAAK;YACH,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,cAAc,CAAC,EACtB,cAAc,CACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,EAChD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,CACvD,EACD,MAAM,CAAC,CAAC,KAAK,SAAS,EAAE,eAAe,CAAC,KAAI;gBAC1C,IAAI,eAAe,EAAE;AACnB,oBAAA,MAAM,CAAC,IAAI,CACT,CAAA,gFAAA,CAAkF,CACnF;gBACH;AACA,gBAAA,OAAO,SAAS,IAAI,CAAC,eAAe;AACtC,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAC/D,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;;AAEjC,YAAA,UAAU,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CACtE;AACH,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AACD;;;;;;;;;;;;;;AAcG;AACH,QAAA,IAAA,CAAA,sBAAsB,GAAG,YAAY,CAAC,MAAK;YACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,wBAAwB,CAAC,EAChC,GAAG,CAAC,MAAM,mBAAmB,EAAE,CAAC,CACjC;AACH,QAAA,CAAC,CAAC;AAEF;;;;;;AAMG;AACH,QAAA,IAAA,CAAA,wBAAwB,GAAG,YAAY,CAAC,MAAK;YAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,gBAAgB,CAAC,EACxB,MAAM,CACJ,CAAC,EAAE,MAAM,EAAE,KACT,MAAM,KAAK,gBAAgB,CAAC,iBAAiB;gBAC7C,IAAI,CAAC,eAAe,CAAC,OAAO;gBAC5B,IAAI,CAAC,eAAe,CAAC,kBAAkB;gBACvC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CACvC,EACD,GAAG,CAAC,MAAK;AACP,gBAAA,MAAM,CAAC,IAAI,CACT,8DAA8D,CAC/D;YACH,CAAC,CAAC,EACF,GAAG,CAAC,MACF,aAAa,CAAC;AACZ,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW;AAC7C,gBAAA,KAAK,EAAE,CAAC;aACT,CAAC,CACH,CACF;AACH,QAAA,CAAC,CAAC;AAEF;;;;AAIG;AACH,QAAA,IAAA,CAAA,2BAA2B,GAAG,YAAY,CAAC,MAAK;AAC9C,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,aAAa,CAAC,EACrB,MAAM,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAC1C,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,KAAK,CAAC,CAAC;YACtC,GAAG,CAAC,MAAM,4BAA4B,EAAE,CAAC,CAC1C;AACH,QAAA,CAAC,CAAC;AAEF;;;;;AAKG;AACH,QAAA,IAAA,CAAA,qBAAqB,GAAG,YAAY,CAAC,MAAK;AACxC,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,aAAa,CAAC,EACrB,MAAM,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAC1C,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAI;AAC/B,gBAAA,MAAM,CAAC,IAAI,CACT,CAAA,sCAAA,EAAyC,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,IAAA,EAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAA,EAAA,CAAI,CACvG;AACH,YAAA,CAAC,CAAC,EACFA,WAAS,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KACxC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAC/CA,WAAS,CAAC,MAAK;AACb,gBAAA,MAAM,CAAC,IAAI,CACT,kDAAkD,OAAO,CAAA,CAAE,CAC5D;;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE;gBACxD,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC;AAChE,oBAAA,IAAI,OAAO,GAAG,WAAW,EAAE;AACzB,wBAAA,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;oBACjE;oBACA,OAAO,EAAE,CACP,mBAAmB,CAAC;AAClB,wBAAA,MAAM,EAAE,oDAAoD;AAC7D,qBAAA,CAAC,CACH;gBACH;;gBAEA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,oBAAoB,CAAC,EAC5B,IAAI,CAAC,CAAC,CAAC,EACPE,SAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,EAC1C,GAAG,CAAC,MACF,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CACzD,EACD,GAAG,CAAC,MAAM,oBAAoB,EAAE,CAAC,EACjC,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,OAAO,GAAG,WAAW,EAAE;AACzB,wBAAA,MAAM,CAAC,IAAI,CACT,yCAAyC,OAAO,CAAA,4BAAA,CAA8B,CAC/E;wBACD,OAAO,EAAE,CACP,aAAa,CAAC;4BACZ,OAAO,EAAE,OAAO,GAAG,CAAC;4BACpB,WAAW;AACZ,yBAAA,CAAC,CACH;oBACH;yBAAO;AACL,wBAAA,MAAM,CAAC,KAAK,CACV,mBAAmB,WAAW,CAAA,qCAAA,CAAuC,CACtE;wBACD,OAAO,EAAE,CACP,mBAAmB,CAAC;4BAClB,MAAM,EAAE,CAAA,+BAAA,EAAkC,WAAW,CAAA,SAAA,CAAW;AACjE,yBAAA,CAAC,CACH;oBACH;gBACF,CAAC,CAAC,CACH;AACH,YAAA,CAAC,CAAC;;YAEF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CACnE,CACF,CACF;AACH,QAAA,CAAC,CAAC;AAEF;;;;;AAKG;AACH,QAAA,IAAA,CAAA,0BAA0B,GAAG,YAAY,CAAC,MAAK;AAC7C,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,mBAAmB,CAAC,EAC3B,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;AACjB,gBAAA,MAAM,CAAC,KAAK,CAAC,yCAAyC,MAAM,CAAA,CAAE,CAAC;AACjE,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KACb,gBAAgB,CAAC;gBACf,MAAM,EAAE,gBAAgB,CAAC,eAAe;AACxC,gBAAA,OAAO,EAAE,MAAM;aAChB,CAAC,CACH,CACF;AACH,QAAA,CAAC,CAAC;AAEF;;;;AAIG;AACH,QAAA,IAAA,CAAA,wBAAwB,GAAG,YAAY,CACrC,MAAK;AACH,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,oBAAoB,CAAC,EAC5B,GAAG,CAAC,MAAK;AACP,gBAAA,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC;YAClE,CAAC,CAAC,CACH;AACH,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AACF,IAAA;8GArqBY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAb,aAAa,EAAA,CAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACnGM,MAAM,iCAAiC,GAAG,cAAc,CAC7D,aAAa,CAAC,0BAA0B,EACxC,aAAa,CAAC,kBAAkB,EAChC,CAAC,oBAAoB,EAAE,KAAK,KAC1B,KAAK,GAAG,IAAI,GAAG,oBAAoB,EAAE,OAAO,IAAI,IAAI;AAEjD,MAAM,yCAAyC,GAAG,cAAc,CACrE,aAAa,CAAC,0BAA0B,EACxC,aAAa,CAAC,kBAAkB,EAChC,CAAC,oBAAoB,EAAE,KAAK,KAC1B,KAAK,GAAG,IAAI,GAAG,oBAAoB,EAAE,QAAQ,IAAI,IAAI;AAElD,MAAM,wBAAwB,GAAG,cAAc,CACpD,aAAa,CAAC,iBAAiB,EAC/B,aAAa,CAAC,kBAAkB,EAChC,CAAC,WAAW,EAAE,KAAK,KACjB,WAAW,EAAE,OAAO,IAAI,KAAK,GAAG,WAAW,EAAE,OAAO,GAAG,IAAI;AAExD,MAAM,0BAA0B,GAAG,cAAc,CACtD,aAAa,CAAC,iBAAiB,EAC/B,CAAC,WAAW,KACV,WAAW,EAAE;MACT,WAAW,CAAC,QAAQ,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,GAAG;MACnD,KAAK;MAEA,gCAAgC,GAAG,cAAc,CAC5D,iCAAiC,EACjC,wBAAwB,EACxB,CAAC,gBAAgB,EAAE,aAAa,KAC9B,gBAAgB,IAAI,aAAa,IAAI,IAAI;AAEtC,MAAM,kBAAkB,GAAG,cAAc,CAC9C,aAAa,CAAC,kBAAkB,EAChC,CAAC,MAAM,KAAK,MAAM;AAEb,MAAM,iBAAiB,GAAG,cAAc,CAC7C,kBAAkB,EAClB,CAAC,MAAM,KAAK,MAAM,EAAE,WAAW,IAAI,mBAAmB;MAE3C,sBAAsB,GAAG,cAAc,CAClD,aAAa,CAAC,eAAe,EAC7B,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,CAAC;AAErB,MAAM,iBAAiB,GAAG,cAAc,CAC7C,kBAAkB,EAClB,CAAC,MAAM,KAAK,MAAM,EAAE,SAAS;AAExB,MAAM,yBAAyB,GAAG,cAAc,CACrD,kBAAkB,EAClB,aAAa,CAAC,oBAAoB,EAClC,CAAC,MAAM,EAAE,cAAc,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,cAAc;AAE3D,MAAM,wBAAwB,GAAG,cAAc,CACpD,aAAa,CAAC,qBAAqB,EACnC,aAAa,CAAC,4BAA4B,EAC1C,CAAC,SAAS,EAAE,YAAY,KAAK,CAAC,SAAS,IAAI,CAAC,YAAY;AAEnD,MAAM,gBAAgB,GAAG,cAAc,CAC5C,wBAAwB,EACxB,aAAa,CAAC,mBAAmB,EACjC,CAAC,SAAS,EAAE,aAAa,KAAK,CAAC,SAAS,IAAI,CAAC,aAAa;AAErD,MAAM,2CAA2C,GAAG,cAAc,CACvE,aAAa,CAAC,oBAAoB,EAClC,aAAa,CAAC,0BAA0B,EACxC,CAAC,cAAc,EAAE,sBAAsB,KACrC,cAAc,IAAI,sBAAsB;AAErC,MAAM,yBAAyB,GAAG,cAAc,CACrD,aAAa,CAAC,YAAY,EAC1B,aAAa,CAAC,iBAAiB,EAC/B,aAAa,CAAC,YAAY,EAC1B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAI;IACzB,MAAM,IAAI,GAAG,EAAE;IACf,IAAI,IAAI,EAAE;AACR,QAAA,IAAI,CAAC,IAAI,CACP,CAAA,EAAG,IAAI,CAAC,aAAa,CAAA,EAAA,EAAK,IAAI,CAAC,UAAU,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,CAAA,CAAE,CAClE;QACD,IAAI,CAAC,IAAI,CAAC,CAAA,oBAAA,EAAuB,IAAI,CAAC,eAAe,CAAA,CAAE,CAAC;AACxD,QAAA,IAAI,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAC,UAAU,CAAA,EAAG,IAAI,CAAC,SAAS,CAAA,CAAE,CAAC;IACvD;SAAO;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACnB;IACA,IAAI,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,CAAA,IAAA,EAAO,QAAQ,CAAC,KAAK,CAAA,CAAE,CAAC;AAClC,IAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,CAAC;AAEI,MAAM,oBAAoB,GAAG,cAAc,CAChD,aAAa,CAAC,oBAAoB,EAClC,CAAC,cAAc,KAAK,cAAc;AAE7B,MAAM,wBAAwB,GAAG,cAAc,CACpD,oBAAoB,EACpB,CAAC,cAAc,KAAK,cAAc,CAAC,kBAAkB,CAAC,MAAM;AAEvD,MAAM,qBAAqB,GAAG,cAAc,CACjD,oBAAoB,EACpB,CAAC,cAAc,KAAI;AACjB,IAAA,IAAI,cAAc,CAAC,oBAAoB,GAAG,CAAC,EAAE;QAC3C,QACE,cAAc,CAAC,sBAAsB;YACrC,cAAc,CAAC,oBAAoB;IAEvC;AACA,IAAA,OAAO,CAAC;AACV,CAAC;AAEI,MAAM,2BAA2B,GAAG,cAAc,CACvD,oBAAoB,EACpB,CAAC,cAAc,KACb,cAAc,CAAC,kBAAkB,EAAE;AACjC,MAAE,cAAc,CAAC,kBAAkB,CAC/B,cAAc,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;MAE9C,IAAI;AAEZ;;AAEG;AACI,MAAM,mBAAmB,GAAG,cAAc,CAC/C,aAAa,CAAC,mCAAmC,EACjD,qBAAqB,EACrB,aAAa,CAAC,iBAAiB,EAC/B,aAAa,CAAC,0BAA0B,EACxC,CACE,6BAA6B,EAC7B,eAAe,EACf,WAAW,EACX,oBAAoB,KAClB;;AAEF,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,KAAK,CACzD,mCAAmC,CACpC;IAED,MAAM,gCAAgC,GAAG;AACvC,UAAE;UACA,CAAC,WAAW,EAAE,gBAAgB,IAAI,CAAC,IAAI,GAAG;AAC9C;;;AAGG;IAEH,MAAM,qBAAqB,GAAG;AAC5B,UAAE;UACA,6BAA6B;AAEjC,IAAA,MAAM,cAAc,GAAG,wBAAwB,GAAG,GAAG;AACrD,IAAA,MAAM,UAAU,GAAG,WAAW,EAAE;UAC5B,cAAc,GAAG;UACjB,cAAc;AAElB,IAAA,MAAM,iBAAiB,GAAG,IAAI,CAC5B,KAAK,EACL,UAAU,EACV,CAAC,qBAAqB,IAAI,CAAC,IAAI,GAAG,CACnC;AACD,IAAA,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,eAAe,CAAC;IAC7D,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,GAAG,YAAY,CAAC;AACvD,CAAC;AAGI,MAAM,sBAAsB,GAAG,cAAc,CAClD,aAAa,CAAC,2BAA2B,EACzC,aAAa,CAAC,kBAAkB,EAChC,CAAC,QAAQ,EAAE,MAAM,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEvC,MAAM,qBAAqB,GAAG,cAAc,CACjD,aAAa,CAAC,mBAAmB,EACjC,aAAa,CAAC,0BAA0B,EACxC,aAAa,CAAC,qBAAqB,EACnC,CAAC,SAAS,EAAE,eAAe,EAAE,oBAAoB,KAC/C,CAAC,SAAS,IAAI,CAAC,eAAe,IAAI,CAAC,oBAAoB;;AC9KrD,SAAU,uBAAuB,CAErC,GAAqB,EAAA;AAErB,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,0BAA0B,CAAC;AACzB,QAAA,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU;AACpC,QAAA,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,eAAe;AAC5C,QAAA,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG;AAC5B,KAAA,CAAC,CACH;AACH;;SCbgB,WAAW,GAAA;AACzB,IAAA,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,SAAS,CAAC;AACb,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,MAAM,EAAE,OAAO;AAChB,KAAA,CAAC,CACH;AACH;;ACLM,SAAU,kBAAkB,CAEhC,GAAuB,EAAA;AAEvB,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AACjB;;ACLM,SAAU,aAAa,CAA0B,GAAW,EAAA;IAChE,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAC5D;AACD,IAAA,OAAO,IAAI;AACb;;ACEA,MAAM,SAAS,GAAG;IAChB,mBAAmB;IACnB,sCAAsC;IACtC,mCAAmC;IACnC,wCAAwC;IACxC,oCAAoC;CACrC;AACK,SAAU,cAAc,CAA0B,CAAa,EAAA;AACnE,IAAA,MAAM,OAAO,GAAG,CAAA,kBAAA,EAAqB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA,GAAA,EAAM,CAAC,CAAC,MAAM,EAAE;AAC3E,IAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAE5C,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;QAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;IACvC;AACF;;ACrBM,SAAU,cAAc,CAA0B,CAAQ,EAAA;AAC9D,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;AAE7C,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;QACf,MAAM,EAAE,gBAAgB,CAAC,cAAc;AACvC,QAAA,OAAO,EAAE,iBAAiB;AAC3B,KAAA,CAAC,CACH;AACH;;ACZM,SAAU,gBAAgB,CAE9B,CAA8B,EAAA;AAE9B,IAAA,MAAM,UAAU,GAAG,CAAC,IAAY,KAAI;;QAElC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzB,IAAA,CAAC;AAED,IAAA,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC9B,QAAA,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACpB;AAAO,SAAA,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,EAAE;QACjC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;IAChC;AACF;;SCdgB,aAAa,GAAA;IAC3B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAEzC,IAAI,CAAC,iBAAiB,EAAE;AAC1B;;ACKA;;;AAGG;AACI,MAAM,iBAAiB,GAAG,CAC/B,MAA2B,KAC6B;AACxD,IAAA,OAAO,CAAC,OAA2B,KACjC,KAAK,CACH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,MAAa,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAU,CAAC,CAAC,EACxE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAU,CAAC,CAAC,CAC5D,CAAC,IAAI,CACJ,IAAI,CACF,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EACnE,CAAC,CACF,CACF;AACL;;AClBM,SAAU,sBAAsB,CAIpC,IAAO,EACP,MAAyB,EACzB,OAAO,GAAG,KAAK,EACf,iBAAiB,GAAG,IAAI,EAAA;AAExB,IAAA,MAAM,aAAa,GAAG,YAAY,EAAE;IACpC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE;AAEtC,IAAA,MAAM,UAAU,GAAG,UAAU,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,IAAI,CAC3ED,KAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;;;;QAIf,OAAO,iBAAiB,IAAI;cACxB,EAAE,IAAI;cACN,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE;IACzC,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;AAClB,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,KAAK,aAAa;AAC7D,IAAA,CAAC,CAAC,EACFC,SAAO,CAAC,OAAO,CAAC,EAChB,UAAU,CAAC,MACT;AACE,UAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,EAAE;UAC9D,EAAE,CAAC,IAAI,CAAC,CACb,EACD,IAAI,CAAC,CAAC,CAAC,EACP,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,MAAM,CAAC,CACf;IAED,UAAU,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAEhC,IAAA,OAAO,UAAmB;AAC5B;;ACjDA;AACM,SAAU,UAAU,CAAC,OAAY,EAAA;AACrC,IAAA,IAAI;QACF,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAClD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF;;ACEA;;;AAGG;AACG,SAAU,UAAU,CACxB,KAAQ,EAAA;AAER,IAAA,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI;;AAE1B,IAAAD,KAAG,CAAC,CAAC,IAAa,KAChB,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CACxE,CACF;AACH;AAMA;;;;AAIG;SACa,UAAU,CACxB,KAAQ,EACR,GAAG,IAA4D,EAAA;AAE/D,IAAA,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACxD;AAEM,SAAU,wBAAwB,CACtC,OAAU,EAAA;IAEV,OAAO,UAAU,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,IAAI,CAC/DA,KAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,CAAC,EACzBA,KAAG,CAAC,CAAC,IAAI,KAAI;AACX,QAAA,IAAI,iBAAiB,IAAI,IAAI,EAAE;YAC7B,OAAO,IAAI,EAAE,eAAe;QAC9B;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,EAC1CA,KAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EACnBA,KAAG,CAAC,CAAC,IAAI,KAAI;AACX,QAAA,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,EAAE,OAAO;aACN;QACpB;QAEA,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;SACL;IACpB,CAAC,CAAC,CACH;AACH;;AChEO,MAAM,cAAc,GAAG,MAAK;IACjC,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC3C;AAEO,MAAM,sBAAsB,GAAG,MAAK;AACzC,IAAA,UAAU,CAAC,0BAA0B,CAAC,mBAAmB,CAAC;AAC5D;;ACTA,MAAM,UAAU,GAAgD;AAC9D,IAAA,OAAO,EACL,wKAAwK;CAC3K;AAEK,SAAU,kBAAkB,CAAC,IAAmB,EAAA;IACpD,IAAI,IAAI,KAAK,IAAI;AAAE,QAAA,OAAO,SAAS;AAEnC,IAAA,OAAO,UAAU,CAAC,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAC;AAClC;;ACJO,MAAM,qBAAqB,GAAG,MAEV;AACzB,IAAA,OAAO,CAAC,MAA0B,KAChC,MAAM,CAAC,IAAI,CACT,IAAI,CACF,CAAC,GAAG,EAAE,KAAK,MAAM;QACf,QAAQ,EAAE,GAAG,CAAC,OAAO;AACrB,QAAA,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,GAAG,CAAC,SAAS;AACzB,QAAA,SAAS,EACP,OAAO,WAAW,KAAK,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AACtE,KAAA,CAAC,EACF;AACE,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,SAAS,EAAE,CAAC;AAMb,KAAA,CACF,EAED,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAI;;AAEzD,QAAA,MAAM,EAAE,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,CAAC;QAClD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE;;;AAGvC,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC;QACpB;;AAGA,QAAA,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC,EAEFA,KAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CACxD;AACL;AAEA;;;;;;;;AAQG;AACI,MAAM,gBAAgB,GAAG,CAC9B,KAAa,EACb,GAAW,EACX,QAAgB,KACM;AACtB,IAAA,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,EAAE;AAC/C,IAAA,OAAO,QAAQ,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,IAAI,CAC9CA,KAAG,CAAC,MAAK;AACP,QAAA,MAAM,OAAO,GAAG,CAAC,uBAAuB,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,QAAQ;QACtE,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;AAC9B,IAAA,CAAC,CAAC,EACF,oBAAoB,EAAE,EACtB,SAAS,CAAC,CAAC,QAAQ,KAAK,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,EAC3CA,KAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAC9C;AACH;;AC/DO,MAAM,uBAAuB,GAAG,CACrC,YAAA,GAAqC,OAAO,EAC5C,WAA+B,EAC/B,KAA6B,KAC3B;AACF,IAAA,IAAI;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CACnC,kBAAkB,CACC;QACrB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC;AAEhD,QAAA,MAAM,CAAC,KAAK;AACV,YAAA,YAAY,KAAK;kBACb,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,WAAW,IAAI;kBACtC,aAAa;AACnB,QAAA,MAAM,CAAC,MAAM;AACX,YAAA,YAAY,KAAK;kBACb,KAAK,EAAE,MAAM,IAAI,KAAK,EAAE,YAAY,IAAI;kBACxC,cAAc;AAEpB,QAAA,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAEvD,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,CAAW;IACjE;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;;ACnCA;;;;AAIG;AACH,IAAI,KAAK,GAAG,CAAC;AACP,UAAW,YAAY,CAAC,IAAc,EAAA;IAC1C,OAAO,IAAI,EAAE;QACX,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC;AACF;;MCRa,cAAc,CAAA;AAMzB;;;;;AAKG;AACH,IAAA,WAAA,CACE,eAAuB,EACvB,kBAA0B,EAC1B,YAAoB,EACpB,gBAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,kBAAkB;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;IAC1C;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,WAAmB,EAAA;;;AAGxB,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ;;QAEvC,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY;;;AAIjE,QAAA,MAAM,UAAU,GAAG,WAAW,GAAG,iBAAiB;;AAElD,QAAA,MAAM,oBAAoB,GAAG,oBAAoB,GAAG,IAAI,CAAC,gBAAgB;;AAEzE,QAAA,MAAM,UAAU,GAAG,oBAAoB,GAAG,oBAAoB;;QAG9D,IAAI,CAAC,QAAQ,GAAG,iBAAiB,GAAG,UAAU,GAAG,UAAU;;QAE3D,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,UAAU,IAAI,oBAAoB;QAE1D,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA,IAAA,MAAM,CAAC,IAAoB,EAAA;QACzB,MAAM,EACJ,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,GACjB,GAAG,IAAI;AACR,QAAA,IAAI,CAAC,QAAQ,GAAG,sBAAsB;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,sBAAsB;AACzC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;IAC1C;AACD;;MCjEY,cAAc,CAAA;IASzB,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;IACrC;AAEA,IAAA,YAAY,CAAC,SAAc,EAAA;AACzB,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,aAAa;AAC9C,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,QAAQ;AACpC,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,eAAe;AAClD,QAAA,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC,kBAAkB;AACxD,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE;AACtC,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;IACrC;AAEA,IAAA,wBAAwB,CAAC,WAAmB,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,EAAE;YACxC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;AACtD,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC;QACrC;IACF;IAEA,wBAAwB,CAAC,CAAM,EAAA,EAAG;AACnC;;AClCM,MAAM,cAAc,GAAG,CAAC,cAAsB,KAAa;IAChE,MAAM,QAAQ,GAAG,EAAE;IACnB,MAAM,KAAK,GAAG,EAAE;IAEhB,IAAI,OAAO,GAAY,MAAM;AAC7B,IAAA,IAAI,cAAc,GAAG,KAAK,EAAE;QAC1B,OAAO,GAAG,KAAK;IACjB;AAAO,SAAA,IAAI,cAAc,GAAG,QAAQ,EAAE;QACpC,OAAO,GAAG,QAAQ;IACpB;AACA,IAAA,OAAO,OAAO;AAChB;;MCVa,mBAAmB,GAAG,CACjC,KAA0B,EAC1B,UAAkB,KAChB;IACF,MAAM,YAAY,GAAG,KAAK;AAC1B,IAAA,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE;AACxB,IAAA,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,MAAM,CACpD,QAAQ,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAC7B;IACD,GAAG,CAAC,sBAAsB,EAAE;IAC5B,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;IACjC,MAAM,aAAa,GAAa,EAAE;IAClC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAI;AACvE,QAAA,IAAI,IAAI,GAAG,SAAS,GAAG,YAAY,EAAE;AACnC,YAAA,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB;AACF,IAAA,CAAC,CAAC;AACF,IAAA,GAAG,CAAC,sBAAsB,IAAI,aAAa,CAAC,MAAM;IAClD,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,MAAM,CACpD,CAAC,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CACjD;AACD,IAAA,OAAO,GAAG;AACZ;;ACtBO,MAAM,QAAQ,GAAG,MAAK;AAC3B,IAAA,UAAU,CAAC,0BAA0B,CAAC,YAAY,CAAC;AACrD;;ACHM,SAAU,kBAAkB,CAChC,IAAiB,EAAA;AAEjB,IAAA,OAAO,IAAI,UAAU,CAAC,CAAC,UAAU,KAAI;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,KACjD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CACzB;AACD,QAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QAEtB,OAAO,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;AACvC,IAAA,CAAC,CAAC;AACJ;;MCba,aAAa,CAAA;AAIxB,IAAA,OAAO,CAAC,MAAW,EAAA;;AAEjB,QAAA,MAAM,MAAM,GAAI,MAA4B,CAAC,aAAa,EAAE;AAE5D,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,wBAAwB,EAAE;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC;AACvD,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AACxE,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;AAG1B;;;;AAIE;IACJ;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE;IAC5B;AAEA,IAAA,mBAAmB,CAAC,KAAU,EAAA;QAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACpC,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;IAEA,QAAQ,GAAA;QACN,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACzC,YAAA,IAAI,EAAE,YAAY;AACnB,SAAA,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,GAAQ,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AAC1C,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5B,QAAA,CAAC,CAAC,KAAK,GAAG,eAAe;AACzB,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;AACZ,QAAA,CAAC,CAAC,QAAQ,GAAG,WAAW;QACxB,CAAC,CAAC,KAAK,EAAE;AACT,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;AACD;;MChCY,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;AAQW,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CACvB,UAAU,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAC1DA,KAAG,CAAC,CAAC,IAAI,MAAM,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CACxD,CACF;AACF,IAAA;8GANY,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECftC,84BA8BA,EAAA,MAAA,EAAA,CAAA,83CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBY,YAAY,6HAAE,qBAAqB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAElC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,WACtC,CAAC,YAAY,EAAE,qBAAqB,CAAC,EAAA,QAAA,EAAA,84BAAA,EAAA,MAAA,EAAA,CAAA,83CAAA,CAAA,EAAA;;;MECnC,oBAAoB,CAAA;AANjC,IAAA,WAAA,GAAA;AAOU,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAEpB,QAAA,IAAA,CAAA,mCAAmC,GAAG,QAAQ,CACrD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAC7D;AACQ,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAChC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CACpD;AACF,IAAA;8GATY,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,4ECdjC,2VAeA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FDDa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;+BACE,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2VAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA;;;MEEpC,QAAQ,CAAA;AAHrB,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAyBzC,IAAA;IAvBC,SAAS,CACP,KAAU,EACV,IAAY,EAAA;QAEZ,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;QACd;QAEA,QAAQ,IAAI;AACV,YAAA,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACtD,YAAA,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,KAAK,CAAC;AACvD,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC;AACxD,YAAA,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC;AACrD,YAAA,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC;AAC7D,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAA,CAAE,CAAC;;IAE7D;8GAzBW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAHpB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,MAAM;AACb,iBAAA;;;MCAY,0BAA0B,CAAA;AAPvC,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAK9B,IAAA;AAHC,IAAA,KAAK,CAAC,KAAe,EAAA;QACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC;8GALW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbvC,igCAkCA,EAAA,MAAA,EAAA,CAAA,0JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvBsB,qBAAqB,+RAA/B,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;+BACE,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,WACtC,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAAA,QAAA,EAAA,igCAAA,EAAA,MAAA,EAAA,CAAA,0JAAA,CAAA,EAAA;;;MEC/B,wBAAwB,CAAA;AAPrC,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAErB,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC;QACtE,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CACvC,aAAa,CAAC,qBAAqB,CACpC;AACF,IAAA;8GAPY,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZrC,gTAcA,EAAA,MAAA,EAAA,CAAA,iTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJY,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEf,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,mBAGhB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,gTAAA,EAAA,MAAA,EAAA,CAAA,iTAAA,CAAA,EAAA;;;MEehB,kBAAkB,CAAA;AAN/B,IAAA,WAAA,GAAA;AAOU,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AAKtB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,SAAS,iDAAC;AACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,CAAC,oDAAC;AACnB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;QAOjC,IAAA,CAAA,IAAI,GAAsB,EAAE;QAEpC,IAAA,CAAA,GAAG,GAAG,CAAC;QACP,IAAA,CAAA,GAAG,GAAG,CAAC;QACP,IAAA,CAAA,OAAO,GAAG,CAAC;AAkEZ,IAAA;IA1EC,IAAa,QAAQ,CAAC,IAA4C,EAAA;QAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;IACpC;IAQA,eAAe,GAAA;QACb,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;QACtC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAA6B;IACrE;AAGA,IAAA,MAAM,CAAC,CAAQ,EAAA;QACb,IAAI,CAAC,IAAI,EAAE;IACb;IAEQ,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB;QACF;QAEA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAa;QACxE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AAChC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAE/D,QAAA,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;YAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;AAElC,YAAA,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAW,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CACf,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EACvB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EACtB,IAAI,CAAC,QAAQ,EAAE,EACf,CAAC,CACF;AACH,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;IACpB;AAEQ,IAAA,QAAQ,CAAC,SAAiB,EAAE,KAAK,GAAG,CAAC,EAAA;AAC3C,QAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;;AAEvC,QAAA,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACjC,QAAA,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAC7C;AACE,YAAA,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACnC,OAAO,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChC;IACF;AAEQ,IAAA,QAAQ,CAAC,KAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAErB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE;AAC1D,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;QACnB;QAEA,IAAI,CAAC,IAAI,EAAE;IACb;8GApFW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,ouBCzB/B,sJAIA,EAAA,MAAA,EAAA,CAAA,qFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FDqBa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sJAAA,EAAA,MAAA,EAAA,CAAA,qFAAA,CAAA,EAAA;;sBAI9C,SAAS;uBAAC,OAAO;;sBASjB;;sBAeA,YAAY;uBAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;;;MEf9B,qBAAqB,CAAA;AAPlC,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAErB,IAAA,CAAA,sBAAsB,GAAG,IAAI,CAAC;aAC5C,MAAM,CAAC,gBAAgB;AACvB,aAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEb,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC;AAC/D;;AAEG;AACM,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CACzC,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAC9C,qBAAqB,EAAE,EACvB,oBAAoB,EAAE,EACtBA,KAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,GAAG,CAAC,EACxC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,EACxEA,KAAG,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,KAC5B,cAAc,GAAG,iBAAiB,GAAG,OAAO,CAC7C,CACF,CACF;QAEQ,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC5C,aAAa,CAAC,iBAAiB,CAChC;AAwFF,IAAA;IAtFC,QAAQ,GAAA;AACN;;AAEG;AACH,QAAA,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEpC;;AAEG;QACH,MAAM,WAAW,GAAqB;AACnC,aAAA,YAAY;AACZ,aAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEpB;;AAEG;AACH,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CACxC,aAAa,CAAC,mBAAmB,CAClC;AAED;;;AAGG;AACH,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,MAAM,CAAC,aAAa,CAAC,qBAAqB;AAC1C,aAAA,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACPD,WAAS,CAAC,CAAC,SAAS,KAClB;AACE,cAAE,EAAE,CAAC,oBAAoB;cACvB,EAAE,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAClE,CACF;AAEH;;AAEG;AACH,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CACxC,aAAa,CAAC,mBAAmB,CAClC;AAED;;AAEG;QACH,MAAM,aAAa,GAAG,KAAK,CACzB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAC7C,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CACtC,CAAC,IAAI,CACJ,KAAK,CAAC,GAAG,CAAC,EACVC,KAAG,CAAC,MAAM,IAAI,CAAC,CAChB;AAED;;AAEG;QACH,KAAK,CAAC,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa;AACjE,aAAA,IAAI,CACH,YAAY,CAAC,CAAC,CAAC,EACf,MAAM,CAAC,UAAU,CAAC,EAClB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,kBAAkB,CAAC,MAAgB,CAAC,CAAC;IACrE;AAEA;;;;;;;AAOG;AACK,IAAA,kBAAkB,CAAC,IAAY,EAAA;QACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAC3C,IAAI,CAAC,mBAAmB,EAAE,uBAAuB;AAC/C,YAAA,0BAA0B,CACR;AAEtB,QAAA,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,aAAa,CAAC,aAAa;AAClD,YAAA,cAAc,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC;QACxC;AAAE,QAAA,MAAM;;QAER;IACF;8GAnHW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpClC,2ZAgBA,EAAA,MAAA,EAAA,CAAA,6yBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkBY,sBAAsB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAErB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,mBAGZ,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,2ZAAA,EAAA,MAAA,EAAA,CAAA,6yBAAA,CAAA,EAAA;;;MEbtB,mBAAmB,CAAA;AAkF9B,IAAA,WAAA,GAAA;QAjFA,IAAA,CAAA,SAAS,GAAG,KAAK;AACT,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;AAC5C,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW;AAEnC,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,CACrD;AACQ,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAC/D,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CACZA,KAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,IAAI,CAAC;AAChD,YAAA,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC,CACJ,CACF;AACQ,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CACZA,KAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY;AACxC,YAAA,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC,CACJ,CACF;AACQ,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CACZA,KAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO;AACnC,YAAA,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC,CACJ,CACF;AACQ,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CACZA,KAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc;AAC1C,YAAA,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC,CACJ,CACF;AACQ,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CACZA,KAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU;AACtC,YAAA,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC,CACJ,CACF;AACQ,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CACZA,KAAG,CACD,CAAC,KAAK,KACJ,IAAI,CAAC,SAAS;AACb,YAAA;gBACC,GAAG,KAAK,CAAC,eAAe;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;aACD,CAC1B,EACD,MAAM,CAAC,OAAO,CAAC,EACfA,KAAG,CAAC,CAAC,IAAS,KAAI;YAChB,OAAO,IAAI,CAAC;AACT,iBAAA,GAAG,CAAC,CAAC,GAAG,KAAI;gBACX,OAAO;oBACL,GAAG;AACH,oBAAA,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;iBACjB;AACH,YAAA,CAAC;AACA,iBAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC,CAAC,CACH,CACF;QAED,IAAA,CAAA,SAAS,GAAU,EAAE;QAEb,IAAA,CAAA,KAAK,GAAG,0BAA0B;QAClC,IAAA,CAAA,cAAc,GAAa,EAAE;AAE7B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;QAGrD,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe;YACf,aAAa;YACb,SAAS;YACT,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,QAAQ;YACR,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,gBAAgB;YAChB,kBAAkB;YAClB,sBAAsB;YACtB,aAAa;YACb,gBAAgB;YAChB,SAAS;YACT,YAAY;YACZ,MAAM;YACN,MAAM;YACN,QAAQ;YACR,cAAc;;;;;SAKf;QAED,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAI;AAC5C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CACzBA,KAAG,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;gBACjB,MAAM,KAAK,GAAI,GAAG,CAAC,eAAuB,CAAC,GAAG,CAAC;AAC/C,gBAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAS;YACtC,CAAC,CAAC,CACH;YAED,OAAO;gBACL,GAAG;gBACH,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;gBAC3C,IAAI;aACL;AACH,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACvC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAChCA,KAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KACd,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAC7D,CACF;IACH;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS;QAChC,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA,IAAA,WAAW,CAAC,MAAkB,EAAE,EAAU,EAAE,KAAW,EAAA;QACrD,MAAM,CAAC,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE;YACxD;QACF;QACA,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACzE;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B;QACA,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI;YACF,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAC3B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAW,CAAC,IAAI,EAAE;AAC9D,YAAA,IAAI,CAAC,cAAc,GAAG,QAAQ,IAAI,EAAE;AACpC,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC5B;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;QAC1B;IACF;IAEQ,WAAW,GAAA;QACjB,YAAY,CAAC,OAAO,CAClB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAAS,CAAC;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,cAAc;AAC9B,SAAA,CAAC,CACH;IACH;8GArLW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBhC,unDAmDA,EAAA,MAAA,EAAA,CAAA,uwCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhCY,kBAAkB,0GAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEhD,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAA,QAAA,EAAA,unDAAA,EAAA,MAAA,EAAA,CAAA,uwCAAA,CAAA,EAAA;;;MEejD,2BAA2B,CAAA;AAPxC,IAAA,WAAA,GAAA;AAQE,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAE/B,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,wBAAwB,CAAC;QACtE,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC;QAEtE,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC;QAC1D,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC;QACzD,IAAA,CAAA,aAAa,GAAG,MAAM,CAC7B,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACtE;QACQ,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CACpC,MACE,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC1B;QAED,IAAA,CAAA,YAAY,GAAwB,IAAI;AA8BzC,IAAA;IA5BC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,qBAAqB;AAC1C,aAAA,IAAI,CAACM,MAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAChE,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACzC;IAEA,eAAe,GAAA;AACb,QAAA,UAAU,CAAC,0BAA0B,CAAC,cAAc;AACjD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAyC,KAAI;AACvD,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,QAAQ;YAElC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC;gBAClC,IAAI,CAAC,YAAY,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;IACN;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACnE;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;8GAjDW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClCxC,+eAoBA,EAAA,MAAA,EAAA,CAAA,+hBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDYY,qBAAqB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEpB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,mBAGnB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,qBAAqB,CAAC,EAAA,QAAA,EAAA,+eAAA,EAAA,MAAA,EAAA,CAAA,+hBAAA,CAAA,EAAA;;;MEZrB,iBAAiB,CAAA;AAc5B,IAAA,WAAA,GAAA;AAbiB,QAAA,IAAA,CAAA,YAAY,GAC3B,SAAS,CAA6B,kBAAkB,wDAAC;AACnD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACnB,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC/C,aAAa,CAAC,mBAAmB,CAClC;QACS,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC/C,aAAa,CAAC,mBAAmB,CAClC;QACO,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC7C,aAAa,CAAC,mBAAmB,CAClC;QAGC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;YAC1C,SAAS,CAAC,MAAK;gBACb,IAAI,aAAa,KAAK,aAAa,IAAI,aAAa,CAAC,EAAE;oBACrD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACtC;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,YAAA,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,EAAE;gBACnC;YACF;AACA,YAAA,SAAS,CAAC,MACR,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,YAAY,CAAC,aAAa,CAAC,CAC5D;AACH,QAAA,CAAC,CAAC;IACJ;IAEQ,WAAW,CAAC,GAAW,EAAE,cAA8B,EAAA;QAC7D,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC;;AAEhE,QAAA,cAAc,CAAC,SAAS,GAAG,EAAE,CAAC;;QAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACpD,QAAA,YAAY,CAAC,QAAQ,GAAG,IAAI;AAC5B,QAAA,YAAY,CAAC,KAAK,GAAG,IAAI;AACzB,QAAA,YAAY,CAAC,IAAI,GAAG,IAAI;QACxB,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,YAAY,CAAC,MAAM,GAAG,CAAA,EAAG,GAAG,aAAa;QAC3C;AAEA,QAAA,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACxC,QAAA,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACjC,QAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAClC,QAAA,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO;QAEtC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QACtD,IAAI,iBAAiB,EAAE;AACrB,YAAA,aAAa,CAAC,GAAG,GAAG,GAAG;QACzB;aAAO;AACL,YAAA,aAAa,CAAC,GAAG,GAAG,CAAA,EAAG,GAAG,YAAY;QACxC;AAEA,QAAA,aAAa,CAAC,IAAI,GAAG,WAAW;;AAEhC,QAAA,YAAY,CAAC,WAAW,CAAC,aAAa,CAAC;;AAEvC,QAAA,YAAY,CAAC,SAAS,IAAI,uBAAuB;;AAEjD,QAAA,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC;IAC1C;8GArEW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpB9B,6OAQA,EAAA,MAAA,EAAA,CAAA,4ZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDSY,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGf,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,WAGhB,CAAC,gBAAgB,CAAC,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6OAAA,EAAA,MAAA,EAAA,CAAA,4ZAAA,CAAA,EAAA;oGAIP,kBAAkB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEmD/C,oBAAoB,CAAA;AAgC/B,IAAA,IAAY,YAAY,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,YAAA,OAAO,IAAI,CAAC,wBAAwB,EAAE;QACxC;AACA,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;IAC/B;AAEA,IAAA,IAAY,UAAU,GAAA;QACpB,OAAO,MAAM,CAAC,gBAAgB;IAChC;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;IACvC;AAEA,IAAA,WAAA,GAAA;AAnDS,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,IAAI,sEAAC;QACxC,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAoC;AACvE,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,MAAM,EAAE,cAAc;AACvB,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACF,QAAA,IAAA,CAAA,sBAAsB,GAAG,YAAY,CACnC,QAAQ,CAAC,MAAK;AACZ,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC1C,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QACvD,CAAC,CAAC,CACH;AACQ,QAAA,IAAA,CAAA,YAAY,GACnB,SAAS,CAA6B,gBAAgB,wDAAC;QACzD,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAW;QAChC,IAAA,CAAA,KAAK,GAAG,aAAa;QACrB,IAAA,CAAA,MAAM,GAAG,cAAc;AACvB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC;AACjE,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;QAC5C,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAC1C,aAAa,CAAC,kBAAkB,CACjC;QACO,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CACpD,0BAA0B,CAC3B;AACO,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAClD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAuBrC,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAChD,YAAA,IAAI,YAAY,IAAI,gBAAgB,EAAE;gBACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACvC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,eAAe,CAAC;YACd,IAAI,EAAE,MAAK;AACT,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;gBACxC,IAAI,YAAY,EAAE;oBAChB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC;AAE1D,oBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE;wBAC/B,SAAS,CAAQ,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa;AACxD,6BAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;6BACxC,SAAS,CAAC,CAAC,KAAY,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;oBACxD;oBACA,IAAI,CAAC,kBAAkB,EAAE;gBAC3B;YACF,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9D,MAAM,CAAC,MAAM,CAAC,EACd,oBAAoB,EAAE,EACtB,MAAM,CACJ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CACtE,EACDN,KAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAC/C,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAI;AACxB,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACtB,CAAC,CAAC,CACH;AAED,QAAA,MAAM,eAAe,GAAG,KAAK,CAC3B,UAAU,CAAC,0BAA0B,CAAC,kBAAkB,CAAC,EACzD,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC5B;AAED,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,CACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAC1CA,KAAG,CAAC,CAAC,KAAK,MAAM;AACd,YAAA,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,UAAU,IAAI,CAAC;AACxC,YAAA,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,WAAW,IAAI,CAAC;SAC1C,CAAC,CAAC,EACH,oBAAoB,CAClB,CAAC,QAAQ,EAAE,OAAO,KAChB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC;AACxD,YAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAC3D,CACF;AAED,QAAA,KAAK,CAAC,uBAAuB,EAAE,eAAe,EAAE,uBAAuB;aACpE,IAAI,CACHK,cAAY,CAAC,6BAA6B,CAAC,EAC3CN,WAAS,CAAC,MAAK;AACb,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;;YAEzB,OAAO,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CACvB,IAAI,CAAC,CAAC,CAAC,EACPC,KAAG,CAAC,MAAM,GAAG,CAAC,CACf;AACH,QAAA,CAAC,CAAC,EACFA,KAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAC7C,oBAAoB,CAClB,CAAC,QAAQ,EAAE,OAAO,KAChB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC;YACxD,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC;AACxD,YAAA,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAC/B,EACD,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EACpC,oBAAoB,CAClB,CAAC,QAAQ,EAAE,OAAO,KAChB,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC;AACxD,YAAA,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAC3D,EACD,iBAAiB,CACf,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,0BAA0B;AAC/C,aAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CACxB,EACD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAI;YACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,4BAA4B,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAChE;AACD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACvB,QAAA,CAAC,CAAC;AAEJ,QAAA,UAAU,CAAC,0BAA0B,CAAC,mBAAmB;AACtD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AACpC,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,UAAU,CAAC,IAAU,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY;AAElC,QAAA,IAAI,KAAK,EAAE,KAAK,EAAE;AAChB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU;AAC1B,YAAA,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;AACzD,YAAA,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;AAE1D,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,gBAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAC/B,gBAAA,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO;gBAC/B,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,CAAA,EAAA,CAAI;gBACtC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA,EAAA,CAAI;YAC1C;QACF;AAEA,QAAA,UAAU,CAAC,0BAA0B,CAAC,uBAAuB,CAAC;IAChE;AAEA;;;;;;;AAOG;IACK,wBAAwB,GAAA;AAC9B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU;AAC1B,QAAA,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC;AACvC,QAAA,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC;AAExC,QAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE,EAAE;YACrC,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,WAAW,IAAI,CAAC;YAChE,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,YAAY,IAAI,CAAC;QACnE;AAEA,QAAA,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,UAAU,GAAG,EAAE,EAAE;AAE3D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU;QAC1C,IAAI,IAAI,GAAG,cAAc;QACzB,IAAI,IAAI,GAAG,aAAa;QAExB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;AAE1C,QAAA,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE;AAClB,YAAA,IAAI,GAAG,cAAc,GAAG,CAAC;AACzB,YAAA,IAAI,GAAG,aAAa,GAAG,CAAC;QAC1B;QAEA,MAAM,SAAS,GAAG;AAChB,cAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,cAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAEpC,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAC5B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,EAC5C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,CAC5B;AAED,QAAA,IAAI,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE;QAEtB,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC;AACrD,QAAA,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE;;YAExB,GAAG,GAAG,UAAU;QAClB;aAAO;;AAEL,YAAA,GAAG,CAAC,KAAK,GAAG,CAAC;QACf;AAEA;;AAEG;QACH,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5B,QAAA,OAAO,EAAE,GAAG,GAAG,EAAE;IACnB;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU;AAC1B,QAAA,MAAM,UAAU,GACd,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,WAAW,IAAI,CAAC,CAAC;AAC5D,QAAA,MAAM,UAAU,GACd,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,YAAY,IAAI,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE;AAEjD,QAAA,MAAM,qBAAqB,GAAG,gBAAgB,CAC5C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAC7C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,CAC5B;AAED,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,qBAAqB,EAAE;AAClD,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC;YACtC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC;AACxC,SAAA,CAAC;AAEF;;AAEG;QACH,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,UAAU,CAAC,IAAU,EAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC;YACtC,OAAO,EAAE,cAAc,CAAC,wBAAwB;AAChD,YAAA,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE;AAClD,SAAA,CAAC;IACJ;AAEQ,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;IACxC;8GAlRW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,cAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzEjC,ygBAkBA,EAAA,MAAA,EAAA,CAAA,22WAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED8CI,yBAAyB,kEACzB,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,2BAA2B,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,wBAAwB,kEACxB,iBAAiB,EAAA,QAAA,EAAA,eAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGR,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAfhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,yBAAyB;wBACzB,qBAAqB;wBACrB,oBAAoB;wBACpB,mBAAmB;wBACnB,2BAA2B;wBAC3B,wBAAwB;wBACxB,iBAAiB;AAClB,qBAAA,EAAA,QAAA,EAAA,ygBAAA,EAAA,MAAA,EAAA,CAAA,22WAAA,CAAA,EAAA;gcAgBuC,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA;sBA6BvD,YAAY;uBAAC,WAAW;;sBAIxB,YAAY;uBAAC,UAAU;;;MEzGb,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;AAQU,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAsB9B,IAAA;IApBC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAEA,8BAA8B,GAAA;AAC5B,QAAA,IAAI,CAAC;AACF,aAAA,MAAM,CAAC,aAAa,CAAC,qBAAqB;AAC1C,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACZ,aAAA,SAAS,CAAC,CAAC,WAAW,KAAI;YACzB,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,gBAAgB,CAAC;oBACf,MAAM,EAAE,gBAAgB,CAAC,cAAc;AACvC,oBAAA,OAAO,EAAE,uBAAuB;AACjC,iBAAA,CAAC,CACH;YACH;YACA,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,CAAC;IACN;8GAvBW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECftC,i5CAkCA,EAAA,MAAA,EAAA,CAAA,keAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDrBY,qBAAqB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEpB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,mBAGjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,qBAAqB,CAAC,EAAA,QAAA,EAAA,i5CAAA,EAAA,MAAA,EAAA,CAAA,keAAA,CAAA,EAAA;;;MEArB,uBAAuB,CAAA;AAPpC,IAAA,WAAA,GAAA;QAQmB,IAAA,CAAA,UAAU,GAAG,mBAAmB;AACxC,QAAA,IAAA,CAAA,kBAAkB,GAAG,EAAE,GAAG,kBAAkB,EAAE;AACvD,QAAA,IAAA,CAAA,QAAQ,GAAG,EAAE,GAAG,kBAAkB,EAAE;AAsCrC,IAAA;IApCC,QAAQ,GAAA;QACN,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC3D,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1C;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;QAClD,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,YAAY,GAAA;QACV,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;YACvE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG;QACvD,CAAC,EAAE,EAAE,CAAC;QACN,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,kBAAkB,EAAE,GAAG,KAAK,EAAE,CAAC;IACpD;AAEA,IAAA,QAAQ,CAAC,KAAgC,EAAA;AACvC,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9D;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,CAAC,KAAK,CAAC,sDAAsD,EAAE,CAAC,CAAC;QACzE;QACA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;AACnC,QAAA,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;AACjC,QAAA,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,CAAC;IAC5C;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,QAAQ,CAAC;AACZ,YAAA,GAAG,kBAAkB;AACrB,YAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;AACnC,SAAA,CAAC;IACJ;8GAxCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbpC,6iGAqGA,EAAA,MAAA,EAAA,CAAA,u+BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3FY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGV,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,WAGtB,CAAC,WAAW,CAAC,EAAA,eAAA,EACL,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6iGAAA,EAAA,MAAA,EAAA,CAAA,u+BAAA,CAAA,EAAA;;;MEoCpC,6BAA6B,CAAA;AAP1C,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AAC3C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;QAEpC,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CACjD,aAAa,CAAC,mBAAmB,CAClC;QACgB,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAClD,aAAa,CAAC,kBAAkB,CACjC;AACgB,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC/DC,sBAAoB,EAAE,EACtB,MAAM,CAAC,MAAM,CAAC,CACf;AACgB,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAChEA,sBAAoB,EAAE,EACtB,MAAM,CAAC,KAAK,CAAC,CACd;AAEgB,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CACnEA,sBAAoB,EAAE,EACtB,MAAM,CAAC,KAAK,CAAC,CACd;QAEgB,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CACpE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,EACnC,KAAK,EAAE,CACR;QACgB,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAClE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,CAC5B;QAEgB,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC;aACxC,IAAI,CACH,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,EACvC,GAAG,CACD,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,KAAK,aAAa,IAAI,CAAC,cAAc,CACtE;AAEF,aAAA,IAAI,CAAC,KAAK,EAAE,CAAC;QAEC,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CACxD,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAiB,EAAE,CAAC,CAAC,CAC5C;AAEgB,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CACjEH,cAAY,CAAC,GAAG,CAAC,EACjBN,WAAS,CAAC,CAAC,SAAS,KAClB,MAAM,CACJ,EAAE,CAAC,KAAK,CAAC,EACT,KAAK,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC,CAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAEI,WAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CACpD,EACDK,sBAAoB,EAAE,EACtB,MAAM,CAAC,2CAA2C,CAAC,EACnD,KAAK,EAAE,CACR;QAEgB,IAAA,CAAA,aAAa,GAAG,KAAK,CACpC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,UAAU,CAChB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAEL,WAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAEzC,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAChD,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,CACzC;QAEgB,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxD,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB,CAAC,EACvC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EACjCA,WAAS,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAClE;AAEQ,QAAA,IAAA,CAAA,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAC9C,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;AAC7C,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;AAC/C,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,4DAAC;AAChC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,KAAK,+DAAC;QAEnC,IAAA,CAAA,2BAA2B,GAAG,YAAY,CACjD,IAAI,CAAC,mBAAmB,CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAEK,sBAAoB,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAmGvD,IAAA;IAjGC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE9C,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,qBAAqB;AAC7D,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEpD,QAAA,IAAI,CAAC;aACF,IAAI,CACH,MAAM,CAAC,MAAM,CAAC,EACd,GAAG,CAAC,MAAK;YACP,eAAe,CAAC,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,CAAC,CAAC,EACFT,WAAS,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,EAClC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACvC,GAAG,CAAC,CAAC,cAAc,KAAK,cAAc,EAAE,cAAc,CAAC,EACvDS,sBAAoB,EAAE,EACtB,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC,EACFT,WAAS,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,EACnC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,KAAK,MAAM,CAAC,EACvC,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAC3C,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,EAAE;IAChB;AAEQ,IAAA,kBAAkB,CAAC,cAAmC,EAAA;;QAE5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,UAAU;QACpD,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK;AACzD,QAAA,MAAM,YAAY,GAAG,kBAAkB,IAAI,QAAQ;;AAGnD,QAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE;AAE5C,QAAA,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc;AAChD,QAAA,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK;AACtC,QAAA,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC,cAAc;;AAG9D,QAAA,IAAI,YAAY,IAAI,YAAY,IAAI,QAAQ,EAAE;AAC5C,YAAA,IAAI,MAAc;YAElB,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,GAAG,CAAA,MAAA,EAAS,WAAW,CAAC,UAAU,EAAE;YAC5C;AAAO,iBAAA,IAAI,OAAO,KAAK,KAAK,EAAE;AAC5B,gBAAA,MAAM,GAAG,CAAA,OAAA,EAAU,WAAW,CAAC,OAAO,GAAG;YAC3C;iBAAO;AACL,gBAAA,MAAM,GAAG,CAAA,QAAA,EAAW,WAAW,CAAC,cAAc,EAAE;YAClD;YAEA,MAAM,CAAC,IAAI,CACT,CAAA,cAAA,EAAiB,MAAM,CAAA,8BAAA,CAAgC,EACvD,cAAc,CAAC,OAAO,CACvB;AAED,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,kBAAkB,CAAC;AACjB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,KAAK,EAAE;oBACL,cAAc;oBACd,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,IAAI,CAAC;AAClD,iBAAA;AACF,aAAA,CAAC,CACH;QACH;IACF;AAEA,IAAA,eAAe,CAAC,KAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QAEnC,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,uBAAuB,EAAE;QAChC;IACF;IAEA,uBAAuB,GAAA;QACrB,KAAK,CAAC,IAAI;AACP,aAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAEI,WAAS,CAAC,IAAI,CAAC,2BAA2B,CAAC;aACzD,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACjD;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC;aACF,IAAI,CAAC,0BAA0B;AAC/B,aAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;aAC1B,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,QAAA,CAAC,CAAC;IACN;8GAvLW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/C1C,40HA8DA,EAAA,MAAA,EAAA,CAAA,qvFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBY,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEtB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAPzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,mBAGrB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,uBAAuB,CAAC,EAAA,QAAA,EAAA,40HAAA,EAAA,MAAA,EAAA,CAAA,qvFAAA,CAAA,EAAA;;;AET9B,SAAU,0BAA0B,CAAC,MAAgC,EAAA;AACzE,IAAA,OAAO,wBAAwB,CAAC;QAC9B,YAAY,CAAC,aAAa,CAAC;AAC3B,QAAA,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;QAC/B,wBAAwB;QACxB,YAAY;QACZ,YAAY;QACZ,mBAAmB;QACnB,kBAAkB;QAClB,mBAAmB;QACnB,kBAAkB;QAClB,iBAAiB;QACjB,gBAAgB;AAChB,QAAA;AACE,YAAA,OAAO,EAAE,4BAA4B;YACrC,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,4BAA4B;AACjC,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,uBAAuB;YAChC,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,uBAAuB;AAC5B,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,iBAAiB;AACtB,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,kBAAkB;AACvB,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,yBAAyB;AAC9B,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,oBAAoB,GAAG,UAAU;AACjE,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,iBAAiB;AACtB,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,wBAAwB;YACjC,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,wBAAwB;AAC7B,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,mBAAmB;YAC5B,QAAQ,EAAE,MAAM,EAAE;AAChB,kBAAE;AACF,kBAAE,mBAAmB;AACxB,SAAA;QACD,6BAA6B,CAAC,MAAK;YACjC,MAAM,CAAC,iBAAiB,CAAC;YACzB,MAAM,CAAC,YAAY,CAAC;YACpB,MAAM,CAAC,4BAA4B,CAAC;YACpC,MAAM,CAAC,wBAAwB,CAAC;YAChC,MAAM,CAAC,UAAU,CAAC;YAClB,MAAM,CAAC,kBAAkB,CAAC;YAC1B,MAAM,CAAC,gBAAgB,CAAC;YACxB,MAAM,CAAC,iBAAiB,CAAC;AAC3B,QAAA,CAAC,CAAC;AACH,KAAA,CAAC;AACJ;;AChHA;;AAEG;;;;"}