werift 0.14.1-debug → 0.14.2-debug2a
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.
- package/lib/rtp/src/rtp/red/encoder.d.ts +1 -5
- package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +2 -1
- package/lib/sctp/src/sctp.js +4 -2
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +5 -3
- package/lib/webrtc/src/media/rtpSender.js +16 -25
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/peerConnection.js +6 -2
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +1 -0
- package/lib/webrtc/src/transport/sctp.js +5 -1
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +2 -1
- package/src/media/rtpSender.ts +17 -40
- package/src/peerConnection.ts +6 -4
- package/src/transport/sctp.ts +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\n\nimport {\n bufferWriter,\n random16,\n uint16Add,\n uint32Add,\n} from \"../../../common/src\";\nimport {\n Extension,\n GenericNack,\n PictureLossIndication,\n ReceiverEstimatedMaxBitrate,\n Red,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSenderInfo,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n RtpHeader,\n RtpPacket,\n SourceDescriptionChunk,\n SourceDescriptionItem,\n TransportWideCC,\n} from \"../../../rtp/src\";\nimport { codecParametersFromString } from \"..\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp, milliTime, ntpTime } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpSendParameters,\n} from \"./parameters\";\nimport { SenderBandwidthEstimator, SentInfo } from \"./sender/senderBWE\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpSender.ts\");\n\nconst RTP_HISTORY_SIZE = 128;\nconst RTT_ALPHA = 0.85;\n\nexport class RTCRtpSender {\n readonly type = \"sender\";\n readonly kind =\n typeof this.trackOrKind === \"string\"\n ? this.trackOrKind\n : this.trackOrKind.kind;\n readonly ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n readonly rtxSsrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n streamId = uuid.v4();\n readonly trackId = uuid.v4();\n readonly onReady = new Event();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onPictureLossIndication = new Event<[]>();\n readonly onGenericNack = new Event<[GenericNack]>();\n readonly senderBWE = new SenderBandwidthEstimator();\n\n private cname?: string;\n private mid?: string;\n private rtpStreamId?: string;\n private repairedRtpStreamId?: string;\n private rtxPayloadType?: number;\n private rtxSequenceNumber = random16();\n redRedundantPayloadType?: number;\n redDistance = 2;\n private headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n private disposeTrack?: () => void;\n\n // # stats\n private lsr?: number;\n private lsrTime: number = Date.now() / 1000;\n private ntpTimestamp = 0n;\n private rtpTimestamp = 0;\n private octetCount = 0;\n private packetCount = 0;\n private rtt?: number;\n receiverEstimatedMaxBitrate: bigint = 0n;\n\n // rtp\n private sequenceNumber?: number;\n private timestamp?: number;\n private timestampOffset = 0;\n private seqOffset = 0;\n private rtpCache: RtpPacket[] = [];\n codec?: RTCRtpCodecParameters;\n\n track?: MediaStreamTrack;\n stopped = false;\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n\n constructor(\n public trackOrKind: Kind | MediaStreamTrack,\n public dtlsTransport: RTCDtlsTransport\n ) {\n dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"connected\") {\n this.onReady.execute();\n }\n });\n if (trackOrKind instanceof MediaStreamTrack) {\n if (trackOrKind.streamId) {\n this.streamId = trackOrKind.streamId;\n }\n this.registerTrack(trackOrKind);\n }\n }\n\n prepareSend(params: RTCRtpSendParameters) {\n this.cname = params.rtcp?.cname;\n this.mid = params.muxId;\n this.headerExtensions = params.headerExtensions;\n this.rtpStreamId = params.rtpStreamId;\n this.repairedRtpStreamId = params.repairedRtpStreamId;\n\n this.codec = params.codecs[0];\n if (this.track) {\n this.track.codec = this.codec;\n }\n\n params.codecs.forEach((codec) => {\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n if (\n codec.name.toLowerCase() === \"rtx\" &&\n codecParams[\"apt\"] === this.codec?.payloadType\n ) {\n this.rtxPayloadType = codec.payloadType;\n }\n if (codec.name.toLowerCase() === \"red\") {\n this.redRedundantPayloadType = Number(\n (codec.parameters ?? \"\").split(\"/\")[0]\n );\n }\n });\n }\n\n registerTrack(track: MediaStreamTrack) {\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n\n track.id = this.trackId;\n\n const { unSubscribe } = track.onReceiveRtp.subscribe((rtp) => {\n this.sendRtp(rtp);\n });\n this.track = track;\n this.disposeTrack = unSubscribe;\n\n if (this.codec) {\n track.codec = this.codec;\n }\n\n track.onSourceChanged.subscribe((header) => {\n this.replaceRTP(header);\n });\n }\n\n async replaceTrack(track: MediaStreamTrack | null) {\n if (track === null) {\n // todo impl\n return;\n }\n\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.sequenceNumber != undefined) {\n const header =\n track.header || (await track.onReceiveRtp.asPromise())[0].header;\n\n this.replaceRTP(header);\n }\n\n this.registerTrack(track);\n log(\"replaceTrack\", \"ssrc\", track.ssrc, \"rid\", track.rid);\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n this.track = undefined;\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const packets: RtcpPacket[] = [\n new RtcpSrPacket({\n ssrc: this.ssrc,\n senderInfo: new RtcpSenderInfo({\n ntpTimestamp: this.ntpTimestamp,\n rtpTimestamp: this.rtpTimestamp,\n packetCount: this.packetCount,\n octetCount: this.octetCount,\n }),\n }),\n ];\n this.lsr = compactNtp(this.ntpTimestamp);\n this.lsrTime = Date.now() / 1000;\n\n if (this.cname) {\n packets.push(\n new RtcpSourceDescriptionPacket({\n chunks: [\n new SourceDescriptionChunk({\n source: this.ssrc,\n items: [\n new SourceDescriptionItem({ type: 1, text: this.cname }),\n ],\n }),\n ],\n })\n );\n }\n\n try {\n await this.dtlsTransport.sendRtcp(packets);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n replaceRTP({\n sequenceNumber,\n timestamp,\n }: Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">) {\n if (this.sequenceNumber != undefined) {\n this.seqOffset = uint16Add(this.sequenceNumber, -sequenceNumber);\n }\n if (this.timestamp != undefined) {\n this.timestampOffset = uint32Add(this.timestamp, -timestamp);\n }\n this.rtpCache = [];\n log(\"replaceRTP\", this.sequenceNumber, sequenceNumber, this.seqOffset);\n }\n\n sendRtp(rtp: Buffer | RtpPacket) {\n if (this.dtlsTransport.state !== \"connected\" || !this.codec) {\n return;\n }\n\n rtp = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n\n const header = rtp.header;\n header.ssrc = this.ssrc;\n header.payloadType = this.codec.payloadType;\n header.timestamp = uint32Add(header.timestamp, this.timestampOffset);\n header.sequenceNumber = uint16Add(header.sequenceNumber, this.seqOffset);\n this.timestamp = header.timestamp;\n this.sequenceNumber = header.sequenceNumber;\n\n header.extensions = this.headerExtensions\n .map((extension) => {\n const payload = (() => {\n switch (extension.uri) {\n case RTP_EXTENSION_URI.sdesMid:\n if (this.mid) {\n return Buffer.from(this.mid);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n if (this.rtpStreamId) {\n return Buffer.from(this.rtpStreamId);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n if (this.repairedRtpStreamId) {\n return Buffer.from(this.repairedRtpStreamId);\n }\n return;\n case RTP_EXTENSION_URI.transportWideCC:\n this.dtlsTransport.transportSequenceNumber = uint16Add(\n this.dtlsTransport.transportSequenceNumber,\n 1\n );\n return bufferWriter(\n [2],\n [this.dtlsTransport.transportSequenceNumber]\n );\n case RTP_EXTENSION_URI.absSendTime:\n const buf = Buffer.alloc(3);\n const time = (ntpTime() >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n }\n })();\n\n if (payload) return { id: extension.id, payload };\n })\n .filter((v) => v) as Extension[];\n\n this.ntpTimestamp = ntpTime();\n this.rtpTimestamp = rtp.header.timestamp;\n this.octetCount += rtp.payload.length;\n this.packetCount = uint32Add(this.packetCount, 1);\n\n rtp.header = header;\n\n this.rtpCache.push(rtp);\n this.rtpCache = this.rtpCache.slice(-RTP_HISTORY_SIZE);\n\n let rtpPayload = rtp.payload;\n\n if (this.redRedundantPayloadType) {\n const redundantPackets = [...Array(this.redDistance).keys()]\n .map((i) => {\n return this.rtpCache.find(\n (c) =>\n c.header.sequenceNumber ===\n header.sequenceNumber - (this.redDistance - i)\n );\n })\n .filter((p): p is NonNullable<typeof p> => typeof p !== \"undefined\");\n const red = buildRedPacket(\n redundantPackets,\n this.redRedundantPayloadType,\n rtp\n );\n rtpPayload = red.serialize();\n }\n\n const size = this.dtlsTransport.sendRtp(rtpPayload, header);\n\n this.runRtcp();\n const sentInfo: SentInfo = {\n wideSeq: this.dtlsTransport.transportSequenceNumber,\n size,\n sendingAtMs: milliTime(),\n sentAtMs: milliTime(),\n };\n this.senderBWE.rtpPacketSent(sentInfo);\n }\n\n handleRtcpPacket(rtcpPacket: RtcpPacket) {\n switch (rtcpPacket.type) {\n case RtcpSrPacket.type:\n case RtcpRrPacket.type:\n {\n const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;\n packet.reports\n .filter((report) => report.ssrc === this.ssrc)\n .forEach((report) => {\n if (this.lsr === report.lsr && report.dlsr) {\n const rtt =\n Date.now() / 1000 - this.lsrTime - report.dlsr / 65536;\n if (this.rtt === undefined) {\n this.rtt = rtt;\n } else {\n this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;\n }\n }\n });\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const packet = rtcpPacket as RtcpTransportLayerFeedback;\n switch (packet.feedback.count) {\n case TransportWideCC.count:\n {\n const feedback = packet.feedback as TransportWideCC;\n this.senderBWE.receiveTWCC(feedback);\n }\n break;\n case GenericNack.count:\n {\n const feedback = packet.feedback as GenericNack;\n feedback.lost.forEach((seqNum) => {\n let packet = this.rtpCache.find(\n (rtp) => rtp.header.sequenceNumber === seqNum\n );\n if (packet) {\n if (this.rtxPayloadType != undefined) {\n packet = wrapRtx(\n packet,\n this.rtxPayloadType,\n this.rtxSequenceNumber,\n this.rtxSsrc\n );\n this.rtxSequenceNumber = uint16Add(\n this.rtxSequenceNumber,\n 1\n );\n }\n this.dtlsTransport.sendRtp(packet.payload, packet.header);\n }\n });\n this.onGenericNack.execute(feedback);\n }\n break;\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const packet = rtcpPacket as RtcpPayloadSpecificFeedback;\n switch (packet.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;\n this.receiverEstimatedMaxBitrate = feedback.bitrate;\n }\n break;\n case PictureLossIndication.count:\n {\n this.onPictureLossIndication.execute();\n }\n break;\n }\n }\n break;\n }\n this.onRtcp.execute(rtcpPacket);\n }\n}\n\nexport function wrapRtx(\n packet: RtpPacket,\n payloadType: number,\n sequenceNumber: number,\n ssrc: number\n) {\n const rtx = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: packet.header.marker,\n sequenceNumber,\n timestamp: packet.header.timestamp,\n ssrc,\n csrc: packet.header.csrc,\n extensions: packet.header.extensions,\n }),\n Buffer.concat([\n Buffer.from(jspack.Pack(\"!H\", [packet.header.sequenceNumber])),\n packet.payload,\n ])\n );\n return rtx;\n}\n\nexport function buildRedPacket(\n redundantPackets: RtpPacket[],\n blockPT: number,\n presentPacket: RtpPacket\n) {\n const red = new Red();\n redundantPackets.forEach((redundant) => {\n red.blocks.push({\n block: redundant.payload,\n blockPT,\n timestampOffset: uint32Add(\n presentPacket.header.timestamp,\n -redundant.header.timestamp\n ),\n });\n });\n\n red.blocks.push({\n block: presentPacket.payload,\n blockPT,\n });\n return red;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\n\nimport {\n bufferWriter,\n random16,\n uint16Add,\n uint32Add,\n} from \"../../../common/src\";\nimport {\n Extension,\n GenericNack,\n PictureLossIndication,\n ReceiverEstimatedMaxBitrate,\n RedEncoder,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSenderInfo,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n RtpHeader,\n RtpPacket,\n SourceDescriptionChunk,\n SourceDescriptionItem,\n TransportWideCC,\n} from \"../../../rtp/src\";\nimport { codecParametersFromString } from \"..\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp, milliTime, ntpTime } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpSendParameters,\n} from \"./parameters\";\nimport { SenderBandwidthEstimator, SentInfo } from \"./sender/senderBWE\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpSender.ts\");\n\nconst RTP_HISTORY_SIZE = 128;\nconst RTT_ALPHA = 0.85;\n\nexport class RTCRtpSender {\n readonly type = \"sender\";\n readonly kind =\n typeof this.trackOrKind === \"string\"\n ? this.trackOrKind\n : this.trackOrKind.kind;\n readonly ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n readonly rtxSsrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n streamId = uuid.v4();\n readonly trackId = uuid.v4();\n readonly onReady = new Event();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onPictureLossIndication = new Event<[]>();\n readonly onGenericNack = new Event<[GenericNack]>();\n readonly senderBWE = new SenderBandwidthEstimator();\n\n private cname?: string;\n private mid?: string;\n private rtpStreamId?: string;\n private repairedRtpStreamId?: string;\n private rtxPayloadType?: number;\n private rtxSequenceNumber = random16();\n redRedundantPayloadType?: number;\n private _redDistance = 2;\n redEncoder = new RedEncoder(this._redDistance);\n private headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n private disposeTrack?: () => void;\n\n // # stats\n private lsr?: number;\n private lsrTime: number = Date.now() / 1000;\n private ntpTimestamp = 0n;\n private rtpTimestamp = 0;\n private octetCount = 0;\n private packetCount = 0;\n private rtt?: number;\n receiverEstimatedMaxBitrate: bigint = 0n;\n\n // rtp\n private sequenceNumber?: number;\n private timestamp?: number;\n private timestampOffset = 0;\n private seqOffset = 0;\n private rtpCache: RtpPacket[] = [];\n codec?: RTCRtpCodecParameters;\n\n track?: MediaStreamTrack;\n stopped = false;\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n\n constructor(\n public trackOrKind: Kind | MediaStreamTrack,\n public dtlsTransport: RTCDtlsTransport\n ) {\n dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"connected\") {\n this.onReady.execute();\n }\n });\n if (trackOrKind instanceof MediaStreamTrack) {\n if (trackOrKind.streamId) {\n this.streamId = trackOrKind.streamId;\n }\n this.registerTrack(trackOrKind);\n }\n }\n\n get redDistance() {\n return this._redDistance;\n }\n set redDistance(n: number) {\n this._redDistance = n;\n this.redEncoder.distance = n;\n }\n\n prepareSend(params: RTCRtpSendParameters) {\n this.cname = params.rtcp?.cname;\n this.mid = params.muxId;\n this.headerExtensions = params.headerExtensions;\n this.rtpStreamId = params.rtpStreamId;\n this.repairedRtpStreamId = params.repairedRtpStreamId;\n\n this.codec = params.codecs[0];\n if (this.track) {\n this.track.codec = this.codec;\n }\n\n params.codecs.forEach((codec) => {\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n if (\n codec.name.toLowerCase() === \"rtx\" &&\n codecParams[\"apt\"] === this.codec?.payloadType\n ) {\n this.rtxPayloadType = codec.payloadType;\n }\n if (codec.name.toLowerCase() === \"red\") {\n this.redRedundantPayloadType = Number(\n (codec.parameters ?? \"\").split(\"/\")[0]\n );\n }\n });\n }\n\n registerTrack(track: MediaStreamTrack) {\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n\n track.id = this.trackId;\n\n const { unSubscribe } = track.onReceiveRtp.subscribe((rtp) => {\n this.sendRtp(rtp);\n });\n this.track = track;\n this.disposeTrack = unSubscribe;\n\n if (this.codec) {\n track.codec = this.codec;\n }\n\n track.onSourceChanged.subscribe((header) => {\n this.replaceRTP(header);\n });\n }\n\n async replaceTrack(track: MediaStreamTrack | null) {\n if (track === null) {\n // todo impl\n return;\n }\n\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.sequenceNumber != undefined) {\n const header =\n track.header || (await track.onReceiveRtp.asPromise())[0].header;\n\n this.replaceRTP(header);\n }\n\n this.registerTrack(track);\n log(\"replaceTrack\", \"ssrc\", track.ssrc, \"rid\", track.rid);\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n this.track = undefined;\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const packets: RtcpPacket[] = [\n new RtcpSrPacket({\n ssrc: this.ssrc,\n senderInfo: new RtcpSenderInfo({\n ntpTimestamp: this.ntpTimestamp,\n rtpTimestamp: this.rtpTimestamp,\n packetCount: this.packetCount,\n octetCount: this.octetCount,\n }),\n }),\n ];\n this.lsr = compactNtp(this.ntpTimestamp);\n this.lsrTime = Date.now() / 1000;\n\n if (this.cname) {\n packets.push(\n new RtcpSourceDescriptionPacket({\n chunks: [\n new SourceDescriptionChunk({\n source: this.ssrc,\n items: [\n new SourceDescriptionItem({ type: 1, text: this.cname }),\n ],\n }),\n ],\n })\n );\n }\n\n try {\n await this.dtlsTransport.sendRtcp(packets);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n replaceRTP({\n sequenceNumber,\n timestamp,\n }: Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">) {\n if (this.sequenceNumber != undefined) {\n this.seqOffset = uint16Add(this.sequenceNumber, -sequenceNumber);\n }\n if (this.timestamp != undefined) {\n this.timestampOffset = uint32Add(this.timestamp, -timestamp);\n }\n this.rtpCache = [];\n log(\"replaceRTP\", this.sequenceNumber, sequenceNumber, this.seqOffset);\n }\n\n sendRtp(rtp: Buffer | RtpPacket) {\n if (this.dtlsTransport.state !== \"connected\" || !this.codec) {\n return;\n }\n\n rtp = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n\n const header = rtp.header;\n header.ssrc = this.ssrc;\n header.payloadType = this.codec.payloadType;\n header.timestamp = uint32Add(header.timestamp, this.timestampOffset);\n header.sequenceNumber = uint16Add(header.sequenceNumber, this.seqOffset);\n this.timestamp = header.timestamp;\n this.sequenceNumber = header.sequenceNumber;\n\n header.extensions = this.headerExtensions\n .map((extension) => {\n const payload = (() => {\n switch (extension.uri) {\n case RTP_EXTENSION_URI.sdesMid:\n if (this.mid) {\n return Buffer.from(this.mid);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n if (this.rtpStreamId) {\n return Buffer.from(this.rtpStreamId);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n if (this.repairedRtpStreamId) {\n return Buffer.from(this.repairedRtpStreamId);\n }\n return;\n case RTP_EXTENSION_URI.transportWideCC:\n this.dtlsTransport.transportSequenceNumber = uint16Add(\n this.dtlsTransport.transportSequenceNumber,\n 1\n );\n return bufferWriter(\n [2],\n [this.dtlsTransport.transportSequenceNumber]\n );\n case RTP_EXTENSION_URI.absSendTime:\n const buf = Buffer.alloc(3);\n const time = (ntpTime() >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n }\n })();\n\n if (payload) return { id: extension.id, payload };\n })\n .filter((v) => v) as Extension[];\n\n this.ntpTimestamp = ntpTime();\n this.rtpTimestamp = rtp.header.timestamp;\n this.octetCount += rtp.payload.length;\n this.packetCount = uint32Add(this.packetCount, 1);\n\n rtp.header = header;\n\n this.rtpCache.push(rtp);\n this.rtpCache = this.rtpCache.slice(-RTP_HISTORY_SIZE);\n\n let rtpPayload = rtp.payload;\n\n if (this.redRedundantPayloadType) {\n this.redEncoder.push({\n block: rtpPayload,\n timestamp: header.timestamp,\n blockPT: this.redRedundantPayloadType,\n });\n const red = this.redEncoder.build();\n rtpPayload = red.serialize();\n }\n\n const size = this.dtlsTransport.sendRtp(rtpPayload, header);\n\n this.runRtcp();\n const sentInfo: SentInfo = {\n wideSeq: this.dtlsTransport.transportSequenceNumber,\n size,\n sendingAtMs: milliTime(),\n sentAtMs: milliTime(),\n };\n this.senderBWE.rtpPacketSent(sentInfo);\n }\n\n handleRtcpPacket(rtcpPacket: RtcpPacket) {\n switch (rtcpPacket.type) {\n case RtcpSrPacket.type:\n case RtcpRrPacket.type:\n {\n const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;\n packet.reports\n .filter((report) => report.ssrc === this.ssrc)\n .forEach((report) => {\n if (this.lsr === report.lsr && report.dlsr) {\n const rtt =\n Date.now() / 1000 - this.lsrTime - report.dlsr / 65536;\n if (this.rtt === undefined) {\n this.rtt = rtt;\n } else {\n this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;\n }\n }\n });\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const packet = rtcpPacket as RtcpTransportLayerFeedback;\n switch (packet.feedback.count) {\n case TransportWideCC.count:\n {\n const feedback = packet.feedback as TransportWideCC;\n this.senderBWE.receiveTWCC(feedback);\n }\n break;\n case GenericNack.count:\n {\n const feedback = packet.feedback as GenericNack;\n feedback.lost.forEach((seqNum) => {\n let packet = this.rtpCache.find(\n (rtp) => rtp.header.sequenceNumber === seqNum\n );\n if (packet) {\n if (this.rtxPayloadType != undefined) {\n packet = wrapRtx(\n packet,\n this.rtxPayloadType,\n this.rtxSequenceNumber,\n this.rtxSsrc\n );\n this.rtxSequenceNumber = uint16Add(\n this.rtxSequenceNumber,\n 1\n );\n }\n this.dtlsTransport.sendRtp(packet.payload, packet.header);\n }\n });\n this.onGenericNack.execute(feedback);\n }\n break;\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const packet = rtcpPacket as RtcpPayloadSpecificFeedback;\n switch (packet.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;\n this.receiverEstimatedMaxBitrate = feedback.bitrate;\n }\n break;\n case PictureLossIndication.count:\n {\n this.onPictureLossIndication.execute();\n }\n break;\n }\n }\n break;\n }\n this.onRtcp.execute(rtcpPacket);\n }\n}\n\nexport function wrapRtx(\n packet: RtpPacket,\n payloadType: number,\n sequenceNumber: number,\n ssrc: number\n) {\n const rtx = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: packet.header.marker,\n sequenceNumber,\n timestamp: packet.header.timestamp,\n ssrc,\n csrc: packet.header.csrc,\n extensions: packet.header.extensions,\n }),\n Buffer.concat([\n Buffer.from(jspack.Pack(\"!H\", [packet.header.sequenceNumber])),\n packet.payload,\n ])\n );\n return rtx;\n}\n"]}
|
|
@@ -555,14 +555,18 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
555
555
|
transceiver.receiver.setupTWCC(remoteMedia.ssrc[0]?.ssrc);
|
|
556
556
|
}
|
|
557
557
|
else if (remoteMedia.kind === "application") {
|
|
558
|
+
// # configure sctp
|
|
559
|
+
this.sctpRemotePort = remoteMedia.sctpPort;
|
|
560
|
+
if (!this.sctpRemotePort) {
|
|
561
|
+
throw new Error("sctpRemotePort not exist");
|
|
562
|
+
}
|
|
558
563
|
if (!this.sctpTransport) {
|
|
559
564
|
this.sctpTransport = this.createSctpTransport();
|
|
560
565
|
}
|
|
566
|
+
this.sctpTransport.setRemotePort(this.sctpRemotePort);
|
|
561
567
|
if (!this.sctpTransport.mid) {
|
|
562
568
|
this.sctpTransport.mid = remoteMedia.rtp.muxId;
|
|
563
569
|
}
|
|
564
|
-
// # configure sctp
|
|
565
|
-
this.sctpRemotePort = remoteMedia.sctpPort;
|
|
566
570
|
}
|
|
567
571
|
if (remoteMedia.iceParams && remoteMedia.dtlsParams) {
|
|
568
572
|
this.iceTransport.setRemoteParams(remoteMedia.iceParams);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { cloneDeep, isEqual } from \"lodash\";\nimport Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport { Profile } from \"../../dtls/src/context/srtp\";\nimport { codecParametersFromString, DtlsKeys } from \".\";\nimport {\n DISCARD_HOST,\n DISCARD_PORT,\n SenderDirections,\n SRTP_PROFILE,\n} from \"./const\";\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport { enumerate, EventTarget } from \"./helper\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpParameters,\n RTCRtpReceiveParameters,\n RTCRtpRtxParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { RtpRouter } from \"./media/router\";\nimport { RTCRtpReceiver } from \"./media/rtpReceiver\";\nimport { RTCRtpSender } from \"./media/rtpSender\";\nimport {\n Direction,\n RTCRtpTransceiver,\n TransceiverOptions,\n} from \"./media/rtpTransceiver\";\nimport { MediaStream, MediaStreamTrack } from \"./media/track\";\nimport {\n addSDPHeader,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n} from \"./sdp\";\nimport { RTCCertificate, RTCDtlsTransport } from \"./transport/dtls\";\nimport {\n IceCandidate,\n IceGathererState,\n RTCIceCandidate,\n RTCIceConnectionState,\n RTCIceGatherer,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\nimport {\n andDirection,\n parseIceServers,\n reverseDirection,\n reverseSimulcastDirection,\n} from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = uuid.v4();\n iceTransport: RTCIceTransport;\n dtlsTransport: RTCDtlsTransport;\n sctpTransport?: RTCSctpTransport;\n masterTransportEstablished = false;\n configuration: Required<PeerConfig> =\n cloneDeep<PeerConfig>(defaultPeerConfig);\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n readonly transceivers: RTCRtpTransceiver[] = [];\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n /**\n * should use onRemoteTransceiverAdded\n * @deprecated\n */\n readonly onTransceiver = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate]>();\n readonly onNegotiationneeded = new Event<[]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n\n private readonly router = new RtpRouter();\n private readonly certificates: RTCCertificate[] = [];\n sctpRemotePort?: number;\n private seenMid = new Set<string>();\n private currentLocalDescription?: SessionDescription;\n private currentRemoteDescription?: SessionDescription;\n private pendingLocalDescription?: SessionDescription;\n private pendingRemoteDescription?: SessionDescription;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n constructor({\n codecs,\n headerExtensions,\n iceServers,\n iceTransportPolicy,\n icePortRange,\n dtls,\n }: Partial<PeerConfig> = {}) {\n super();\n\n if (iceServers) this.configuration.iceServers = iceServers;\n if (iceTransportPolicy)\n this.configuration.iceTransportPolicy = iceTransportPolicy;\n if (icePortRange) {\n const [min, max] = icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n this.configuration.icePortRange = icePortRange;\n }\n if (codecs?.audio) this.configuration.codecs.audio = codecs.audio;\n if (codecs?.video) this.configuration.codecs.video = codecs.video;\n\n for (const [i, codecParams] of enumerate([\n ...(this.configuration.codecs.audio || []),\n ...(this.configuration.codecs.video || []),\n ])) {\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n break;\n }\n }\n\n if (headerExtensions?.audio)\n this.configuration.headerExtensions.audio = headerExtensions.audio;\n if (headerExtensions?.video)\n this.configuration.headerExtensions.video = headerExtensions.video;\n [\n ...(this.configuration.headerExtensions.audio || []),\n ...(this.configuration.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n if (dtls) {\n const { keys } = dtls;\n if (keys) {\n this.certificates.push(\n new RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash)\n );\n }\n }\n\n this.iceConnectionStateChange.subscribe((state) => {\n switch (state) {\n case \"disconnected\":\n this.setConnectionState(\"disconnected\");\n break;\n case \"closed\":\n this.close();\n break;\n }\n });\n\n const { iceTransport, dtlsTransport } = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n this.iceTransport = iceTransport;\n this.dtlsTransport = dtlsTransport;\n }\n\n get localDescription() {\n if (!this._localDescription) return;\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) return;\n return this._remoteDescription.toJSON();\n }\n\n private get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n private get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n private getTransceiverByMid(mid: string) {\n return this.transceivers.find((transceiver) => transceiver.mid === mid);\n }\n\n private getTransceiverByMLineIndex(index: number) {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index\n );\n }\n\n async createOffer() {\n if (this.certificates.length === 0) {\n await this.dtlsTransport.setupCertificate();\n }\n\n this.transceivers.forEach((transceiver) => {\n transceiver.codecs = this.configuration.codecs[transceiver.kind];\n transceiver.headerExtensions =\n this.configuration.headerExtensions[transceiver.kind];\n });\n\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n\n const currentMedia = this._localDescription\n ? this._localDescription.media\n : [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n log(\"mid missing\", m);\n return;\n }\n if (m.kind === \"application\") {\n description.media.push(\n createMediaDescriptionForSctp(this.sctpTransport!, mid)\n );\n } else {\n const transceiver = this.getTransceiverByMid(mid);\n if (!transceiver) {\n log(\"transceiver by mid not found\", mid);\n return;\n }\n transceiver.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n mid\n )\n );\n }\n });\n\n // # handle new transceivers / sctp\n this.transceivers\n .filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))\n .forEach((transceiver) => {\n transceiver.mLineIndex = description.media.length;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n allocateMid(this.seenMid)\n )\n );\n });\n\n if (\n this.sctpTransport &&\n !description.media.find((m) => this.sctpTransport!.mid === m.rtp.muxId)\n ) {\n description.media.push(\n createMediaDescriptionForSctp(\n this.sctpTransport,\n allocateMid(this.seenMid)\n )\n );\n }\n\n const mids = description.media\n .map((m) => m.rtp.muxId)\n .filter((v) => v) as string[];\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n\n return description.toJSON();\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {}\n ): RTCDataChannel {\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = { ...base, ...options } as any;\n\n if (settings.maxPacketLifeTime && settings.maxRetransmits)\n throw new Error(\"can not select both\");\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.needNegotiation();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n return new RTCDataChannel(this.sctpTransport, parameters);\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) throw new Error(\"peer closed\");\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc))\n throw new Error(\"unExist\");\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc\n );\n if (!transceiver) throw new Error(\"unExist\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.needNegotiation();\n return;\n }\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.direction = \"recvonly\";\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.direction = \"inactive\";\n }\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") return;\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private createTransport(srtpProfiles: Profile[] = []) {\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.configuration.iceServers),\n forceTurn: this.configuration.iceTransportPolicy === \"relay\",\n portRange: this.configuration.icePortRange,\n });\n iceGatherer.onGatheringStateChange.subscribe((state) => {\n this.updateIceGatheringState(state);\n });\n this.updateIceGatheringState(iceGatherer.gatheringState);\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe((state) => {\n this.updateIceConnectionState(state);\n });\n this.updateIceConnectionState(iceTransport.state);\n\n iceTransport.iceGather.onIceCandidate = (candidate) => {\n if (!this.localDescription) return;\n const sdp = SessionDescription.parse(this.localDescription.sdp);\n const media = sdp.media[0];\n if (!media) {\n log(\"media not exist\");\n return;\n }\n candidate.sdpMLineIndex = 0;\n candidate.sdpMid = media.rtp.muxId;\n // for chrome & firefox & maybe others\n candidate.foundation = \"candidate:\" + candidate.foundation;\n\n this.onIceCandidate.execute(candidate.toJSON());\n if (this.onicecandidate)\n this.onicecandidate({ candidate: candidate.toJSON() });\n this.emit(\"icecandidate\", { candidate });\n };\n\n const dtlsTransport = new RTCDtlsTransport(\n iceTransport,\n this.router,\n this.certificates,\n srtpProfiles\n );\n\n return { dtlsTransport, iceTransport };\n }\n\n private createSctpTransport() {\n const sctp = new RTCSctpTransport(this.dtlsTransport);\n sctp.mid = undefined;\n\n sctp.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n\n const event: RTCDataChannelEvent = { channel };\n if (this.ondatachannel) this.ondatachannel(event);\n this.emit(\"datachannel\", event);\n });\n\n return sctp;\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // # parse and validate description\n const description = SessionDescription.parse(sessionDescription.sdp);\n description.type = sessionDescription.type;\n this.validateDescription(description, true);\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n description.media.forEach((media, i) => {\n const mid = media.rtp.muxId;\n if (!mid) {\n throw new Error(\"mid not exist\");\n }\n this.seenMid.add(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver = this.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n });\n\n // # set ICE role\n if (description.type === \"offer\") {\n this.iceTransport.connection.iceControlling = true;\n } else {\n this.iceTransport.connection.iceControlling = false;\n }\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (this.iceTransport.connection.remoteIsLite) {\n this.iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (description.type === \"answer\") {\n const role = description.media.find((media) => media.dtlsParams)\n ?.dtlsParams?.role;\n if (role) {\n this.dtlsTransport.role = role;\n }\n }\n\n // # configure direction\n this.transceivers.forEach((t) => {\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.currentDirection = direction;\n }\n });\n\n // for trickle ice\n this.setLocal(description);\n\n // # gather candidates\n await this.iceTransport.iceGather.gather();\n description.media.map((media) => {\n addTransportDescription(media, this.dtlsTransport);\n });\n\n this.setLocal(description);\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private setLocal(description: SessionDescription) {\n if (description.type === \"answer\") {\n this.currentLocalDescription = description;\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n async addIceCandidate(candidateMessage: RTCIceCandidate) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n await this.iceTransport.addRemoteCandidate(candidate);\n }\n\n private async connect() {\n if (this.masterTransportEstablished) return;\n\n const dtlsTransport = this.dtlsTransport;\n const iceTransport = dtlsTransport.iceTransport;\n\n this.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n log(\"ice connected\");\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n log(\"dtls connected\");\n\n if (this.sctpTransport && this.sctpRemotePort) {\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n }\n\n this.masterTransportEstablished = true;\n this.setConnectionState(\"connected\");\n }\n\n private localRtp(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n private remoteRtp(\n remoteDescription: SessionDescription,\n transceiver: RTCRtpTransceiver\n ): RTCRtpReceiveParameters {\n if (transceiver.mLineIndex == undefined)\n throw new Error(\"mLineIndex not assigned\");\n const media = remoteDescription.media[transceiver.mLineIndex];\n if (!media) throw new Error(\"media line not exist\");\n\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {}\n )\n ),\n };\n\n return receiveParameters;\n }\n\n async setRemoteDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }) {\n // # parse and validate description\n const remoteSdp = SessionDescription.parse(sessionDescription.sdp);\n remoteSdp.type = sessionDescription.type;\n this.validateDescription(remoteSdp, false);\n\n // # apply description\n for (const [i, remoteMedia] of enumerate(remoteSdp.media)) {\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver =\n this.transceivers.find(\n (t) =>\n t.kind === remoteMedia.kind &&\n [undefined, remoteMedia.rtp.muxId].includes(t.mid)\n ) ||\n (() => {\n // create remote transceiver\n const transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n\n this.onRemoteTransceiverAdded.execute(transceiver);\n this.onTransceiver.execute(transceiver);\n\n return transceiver;\n })();\n\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n transceiver.mLineIndex = i;\n }\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.configuration.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) return false;\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(\n existCodec.parameters ?? \"\"\n );\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find(\n (c) => c.payloadType === pt\n );\n if (!origin) return false;\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (\n this.configuration.headerExtensions[\n remoteMedia.kind as \"video\" | \"audio\"\n ] || []\n ).find((v) => v.uri === extension.uri)\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction || \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(remoteSdp.type)) {\n transceiver.currentDirection = direction;\n } else {\n transceiver.offerDirection = direction;\n }\n\n const localParams = this.localRtp(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.remoteRtp(remoteSdp, transceiver);\n\n // register simulcast receiver\n remoteMedia.simulcastParameters.forEach((param) => {\n this.router.registerRtpReceiverByRid(\n transceiver,\n param,\n remotePrams\n );\n });\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n // assign msid\n if (remoteMedia.msid != undefined) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n\n this.fireOnTrack(\n transceiver.receiver.track,\n transceiver,\n new MediaStream({\n id: streamId,\n tracks: [transceiver.receiver.track],\n })\n );\n }\n }\n\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0]?.ssrc);\n } else if (remoteMedia.kind === \"application\") {\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n }\n\n if (!this.sctpTransport.mid) {\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n // # configure sctp\n this.sctpRemotePort = remoteMedia.sctpPort;\n }\n\n if (remoteMedia.iceParams && remoteMedia.dtlsParams) {\n this.iceTransport.setRemoteParams(remoteMedia.iceParams);\n this.dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n this.iceTransport.connection.iceControlling = true;\n }\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(this.iceTransport.addRemoteCandidate);\n\n await this.iceTransport.iceGather.gather();\n\n if (remoteMedia.iceCandidatesComplete) {\n await this.iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n this.dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n private validateDescription(\n description: SessionDescription,\n isLocal: boolean\n ) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(this.signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(this.signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n\n description.media.forEach((media) => {\n if (media.direction === \"inactive\") return;\n if (\n !media.iceParams ||\n !media.iceParams.usernameFragment ||\n !media.iceParams.password\n )\n throw new Error(\"ICE username fragment or password is missing\");\n });\n\n if ([\"answer\", \"pranswer\"].includes(description.type || \"\")) {\n const offer = isLocal ? this._remoteDescription : this._localDescription;\n if (!offer) throw new Error();\n\n const offerMedia = offer.media.map((v) => [v.kind, v.rtp.muxId]);\n const answerMedia = description.media.map((v) => [v.kind, v.rtp.muxId]);\n if (!isEqual(offerMedia, answerMedia))\n throw new Error(\"Media sections in answer do not match offer\");\n }\n }\n\n private fireOnTrack(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n stream: MediaStream\n ) {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.emit(\"track\", event);\n if (this.ontrack) this.ontrack(event);\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {}\n ) {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const sender = new RTCRtpSender(trackOrKind, this.dtlsTransport);\n const receiver = new RTCRtpReceiver(kind, this.dtlsTransport, sender.ssrc);\n const transceiver = new RTCRtpTransceiver(\n kind,\n receiver,\n sender,\n direction,\n this.dtlsTransport\n );\n transceiver.options = options;\n this.router.registerRtpSender(transceiver.sender);\n\n this.transceivers.push(transceiver);\n this.onTransceiverAdded.execute(transceiver);\n\n this.needNegotiation();\n\n return transceiver;\n }\n\n getTransceivers() {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream\n ) {\n if (this.isClosed) throw new Error(\"is closed\");\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"track exist\");\n }\n\n const emptyTrackSender = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true\n );\n if (emptyTrackSender) {\n const sender = emptyTrackSender.sender;\n sender.registerTrack(track);\n this.needNegotiation();\n return sender;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.direction = \"sendrecv\";\n break;\n case \"inactive\":\n notSendTransceiver.direction = \"sendonly\";\n break;\n }\n this.needNegotiation();\n return sender;\n } else {\n const transceiver = this.addTransceiver(track, { direction: \"sendrecv\" });\n this.needNegotiation();\n return transceiver.sender;\n }\n }\n\n async createAnswer() {\n this.assertNotClosed();\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n ) ||\n !this.dtlsTransport\n )\n throw new Error(\"createAnswer failed\");\n\n if (this.certificates.length === 0) {\n await this.dtlsTransport.setupCertificate();\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n this._remoteDescription?.media.forEach((remoteM) => {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteM.kind)) {\n const transceiver = this.getTransceiverByMid(remoteM.rtp.muxId!)!;\n media = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n andDirection(transceiver.direction, transceiver.offerDirection),\n transceiver.mid!\n );\n if (!transceiver.dtlsTransport) throw new Error();\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteM.kind === \"application\") {\n if (!this.sctpTransport || !this.sctpTransport.mid) throw new Error();\n media = createMediaDescriptionForSctp(\n this.sctpTransport,\n this.sctpTransport.mid\n );\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n } else throw new Error();\n\n // # determine DTLS role, or preserve the currently configured role\n if (!media.dtlsParams) throw new Error();\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n media.simulcastParameters = remoteM.simulcastParameters.map((v) => ({\n ...v,\n direction: reverseSimulcastDirection(v.direction),\n }));\n description.media.push(media);\n });\n\n const bundle = new GroupDescription(\"BUNDLE\", []);\n description.media.forEach((media) => {\n bundle.items.push(media.rtp.muxId!);\n });\n description.group.push(bundle);\n\n return description.toJSON();\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n this.setConnectionState(\"closed\");\n\n this.transceivers.forEach((transceiver) => {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n });\n\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n await this.dtlsTransport.stop();\n await this.iceTransport.stop();\n\n this.dispose();\n log(\"peerConnection closed\");\n }\n\n private assertNotClosed() {\n if (this.isClosed) throw new Error(\"RTCPeerConnection is closed\");\n }\n\n private updateIceGatheringState(state: IceGathererState) {\n log(\"iceGatheringStateChange\", state);\n this.iceGatheringState = state;\n this.iceGatheringStateChange.execute(state);\n this.emit(\"icegatheringstatechange\", state);\n }\n\n private updateIceConnectionState(state: RTCIceConnectionState) {\n log(\"iceConnectionStateChange\", state);\n this.iceConnectionState = state;\n this.iceConnectionStateChange.execute(state);\n this.emit(\"iceconnectionstatechange\", state);\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) this.onsignalingstatechange({});\n }\n\n private setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n if (this.onconnectionstatechange) this.onconnectionstatechange();\n this.emit(\"connectionstatechange\");\n }\n\n private dispose() {\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n }\n}\n\nexport function createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n cname: string,\n direction: Direction,\n mid: string\n) {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType)\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname })];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o)\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({ ssrc: transceiver.sender.rtxSsrc, cname })\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n}\n\nexport function createMediaDescriptionForSctp(\n sctp: RTCSctpTransport,\n mid: string\n) {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"]\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n addTransportDescription(media, sctp.dtlsTransport);\n return media;\n}\n\nexport function addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport\n) {\n const iceTransport = dtlsTransport.iceTransport;\n const iceGatherer = iceTransport.iceGather;\n\n media.iceCandidates = iceGatherer.localCandidates;\n media.iceCandidatesComplete = iceGatherer.gatheringState === \"complete\";\n media.iceParams = iceGatherer.localParameters;\n media.iceOptions = \"trickle\";\n\n if (media.iceCandidates.length > 0) {\n const candidate = media.iceCandidates[media.iceCandidates.length - 1];\n media.host = candidate.ip;\n media.port = candidate.port;\n } else {\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n }\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n}\n\nexport function allocateMid(mids: Set<string>) {\n let mid = \"\";\n for (let i = 0; ; ) {\n mid = (i++).toString();\n if (!mids.has(mid)) break;\n }\n mids.add(mid);\n return mid;\n}\n\nexport interface PeerConfig {\n codecs: Partial<{\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase()\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nexport const defaultPeerConfig: PeerConfig = {\n codecs: {\n audio: [\n new RTCRtpCodecParameters({\n mimeType: \"audio/opus\",\n clockRate: 48000,\n channels: 2,\n }),\n new RTCRtpCodecParameters({\n mimeType: \"audio/PCMU\",\n clockRate: 8000,\n channels: 1,\n }),\n ],\n video: [\n new RTCRtpCodecParameters({\n mimeType: \"video/VP8\",\n clockRate: 90000,\n rtcpFeedback: [\n { type: \"ccm\", parameter: \"fir\" },\n { type: \"nack\" },\n { type: \"nack\", parameter: \"pli\" },\n { type: \"goog-remb\" },\n ],\n }),\n ],\n },\n headerExtensions: { audio: [], video: [] },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n dtls: {},\n};\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate: RTCIceCandidate;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,mCAA4C;AAC5C,sDAA4B;AAC5B,2CAA6B;AAG7B,wBAAwD;AACxD,mCAKiB;AACjB,+CAAyE;AACzE,qCAAkD;AAClD,mDAQ4B;AAC5B,2CAA2C;AAC3C,qDAAqD;AACrD,iDAAiD;AACjD,2DAIgC;AAChC,yCAA8D;AAC9D,+BAMe;AACf,2CAAoE;AACpE,yCAOyB;AACzB,2CAAoD;AAGpD,mCAKiB;AAEjB,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,8CAA8C,CAAC,CAAC;AAElE,MAAa,iBAAkB,SAAQ,oBAAW;IA+ChD,YAAY,EACV,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,IAAI,MACmB,EAAE;QACzB,KAAK,EAAE,CAAC;QAtDD,UAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAI3B,+BAA0B,GAAG,KAAK,CAAC;QACnC,kBAAa,GACX,IAAA,kBAAS,EAAa,yBAAiB,CAAC,CAAC;QAC3C,oBAAe,GAAoB,KAAK,CAAC;QACzC,uBAAkB,GAA0B,KAAK,CAAC;QAClD,sBAAiB,GAAqB,KAAK,CAAC;QAC5C,mBAAc,GAAsB,QAAQ,CAAC;QAC7C,sBAAiB,GAAG,KAAK,CAAC;QACjB,iBAAY,GAAwB,EAAE,CAAC;QACvC,4BAAuB,GAAG,IAAI,iBAAK,EAAsB,CAAC;QAC1D,6BAAwB,GAAG,IAAI,iBAAK,EAA2B,CAAC;QAChE,yBAAoB,GAAG,IAAI,iBAAK,EAAuB,CAAC;QACxD,0BAAqB,GAAG,IAAI,iBAAK,EAAqB,CAAC;QACvD,kBAAa,GAAG,IAAI,iBAAK,EAAoB,CAAC;QAC9C,6BAAwB,GAAG,IAAI,iBAAK,EAAuB,CAAC;QACrE;;;WAGG;QACM,kBAAa,GAAG,IAAI,iBAAK,EAAuB,CAAC;QACjD,uBAAkB,GAAG,IAAI,iBAAK,EAAuB,CAAC;QACtD,mBAAc,GAAG,IAAI,iBAAK,EAAqB,CAAC;QAChD,wBAAmB,GAAG,IAAI,iBAAK,EAAM,CAAC;QAS9B,WAAM,GAAG,IAAI,kBAAS,EAAE,CAAC;QACzB,iBAAY,GAAqB,EAAE,CAAC;QAE7C,YAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAK5B,aAAQ,GAAG,KAAK,CAAC;QACjB,4BAAuB,GAAG,KAAK,CAAC;QAuQhC,oBAAe,GAAG,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;YACpC,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ;gBAAE,OAAO;YACvE,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;YACrC,YAAY,CAAC,GAAG,EAAE;gBAChB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC,mBAAmB;oBAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QApQA,IAAI,UAAU;YAAE,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;QAC3D,IAAI,kBAAkB;YACpB,IAAI,CAAC,aAAa,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7D,IAAI,YAAY,EAAE;YAChB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC;YAChC,IAAI,GAAG,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC7D,IAAI,GAAG,IAAI,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACjE,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,YAAY,CAAC;SAChD;QACD,IAAI,MAAM,EAAE,KAAK;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAClE,IAAI,MAAM,EAAE,KAAK;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAElE,KAAK,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,IAAA,kBAAS,EAAC;YACvC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SAC3C,CAAC,EAAE;YACF,WAAW,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,QAAQ,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtC,KAAK,KAAK;oBACR;wBACE,WAAW,CAAC,UAAU,GAAG,OAAO,WAAW,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;qBAC/D;oBACD,MAAM;gBACR,KAAK,KAAK;oBACR;wBACE,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,GAAG,CAAC,CAAC;wBAC9C,WAAW,CAAC,UAAU,GAAG,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;wBACrD,WAAW,CAAC,WAAW,GAAG,EAAE,CAAC;qBAC9B;oBACD,MAAM;aACT;SACF;QAED,IAAI,gBAAgB,EAAE,KAAK;YACzB,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;QACrE,IAAI,gBAAgB,EAAE,KAAK;YACzB,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;QACrE;YACE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;SACrD,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,EAAE;YACR,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;YACtB,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,qBAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAClE,CAAC;aACH;SACF;QAED,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,QAAQ,KAAK,EAAE;gBACb,KAAK,cAAc;oBACjB,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;oBACxC,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,MAAM;aACT;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;YAC3D,oBAAY,CAAC,qBAAqB;YAClC,oBAAY,CAAC,2BAA2B;SACzC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,IAAI,gBAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,iBAAiB;QACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACrC,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,CAAC;IACtE,CAAC;IAED,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,CAAC;IACxE,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACrC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1E,CAAC;IAEO,0BAA0B,CAAC,KAAa;QAC9C,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAC3B,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,KAAK,KAAK,CAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;SAC7C;QAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACxC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACjE,WAAW,CAAC,gBAAgB;gBAC1B,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEnC,wCAAwC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB;YACzC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK;YAC9B,CAAC,CAAC,EAAE,CAAC;QAEP,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,EAAE;gBACR,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBACtB,OAAO;aACR;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE;gBAC5B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,6BAA6B,CAAC,IAAI,CAAC,aAAc,EAAE,GAAG,CAAC,CACxD,CAAC;aACH;iBAAM;gBACL,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,EAAE;oBAChB,GAAG,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;oBACzC,OAAO;iBACR;gBACD,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,oCAAoC,CAClC,WAAW,EACX,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,SAAS,EACrB,GAAG,CACJ,CACF,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,IAAI,CAAC,YAAY;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;aACpE,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACvB,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YAClD,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,oCAAoC,CAClC,WAAW,EACX,IAAI,CAAC,KAAK,EACV,WAAW,CAAC,SAAS,EACrB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAC1B,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,IACE,IAAI,CAAC,aAAa;YAClB,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAc,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EACvE;YACA,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,6BAA6B,CAC3B,IAAI,CAAC,aAAa,EAClB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAC1B,CACF,CAAC;SACH;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAa,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,iBAAiB,CACf,KAAa,EACb,UAOK,EAAE;QAEP,MAAM,IAAI,GAAmB;YAC3B,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK;SAClB,CAAC;QACF,MAAM,QAAQ,GAA0B,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAS,CAAC;QAEvE,IAAI,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,cAAc;YACvD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;QAED,MAAM,UAAU,GAAG,IAAI,sCAAwB,CAAC;YAC9C,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK;YACL,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC,CAAC;QAEH,OAAO,IAAI,4BAAc,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CACxC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAC/C,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,CAAC,IAAI,EAAE,CAAC;QAEd,IAAI,WAAW,CAAC,gBAAgB,KAAK,UAAU,EAAE;YAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;SACR;QAED,IAAI,WAAW,CAAC,SAAS,KAAK,UAAU,EAAE;YACxC,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC;SACpC;aAAM,IACL,WAAW,CAAC,SAAS,KAAK,UAAU;YACpC,WAAW,CAAC,SAAS,KAAK,UAAU,EACpC;YACA,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC;SACpC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAaO,eAAe,CAAC,eAA0B,EAAE;QAClD,MAAM,WAAW,GAAG,IAAI,oBAAc,CAAC;YACrC,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;YACjD,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB,KAAK,OAAO;YAC5D,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;SAC3C,CAAC,CAAC;QACH,WAAW,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACrD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,qBAAe,CAAC,WAAW,CAAC,CAAC;QACtD,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC7C,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAElD,YAAY,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAAE,OAAO;YACnC,MAAM,GAAG,GAAG,wBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE;gBACV,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBACvB,OAAO;aACR;YACD,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC;YAC5B,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC,sCAAsC;YACtC,SAAS,CAAC,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC;YAE3D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,cAAc;gBACrB,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,uBAAgB,CACxC,YAAY,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,EACjB,YAAY,CACb,CAAC;QAEF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACzC,CAAC;IAEO,mBAAmB;QACzB,MAAM,IAAI,GAAG,IAAI,uBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QAErB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACvC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAwB,EAAE,OAAO,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,kBAGzB;QACC,mCAAmC;QACnC,MAAM,WAAW,GAAG,wBAAkB,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACrE,WAAW,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE5C,2BAA2B;QAC3B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE;YAChC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;SAC5C;aAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;YACxC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SAClC;QAED,eAAe;QACf,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,EAAE;gBACR,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;aAClC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBACvD,IAAI,WAAW,EAAE;oBACf,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;iBACvB;aACF;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtD,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;aAC9B;QACH,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE;YAChC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;SACpD;aAAM;YACL,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,KAAK,CAAC;SACrD;QACD,6HAA6H;QAC7H,kBAAkB;QAClB,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,EAAE;YAC7C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;SACpD;QAED,gCAAgC;QAChC,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;YACjC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC9D,EAAE,UAAU,EAAE,IAAI,CAAC;YACrB,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;aAChC;SACF;QAED,wBAAwB;QACxB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;gBACrD,MAAM,SAAS,GAAG,IAAA,oBAAY,EAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC9D,CAAC,CAAC,gBAAgB,GAAG,SAAS,CAAC;aAChC;QACH,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE3B,sBAAsB;QACtB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3C,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE3B,qBAAqB;QACrB,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;YACjC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,QAAQ,CAAC,WAA+B;QAC9C,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;YACjC,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;YAC3C,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;SAC1C;aAAM;YACL,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;SAC5C;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,gBAAiC;QACrD,MAAM,SAAS,GAAG,kBAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,0BAA0B;YAAE,OAAO;QAE5C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAEhD,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,eAAe,CAAC,CAAC;QACrB,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YACvC,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEtB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE;YAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;SAClE;QAED,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAEO,QAAQ,CAAC,WAA8B;QAC7C,IAAI,WAAW,CAAC,GAAG,IAAI,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEtE,MAAM,GAAG,GAAqB;YAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,KAAK,EAAE,WAAW,CAAC,GAAG;YACtB,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;SACtE,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,SAAS,CACf,iBAAqC,EACrC,WAA8B;QAE9B,IAAI,WAAW,CAAC,UAAU,IAAI,SAAS;YACrC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEpD,MAAM,iBAAiB,GAA4B;YACjD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI;YACpB,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,CACtB,WAAW,CAAC,MAAM,CAAC,MAAM,CACvB,CAAC,GAA6C,EAAE,KAAK,EAAE,EAAE;gBACvD,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;oBACtC,MAAM,MAAM,GAAG,IAAA,4BAAyB,EAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;oBACjE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC/B,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;wBAClC,GAAG,CAAC,GAAG,GAAG,IAAI,gCAAmB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBACjE;oBACD,OAAO,GAAG,CAAC;iBACZ;gBACD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,mCAAsB,CAAC;oBAClD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI;oBACzB,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC;YACb,CAAC,EACD,EAAE,CACH,CACF;SACF,CAAC;QAEF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,kBAG1B;QACC,mCAAmC;QACnC,MAAM,SAAS,GAAG,wBAAkB,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAE3C,sBAAsB;QACtB,KAAK,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,IAAA,kBAAS,EAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACzD,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;gBACjD,MAAM,WAAW,GACf,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;oBAC3B,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CACrD;oBACD,CAAC,GAAG,EAAE;wBACJ,4BAA4B;wBAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE;4BACxD,SAAS,EAAE,UAAU;yBACtB,CAAC,CAAC;wBAEH,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;wBACnD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;wBAExC,OAAO,WAAW,CAAC;oBACrB,CAAC,CAAC,EAAE,CAAC;gBAEP,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;oBACpB,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;oBACxC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;iBAC5B;gBAED,qBAAqB;gBACrB,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;oBACjE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAEtE,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACjE,IAAI,CAAC,UAAU;wBAAE,OAAO,KAAK,CAAC;oBAE9B,IAAI,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;wBAC5C,MAAM,MAAM,GAAG,IAAA,4BAAyB,EACtC,UAAU,CAAC,UAAU,IAAI,EAAE,CAC5B,CAAC;wBACF,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;wBACzB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAC5B,CAAC;wBACF,IAAI,CAAC,MAAM;4BAAE,OAAO,KAAK,CAAC;wBAC1B,OAAO,CAAC,CAAC,IAAA,2BAAmB,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;qBACnD;oBAED,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,GAAG,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBACnC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;iBAC7C;gBACD,WAAW,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CACpE,CAAC,SAAS,EAAE,EAAE,CACZ,CACE,IAAI,CAAC,aAAa,CAAC,gBAAgB,CACjC,WAAW,CAAC,IAAyB,CACtC,IAAI,EAAE,CACR,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,CACzC,CAAC;gBAEF,wBAAwB;gBACxB,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,IAAI,UAAU,CAAC;gBAC3D,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAAC,cAAc,CAAC,CAAC;gBACnD,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;oBACnD,WAAW,CAAC,gBAAgB,GAAG,SAAS,CAAC;iBAC1C;qBAAM;oBACL,WAAW,CAAC,cAAc,GAAG,SAAS,CAAC;iBACxC;gBAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC/C,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBAE5C,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;oBAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;oBAE3D,8BAA8B;oBAC9B,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;wBAChD,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAClC,WAAW,EACX,KAAK,EACL,WAAW,CACZ,CAAC;oBACJ,CAAC,CAAC,CAAC;oBAEH,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;oBACjD,yBAAyB;oBACzB,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;iBACjE;gBACD,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;oBACrD,cAAc;oBACd,IAAI,WAAW,CAAC,IAAI,IAAI,SAAS,EAAE;wBACjC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACxD,WAAW,CAAC,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC;wBAC/C,WAAW,CAAC,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC;wBAE7C,IAAI,CAAC,WAAW,CACd,WAAW,CAAC,QAAQ,CAAC,KAAK,EAC1B,WAAW,EACX,IAAI,mBAAW,CAAC;4BACd,EAAE,EAAE,QAAQ;4BACZ,MAAM,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;yBACrC,CAAC,CACH,CAAC;qBACH;iBACF;gBAED,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;aAC3D;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE;gBAC7C,mBAAmB;gBACnB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;oBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;iBAC7C;gBACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;oBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;iBACjD;gBACD,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE;oBAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;iBAChD;aACF;YAED,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE;gBACnD,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACzD,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBAE3D,6HAA6H;gBAC7H,kBAAkB;gBAClB,IAAI,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE;oBAClC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;iBACpD;aACF;YAED,uBAAuB;YACvB,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAExE,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAE3C,IAAI,WAAW,CAAC,qBAAqB,EAAE;gBACrC,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;aACvD;YAED,kBAAkB;YAClB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE;gBAC/D,IAAI,CAAC,aAAa,CAAC,IAAI;oBACrB,WAAW,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;aAClE;SACF;QAED,qBAAqB;QACrB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;YAC9B,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;SAC7C;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE;YACtC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SAClC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE;YAC/B,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;SAC3C;aAAM;YACL,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;SAC3C;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;IACH,CAAC;IAEO,mBAAmB,CACzB,WAA+B,EAC/B,OAAgB;QAEhB,IAAI,OAAO,EAAE;YACX,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE;gBAChC,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;aAC7D;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACxC,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,CACpB,EACD;oBACA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;iBAC5D;aACF;SACF;aAAM;YACL,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE;gBAChC,IAAI,CAAC,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;oBAClE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;iBAC3D;aACF;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACxC,IACE,CAAC,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,CACpB,EACD;oBACA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;iBAC5D;aACF;SACF;QAED,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU;gBAAE,OAAO;YAC3C,IACE,CAAC,KAAK,CAAC,SAAS;gBAChB,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB;gBACjC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;gBAEzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;YAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACzE,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YAE9B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,IAAA,gBAAO,EAAC,UAAU,EAAE,WAAW,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAClE;IACH,CAAC;IAEO,WAAW,CACjB,KAAuB,EACvB,WAA8B,EAC9B,MAAmB;QAEnB,MAAM,KAAK,GAAkB;YAC3B,KAAK;YACL,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,WAAW;YACX,QAAQ,EAAE,WAAW,CAAC,QAAQ;SAC/B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CACZ,WAAoC,EACpC,UAAuC,EAAE;QAEzC,MAAM,IAAI,GACR,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QAEnE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;QAElD,MAAM,MAAM,GAAG,IAAI,wBAAY,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,4BAAc,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,IAAI,kCAAiB,CACvC,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,SAAS,EACT,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE7C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,WAAW;IACX,QAAQ,CACN,KAAuB;IACvB,eAAe;IACf,EAAgB;QAEhB,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE;YACzE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;SAChC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS;YAC3B,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACrB,wBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAClD,CAAC;QACF,IAAI,gBAAgB,EAAE;YACpB,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACvC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;SACf;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS;YAC3B,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACrB,wBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK;YAChD,CAAC,CAAC,CAAC,aAAa,CACnB,CAAC;QACF,IAAI,kBAAkB,EAAE;YACtB,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;YACzC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,QAAQ,kBAAkB,CAAC,SAAS,EAAE;gBACpC,KAAK,UAAU;oBACb,kBAAkB,CAAC,SAAS,GAAG,UAAU,CAAC;oBAC1C,MAAM;gBACR,KAAK,UAAU;oBACb,kBAAkB,CAAC,SAAS,GAAG,UAAU,CAAC;oBAC1C,MAAM;aACT;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;SACf;aAAM;YACL,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,MAAM,CAAC;SAC3B;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,CACpB;YACD,CAAC,IAAI,CAAC,aAAa;YAEnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;SAC7C;QAED,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEpC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACjD,IAAI,aAAgC,CAAC;YACrC,IAAI,KAAuB,CAAC;YAE5B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAM,CAAE,CAAC;gBAClE,KAAK,GAAG,oCAAoC,CAC1C,WAAW,EACX,IAAI,CAAC,KAAK,EACV,IAAA,oBAAY,EAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,EAC/D,WAAW,CAAC,GAAI,CACjB,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,aAAa;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;gBAClD,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;aAC3C;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE;gBACzC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;gBACtE,KAAK,GAAG,6BAA6B,CACnC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,aAAa,CAAC,GAAG,CACvB,CAAC;gBAEF,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;aAClD;;gBAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAEzB,mEAAmE;YACnE,IAAI,CAAC,KAAK,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YACzC,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM,EAAE;gBACjC,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC;aAClC;iBAAM;gBACL,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;aAC5C;YACD,KAAK,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,GAAG,CAAC;gBACJ,SAAS,EAAE,IAAA,iCAAyB,EAAC,CAAC,CAAC,SAAS,CAAC;aAClD,CAAC,CAAC,CAAC;YACJ,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YACxC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SACjC;QACD,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpE,CAAC;IAEO,uBAAuB,CAAC,KAAuB;QACrD,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEO,wBAAwB,CAAC,KAA4B;QAC3D,GAAG,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,iBAAiB,CAAC,KAAwB;QAChD,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,sBAAsB;YAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAEO,kBAAkB,CAAC,KAAsB;QAC/C,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,uBAAuB;YAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IACvC,CAAC;CACF;AA5gCD,8CA4gCC;AAED,SAAgB,oCAAoC,CAClD,WAA8B,EAC9B,KAAa,EACb,SAAoB,EACpB,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,WAAW,CAAC,IAAI,EAChB,CAAC,EACD,mBAAmB,EACnB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAC7C,CAAC;IACF,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,KAAK,CAAC,GAAG,GAAG;QACV,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;QAC9C,KAAK,EAAE,GAAG;KACX,CAAC;IACF,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,qBAAe,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7E,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE;QACjC,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,sCAAyB,CAAC,CAAC,CAAC,CACxC,CAAC;KACH;IAED,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE;QAChE,KAAK,CAAC,IAAI,CAAC,IAAI,CACb,IAAI,qBAAe,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CACjE,CAAC;QACF,KAAK,CAAC,SAAS,GAAG;YAChB,IAAI,sBAAgB,CAAC,KAAK,EAAE;gBAC1B,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;aACtC,CAAC;SACH,CAAC;KACH;IAED,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AA5CD,oFA4CC;AAED,SAAgB,6BAA6B,CAC3C,IAAsB,EACtB,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,aAAa,EACb,oBAAY,EACZ,eAAe,EACf,CAAC,oBAAoB,CAAC,CACvB,CAAC;IACF,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC;IACtB,KAAK,CAAC,gBAAgB,GAAG,uBAAgB,CAAC,eAAe,EAAE,CAAC;IAE5D,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAhBD,sEAgBC;AAED,SAAgB,uBAAuB,CACrC,KAAuB,EACvB,aAA+B;IAE/B,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAChD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;IAE3C,KAAK,CAAC,aAAa,GAAG,WAAW,CAAC,eAAe,CAAC;IAClD,KAAK,CAAC,qBAAqB,GAAG,WAAW,CAAC,cAAc,KAAK,UAAU,CAAC;IACxE,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC;IAC9C,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;IAE7B,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;KAC7B;SAAM;QACL,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;QAC1B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;KAC3B;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;QAClC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;KAChB;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACrB,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC,eAAe,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE;YAClC,KAAK,CAAC,UAAU,CAAC,YAAY;gBAC3B,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;SAC9C;KACF;AACH,CAAC;AAhCD,0DAgCC;AAED,SAAgB,WAAW,CAAC,IAAiB;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,IAAM;QAClB,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM;KAC3B;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,CAAC;AACb,CAAC;AARD,kCAQC;AAoBM,MAAM,mBAAmB,GAAG,CACjC,MAA+B,EAC/B,MAA6B,EAC7B,EAAE,CACF,MAAM,CAAC,IAAI,CACT,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CACtE;IACC,CAAC,CAAC,MAAM;IACR,CAAC,CAAC,SAAS,CAAC;AATH,QAAA,mBAAmB,uBAShB;AAQH,QAAA,iBAAiB,GAAe;IAC3C,MAAM,EAAE;QACN,KAAK,EAAE;YACL,IAAI,kCAAqB,CAAC;gBACxB,QAAQ,EAAE,YAAY;gBACtB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,CAAC;aACZ,CAAC;YACF,IAAI,kCAAqB,CAAC;gBACxB,QAAQ,EAAE,YAAY;gBACtB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,CAAC;aACZ,CAAC;SACH;QACD,KAAK,EAAE;YACL,IAAI,kCAAqB,CAAC;gBACxB,QAAQ,EAAE,WAAW;gBACrB,SAAS,EAAE,KAAK;gBAChB,YAAY,EAAE;oBACZ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;oBACjC,EAAE,IAAI,EAAE,MAAM,EAAE;oBAChB,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;oBAClC,EAAE,IAAI,EAAE,WAAW,EAAE;iBACtB;aACF,CAAC;SACH;KACF;IACD,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAC1C,kBAAkB,EAAE,KAAK;IACzB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;IACtD,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,EAAE;CACT,CAAC","sourcesContent":["import debug from \"debug\";\nimport { cloneDeep, isEqual } from \"lodash\";\nimport Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport { Profile } from \"../../dtls/src/context/srtp\";\nimport { codecParametersFromString, DtlsKeys } from \".\";\nimport {\n DISCARD_HOST,\n DISCARD_PORT,\n SenderDirections,\n SRTP_PROFILE,\n} from \"./const\";\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport { enumerate, EventTarget } from \"./helper\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpParameters,\n RTCRtpReceiveParameters,\n RTCRtpRtxParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport { RtpRouter } from \"./media/router\";\nimport { RTCRtpReceiver } from \"./media/rtpReceiver\";\nimport { RTCRtpSender } from \"./media/rtpSender\";\nimport {\n Direction,\n RTCRtpTransceiver,\n TransceiverOptions,\n} from \"./media/rtpTransceiver\";\nimport { MediaStream, MediaStreamTrack } from \"./media/track\";\nimport {\n addSDPHeader,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n} from \"./sdp\";\nimport { RTCCertificate, RTCDtlsTransport } from \"./transport/dtls\";\nimport {\n IceCandidate,\n IceGathererState,\n RTCIceCandidate,\n RTCIceConnectionState,\n RTCIceGatherer,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\nimport {\n andDirection,\n parseIceServers,\n reverseDirection,\n reverseSimulcastDirection,\n} from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = uuid.v4();\n iceTransport: RTCIceTransport;\n dtlsTransport: RTCDtlsTransport;\n sctpTransport?: RTCSctpTransport;\n masterTransportEstablished = false;\n configuration: Required<PeerConfig> =\n cloneDeep<PeerConfig>(defaultPeerConfig);\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n readonly transceivers: RTCRtpTransceiver[] = [];\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n /**\n * should use onRemoteTransceiverAdded\n * @deprecated\n */\n readonly onTransceiver = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate]>();\n readonly onNegotiationneeded = new Event<[]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n\n private readonly router = new RtpRouter();\n private readonly certificates: RTCCertificate[] = [];\n sctpRemotePort?: number;\n private seenMid = new Set<string>();\n private currentLocalDescription?: SessionDescription;\n private currentRemoteDescription?: SessionDescription;\n private pendingLocalDescription?: SessionDescription;\n private pendingRemoteDescription?: SessionDescription;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n constructor({\n codecs,\n headerExtensions,\n iceServers,\n iceTransportPolicy,\n icePortRange,\n dtls,\n }: Partial<PeerConfig> = {}) {\n super();\n\n if (iceServers) this.configuration.iceServers = iceServers;\n if (iceTransportPolicy)\n this.configuration.iceTransportPolicy = iceTransportPolicy;\n if (icePortRange) {\n const [min, max] = icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n this.configuration.icePortRange = icePortRange;\n }\n if (codecs?.audio) this.configuration.codecs.audio = codecs.audio;\n if (codecs?.video) this.configuration.codecs.video = codecs.video;\n\n for (const [i, codecParams] of enumerate([\n ...(this.configuration.codecs.audio || []),\n ...(this.configuration.codecs.video || []),\n ])) {\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n break;\n }\n }\n\n if (headerExtensions?.audio)\n this.configuration.headerExtensions.audio = headerExtensions.audio;\n if (headerExtensions?.video)\n this.configuration.headerExtensions.video = headerExtensions.video;\n [\n ...(this.configuration.headerExtensions.audio || []),\n ...(this.configuration.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n if (dtls) {\n const { keys } = dtls;\n if (keys) {\n this.certificates.push(\n new RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash)\n );\n }\n }\n\n this.iceConnectionStateChange.subscribe((state) => {\n switch (state) {\n case \"disconnected\":\n this.setConnectionState(\"disconnected\");\n break;\n case \"closed\":\n this.close();\n break;\n }\n });\n\n const { iceTransport, dtlsTransport } = this.createTransport([\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n ]);\n this.iceTransport = iceTransport;\n this.dtlsTransport = dtlsTransport;\n }\n\n get localDescription() {\n if (!this._localDescription) return;\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) return;\n return this._remoteDescription.toJSON();\n }\n\n private get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n private get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n private getTransceiverByMid(mid: string) {\n return this.transceivers.find((transceiver) => transceiver.mid === mid);\n }\n\n private getTransceiverByMLineIndex(index: number) {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index\n );\n }\n\n async createOffer() {\n if (this.certificates.length === 0) {\n await this.dtlsTransport.setupCertificate();\n }\n\n this.transceivers.forEach((transceiver) => {\n transceiver.codecs = this.configuration.codecs[transceiver.kind];\n transceiver.headerExtensions =\n this.configuration.headerExtensions[transceiver.kind];\n });\n\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n\n const currentMedia = this._localDescription\n ? this._localDescription.media\n : [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n log(\"mid missing\", m);\n return;\n }\n if (m.kind === \"application\") {\n description.media.push(\n createMediaDescriptionForSctp(this.sctpTransport!, mid)\n );\n } else {\n const transceiver = this.getTransceiverByMid(mid);\n if (!transceiver) {\n log(\"transceiver by mid not found\", mid);\n return;\n }\n transceiver.mLineIndex = i;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n mid\n )\n );\n }\n });\n\n // # handle new transceivers / sctp\n this.transceivers\n .filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))\n .forEach((transceiver) => {\n transceiver.mLineIndex = description.media.length;\n description.media.push(\n createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n transceiver.direction,\n allocateMid(this.seenMid)\n )\n );\n });\n\n if (\n this.sctpTransport &&\n !description.media.find((m) => this.sctpTransport!.mid === m.rtp.muxId)\n ) {\n description.media.push(\n createMediaDescriptionForSctp(\n this.sctpTransport,\n allocateMid(this.seenMid)\n )\n );\n }\n\n const mids = description.media\n .map((m) => m.rtp.muxId)\n .filter((v) => v) as string[];\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n\n return description.toJSON();\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {}\n ): RTCDataChannel {\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = { ...base, ...options } as any;\n\n if (settings.maxPacketLifeTime && settings.maxRetransmits)\n throw new Error(\"can not select both\");\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n this.needNegotiation();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n return new RTCDataChannel(this.sctpTransport, parameters);\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) throw new Error(\"peer closed\");\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc))\n throw new Error(\"unExist\");\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc\n );\n if (!transceiver) throw new Error(\"unExist\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.needNegotiation();\n return;\n }\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.direction = \"recvonly\";\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.direction = \"inactive\";\n }\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") return;\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private createTransport(srtpProfiles: Profile[] = []) {\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.configuration.iceServers),\n forceTurn: this.configuration.iceTransportPolicy === \"relay\",\n portRange: this.configuration.icePortRange,\n });\n iceGatherer.onGatheringStateChange.subscribe((state) => {\n this.updateIceGatheringState(state);\n });\n this.updateIceGatheringState(iceGatherer.gatheringState);\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe((state) => {\n this.updateIceConnectionState(state);\n });\n this.updateIceConnectionState(iceTransport.state);\n\n iceTransport.iceGather.onIceCandidate = (candidate) => {\n if (!this.localDescription) return;\n const sdp = SessionDescription.parse(this.localDescription.sdp);\n const media = sdp.media[0];\n if (!media) {\n log(\"media not exist\");\n return;\n }\n candidate.sdpMLineIndex = 0;\n candidate.sdpMid = media.rtp.muxId;\n // for chrome & firefox & maybe others\n candidate.foundation = \"candidate:\" + candidate.foundation;\n\n this.onIceCandidate.execute(candidate.toJSON());\n if (this.onicecandidate)\n this.onicecandidate({ candidate: candidate.toJSON() });\n this.emit(\"icecandidate\", { candidate });\n };\n\n const dtlsTransport = new RTCDtlsTransport(\n iceTransport,\n this.router,\n this.certificates,\n srtpProfiles\n );\n\n return { dtlsTransport, iceTransport };\n }\n\n private createSctpTransport() {\n const sctp = new RTCSctpTransport(this.dtlsTransport);\n sctp.mid = undefined;\n\n sctp.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n\n const event: RTCDataChannelEvent = { channel };\n if (this.ondatachannel) this.ondatachannel(event);\n this.emit(\"datachannel\", event);\n });\n\n return sctp;\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // # parse and validate description\n const description = SessionDescription.parse(sessionDescription.sdp);\n description.type = sessionDescription.type;\n this.validateDescription(description, true);\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n description.media.forEach((media, i) => {\n const mid = media.rtp.muxId;\n if (!mid) {\n throw new Error(\"mid not exist\");\n }\n this.seenMid.add(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver = this.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n });\n\n // # set ICE role\n if (description.type === \"offer\") {\n this.iceTransport.connection.iceControlling = true;\n } else {\n this.iceTransport.connection.iceControlling = false;\n }\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (this.iceTransport.connection.remoteIsLite) {\n this.iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (description.type === \"answer\") {\n const role = description.media.find((media) => media.dtlsParams)\n ?.dtlsParams?.role;\n if (role) {\n this.dtlsTransport.role = role;\n }\n }\n\n // # configure direction\n this.transceivers.forEach((t) => {\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.currentDirection = direction;\n }\n });\n\n // for trickle ice\n this.setLocal(description);\n\n // # gather candidates\n await this.iceTransport.iceGather.gather();\n description.media.map((media) => {\n addTransportDescription(media, this.dtlsTransport);\n });\n\n this.setLocal(description);\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private setLocal(description: SessionDescription) {\n if (description.type === \"answer\") {\n this.currentLocalDescription = description;\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n async addIceCandidate(candidateMessage: RTCIceCandidate) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n await this.iceTransport.addRemoteCandidate(candidate);\n }\n\n private async connect() {\n if (this.masterTransportEstablished) return;\n\n const dtlsTransport = this.dtlsTransport;\n const iceTransport = dtlsTransport.iceTransport;\n\n this.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n log(\"ice connected\");\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n log(\"dtls connected\");\n\n if (this.sctpTransport && this.sctpRemotePort) {\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n }\n\n this.masterTransportEstablished = true;\n this.setConnectionState(\"connected\");\n }\n\n private localRtp(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n private remoteRtp(\n remoteDescription: SessionDescription,\n transceiver: RTCRtpTransceiver\n ): RTCRtpReceiveParameters {\n if (transceiver.mLineIndex == undefined)\n throw new Error(\"mLineIndex not assigned\");\n const media = remoteDescription.media[transceiver.mLineIndex];\n if (!media) throw new Error(\"media line not exist\");\n\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {}\n )\n ),\n };\n\n return receiveParameters;\n }\n\n async setRemoteDescription(sessionDescription: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }) {\n // # parse and validate description\n const remoteSdp = SessionDescription.parse(sessionDescription.sdp);\n remoteSdp.type = sessionDescription.type;\n this.validateDescription(remoteSdp, false);\n\n // # apply description\n for (const [i, remoteMedia] of enumerate(remoteSdp.media)) {\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver =\n this.transceivers.find(\n (t) =>\n t.kind === remoteMedia.kind &&\n [undefined, remoteMedia.rtp.muxId].includes(t.mid)\n ) ||\n (() => {\n // create remote transceiver\n const transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n\n this.onRemoteTransceiverAdded.execute(transceiver);\n this.onTransceiver.execute(transceiver);\n\n return transceiver;\n })();\n\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n transceiver.mLineIndex = i;\n }\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.configuration.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) return false;\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(\n existCodec.parameters ?? \"\"\n );\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find(\n (c) => c.payloadType === pt\n );\n if (!origin) return false;\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (\n this.configuration.headerExtensions[\n remoteMedia.kind as \"video\" | \"audio\"\n ] || []\n ).find((v) => v.uri === extension.uri)\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction || \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(remoteSdp.type)) {\n transceiver.currentDirection = direction;\n } else {\n transceiver.offerDirection = direction;\n }\n\n const localParams = this.localRtp(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.remoteRtp(remoteSdp, transceiver);\n\n // register simulcast receiver\n remoteMedia.simulcastParameters.forEach((param) => {\n this.router.registerRtpReceiverByRid(\n transceiver,\n param,\n remotePrams\n );\n });\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n // assign msid\n if (remoteMedia.msid != undefined) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n\n this.fireOnTrack(\n transceiver.receiver.track,\n transceiver,\n new MediaStream({\n id: streamId,\n tracks: [transceiver.receiver.track],\n })\n );\n }\n }\n\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0]?.ssrc);\n } else if (remoteMedia.kind === \"application\") {\n // # configure sctp\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n }\n this.sctpTransport.setRemotePort(this.sctpRemotePort);\n if (!this.sctpTransport.mid) {\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n if (remoteMedia.iceParams && remoteMedia.dtlsParams) {\n this.iceTransport.setRemoteParams(remoteMedia.iceParams);\n this.dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n this.iceTransport.connection.iceControlling = true;\n }\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(this.iceTransport.addRemoteCandidate);\n\n await this.iceTransport.iceGather.gather();\n\n if (remoteMedia.iceCandidatesComplete) {\n await this.iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n this.dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.setConnectionState(\"failed\");\n });\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n private validateDescription(\n description: SessionDescription,\n isLocal: boolean\n ) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(this.signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(this.signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(\n this.signalingState\n )\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n\n description.media.forEach((media) => {\n if (media.direction === \"inactive\") return;\n if (\n !media.iceParams ||\n !media.iceParams.usernameFragment ||\n !media.iceParams.password\n )\n throw new Error(\"ICE username fragment or password is missing\");\n });\n\n if ([\"answer\", \"pranswer\"].includes(description.type || \"\")) {\n const offer = isLocal ? this._remoteDescription : this._localDescription;\n if (!offer) throw new Error();\n\n const offerMedia = offer.media.map((v) => [v.kind, v.rtp.muxId]);\n const answerMedia = description.media.map((v) => [v.kind, v.rtp.muxId]);\n if (!isEqual(offerMedia, answerMedia))\n throw new Error(\"Media sections in answer do not match offer\");\n }\n }\n\n private fireOnTrack(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n stream: MediaStream\n ) {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.emit(\"track\", event);\n if (this.ontrack) this.ontrack(event);\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {}\n ) {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const sender = new RTCRtpSender(trackOrKind, this.dtlsTransport);\n const receiver = new RTCRtpReceiver(kind, this.dtlsTransport, sender.ssrc);\n const transceiver = new RTCRtpTransceiver(\n kind,\n receiver,\n sender,\n direction,\n this.dtlsTransport\n );\n transceiver.options = options;\n this.router.registerRtpSender(transceiver.sender);\n\n this.transceivers.push(transceiver);\n this.onTransceiverAdded.execute(transceiver);\n\n this.needNegotiation();\n\n return transceiver;\n }\n\n getTransceivers() {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream\n ) {\n if (this.isClosed) throw new Error(\"is closed\");\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"track exist\");\n }\n\n const emptyTrackSender = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true\n );\n if (emptyTrackSender) {\n const sender = emptyTrackSender.sender;\n sender.registerTrack(track);\n this.needNegotiation();\n return sender;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.direction = \"sendrecv\";\n break;\n case \"inactive\":\n notSendTransceiver.direction = \"sendonly\";\n break;\n }\n this.needNegotiation();\n return sender;\n } else {\n const transceiver = this.addTransceiver(track, { direction: \"sendrecv\" });\n this.needNegotiation();\n return transceiver.sender;\n }\n }\n\n async createAnswer() {\n this.assertNotClosed();\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(\n this.signalingState\n ) ||\n !this.dtlsTransport\n )\n throw new Error(\"createAnswer failed\");\n\n if (this.certificates.length === 0) {\n await this.dtlsTransport.setupCertificate();\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n this._remoteDescription?.media.forEach((remoteM) => {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteM.kind)) {\n const transceiver = this.getTransceiverByMid(remoteM.rtp.muxId!)!;\n media = createMediaDescriptionForTransceiver(\n transceiver,\n this.cname,\n andDirection(transceiver.direction, transceiver.offerDirection),\n transceiver.mid!\n );\n if (!transceiver.dtlsTransport) throw new Error();\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteM.kind === \"application\") {\n if (!this.sctpTransport || !this.sctpTransport.mid) throw new Error();\n media = createMediaDescriptionForSctp(\n this.sctpTransport,\n this.sctpTransport.mid\n );\n\n dtlsTransport = this.sctpTransport.dtlsTransport;\n } else throw new Error();\n\n // # determine DTLS role, or preserve the currently configured role\n if (!media.dtlsParams) throw new Error();\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n media.simulcastParameters = remoteM.simulcastParameters.map((v) => ({\n ...v,\n direction: reverseSimulcastDirection(v.direction),\n }));\n description.media.push(media);\n });\n\n const bundle = new GroupDescription(\"BUNDLE\", []);\n description.media.forEach((media) => {\n bundle.items.push(media.rtp.muxId!);\n });\n description.group.push(bundle);\n\n return description.toJSON();\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n this.setConnectionState(\"closed\");\n\n this.transceivers.forEach((transceiver) => {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n });\n\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n await this.dtlsTransport.stop();\n await this.iceTransport.stop();\n\n this.dispose();\n log(\"peerConnection closed\");\n }\n\n private assertNotClosed() {\n if (this.isClosed) throw new Error(\"RTCPeerConnection is closed\");\n }\n\n private updateIceGatheringState(state: IceGathererState) {\n log(\"iceGatheringStateChange\", state);\n this.iceGatheringState = state;\n this.iceGatheringStateChange.execute(state);\n this.emit(\"icegatheringstatechange\", state);\n }\n\n private updateIceConnectionState(state: RTCIceConnectionState) {\n log(\"iceConnectionStateChange\", state);\n this.iceConnectionState = state;\n this.iceConnectionStateChange.execute(state);\n this.emit(\"iceconnectionstatechange\", state);\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) this.onsignalingstatechange({});\n }\n\n private setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n if (this.onconnectionstatechange) this.onconnectionstatechange();\n this.emit(\"connectionstatechange\");\n }\n\n private dispose() {\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n }\n}\n\nexport function createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n cname: string,\n direction: Direction,\n mid: string\n) {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType)\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname })];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o)\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({ ssrc: transceiver.sender.rtxSsrc, cname })\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n}\n\nexport function createMediaDescriptionForSctp(\n sctp: RTCSctpTransport,\n mid: string\n) {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"]\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n addTransportDescription(media, sctp.dtlsTransport);\n return media;\n}\n\nexport function addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport\n) {\n const iceTransport = dtlsTransport.iceTransport;\n const iceGatherer = iceTransport.iceGather;\n\n media.iceCandidates = iceGatherer.localCandidates;\n media.iceCandidatesComplete = iceGatherer.gatheringState === \"complete\";\n media.iceParams = iceGatherer.localParameters;\n media.iceOptions = \"trickle\";\n\n if (media.iceCandidates.length > 0) {\n const candidate = media.iceCandidates[media.iceCandidates.length - 1];\n media.host = candidate.ip;\n media.port = candidate.port;\n } else {\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n }\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n}\n\nexport function allocateMid(mids: Set<string>) {\n let mid = \"\";\n for (let i = 0; ; ) {\n mid = (i++).toString();\n if (!mids.has(mid)) break;\n }\n mids.add(mid);\n return mid;\n}\n\nexport interface PeerConfig {\n codecs: Partial<{\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase()\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nexport const defaultPeerConfig: PeerConfig = {\n codecs: {\n audio: [\n new RTCRtpCodecParameters({\n mimeType: \"audio/opus\",\n clockRate: 48000,\n channels: 2,\n }),\n new RTCRtpCodecParameters({\n mimeType: \"audio/PCMU\",\n clockRate: 8000,\n channels: 1,\n }),\n ],\n video: [\n new RTCRtpCodecParameters({\n mimeType: \"video/VP8\",\n clockRate: 90000,\n rtcpFeedback: [\n { type: \"ccm\", parameter: \"fir\" },\n { type: \"nack\" },\n { type: \"nack\", parameter: \"pli\" },\n { type: \"goog-remb\" },\n ],\n }),\n ],\n },\n headerExtensions: { audio: [], video: [] },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n dtls: {},\n};\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate: RTCIceCandidate;\n}\n"]}
|
|
@@ -25,6 +25,7 @@ export declare class RTCSctpTransport {
|
|
|
25
25
|
private dataChannelFlush;
|
|
26
26
|
datachannelSend: (channel: RTCDataChannel, data: Buffer | string) => void;
|
|
27
27
|
static getCapabilities(): RTCSctpCapabilities;
|
|
28
|
+
setRemotePort(port: number): void;
|
|
28
29
|
start(remotePort: number): Promise<void>;
|
|
29
30
|
stop(): Promise<void>;
|
|
30
31
|
dataChannelClose(channel: RTCDataChannel): void;
|
|
@@ -259,6 +259,9 @@ class RTCSctpTransport {
|
|
|
259
259
|
static getCapabilities() {
|
|
260
260
|
return new RTCSctpCapabilities(65536);
|
|
261
261
|
}
|
|
262
|
+
setRemotePort(port) {
|
|
263
|
+
this.sctp.setRemotePort(port);
|
|
264
|
+
}
|
|
262
265
|
async start(remotePort) {
|
|
263
266
|
if (this.isServer) {
|
|
264
267
|
this.dataChannelId = 0;
|
|
@@ -267,7 +270,8 @@ class RTCSctpTransport {
|
|
|
267
270
|
this.dataChannelId = 1;
|
|
268
271
|
}
|
|
269
272
|
this.sctp.isServer = this.isServer;
|
|
270
|
-
|
|
273
|
+
this.setRemotePort(remotePort);
|
|
274
|
+
await this.sctp.start();
|
|
271
275
|
}
|
|
272
276
|
async stop() {
|
|
273
277
|
this.dtlsTransport.dataReceiver = () => { };
|