@camstack/addon-pipeline 1.2.11 → 1.2.13
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/dist/audio-analyzer/index.js +1 -1
- package/dist/audio-analyzer/index.mjs +1 -1
- package/dist/detection-pipeline/index.js +2 -2
- package/dist/detection-pipeline/index.mjs +2 -2
- package/dist/{dist-DNjy_sr4.js → dist-BUd2xSjP.js} +2243 -2075
- package/dist/{dist-owmpaeIY.mjs → dist-DuI0Ypuu.mjs} +2243 -2075
- package/dist/{fmp4-keyframes-BzTPoPVn.js → fmp4-keyframes-5s8T9Mng.js} +42 -7
- package/dist/{fmp4-keyframes-qOgJBjMO.mjs → fmp4-keyframes-CV0X1mGy.mjs} +37 -12
- package/dist/motion-wasm/index.js +1 -1
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/pipeline-runner/index.js +2 -2
- package/dist/pipeline-runner/index.mjs +2 -2
- package/dist/recorder/index.js +183 -49
- package/dist/recorder/index.mjs +183 -49
- package/dist/{step-definitions-C2bNlww3.js → step-definitions-Ck4_6GKK.js} +1 -1
- package/dist/{step-definitions-CkvctwuS.mjs → step-definitions-DqNWVeYB.mjs} +1 -1
- package/dist/stream-broker/_stub.js +2 -2
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CkiyBstP.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-5EJfCCjk.mjs} +2 -2
- package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DHQsa56B.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BDeEvhV5.mjs} +1 -1
- package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js--zEZtV2N.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BGtpZkgz.mjs} +1 -1
- package/dist/stream-broker/{hostInit-BC07ueda.mjs → hostInit-QaJMh7Ec.mjs} +2 -2
- package/dist/stream-broker/index.js +1186 -337
- package/dist/stream-broker/index.mjs +1187 -338
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-CftzR7Pj.js → MaskShapeCanvas-DI4BY7W2-Di-nvxaR.js} +1 -1
- package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-DPgVIdEn.js → MotionZonesSettings-NcxxQN8r-C6Nj76Lm.js} +1 -1
- package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-D0HqiXHW.js → PrivacyMaskSettings-APgPLF7p-DwVoJunF.js} +1 -1
- package/embed-dist/assets/index-CtDVz0vI.js +116 -0
- package/embed-dist/index.html +1 -1
- package/package.json +1 -1
- package/embed-dist/assets/index-DRtbV_en.js +0 -116
|
@@ -3,10 +3,10 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
const require_chunk = require("../chunk-emK7D4bc.js");
|
|
6
|
-
const require_dist = require("../dist-
|
|
6
|
+
const require_dist = require("../dist-BUd2xSjP.js");
|
|
7
7
|
const require_remote_restream = require("../remote-restream-CO36Sr30.js");
|
|
8
8
|
const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-fsdDExML.js");
|
|
9
|
-
const require_fmp4_keyframes = require("../fmp4-keyframes-
|
|
9
|
+
const require_fmp4_keyframes = require("../fmp4-keyframes-5s8T9Mng.js");
|
|
10
10
|
let node_child_process = require("node:child_process");
|
|
11
11
|
let node_url = require("node:url");
|
|
12
12
|
let node_fs = require("node:fs");
|
|
@@ -2435,6 +2435,30 @@ function logBannerArgs(level) {
|
|
|
2435
2435
|
level
|
|
2436
2436
|
];
|
|
2437
2437
|
}
|
|
2438
|
+
/** PCMU: 8 kHz µ-law, 160 samples (20 ms), static PT 0. */
|
|
2439
|
+
var AUDIO_CLOCK_PCMU = {
|
|
2440
|
+
codec: "pcmu",
|
|
2441
|
+
rateHz: 8e3,
|
|
2442
|
+
frameSamples: 160,
|
|
2443
|
+
payloadType: 0
|
|
2444
|
+
};
|
|
2445
|
+
/** Opus: 48 kHz, 960 samples (20 ms), dynamic PT 111. */
|
|
2446
|
+
var AUDIO_CLOCK_OPUS = {
|
|
2447
|
+
codec: "opus",
|
|
2448
|
+
rateHz: 48e3,
|
|
2449
|
+
frameSamples: 960,
|
|
2450
|
+
payloadType: 111
|
|
2451
|
+
};
|
|
2452
|
+
/**
|
|
2453
|
+
* Select the audio clock for a negotiated sender mime type
|
|
2454
|
+
* (`audio/opus`, `audio/PCMU`, …). Anything not recognised as Opus falls back
|
|
2455
|
+
* to PCMU — the always-offered baseline codec — so an unexpected/absent mime
|
|
2456
|
+
* can never silently pick the wrong (48 kHz) clock for an 8 kHz track.
|
|
2457
|
+
*/
|
|
2458
|
+
function selectAudioClock(mimeType) {
|
|
2459
|
+
if (mimeType && /opus/i.test(mimeType)) return AUDIO_CLOCK_OPUS;
|
|
2460
|
+
return AUDIO_CLOCK_PCMU;
|
|
2461
|
+
}
|
|
2438
2462
|
//#endregion
|
|
2439
2463
|
//#region src/stream-broker/webrtc/session.ts
|
|
2440
2464
|
var _werift;
|
|
@@ -2873,6 +2897,8 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
2873
2897
|
*/
|
|
2874
2898
|
recordedAudioRebasePending = false;
|
|
2875
2899
|
recordedAudioTsOffset = 0;
|
|
2900
|
+
negotiatedAudioClock = null;
|
|
2901
|
+
opusSilenceFrame = null;
|
|
2876
2902
|
/** Client-created control data channel (recorded-playback protocol). */
|
|
2877
2903
|
controlChannel = null;
|
|
2878
2904
|
onControlMessageCb = null;
|
|
@@ -3231,6 +3257,12 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
3231
3257
|
codecs: {
|
|
3232
3258
|
video: this.sourceCodec === "H265" ? [h265Codec, h264Codec] : [h264Codec],
|
|
3233
3259
|
audio: [new werift.RTCRtpCodecParameters({
|
|
3260
|
+
mimeType: "audio/opus",
|
|
3261
|
+
clockRate: 48e3,
|
|
3262
|
+
payloadType: 111,
|
|
3263
|
+
channels: 2,
|
|
3264
|
+
parameters: "minptime=10;useinbandfec=1"
|
|
3265
|
+
}), new werift.RTCRtpCodecParameters({
|
|
3234
3266
|
mimeType: "audio/PCMU",
|
|
3235
3267
|
clockRate: 8e3,
|
|
3236
3268
|
payloadType: 0,
|
|
@@ -4208,7 +4240,7 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4208
4240
|
} else if (mediaFrame.type === "audio") {
|
|
4209
4241
|
const frame = mediaFrame.frame;
|
|
4210
4242
|
if (!this.audioSender) continue;
|
|
4211
|
-
const rtpTs = Math.floor(frame.timestampMicros *
|
|
4243
|
+
const rtpTs = Math.floor(frame.timestampMicros * this.audioClock().rateHz / 1e6) >>> 0;
|
|
4212
4244
|
this.recordAudioSourceLatency(frame.timestampMicros);
|
|
4213
4245
|
this.writeAudio(frame.data, rtpTs, frame.codec);
|
|
4214
4246
|
}
|
|
@@ -4327,7 +4359,7 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4327
4359
|
if (signal.aborted || this.closed) break;
|
|
4328
4360
|
if (mediaFrame.type === "audio") {
|
|
4329
4361
|
const frame = mediaFrame.frame;
|
|
4330
|
-
const rtpTs = Math.floor(frame.timestampMicros *
|
|
4362
|
+
const rtpTs = Math.floor(frame.timestampMicros * this.audioClock().rateHz / 1e6) >>> 0;
|
|
4331
4363
|
this.recordAudioSourceLatency(frame.timestampMicros);
|
|
4332
4364
|
this.writeAudio(frame.data, rtpTs, frame.codec);
|
|
4333
4365
|
}
|
|
@@ -4483,6 +4515,41 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4483
4515
|
}
|
|
4484
4516
|
}
|
|
4485
4517
|
/**
|
|
4518
|
+
* Send one recorded Opus (48 kHz) audio frame on the shared audio sender.
|
|
4519
|
+
* The Opus sibling of `writeRecordedAudio` — active ONLY while the live feed
|
|
4520
|
+
* is gated and the session negotiated Opus. Stored Opus AUs (post-A1 fMP4
|
|
4521
|
+
* fragments) are forwarded with NO transcode. Timestamp is software-rebased
|
|
4522
|
+
* to continue monotonically from the last sent audio packet across the
|
|
4523
|
+
* live→recorded switch, at the 48 kHz Opus clock (one 20 ms frame = 960
|
|
4524
|
+
* samples).
|
|
4525
|
+
*/
|
|
4526
|
+
writeRecordedAudioOpus(opus, rtpTs48k) {
|
|
4527
|
+
if (!this.audioSender || !_werift) return;
|
|
4528
|
+
if (!this.liveFeedGated) return;
|
|
4529
|
+
const werift = _werift;
|
|
4530
|
+
if (this.recordedAudioRebasePending) {
|
|
4531
|
+
this.recordedAudioRebasePending = false;
|
|
4532
|
+
this.recordedAudioTsOffset = (this.lastAudioRtpTs ?? 0) + AUDIO_CLOCK_OPUS.frameSamples - rtpTs48k | 0;
|
|
4533
|
+
}
|
|
4534
|
+
const outTs = rtpTs48k + this.recordedAudioTsOffset >>> 0;
|
|
4535
|
+
const pt = this.audioSender.codec?.payloadType ?? AUDIO_CLOCK_OPUS.payloadType;
|
|
4536
|
+
try {
|
|
4537
|
+
const header = new werift.RtpHeader();
|
|
4538
|
+
header.payloadType = pt;
|
|
4539
|
+
header.timestamp = outTs;
|
|
4540
|
+
header.marker = true;
|
|
4541
|
+
header.sequenceNumber = this.audioSeqNum = this.audioSeqNum + 1 & 65535;
|
|
4542
|
+
this.audioSender.sendRtp(new werift.RtpPacket(header, opus));
|
|
4543
|
+
this.lastAudioRtpTs = outTs;
|
|
4544
|
+
} catch (err) {
|
|
4545
|
+
this.logger.debug("recorded opus audio write error", { meta: {
|
|
4546
|
+
phase: "session",
|
|
4547
|
+
sessionId: this.sessionId,
|
|
4548
|
+
error: require_dist.errMsg(err)
|
|
4549
|
+
} });
|
|
4550
|
+
}
|
|
4551
|
+
}
|
|
4552
|
+
/**
|
|
4486
4553
|
* On a source switch, remap werift's sender offsets so the new source's first
|
|
4487
4554
|
* packet (seq/ts) continues seamlessly from the last sent packet. One-shot per
|
|
4488
4555
|
* switch (cleared after firing). No-op until a packet has actually been sent
|
|
@@ -4694,6 +4761,32 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4694
4761
|
}
|
|
4695
4762
|
}
|
|
4696
4763
|
}
|
|
4764
|
+
/**
|
|
4765
|
+
* The negotiated audio RTP clock (PCMU 8 kHz or Opus 48 kHz), resolved once
|
|
4766
|
+
* from the werift sender's bound codec and cached. Returns the PCMU baseline
|
|
4767
|
+
* (uncached) until the sender codec is bound, so an early call can't lock in
|
|
4768
|
+
* the wrong clock.
|
|
4769
|
+
*/
|
|
4770
|
+
audioClock() {
|
|
4771
|
+
if (this.negotiatedAudioClock) return this.negotiatedAudioClock;
|
|
4772
|
+
const mime = this.audioSender?.codec?.mimeType;
|
|
4773
|
+
if (!mime) return AUDIO_CLOCK_PCMU;
|
|
4774
|
+
const clock = selectAudioClock(mime);
|
|
4775
|
+
this.negotiatedAudioClock = clock;
|
|
4776
|
+
return clock;
|
|
4777
|
+
}
|
|
4778
|
+
/** True once the session has negotiated the Opus audio codec. */
|
|
4779
|
+
get isOpusAudio() {
|
|
4780
|
+
return this.audioClock().codec === "opus";
|
|
4781
|
+
}
|
|
4782
|
+
/**
|
|
4783
|
+
* Inject the canonical 20 ms Opus silence packet used for prestream A/V-sync
|
|
4784
|
+
* padding. Broker-provided (encoded via the audio-codec cap) because Opus has
|
|
4785
|
+
* no fixed silence byte the way PCMU does (0xFF).
|
|
4786
|
+
*/
|
|
4787
|
+
setOpusSilenceFrame(frame) {
|
|
4788
|
+
this.opusSilenceFrame = frame;
|
|
4789
|
+
}
|
|
4697
4790
|
writeAudio(data, rtpTs, codec) {
|
|
4698
4791
|
if (!this.audioSender || !_werift) return;
|
|
4699
4792
|
if (this.liveFeedGated) return;
|
|
@@ -4746,17 +4839,19 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4746
4839
|
if (!this.audioSender || !_werift) return;
|
|
4747
4840
|
const werift = _werift;
|
|
4748
4841
|
const nowMs = Date.now();
|
|
4842
|
+
const clock = this.audioClock();
|
|
4843
|
+
const silencePayload = clock.codec === "opus" ? this.opusSilenceFrame : Buffer.alloc(AdaptiveSession.PCMU_FRAME_SAMPLES, AdaptiveSession.PCMU_SILENCE_BYTE);
|
|
4844
|
+
if (!silencePayload) return;
|
|
4749
4845
|
const plan = planAudioSilencePadPackets({
|
|
4750
4846
|
nowMs,
|
|
4751
4847
|
firstVideoSendWallMs: this.firstVideoSendWallMs,
|
|
4752
|
-
framesizeSamples:
|
|
4753
|
-
rateHz:
|
|
4848
|
+
framesizeSamples: clock.frameSamples,
|
|
4849
|
+
rateHz: clock.rateHz,
|
|
4754
4850
|
maxPadMs: AdaptiveSession.AUDIO_SILENCE_MAX_PAD_MS,
|
|
4755
4851
|
realRtpTs,
|
|
4756
4852
|
audioSeqNum: this.audioSeqNum
|
|
4757
4853
|
});
|
|
4758
4854
|
if (plan.packets.length === 0) return;
|
|
4759
|
-
const silencePayload = Buffer.alloc(AdaptiveSession.PCMU_FRAME_SAMPLES, AdaptiveSession.PCMU_SILENCE_BYTE);
|
|
4760
4855
|
for (let i = 0; i < plan.packets.length; i++) {
|
|
4761
4856
|
const planned = plan.packets[i];
|
|
4762
4857
|
try {
|
|
@@ -4791,7 +4886,7 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4791
4886
|
gapMs: this.firstVideoSendWallMs === null ? null : nowMs - this.firstVideoSendWallMs,
|
|
4792
4887
|
firstSilenceRtpTs: plan.packets[0]?.rtpTs ?? null,
|
|
4793
4888
|
realRtpTs,
|
|
4794
|
-
frameSize:
|
|
4889
|
+
frameSize: clock.frameSamples
|
|
4795
4890
|
} });
|
|
4796
4891
|
}
|
|
4797
4892
|
startStatsCollection() {
|
|
@@ -4838,10 +4933,9 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4838
4933
|
});
|
|
4839
4934
|
this.emitAvSyncDiag();
|
|
4840
4935
|
}
|
|
4841
|
-
/**
|
|
4842
|
-
*
|
|
4936
|
+
/** Video RTP clock rate in Hz (audio rate now comes from `audioClock()`,
|
|
4937
|
+
* which follows the negotiated codec — PCMU 8 kHz / Opus 48 kHz). */
|
|
4843
4938
|
static VIDEO_RTP_CLOCK_HZ = 9e4;
|
|
4844
|
-
static PCMU_RTP_CLOCK_HZ = 8e3;
|
|
4845
4939
|
/**
|
|
4846
4940
|
* Emit the periodic "av-sync diag" log (debug only, ~every 3s) to gather the
|
|
4847
4941
|
* evidence for the steady "audio plays ~0.5s behind video" lag — WITHOUT
|
|
@@ -4857,7 +4951,7 @@ var AdaptiveSession = class AdaptiveSession {
|
|
|
4857
4951
|
emitAvSyncDiag() {
|
|
4858
4952
|
if (!this.debug) return;
|
|
4859
4953
|
const elapsedMs = Date.now() - this.createdAt;
|
|
4860
|
-
const audioRate =
|
|
4954
|
+
const audioRate = this.audioClock().rateHz;
|
|
4861
4955
|
const skew = computeAvSyncSkew({
|
|
4862
4956
|
video: this.lastVideoRtpTs === null || this.firstVideoRtpTs === null ? null : {
|
|
4863
4957
|
rtpTs: this.lastVideoRtpTs - this.firstVideoRtpTs >>> 0,
|
|
@@ -5825,6 +5919,21 @@ function appendAudioMediaBlock(videoSdp, audioBlock) {
|
|
|
5825
5919
|
*/
|
|
5826
5920
|
var LIVE_EDGE_MAX_SPAN_MS = 500;
|
|
5827
5921
|
/**
|
|
5922
|
+
* Defensive hard bound on the per-keyframe RTP/NAL cache (both the passthrough
|
|
5923
|
+
* `lastKeyframeRtpPackets` and the Annex-B `lastKeyframeNals`). A single
|
|
5924
|
+
* keyframe GOP is at most a few large NALs — well under a megabyte or two even
|
|
5925
|
+
* for 4K/8MP IDRs. Anything past this cap means the collection latch never
|
|
5926
|
+
* closed (an all-intra stream, or a stall right after an IDR before the first
|
|
5927
|
+
* P-frame), so the cache would otherwise grow without bound. That is the exact
|
|
5928
|
+
* structure that reached ~1.5 GB and OOM-killed the hub stream-broker runner
|
|
5929
|
+
* (heap snapshot: 1567 MB retained by `RtspRestreamer.lastKeyframeRtpPackets`).
|
|
5930
|
+
* On overflow we drop the partial cache and stop collecting until the next
|
|
5931
|
+
* clean GOP boundary; the live edge is unaffected — only the late-joiner
|
|
5932
|
+
* keyframe burst is skipped meanwhile.
|
|
5933
|
+
*/
|
|
5934
|
+
var MAX_KEYFRAME_CACHE_BYTES = 16 * 1024 * 1024;
|
|
5935
|
+
var CACHE_CAP_WARN_INTERVAL_MS = 3e4;
|
|
5936
|
+
/**
|
|
5828
5937
|
* Per-broker RTSP restreamer.
|
|
5829
5938
|
*
|
|
5830
5939
|
* Operates in two modes:
|
|
@@ -5857,6 +5966,7 @@ var RtspRestreamer = class {
|
|
|
5857
5966
|
egressAudioBlock = null;
|
|
5858
5967
|
/** Cached last keyframe NALs (SPS/PPS + IDR) for late-joining clients. */
|
|
5859
5968
|
lastKeyframeNals = [];
|
|
5969
|
+
lastKeyframeNalBytes = 0;
|
|
5860
5970
|
lastKeyframeTimestamp = 0;
|
|
5861
5971
|
/** True if we're currently accumulating a keyframe's NALs. */
|
|
5862
5972
|
collectingKeyframe = false;
|
|
@@ -5864,6 +5974,9 @@ var RtspRestreamer = class {
|
|
|
5864
5974
|
currentTimestamp = 0;
|
|
5865
5975
|
/** RTP passthrough: cached last keyframe RTP packets for late-joining clients. */
|
|
5866
5976
|
lastKeyframeRtpPackets = [];
|
|
5977
|
+
lastKeyframeRtpBytes = 0;
|
|
5978
|
+
/** Throttle for the defensive keyframe-cache overflow warning. */
|
|
5979
|
+
cacheCapWarnMs = 0;
|
|
5867
5980
|
/** True when in RTP passthrough mode (setCameraSdp was called). */
|
|
5868
5981
|
_rtpPassthroughMode = false;
|
|
5869
5982
|
/** Accumulating keyframe RTP packets in passthrough mode. */
|
|
@@ -5904,6 +6017,7 @@ var RtspRestreamer = class {
|
|
|
5904
6017
|
*/
|
|
5905
6018
|
resetStreamState() {
|
|
5906
6019
|
this.lastKeyframeNals = [];
|
|
6020
|
+
this.lastKeyframeNalBytes = 0;
|
|
5907
6021
|
this.lastKeyframeTimestamp = 0;
|
|
5908
6022
|
this.collectingKeyframe = false;
|
|
5909
6023
|
this.currentTimestamp = 0;
|
|
@@ -5914,11 +6028,29 @@ var RtspRestreamer = class {
|
|
|
5914
6028
|
this.deframer = null;
|
|
5915
6029
|
this.detectedCodec = null;
|
|
5916
6030
|
this.lastKeyframeRtpPackets = [];
|
|
6031
|
+
this.lastKeyframeRtpBytes = 0;
|
|
5917
6032
|
this._rtpPassthroughMode = false;
|
|
5918
6033
|
this.collectingKeyframeRtp = false;
|
|
5919
6034
|
this.egressAudioBlock = null;
|
|
5920
6035
|
}
|
|
5921
6036
|
/**
|
|
6037
|
+
* Enforce the defensive per-keyframe cache byte cap. Returns true when the
|
|
6038
|
+
* cap was exceeded (caller must have already reset the cache + collecting
|
|
6039
|
+
* flag). Warns at most once per {@link CACHE_CAP_WARN_INTERVAL_MS}.
|
|
6040
|
+
*/
|
|
6041
|
+
warnCacheCapExceeded(kind, bytes, packets) {
|
|
6042
|
+
const now = Date.now();
|
|
6043
|
+
if (now - this.cacheCapWarnMs < CACHE_CAP_WARN_INTERVAL_MS) return;
|
|
6044
|
+
this.cacheCapWarnMs = now;
|
|
6045
|
+
this.logger?.warn("keyframe cache exceeded defensive cap — dropping partial GOP", { meta: {
|
|
6046
|
+
streamName: this.streamName,
|
|
6047
|
+
kind,
|
|
6048
|
+
bytes,
|
|
6049
|
+
packets,
|
|
6050
|
+
capBytes: MAX_KEYFRAME_CACHE_BYTES
|
|
6051
|
+
} });
|
|
6052
|
+
}
|
|
6053
|
+
/**
|
|
5922
6054
|
* Graft (or clear) a transcode-egress audio track onto the push-mode SDP.
|
|
5923
6055
|
* Safe to call before or after the video codec params are detected — the SDP
|
|
5924
6056
|
* is recomposed whenever both are available.
|
|
@@ -5999,7 +6131,6 @@ var RtspRestreamer = class {
|
|
|
5999
6131
|
* @param isParameterSet True if this packet contains SPS/PPS/VPS
|
|
6000
6132
|
*/
|
|
6001
6133
|
pushRtpPassthrough(rtpData, isKeyframe, isParameterSet) {
|
|
6002
|
-
if (this.sessions.size === 0 && !isKeyframe && !isParameterSet) return;
|
|
6003
6134
|
const rtpPacket = {
|
|
6004
6135
|
data: rtpData,
|
|
6005
6136
|
marker: (rtpData[1] & 128) !== 0
|
|
@@ -6009,6 +6140,7 @@ var RtspRestreamer = class {
|
|
|
6009
6140
|
if (!this.collectingKeyframeRtp) {
|
|
6010
6141
|
this.collectingKeyframeRtp = true;
|
|
6011
6142
|
this.lastKeyframeRtpPackets = [];
|
|
6143
|
+
this.lastKeyframeRtpBytes = 0;
|
|
6012
6144
|
}
|
|
6013
6145
|
}
|
|
6014
6146
|
if (this.collectingKeyframeRtp) {
|
|
@@ -6016,7 +6148,14 @@ var RtspRestreamer = class {
|
|
|
6016
6148
|
data: Buffer.from(rtpData),
|
|
6017
6149
|
marker: rtpPacket.marker
|
|
6018
6150
|
});
|
|
6151
|
+
this.lastKeyframeRtpBytes += rtpData.length;
|
|
6019
6152
|
if (!isKeyframe && !isParameterSet) this.collectingKeyframeRtp = false;
|
|
6153
|
+
else if (this.lastKeyframeRtpBytes > MAX_KEYFRAME_CACHE_BYTES) {
|
|
6154
|
+
this.warnCacheCapExceeded("rtp", this.lastKeyframeRtpBytes, this.lastKeyframeRtpPackets.length);
|
|
6155
|
+
this.lastKeyframeRtpPackets = [];
|
|
6156
|
+
this.lastKeyframeRtpBytes = 0;
|
|
6157
|
+
this.collectingKeyframeRtp = false;
|
|
6158
|
+
}
|
|
6020
6159
|
}
|
|
6021
6160
|
if (this.sessions.size === 0) return;
|
|
6022
6161
|
this.servePendingSessionsRtp();
|
|
@@ -6129,12 +6268,20 @@ var RtspRestreamer = class {
|
|
|
6129
6268
|
if (!this.collectingKeyframe) {
|
|
6130
6269
|
this.collectingKeyframe = true;
|
|
6131
6270
|
this.lastKeyframeNals = [];
|
|
6271
|
+
this.lastKeyframeNalBytes = 0;
|
|
6132
6272
|
this.lastKeyframeTimestamp = this.currentTimestamp;
|
|
6133
6273
|
}
|
|
6134
6274
|
}
|
|
6135
6275
|
if (this.collectingKeyframe) {
|
|
6136
6276
|
this.lastKeyframeNals.push(Buffer.from(nal));
|
|
6277
|
+
this.lastKeyframeNalBytes += nal.length;
|
|
6137
6278
|
if (!isKeyframe && !this.isParameterSetNal(nal)) this.collectingKeyframe = false;
|
|
6279
|
+
else if (this.lastKeyframeNalBytes > MAX_KEYFRAME_CACHE_BYTES) {
|
|
6280
|
+
this.warnCacheCapExceeded("nal", this.lastKeyframeNalBytes, this.lastKeyframeNals.length);
|
|
6281
|
+
this.lastKeyframeNals = [];
|
|
6282
|
+
this.lastKeyframeNalBytes = 0;
|
|
6283
|
+
this.collectingKeyframe = false;
|
|
6284
|
+
}
|
|
6138
6285
|
}
|
|
6139
6286
|
if (this.sessions.size === 0) return;
|
|
6140
6287
|
if (!this.packetizer) return;
|
|
@@ -8893,13 +9040,13 @@ var AudioChunkPlane = class {
|
|
|
8893
9040
|
};
|
|
8894
9041
|
//#endregion
|
|
8895
9042
|
//#region src/stream-broker/stream-broker/audio-codec-session.ts
|
|
8896
|
-
var POLL_INTERVAL_MS = 40;
|
|
9043
|
+
var POLL_INTERVAL_MS$1 = 40;
|
|
8897
9044
|
var MAX_PCM_PER_POLL = 16;
|
|
8898
9045
|
var RTP_HEADER_LENGTH = 12;
|
|
8899
|
-
var WARN_THROTTLE_MS = 5e3;
|
|
8900
|
-
var SESSION_NOT_FOUND_RE = /decode session\b.*\bnot found\b/;
|
|
8901
|
-
function isSessionGone(err) {
|
|
8902
|
-
return SESSION_NOT_FOUND_RE.test(require_dist.errMsg(err));
|
|
9046
|
+
var WARN_THROTTLE_MS$1 = 5e3;
|
|
9047
|
+
var SESSION_NOT_FOUND_RE$1 = /decode session\b.*\bnot found\b/;
|
|
9048
|
+
function isSessionGone$1(err) {
|
|
9049
|
+
return SESSION_NOT_FOUND_RE$1.test(require_dist.errMsg(err));
|
|
8903
9050
|
}
|
|
8904
9051
|
var AudioCodecSession = class {
|
|
8905
9052
|
api;
|
|
@@ -9078,7 +9225,7 @@ var AudioCodecSession = class {
|
|
|
9078
9225
|
if (this.pollTimer || this.closed) return;
|
|
9079
9226
|
this.pollTimer = setInterval(() => {
|
|
9080
9227
|
this.pollOnce();
|
|
9081
|
-
}, POLL_INTERVAL_MS);
|
|
9228
|
+
}, POLL_INTERVAL_MS$1);
|
|
9082
9229
|
if (typeof this.pollTimer.unref === "function") this.pollTimer.unref();
|
|
9083
9230
|
}
|
|
9084
9231
|
async pollOnce() {
|
|
@@ -9093,7 +9240,7 @@ var AudioCodecSession = class {
|
|
|
9093
9240
|
});
|
|
9094
9241
|
for (const pcm of pcms) this.appendPcm(pcm);
|
|
9095
9242
|
} catch (err) {
|
|
9096
|
-
if (isSessionGone(err)) {
|
|
9243
|
+
if (isSessionGone$1(err)) {
|
|
9097
9244
|
this.handleSessionGone(sid);
|
|
9098
9245
|
return;
|
|
9099
9246
|
}
|
|
@@ -9139,7 +9286,7 @@ var AudioCodecSession = class {
|
|
|
9139
9286
|
this.warnThrottled("audio-codec: session reaped upstream — will re-create on next packet", `staleSessionId=${staleSid}`);
|
|
9140
9287
|
}
|
|
9141
9288
|
handlePushError(label, sid, err) {
|
|
9142
|
-
if (isSessionGone(err)) {
|
|
9289
|
+
if (isSessionGone$1(err)) {
|
|
9143
9290
|
this.handleSessionGone(sid);
|
|
9144
9291
|
return;
|
|
9145
9292
|
}
|
|
@@ -9155,7 +9302,7 @@ var AudioCodecSession = class {
|
|
|
9155
9302
|
const key = `${label}|${detail}`;
|
|
9156
9303
|
const now = Date.now();
|
|
9157
9304
|
const prev = this.warnState.get(key);
|
|
9158
|
-
if (prev && now - prev.lastLoggedAt < WARN_THROTTLE_MS) {
|
|
9305
|
+
if (prev && now - prev.lastLoggedAt < WARN_THROTTLE_MS$1) {
|
|
9159
9306
|
prev.suppressed++;
|
|
9160
9307
|
return;
|
|
9161
9308
|
}
|
|
@@ -10145,6 +10292,41 @@ function pcmToMulaw(pcm) {
|
|
|
10145
10292
|
for (let i = 0; i < pcm.length; i++) result[i] = linearToMulaw(pcm[i]);
|
|
10146
10293
|
return result;
|
|
10147
10294
|
}
|
|
10295
|
+
/** Decode a single µ-law byte back to a 16-bit signed PCM sample (ITU-T G.711). */
|
|
10296
|
+
function mulawToLinear(uVal) {
|
|
10297
|
+
const u = ~uVal & 255;
|
|
10298
|
+
let t = ((u & 15) << 3) + MULAW_BIAS;
|
|
10299
|
+
t <<= (u & 112) >> 4;
|
|
10300
|
+
return (u & 128) !== 0 ? MULAW_BIAS - t : t - MULAW_BIAS;
|
|
10301
|
+
}
|
|
10302
|
+
/**
|
|
10303
|
+
* Decode µ-law bytes to 16-bit signed PCM. The inverse of {@link pcmToMulaw};
|
|
10304
|
+
* used by the WebRTC Opus egress to turn the broker's native/companded G.711
|
|
10305
|
+
* audio back into PCM for the Opus encoder (source→PCM→Opus).
|
|
10306
|
+
*/
|
|
10307
|
+
function mulawToPcm(ulaw) {
|
|
10308
|
+
const out = new Int16Array(ulaw.length);
|
|
10309
|
+
for (let i = 0; i < ulaw.length; i++) out[i] = mulawToLinear(ulaw[i]);
|
|
10310
|
+
return out;
|
|
10311
|
+
}
|
|
10312
|
+
function alawToLinear(aVal) {
|
|
10313
|
+
let a = aVal ^ 85;
|
|
10314
|
+
let t = (a & 15) << 4;
|
|
10315
|
+
const seg = (a & 112) >> 4;
|
|
10316
|
+
if (seg === 0) t += 8;
|
|
10317
|
+
else if (seg === 1) t += 264;
|
|
10318
|
+
else {
|
|
10319
|
+
t += 264;
|
|
10320
|
+
t <<= seg - 1;
|
|
10321
|
+
}
|
|
10322
|
+
return (a & 128) !== 0 ? t : -t;
|
|
10323
|
+
}
|
|
10324
|
+
/** Decode A-law (PCMA) bytes to 16-bit signed PCM. */
|
|
10325
|
+
function alawToPcm(alaw) {
|
|
10326
|
+
const out = new Int16Array(alaw.length);
|
|
10327
|
+
for (let i = 0; i < alaw.length; i++) out[i] = alawToLinear(alaw[i]);
|
|
10328
|
+
return out;
|
|
10329
|
+
}
|
|
10148
10330
|
/**
|
|
10149
10331
|
* Downsample µ-law by picking every Nth sample. Used when source
|
|
10150
10332
|
* sample rate exceeds 8kHz (e.g. AAC at 16kHz → G.711 at 8kHz).
|
|
@@ -10157,138 +10339,429 @@ function downsampleUlaw(data, ratio) {
|
|
|
10157
10339
|
return result;
|
|
10158
10340
|
}
|
|
10159
10341
|
//#endregion
|
|
10160
|
-
//#region src/stream-broker/stream-broker/
|
|
10161
|
-
var
|
|
10162
|
-
|
|
10163
|
-
reconnecting: "AAAAAWdCwB/aAUAW7ARAAAADAEAAAAMAg8YMqAAAAAFozg/IAAABZYiEOiYoAAjgycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdgARwAaAfgvaKICMwoLAOgADxEIjArGFj0HzJsgAA2AHATLIAAMgBQE3ACIwbKGUWeUI9Xg4ABsAOAmWHAANgBwEyywADYAAgMGRwADYAAgMGQ4ABkAKAm4QAAYAHAq4HAAMgBQE3A4ABgAcCrn4/ABwjgGMCXnxbX/yxvWnTbBwke+QAqCJtK/C/ANHYwBiaibAhFAwNAYBETMKEp/DdMAAVluoAAgKyf8BWwZFmQC+raGBG1IAwEgPQdQ7AEAYHCVS5MuqyLBIm21NwPwEdMjMJ8h2KQPTQfEi5poyZEw/1NvqAA8ZCKyiNLHIZ6XyAADIAQDbgYAro/YCAZstAw/vNEAqAAIBiyrw4ABkAIBtzDgAGQAgG3B/4BjvB/2xbteXFxm4BcTAgkL5YdfLwCIgyByUFDRzz1eDr5YdfLLAANgACAwZHAANgACAwZyAACgAgCrmHAAKACAKufvZY7AA7AACAQAQPJEWx8kFDGRyZ/eABHf9E/EeMqpJFVe/gAeJVOoQrZdIPEev4AH8J5YVwwpkr3+37/+/wGgClGk1MvAN9VJ6BIUWVMODsABAPgACACEiJKqGeGhQqwRGuD0AAYoXqu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RLHYAEH1zdzf/gBMRiKyHMpRkqWH47AARBqhDjKTaFvcon/4AD5EY1QhM4voRkAAGgA4CJYAQtDIw6J8ppDx2AAiMyIBjO3ee9zH/+GBI/NvyAADQAcBEsADBYIweqs4k4sfgAIADAgkqwysyUKlCrRIqQ/wACEUSqy5aKeEb/0JWYE4gmijPjBpr7TQ78AAkQAAQEhUmDIwVtWD8meJumEurCowj2gJxHrWF5hvElDlMS7OasJqgA2Y5AHeoAAgKVzv/oNWfEBRXSABffbEAAE1AAEBS4wAAQAAEA24AE0TAihBEW1YKjTLkAAGgA4HS8fgAIGHBQoVzpjA7v1bsT4PxEgrgFIFpyZIAPcgPZk4xdCozhgB6De+qQEPg0EOzwYwJxxFVGfMGQfJFhwG0eU+Q8DSdo86EALwQR/bIyIDJXBFlFl4E3kNhenCVOaDsBQAIBAkmNOyGGSSVsAjkDV3wI6MjMEXMOhrAxpjMxp4ijbpzzSk+A87YQeoiABfu/sQpLw2zMgCE+/pUAntEGlsl0IgB+UAQBdCsHAQuUFDsqfjw6ZYdNVslPB2AAgYAfhIwvZMuvFIEKDvPyBwAKeiEp3qDIWsbh9ENEH5R+FmHPA0cqMNUxNgC/mp4bj7pbSXp9DEAiQUaWx2rYrlD3E2AIS++5yZmgmAw7d8BLALbDw8skKUFK/v1qEQbDgUp5QNIQAAbACAfcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeG+/367w3+/33+/37777799d99/v994b77799/v9dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeA=",
|
|
10164
|
-
|
|
10165
|
-
|
|
10166
|
-
|
|
10167
|
-
|
|
10168
|
-
},
|
|
10169
|
-
h265: {
|
|
10170
|
-
reconnecting: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLjAFwEgEQEADwDgDgDgDQDJdd4QDwCwCwCgCgCQCQCQCQCYNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAV0oBlPeTVLjjiybt/79hr8egLGkfgRr4BMQkiA4Kvw8jeWLF+WRCVyWx9qYu5G9T5CK0jQtgcXtpIjS8fOF3Fs7TooZzWpZ8ReTWIvMHVoz1Khj/MspUENld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",
|
|
10171
|
-
sleeping: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLjAFwEgEQEADwDgDgDgDQDFjo4wDgCwCwCgCgCQCQCQCQCYNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAnJVW/5yV+komUy56aphjzFvh52pfB2PTfCwCh7ggQKBSBYFGbEzvodhyojZdGeFaSykK9Ax2TQRMp4vmNtSZ21tm+X8AAJbdd/W7GfmdQAeYoPMrNuiQvN/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",
|
|
10172
|
-
offline: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLiwLgSAiBAB4DgHAOAaAyPGfQGALAWAoBQCQEgJASAmNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAnIRJY7mt6jxDg1ZAEbP7/LhpeVRCRSHYPE9hJm0I9bQrAjX0yu6L7lrKwJuj+U+EieuvMXkRVod2huH5MMqkgjezPIXhMMMbzPxp9/3NjL4R6GTuXhhGpNVRUatKyGtGQprE67mXeVeyt8q8XH55OXhBv4tDkapTnVztyP476G0CbTtwCKWm1coovmbCwsGoeuxe1KH1XPfGSpVvJgH0eKir9DUKGvaq38A+K4vCdrPnW9h2AIgZQrFMG5esP5M5Vj+RViJ4rcaYrxWVJKxyOBSOjLp6asU5sEWJAjP0CgnmWFIIYk5t2zZ2KhVPRpZS2kZwJK+3NeZ9kVSFWLkmyzQtyHQl8Ucj2Qow+3sBQdhZKdqVYVJVVwTt/s/IObzDjXLhsl9qkhIpu1hikB7vq9GZzw/NJumDCpYEInYS9ZjrHx2jmMk0QXSKkQwL2RsB9I2l7bz6z5L1NT98KZZF4sTRSGmMlivbyZ6QH2AARLMbZsL9jTxFXmaSSc5pg1FlgnRRlrEqSt3S44/VRE6LcU54L45c/EJERdNI0lAT5iAga8pllYNnCugL/iwnq0lrXn+6HpHCRx2ajLvmql6dkwKGaZn1HSeHAUhn8rCMlgMxBIR5a4Qgehe/I8rWdm8cuZE+WzQHumkeUjfvLw5E31mquqpttU5jt1ADcJI3p//dEp0KJHGJ2wDkMeCzn9I+pOF8+hZI/LRnP8YiGf6oZuABjwZnG6hnjWnoq1wIB+/tQ7c5K6JESHleEBruHbZrCsW876YwkveQTUPVpWe/XuzgiZaJWDrWd6edJ/6Z4mcIVSTeqAV0gPOeeFlgEYI6cAB78bESFgmNZTukgcfdEw5rxFwECmrf98AabHx28Daoh6o1eP/iU0MEx+0lfwtn62vvLrkJr6LdqppJ/V4uthU+zSDDntLN3wOfBbSIBAXheiqHz9TB0PLj0IMQAcJFKvsGo1WIw9QO7tp/Fd6bENcv9tPTqJI08/spfWrW/0TE/MjfEN5FI7WN6jTWU7YiDaEJfBKSBQw2yQobgCB9hA2Hl+qG88UZhAg5oq1DfkvQyqGvDUjKT4RZim5X96qCV7rA+cHQbHM/dXNaWbv7Lncbm0+4wJ9E/VuB161yenwEq6JVlJpXEpZ4/D+cqmG9jf3ZPBBXvpzjoJR/As59Ju+izJ7rHmT2Gzwj6RsgBtYN6ljCTSxeTv6+RkWH8gjUq1BZPKbZQuSwrMpiVzy869A4FtxbTHDYig1FRfZtufurQyp7EVkIv1YRrQt9CQvdQnehenXY84QdXD3VA0X3P08Wj0oMK450ODnAIaGKgHM3z7zFBzJmZ4D+XC1owLRQ0Zj4AjPztk0HGezZczdyHnkQto7mkLcoGTDK3CATzvt8GNXOptD4/nV4M9E+jbvwWpOFViuWr+AqRwZZ8uC+1or4+3EZ2Vrvwg4AKB5PWsR+0lkUFWiLnkMyagxv8aU2+b/Cti0KlOUys0h1KactAoSxwN/JX0D7HnwTV96KAAAAwCmgAAAAwAD/BQmkkSAIeH2QL4F/A6HctVCKGX8yMdMaxWTbi3QOpN4Alk9HT68HOZZgaitJoPjH+HZc6411cnVrqfm9Iaio91UDA0UGzBk66tFpYSgBjNxkHN4cYfiwGvdz7XviLZ8O/doO+VIfXSRLBzypg46GnIJ/iGll8gtiV6ax3vU1yktNzcqMKzD9V8I1N+2yedgAM5M5BmZLSdVI9Tqn1CtDLReN6032lEHUdP0bWOOFwsuqiuBKESunznZIwiFJtuajlou+N4mSpHy0SlnJRRZTmHPdlJO3laXfzLuSiqAU4OZiJbOFPhg2DwnP+vKIHwIPGZSWW9NqqH3ZdEAaMjYbIa1vEJ0DJV+NuCr5xAmV3tILbuFFEwUCcJdbiRRAMtR1JxQ2JUlEN9L/RuBBx5bQZdd7QJhiYKNw/ssyKrDPAkyoSfGy7YR6ki6Nj3FCVNeyL3FDjvZ52487UGX5U8gP4uBp5E2r/hZyh0++PQtzgL2XbaUEw65Ztry7AQmeZo43NHtNX0juv0qLk90iAkKLgebAQS0RTWb4epVN47jXXMGWoDvTnQchHQsgXD67fj85ol2cvZm9dIv5cuX8nG3+3eRV4otZUTNr0JdaQO8+KCLlO5RM8hSavTSZ39LvLj8WdK96/B1D9RU7zaEDEamMceo9pgX44L+dwwjprLTVbTae5zSe8d3ielSzh77uhuzkqm42ZcPAOOVAPR5xjN6Ha4PPr4u5me1ioZS5iIw+uFOBFUKbex+iI/AK1q3vQFSIZ0g0HIQWXLFqInWc6bqE3lzCw4Cddnri6Znt8AdZScPqX7e/F2mUhMnCtJaOWgITt1f9bkUFnkiW+E1ZAAc+0wCmDP7I6+6nmgPjZXHOJq+Gfo5yHyOBFMoNjXJN0fZ7p4tQYIR3UgocweENGz1gLn1Pk4HodRvgNXy5YdxRIRyhqa5OL+BTCoML8oDXy9wed42esjF56MDhO2Kf0wpYoT4bNpbFoYsY7qxtF+omIMhXqS8I+PSsMh0Woo13avSa7OCo3WkTrspLvnuH7rhbVDgXS6nQPJodXz/7GA0xr9Ub1NZkJSNxKQQMi/e+Bj6XuDVH2lXa9h9TtRAlh9srl3rVItUnP227ZOHq6trhyUlLnTFlnroyDEZWYJd95sGQQAsD0kmHlfqXPR7PvtKoH1iuHKaSTLMmBE26TsrmB5ZBhc10GEH8at9RuaYxB1F//vNyhZQL5BHENtNa5akA9Wz6MxFAOs1Ab5suoLUxAvxIkXEmrrNEKlsg+jIfWLqFQM6PBMRyvmhH0vvkOtxlV9WlaqPvMhzJoXQY9K2xSxsYXkDbsugNXg8Ll7zDPW31e2gQUZimo4tFsJHa1MocIt5q1COaYN5wz9pKsE4aMBy0JsqLvr7/C/8JRPwhnh2YsatfbQkhW0XYrG6XdUN5+cARZeE3htgV7M4ZZvHH9Uq7JYrJmdJmspKxEBWAjtHg0HgME5a0nult4pUYId35Huitxo/JektWcz63gJzSu1h7opGDVUwhm0fp8nFoFgprwp1OKjTBzo/j2+Rr8dWKQNovcrNLJ8f+nkM/UTpejJwirJckIyOKzhtmhhug1wU2G/2mNaF30ZdTBp/H9p1+d8hASZfNeto3JmNZSrsoPFFZlfYNN9+KHxNSyNMlDxABkFzl7wN1rDrnt9n+A+raSJqVZT/xeFpief4TbTJr42q/5X/SpHcZrf5YQs0jR0Mvua8BvheJzjTdDQuuwJzuySbnJ8cyafEJNf9xKvhgoAzohE7DxXlC4vlUFsVOvYqh0aBwJXHAQSQHDTMA/4LIle0cJ59iYwGPbR7c+oi3T58YJ1VyBpwJ2gekbLGFnUHA8cVAUB8I4wcDHV/jdjErT/aSrIefqCKMJmEqazX5Z0PecB+sM0C7gBzsN86VU0IyILMTSEJuWgQFQuIfrCIdzApSF5hGM511/bNlNYlyiXAyBJDB+P2ogCucX2SfBR8moHx0EB5YumzDw54TwjUMvgSX+LyK0HWETf5Wrl1y7QS3WakcKshxUBsTx5KP//iLpWgj2tdTTZFgDDGahR/I1lCA8JqSzWmObHQlm3mSm2dDtXvzXo6rA8wCW6w7UiMx20nx/bxXbKoRu+ecHCQ+T4chv2Ko+Se4QCceUigLhDty8jdZsD8Z8u31mSP6wjLjwdIeymOSqmjk9QrkiybypmIrm7bMUA/oAAAAwAvnIinFF4ABwwAAAMAAAMAAAMAK2AAAAMAAAMAAAMAf4AAAAMAAAMAAAMBYwAAAwAAAwAAAwOyAAADAAADAAAG5AAAAwAAAwAADhgAAAMAAAMAABjQAAADAAADAAApIAAAAwAAAwAAPOCHAAADAAADAAADAAADAAADAAADAWk=",
|
|
10173
|
-
disabled: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLjAFwEgEQEADwDgDgDgDQDFlYmgDACwCwCgCgCQCQCQCQCYNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAnJXh0f6dh91ZYSfYA2WZGi8L4B4Km93Ubr5/EFPTj6FOBGEL/s1k6y5ZvJx9Rlg/VUGc79Ok5oWDJetrtsLEUH4QjulhGTw2WWHi1fKx08W4ltGWipQDk4q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",
|
|
10174
|
-
waking: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLiwLgSAiBAB4DgHAOAaAyfX/AGgLAWAoBQCQEgJASAmNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAMsbsDkcoZgDIVg0QtuHSsRxkPs93x2tkl6E1gXx0vsrK+j+vQJ0cELr/DHTvsNk9haL5Nc9sUfbRjjmhBTJTjTszXpCeksgb575CVY08mk/BPfZmrL7JLcxTIpD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"
|
|
10175
|
-
}
|
|
10176
|
-
};
|
|
10177
|
-
var cache = {};
|
|
10178
|
-
/**
|
|
10179
|
-
* Get the pre-encoded placeholder frame for `(kind, codec)`. Buffer
|
|
10180
|
-
* is created once on first use per (codec, kind) pair and cached
|
|
10181
|
-
* permanently — safe to call from hot paths (~5-9KB per pair, ~60KB
|
|
10182
|
-
* worst-case across both codecs and all five states).
|
|
10183
|
-
*/
|
|
10184
|
-
function getPlaceholderFrame(kind, codec) {
|
|
10185
|
-
const codecCache = cache[codec] ?? (cache[codec] = {});
|
|
10186
|
-
const cached = codecCache[kind];
|
|
10187
|
-
if (cached) return cached;
|
|
10188
|
-
const buf = Buffer.from(FRAME_B64[codec][kind], "base64");
|
|
10189
|
-
codecCache[kind] = buf;
|
|
10190
|
-
return buf;
|
|
10342
|
+
//#region src/stream-broker/stream-broker/opus-encode-session.ts
|
|
10343
|
+
var POLL_INTERVAL_MS = 40;
|
|
10344
|
+
var MAX_ENCODED_PER_POLL = 16;
|
|
10345
|
+
var WARN_THROTTLE_MS = 5e3;
|
|
10346
|
+
var OPUS_CODEC = "opus";
|
|
10347
|
+
var SESSION_NOT_FOUND_RE = /encode session\b.*\bnot found\b/;
|
|
10348
|
+
function isSessionGone(err) {
|
|
10349
|
+
return SESSION_NOT_FOUND_RE.test(require_dist.errMsg(err));
|
|
10191
10350
|
}
|
|
10192
|
-
|
|
10193
|
-
|
|
10194
|
-
|
|
10195
|
-
|
|
10196
|
-
* (H.264/H.265 Annex-B) to all connected clients.
|
|
10197
|
-
*
|
|
10198
|
-
* Each StreamBroker owns one StreamPipeServer. Restreamers (e.g. go2rtc)
|
|
10199
|
-
* connect via `tcp://127.0.0.1:{port}` and receive the same byte stream
|
|
10200
|
-
* that the broker reads from the camera, eliminating duplicate RTSP
|
|
10201
|
-
* connections.
|
|
10202
|
-
*/
|
|
10203
|
-
/** Max bytes queued in a client's write buffer before we consider it too slow */
|
|
10204
|
-
var MAX_WRITE_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
10205
|
-
var StreamPipeServer = class {
|
|
10206
|
-
server;
|
|
10207
|
-
clients = /* @__PURE__ */ new Set();
|
|
10208
|
-
port = 0;
|
|
10209
|
-
started = false;
|
|
10351
|
+
var OpusEncodeSession = class {
|
|
10352
|
+
api;
|
|
10353
|
+
cfg;
|
|
10354
|
+
emit;
|
|
10210
10355
|
logger;
|
|
10211
|
-
|
|
10212
|
-
|
|
10213
|
-
|
|
10214
|
-
|
|
10215
|
-
|
|
10216
|
-
|
|
10356
|
+
sessionId = null;
|
|
10357
|
+
sessionNodeId = null;
|
|
10358
|
+
creating = null;
|
|
10359
|
+
pollTimer = null;
|
|
10360
|
+
closed = false;
|
|
10361
|
+
chunksIn = 0;
|
|
10362
|
+
chunksDropped = 0;
|
|
10363
|
+
warnState = /* @__PURE__ */ new Map();
|
|
10364
|
+
constructor(api, cfg, emit, logger) {
|
|
10365
|
+
this.api = api;
|
|
10366
|
+
this.cfg = cfg;
|
|
10367
|
+
this.emit = emit;
|
|
10217
10368
|
this.logger = logger;
|
|
10218
|
-
this.server = node_net.default.createServer((socket) => {
|
|
10219
|
-
this.handleConnection(socket);
|
|
10220
|
-
});
|
|
10221
|
-
this.server.on("error", (err) => {
|
|
10222
|
-
this.logger?.error("StreamPipeServer error", { meta: { error: err.message } });
|
|
10223
|
-
});
|
|
10224
10369
|
}
|
|
10225
|
-
|
|
10226
|
-
|
|
10227
|
-
|
|
10228
|
-
|
|
10229
|
-
|
|
10230
|
-
|
|
10231
|
-
|
|
10232
|
-
|
|
10233
|
-
|
|
10234
|
-
|
|
10235
|
-
|
|
10370
|
+
/**
|
|
10371
|
+
* Push one decoded PCM chunk. The session is created lazily on the first
|
|
10372
|
+
* push; the poll loop then drains Opus frames back out via `emit`.
|
|
10373
|
+
* `pts` is source-relative ms (falls back to the chunk timestamp).
|
|
10374
|
+
*/
|
|
10375
|
+
pushPcm(chunk) {
|
|
10376
|
+
if (this.closed) return;
|
|
10377
|
+
if (chunk.data.byteLength === 0) return;
|
|
10378
|
+
this.chunksIn++;
|
|
10379
|
+
const data = Uint8Array.from(chunk.data);
|
|
10380
|
+
const pts = chunk.timestamp;
|
|
10381
|
+
this.ensureSession().then((sid) => {
|
|
10382
|
+
if (!sid || this.closed) return;
|
|
10383
|
+
const nodeId = this.sessionNodeId ?? void 0;
|
|
10384
|
+
this.api.pushPcm({
|
|
10385
|
+
sessionId: sid,
|
|
10386
|
+
...nodeId ? { nodeId } : {},
|
|
10387
|
+
data,
|
|
10388
|
+
pts
|
|
10389
|
+
}).catch((err) => {
|
|
10390
|
+
this.chunksDropped++;
|
|
10391
|
+
this.handlePushError("opus-encode: pushPcm failed", sid, err);
|
|
10236
10392
|
});
|
|
10237
10393
|
});
|
|
10238
10394
|
}
|
|
10395
|
+
getStats() {
|
|
10396
|
+
return {
|
|
10397
|
+
chunksIn: this.chunksIn,
|
|
10398
|
+
chunksDropped: this.chunksDropped,
|
|
10399
|
+
sessionId: this.sessionId
|
|
10400
|
+
};
|
|
10401
|
+
}
|
|
10239
10402
|
/**
|
|
10240
|
-
*
|
|
10241
|
-
*
|
|
10403
|
+
* Release the upstream encode session + poll loop WITHOUT closing the handle
|
|
10404
|
+
* (demand-gate: no Opus consumer ⇒ the encoder is pure waste). Reusable — the
|
|
10405
|
+
* next `pushPcm` re-creates the session. Mirrors the decode client's `idle`.
|
|
10242
10406
|
*/
|
|
10243
|
-
|
|
10244
|
-
|
|
10245
|
-
|
|
10246
|
-
|
|
10247
|
-
|
|
10248
|
-
|
|
10249
|
-
|
|
10250
|
-
|
|
10251
|
-
|
|
10252
|
-
|
|
10253
|
-
|
|
10254
|
-
|
|
10255
|
-
|
|
10256
|
-
|
|
10257
|
-
|
|
10258
|
-
|
|
10407
|
+
async idle() {
|
|
10408
|
+
if (this.closed) return;
|
|
10409
|
+
if (this.creating) await this.creating;
|
|
10410
|
+
if (this.closed) return;
|
|
10411
|
+
if (this.pollTimer) {
|
|
10412
|
+
clearInterval(this.pollTimer);
|
|
10413
|
+
this.pollTimer = null;
|
|
10414
|
+
}
|
|
10415
|
+
if (!this.sessionId) return;
|
|
10416
|
+
const sid = this.sessionId;
|
|
10417
|
+
const nodeId = this.sessionNodeId ?? void 0;
|
|
10418
|
+
this.sessionId = null;
|
|
10419
|
+
this.sessionNodeId = null;
|
|
10420
|
+
try {
|
|
10421
|
+
await this.api.closeSession({
|
|
10422
|
+
sessionId: sid,
|
|
10423
|
+
...nodeId ? { nodeId } : {}
|
|
10259
10424
|
});
|
|
10425
|
+
} catch (err) {
|
|
10426
|
+
this.logger?.warn("opus-encode: idle closeSession failed", { meta: { error: require_dist.errMsg(err) } });
|
|
10260
10427
|
}
|
|
10428
|
+
this.logger?.info("opus-encode: encode session idled (no opus consumer)", { meta: { sessionId: sid } });
|
|
10261
10429
|
}
|
|
10262
|
-
|
|
10263
|
-
|
|
10264
|
-
|
|
10265
|
-
|
|
10266
|
-
|
|
10267
|
-
|
|
10268
|
-
|
|
10269
|
-
|
|
10270
|
-
|
|
10271
|
-
|
|
10272
|
-
|
|
10273
|
-
|
|
10274
|
-
|
|
10275
|
-
|
|
10276
|
-
this.started = false;
|
|
10277
|
-
this._onClientCountChanged = null;
|
|
10278
|
-
for (const client of this.clients) client.destroy();
|
|
10279
|
-
this.clients.clear();
|
|
10280
|
-
await new Promise((resolve) => {
|
|
10281
|
-
this.server.close(() => {
|
|
10282
|
-
this.logger?.debug("StreamPipeServer stopped");
|
|
10283
|
-
resolve();
|
|
10430
|
+
async close() {
|
|
10431
|
+
if (this.closed) return;
|
|
10432
|
+
this.closed = true;
|
|
10433
|
+
if (this.pollTimer) {
|
|
10434
|
+
clearInterval(this.pollTimer);
|
|
10435
|
+
this.pollTimer = null;
|
|
10436
|
+
}
|
|
10437
|
+
if (!this.sessionId) return;
|
|
10438
|
+
const sid = this.sessionId;
|
|
10439
|
+
const nodeId = this.sessionNodeId ?? void 0;
|
|
10440
|
+
try {
|
|
10441
|
+
const tail = await this.api.flushEncode({
|
|
10442
|
+
sessionId: sid,
|
|
10443
|
+
...nodeId ? { nodeId } : {}
|
|
10284
10444
|
});
|
|
10285
|
-
|
|
10445
|
+
for (const enc of tail) this.emitEncoded(enc);
|
|
10446
|
+
} catch (err) {
|
|
10447
|
+
if (!isSessionGone(err)) this.warnThrottled("opus-encode: flushEncode failed", require_dist.errMsg(err));
|
|
10448
|
+
}
|
|
10449
|
+
try {
|
|
10450
|
+
await this.api.closeSession({
|
|
10451
|
+
sessionId: sid,
|
|
10452
|
+
...nodeId ? { nodeId } : {}
|
|
10453
|
+
});
|
|
10454
|
+
} catch (err) {
|
|
10455
|
+
this.logger?.warn("opus-encode: closeSession failed", { meta: { error: require_dist.errMsg(err) } });
|
|
10456
|
+
}
|
|
10457
|
+
this.sessionId = null;
|
|
10458
|
+
this.sessionNodeId = null;
|
|
10286
10459
|
}
|
|
10287
|
-
|
|
10288
|
-
this.
|
|
10289
|
-
this.
|
|
10290
|
-
this.
|
|
10291
|
-
|
|
10460
|
+
async ensureSession() {
|
|
10461
|
+
if (this.sessionId) return this.sessionId;
|
|
10462
|
+
if (this.creating) return this.creating;
|
|
10463
|
+
this.creating = (async () => {
|
|
10464
|
+
try {
|
|
10465
|
+
const res = await this.api.createEncodeSession({
|
|
10466
|
+
codec: OPUS_CODEC,
|
|
10467
|
+
sourceSampleRate: this.cfg.sourceSampleRate,
|
|
10468
|
+
sourceChannels: this.cfg.sourceChannels,
|
|
10469
|
+
...this.cfg.sourceFormat ? { sourceFormat: this.cfg.sourceFormat } : {},
|
|
10470
|
+
targetSampleRate: this.cfg.targetSampleRate,
|
|
10471
|
+
targetChannels: this.cfg.targetChannels,
|
|
10472
|
+
...this.cfg.bitrateKbps ? { bitrateKbps: this.cfg.bitrateKbps } : {},
|
|
10473
|
+
...this.cfg.tag ? { tag: this.cfg.tag } : {}
|
|
10474
|
+
});
|
|
10475
|
+
if (this.closed) {
|
|
10476
|
+
try {
|
|
10477
|
+
await this.api.closeSession({
|
|
10478
|
+
sessionId: res.sessionId,
|
|
10479
|
+
...res.nodeId ? { nodeId: res.nodeId } : {}
|
|
10480
|
+
});
|
|
10481
|
+
} catch (err) {
|
|
10482
|
+
this.logger?.warn("opus-encode: closeSession (closed mid-create) failed", { meta: { error: require_dist.errMsg(err) } });
|
|
10483
|
+
}
|
|
10484
|
+
return null;
|
|
10485
|
+
}
|
|
10486
|
+
this.sessionId = res.sessionId;
|
|
10487
|
+
this.sessionNodeId = res.nodeId;
|
|
10488
|
+
this.startPollLoop();
|
|
10489
|
+
this.logger?.info("opus-encode: encode session ready", { meta: {
|
|
10490
|
+
sessionId: res.sessionId,
|
|
10491
|
+
nodeId: res.nodeId,
|
|
10492
|
+
source: `${this.cfg.sourceSampleRate}Hz×${this.cfg.sourceChannels}`,
|
|
10493
|
+
target: `${this.cfg.targetSampleRate}Hz×${this.cfg.targetChannels} opus`
|
|
10494
|
+
} });
|
|
10495
|
+
return res.sessionId;
|
|
10496
|
+
} catch (err) {
|
|
10497
|
+
this.logger?.error("opus-encode: createEncodeSession failed", { meta: { error: require_dist.errMsg(err) } });
|
|
10498
|
+
return null;
|
|
10499
|
+
} finally {
|
|
10500
|
+
this.creating = null;
|
|
10501
|
+
}
|
|
10502
|
+
})();
|
|
10503
|
+
return this.creating;
|
|
10504
|
+
}
|
|
10505
|
+
startPollLoop() {
|
|
10506
|
+
if (this.pollTimer || this.closed) return;
|
|
10507
|
+
this.pollTimer = setInterval(() => {
|
|
10508
|
+
this.pollOnce();
|
|
10509
|
+
}, POLL_INTERVAL_MS);
|
|
10510
|
+
if (typeof this.pollTimer.unref === "function") this.pollTimer.unref();
|
|
10511
|
+
}
|
|
10512
|
+
async pollOnce() {
|
|
10513
|
+
const sid = this.sessionId;
|
|
10514
|
+
if (!sid || this.closed) return;
|
|
10515
|
+
const nodeId = this.sessionNodeId ?? void 0;
|
|
10516
|
+
try {
|
|
10517
|
+
const encoded = await this.api.pullEncoded({
|
|
10518
|
+
sessionId: sid,
|
|
10519
|
+
...nodeId ? { nodeId } : {},
|
|
10520
|
+
maxCount: MAX_ENCODED_PER_POLL
|
|
10521
|
+
});
|
|
10522
|
+
for (const enc of encoded) this.emitEncoded(enc);
|
|
10523
|
+
} catch (err) {
|
|
10524
|
+
if (isSessionGone(err)) {
|
|
10525
|
+
this.handleSessionGone(sid);
|
|
10526
|
+
return;
|
|
10527
|
+
}
|
|
10528
|
+
this.warnThrottled("opus-encode: pullEncoded failed", require_dist.errMsg(err));
|
|
10529
|
+
}
|
|
10530
|
+
}
|
|
10531
|
+
emitEncoded(enc) {
|
|
10532
|
+
if (enc.data.byteLength === 0) return;
|
|
10533
|
+
this.emit({
|
|
10534
|
+
data: Buffer.from(enc.data),
|
|
10535
|
+
ptsMs: enc.pts
|
|
10536
|
+
});
|
|
10537
|
+
}
|
|
10538
|
+
handleSessionGone(staleSid) {
|
|
10539
|
+
if (this.sessionId !== staleSid) return;
|
|
10540
|
+
this.sessionId = null;
|
|
10541
|
+
this.sessionNodeId = null;
|
|
10542
|
+
if (this.pollTimer) {
|
|
10543
|
+
clearInterval(this.pollTimer);
|
|
10544
|
+
this.pollTimer = null;
|
|
10545
|
+
}
|
|
10546
|
+
this.warnThrottled("opus-encode: session reaped upstream — will re-create on next chunk", `staleSessionId=${staleSid}`);
|
|
10547
|
+
}
|
|
10548
|
+
handlePushError(label, sid, err) {
|
|
10549
|
+
if (isSessionGone(err)) {
|
|
10550
|
+
this.handleSessionGone(sid);
|
|
10551
|
+
return;
|
|
10552
|
+
}
|
|
10553
|
+
this.warnThrottled(label, require_dist.errMsg(err));
|
|
10554
|
+
}
|
|
10555
|
+
warnThrottled(label, detail) {
|
|
10556
|
+
const key = `${label}|${detail}`;
|
|
10557
|
+
const now = Date.now();
|
|
10558
|
+
const prev = this.warnState.get(key);
|
|
10559
|
+
if (prev && now - prev.lastLoggedAt < WARN_THROTTLE_MS) {
|
|
10560
|
+
prev.suppressed++;
|
|
10561
|
+
return;
|
|
10562
|
+
}
|
|
10563
|
+
const suppressed = prev?.suppressed ?? 0;
|
|
10564
|
+
this.warnState.set(key, {
|
|
10565
|
+
lastLoggedAt: now,
|
|
10566
|
+
suppressed: 0
|
|
10567
|
+
});
|
|
10568
|
+
this.logger?.warn(label, { meta: {
|
|
10569
|
+
error: detail,
|
|
10570
|
+
...suppressed > 0 ? { suppressedSinceLastLog: suppressed } : {}
|
|
10571
|
+
} });
|
|
10572
|
+
}
|
|
10573
|
+
};
|
|
10574
|
+
var OPUS_SILENCE_RATE_HZ = 48e3;
|
|
10575
|
+
var OPUS_SILENCE_FRAME_SAMPLES = 960;
|
|
10576
|
+
var OPUS_SILENCE_PRIME_FRAMES = 6;
|
|
10577
|
+
/**
|
|
10578
|
+
* Produce ONE canonical 20 ms Opus silence packet by encoding PCM zeros through
|
|
10579
|
+
* the audio-codec cap, for the WebRTC session's prestream A/V-sync padding
|
|
10580
|
+
* (Opus has no fixed "silence byte" like PCMU's 0xFF — silence must be encoded).
|
|
10581
|
+
* A short-lived encode session is created, primed with a few zero frames, and
|
|
10582
|
+
* flushed; the LAST steady-state frame is returned. Returns `null` when the cap
|
|
10583
|
+
* is unavailable or yields nothing so the caller can skip prestream padding.
|
|
10584
|
+
*/
|
|
10585
|
+
async function encodeOpusSilenceFrame(api, cfg) {
|
|
10586
|
+
let sessionId = null;
|
|
10587
|
+
let nodeId;
|
|
10588
|
+
try {
|
|
10589
|
+
const res = await api.createEncodeSession({
|
|
10590
|
+
codec: OPUS_CODEC,
|
|
10591
|
+
sourceSampleRate: OPUS_SILENCE_RATE_HZ,
|
|
10592
|
+
sourceChannels: cfg.channels,
|
|
10593
|
+
sourceFormat: "f32le",
|
|
10594
|
+
targetSampleRate: OPUS_SILENCE_RATE_HZ,
|
|
10595
|
+
targetChannels: cfg.channels,
|
|
10596
|
+
...cfg.bitrateKbps ? { bitrateKbps: cfg.bitrateKbps } : {},
|
|
10597
|
+
tag: "opus-silence"
|
|
10598
|
+
});
|
|
10599
|
+
sessionId = res.sessionId;
|
|
10600
|
+
nodeId = res.nodeId;
|
|
10601
|
+
const zeros = Buffer.alloc(OPUS_SILENCE_FRAME_SAMPLES * cfg.channels * 4);
|
|
10602
|
+
const collected = [];
|
|
10603
|
+
for (let i = 0; i < OPUS_SILENCE_PRIME_FRAMES; i++) {
|
|
10604
|
+
await api.pushPcm({
|
|
10605
|
+
sessionId,
|
|
10606
|
+
...nodeId ? { nodeId } : {},
|
|
10607
|
+
data: zeros,
|
|
10608
|
+
pts: i * 20
|
|
10609
|
+
});
|
|
10610
|
+
const out = await api.pullEncoded({
|
|
10611
|
+
sessionId,
|
|
10612
|
+
...nodeId ? { nodeId } : {},
|
|
10613
|
+
maxCount: 8
|
|
10614
|
+
});
|
|
10615
|
+
for (const e of out) if (e.data.byteLength > 0) collected.push(Buffer.from(e.data));
|
|
10616
|
+
}
|
|
10617
|
+
const tail = await api.flushEncode({
|
|
10618
|
+
sessionId,
|
|
10619
|
+
...nodeId ? { nodeId } : {}
|
|
10620
|
+
});
|
|
10621
|
+
for (const e of tail) if (e.data.byteLength > 0) collected.push(Buffer.from(e.data));
|
|
10622
|
+
return collected.length > 0 ? collected[collected.length - 1] : null;
|
|
10623
|
+
} catch {
|
|
10624
|
+
return null;
|
|
10625
|
+
} finally {
|
|
10626
|
+
if (sessionId) await api.closeSession({
|
|
10627
|
+
sessionId,
|
|
10628
|
+
...nodeId ? { nodeId } : {}
|
|
10629
|
+
}).catch(() => {});
|
|
10630
|
+
}
|
|
10631
|
+
}
|
|
10632
|
+
//#endregion
|
|
10633
|
+
//#region src/stream-broker/stream-broker/placeholder-frames.ts
|
|
10634
|
+
var FRAME_B64 = {
|
|
10635
|
+
h264: {
|
|
10636
|
+
reconnecting: "AAAAAWdCwB/aAUAW7ARAAAADAEAAAAMAg8YMqAAAAAFozg/IAAABZYiEOiYoAAjgycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdgARwAaAfgvaKICMwoLAOgADxEIjArGFj0HzJsgAA2AHATLIAAMgBQE3ACIwbKGUWeUI9Xg4ABsAOAmWHAANgBwEyywADYAAgMGRwADYAAgMGQ4ABkAKAm4QAAYAHAq4HAAMgBQE3A4ABgAcCrn4/ABwjgGMCXnxbX/yxvWnTbBwke+QAqCJtK/C/ANHYwBiaibAhFAwNAYBETMKEp/DdMAAVluoAAgKyf8BWwZFmQC+raGBG1IAwEgPQdQ7AEAYHCVS5MuqyLBIm21NwPwEdMjMJ8h2KQPTQfEi5poyZEw/1NvqAA8ZCKyiNLHIZ6XyAADIAQDbgYAro/YCAZstAw/vNEAqAAIBiyrw4ABkAIBtzDgAGQAgG3B/4BjvB/2xbteXFxm4BcTAgkL5YdfLwCIgyByUFDRzz1eDr5YdfLLAANgACAwZHAANgACAwZyAACgAgCrmHAAKACAKufvZY7AA7AACAQAQPJEWx8kFDGRyZ/eABHf9E/EeMqpJFVe/gAeJVOoQrZdIPEev4AH8J5YVwwpkr3+37/+/wGgClGk1MvAN9VJ6BIUWVMODsABAPgACACEiJKqGeGhQqwRGuD0AAYoXqu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RLHYAEH1zdzf/gBMRiKyHMpRkqWH47AARBqhDjKTaFvcon/4AD5EY1QhM4voRkAAGgA4CJYAQtDIw6J8ppDx2AAiMyIBjO3ee9zH/+GBI/NvyAADQAcBEsADBYIweqs4k4sfgAIADAgkqwysyUKlCrRIqQ/wACEUSqy5aKeEb/0JWYE4gmijPjBpr7TQ78AAkQAAQEhUmDIwVtWD8meJumEurCowj2gJxHrWF5hvElDlMS7OasJqgA2Y5AHeoAAgKVzv/oNWfEBRXSABffbEAAE1AAEBS4wAAQAAEA24AE0TAihBEW1YKjTLkAAGgA4HS8fgAIGHBQoVzpjA7v1bsT4PxEgrgFIFpyZIAPcgPZk4xdCozhgB6De+qQEPg0EOzwYwJxxFVGfMGQfJFhwG0eU+Q8DSdo86EALwQR/bIyIDJXBFlFl4E3kNhenCVOaDsBQAIBAkmNOyGGSSVsAjkDV3wI6MjMEXMOhrAxpjMxp4ijbpzzSk+A87YQeoiABfu/sQpLw2zMgCE+/pUAntEGlsl0IgB+UAQBdCsHAQuUFDsqfjw6ZYdNVslPB2AAgYAfhIwvZMuvFIEKDvPyBwAKeiEp3qDIWsbh9ENEH5R+FmHPA0cqMNUxNgC/mp4bj7pbSXp9DEAiQUaWx2rYrlD3E2AIS++5yZmgmAw7d8BLALbDw8skKUFK/v1qEQbDgUp5QNIQAAbACAfcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeG+/367w3+/33+/37777799d99/v994b77799/v9dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeA=",
|
|
10637
|
+
sleeping: "AAAAAWdCwB/aAUAW7ARAAAADAEAAAAMAg8YMqAAAAAFozg/IAAABZYiEOiYoAAjgycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdgAIBgAEPwDIl6AJKw3fccBLCZwAHKurzmDTjrCx0AC1cGKrrkpgC3X4FFZAP0Uaf7/6gZgeKmof6pKQDFucb/wYp75WNKMZMNLhTAUAVnFsltEAGDB64A7LxPeqngCF4/AEAgcCPCbK0wt32oU2+7FSzAg1zwoGYY6J5NiACWYMvJ4xAAWoI254HCYUE/1doEB1DA/VNnAlhlGCkobZhpf/euUyMgit1MDgPz//6ewJdgXXJoQEX0DzktM5h4U0h2AkYAK8DY5OrsAFl7Vq4BIA2V6cjTQdhKNqXYkqw0Ut8ACnIZCjJ8wppIEyAEBACbgYAH5v2DCCkY/LAsAA2AAIDBmjkDKJTBzRBfXvDgICAE3PDgICAE3B34bu7nOdwABBIAAEAze9gASAiIAANgBwEywAnMzGqlKMc30jsgAAoAwIuB/hwACgDAi5hwACgDAi5+uOwAGBRTAPA9QGwrbYCgnAuAAUaIZHGW0Qlv50gAA2AHATLIAAIgGAbcw4ABsAOAmWHAANgBwEywCIgbApKijwCmPV4sAA2AAIDBkOAARAMA25hwACIBgG3MgAAwAIBFzDgAGABAIub8dgAIAs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iKqL+gYHiILNZcsFvCN/7TQOklXDjIuln8BV+nTmgMEwFLygbIkJCH35eOw8AAiD7JgAcORoP8BzLgiAWU+vfhmNvSMEUAwAPN5nmcCBboVnqVIQUTiFiZzyAACoBQbcxDgGAB4jM8SgBBakVng6AwrALSNMvToZltGEAAFQCg25gp2jAGB/jQ8e8dgAoAAIEIAAgCAERjADRCK2tqF/+B1ncwFQADVtoAQDoi4gAA0AGARLH4ACAEGLASmcBNaIPDDzUpHKT//+ACWBDkZTThJEXIDgBDiLmoAAbELBYzxmDgAGwA4CZa6666666666666666666666666666666666666666666666666666666666647AAYAGHWAELGCgIvxicO8WuFYAJSiqBLnAC954PAZRlkFw48wBjdNbJpgAGcthxDGwsUX4QK6KKdCKCxy/3/1B31BhNY1iYGYYYAFC2ILP5UGFgJYAAvPYYiPuTXAIdfsbiMBS0wDgZ3fD8ABAAwDCoFzPz1a4pq2Y//wAKbIkxlVhMSvMoIDpiNGax3lAABAPADGCdsQasEP2eEAAEQIFywDKAAh1THGcvPUQswHTI3ppv9SpZikOQXjfYXAIcuYlKByRh2AEggQPVOkjRH9A4nMhK2/+AHJSIAGAXqwEjy0AEtVZVTO8VKyZas51kkk4/kTLs4fFtoEbODpKFTEWkYbgxSiAiM8BYToQcwwVQgABYAAQCYfgAVpjKQZEeW0hw7AAQBBCQMRYRZFGrUswC1NJn/AB+YSgzkvKANT9XiAADQAcBEsSAAaBR5sYU5iwADQAAgMmQcAA0AAIDJkgAA0AHARLDgAGgA4CJY/AAQ2YAF9alAw4dH63z5///ABzDTiIaSwr1eLAANgACAwZAhshJylENViRhAABsAMAmWOwAGhxDANI9WqgHIDEWqH/gBFIxlYZVJLW5hAABoAOAiWAD8wTghCyTgC1/V4sAA0AAIDJkSAAaAoabGGOYgAA0AHARLfHYAFgYwPTqkREPiuR6WOrf4OAAaAAEBkyAD4gNkBWGC1WvV4DgAGgA4CJYCxGIrIKwwchnhj4YAFeYihnJjixpTw7AAQBBCQORQZRFm7dtwCXuZP8AHYS4X2OaT6vFgAGgABAZMqAAGgoo2MI8xAABoAOAiWDgAGgABAZMg4ABoAAQGTIcAA0AHARLDgAGgA4CJY/AAiA/REZ5Ef/+ADmawkKKhnq9AhtEszCH7PMHYACIzIgGM7dx73Mf//D4HAANABwESwCMhiMNwUq0nu0u+OwAEYGiiY7W07Hu0n/wAQXkrekEAAGgA4CJeAFU8EYPFSITYTDHYACYD3Gp1vplPdb//wAMwpgASLMoA4FU+uOBDFzECF3kwx+AAhOAwe+XLfLD74RzmJ7dP4ALJXJiAtpYEDu37tFrI5i6oBGY0+cykFxS7tZgTiiKqL+nhgeIgt1lywW8I3/vjvwzgOkbjQnaYGUzWh46wSG9hcMNk2S6/jjNXFAA91AAEAgPyAgcAq5gBJIpYUQVuRu/xTQgAA0AHARLwAhNNIybF0UMfgKcAqAQLCQh7WF+Rdn0fvgMIJ7NygR8kAeB1f9ABOwXNNMoUZFwyBrAT30yAj4NAYPw7WIXGiLrreAU7MEWEAqjzF8XO4M3MBUHHw8GZJBpXARoxvrlyMTifGkLawCM2RobdCoz2wo1BNm8AEK/fD8AFAACoD4AAbWtAFsNT9/zfAkF+gkFgO1QGJqIoc6gYNQ5ZwABAKfk8x8oBLaIkXvvNCQEAAIAdzwcGUAAIFgtp+A4coBHVIY7/74tIBAACAPFh2IEQ/AHR3g7AAYAAIA6DgQoPIwhiOjamwn6R8ADGUsz0LKujNEL01cCoErP/f+oMo92eSJTz3cXyTAl+AAEBK2sFwtxqwBCH32v2QQkWYIScAg7ALfYHfrssBHC8gAEMJua6666666666666666666666666666666666666666666666666666666666677/f7994a79+++uu/313hvv9/rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrw",
|
|
10638
|
+
offline: "AAAAAWdCwB/aAUAW7ARAAAADAEAAAAMAg8YMqAAAAAFozg/IAAABZYiEOiYoAAjgycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJydddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdgAIAQcsOSSTTLlyxZIuXLf/wANhc8uVQgps2//QWgElpnArSQHn3h2AA4ADBMADxxeJWO1OLfdS9Bs/QADCh193AxANb38ABYlU8UMVsskHiLn+/7YELICKS04HAb9fDqNXOPveYDnMTLoBSwIaP2fQPHkQGAM13p+//nbhoKtUCn5CaBgpIA2DKJLlxxnYqkpEkg/Dj8AQjAAGAQTCxyPvtmpwKevTsuUcA0IZIYc1H2mrLxnjMgBArJmNE66YDDcB4PVTiQCUnBCAVG3DyiSs+w2ogYtWIF/9++5cjIADMXOEB4ds/8CMzI0GTsLyk4MwuSpRR03i/4GBtiexCgh8GAnuHYCwAwAOaLf0Ksjw9oPzoJL+EIuLJSAFwLKft8ACmkaZGGN26bIABBBdzGuxC807SzIA/GTxFRjoUgdpAK8JbPkkAQ4GHABBBdzw4AIILuD/wGK0P66UdLhIiO/gyLGwgAEFHyw4AIKPl4BoAQqZQFiSKq8HABBR8sOACCj5ZYABsAAQGDI4ABsAAQGDOQgCAAEAy5h0AQAAgGXPx+ADzQAX3wKYaZJZhv4AJIGQLltPIMA4oagCR64Bgkl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uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuv",
|
|
10639
|
+
disabled: "AAAAAWdCwB/aAUAW7ARAAAADAEAAAAMAg8YMqAAAAAFozg/IAAABZYiEOiYoAAjgycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdgAIDBmgatGsRz4EOeLeNIaoAK4IoTYYcSaB6SIAgABANuEAAGwA4CZYcAA2AHATLwCkaABlQgoArnq9DwBAACAbch4AgABANuZAAQQVcw4AQQVcH4AOBDut5h5lXWn9tfoTCAFpcXTwIwAIBExOCkcZ4QItHXzzA41AEvZgwSXTL//x2AIYE8HHbnwLhNOR539HJQyAaKcqPtQcwCVj94YAFoaXVQUzrsCRB/9/AAuDkyBD/rKBQuBgU/dzrBAEZpphAvPAATjMf9dAh8ixQOxhpLUMArHgIH/vHYADQK0aHw4EAACAXBfepAdQAXECCkdJJgsmJpZAALgACATcAjNpgAaoQfw0RyDIACHEXOVAALgACATclQAC4AAgE3A4AQ4i5hwAhxFzHYACAMBDQCUih84AUyPVKvkE44cACXIlmH2MhSgAmhOL88YwskgR0Ag0TPvANTbaJLsZ+cD+JbfaIzlkCygK0c0/73QAGSw1BulYBuWZgRLcAAICP4GC1SAiBDKIFC8EHLUFQ4unmAPwBAQApVh7gt9NLRK0nnlCdgi2nDBGTfEAAFABAOl19AzyMAMr9zyoABgAAQAFidgO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rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrw=",
|
|
10640
|
+
waking: "AAAAAWdCwB/aAUAW7ARAAAADAEAAAAMAg8YMqAAAAAFozg/IAAABZYiEOiYoAAjgycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJydddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcd/oH/47AAQBAGUBlZdJh5G9sxrA8HYAFbAAfbqQAFAm44CYXpxTUasssNGECENJJxx+tDI/9Ry8wBAOpYOO/f+DrFIcycwAAgIr3685zLaHgXN8IKM/o2feDBzo0Q4rHPBfP8AgCJWBh+7x2AAmAARwOv3gOBaB+1Tygfhc4CPXtgAOYUMFKd57jwafCAADYAcBMuQG07ivlZJgD8arZJMnA+ncYBgI5oNv/QcO3CKiGgDV78HQZJtQYpggXN/A67gggv/Cx97Fb6IAwEawG3/h2ADhnHDfssxKgIDDnB5vz8AE5hocrnuDCcsiQdcAAI0SyeaAI/r3/LDKKw0hoqq94YAWDbTjCEekj3v47AARgDA2nC+phF+FKPPlmgcoAHJCwOib+QsZpcAFQynCiPbJ1XgwJmExQr5/xbrIweDoOyFYDIYAQfe8NgAGmwTlgCXl4Z9/R2DQADTcH9YBry9ay7IAgHawHZ/qSoJjCQhxzw47AARgACAQFBfephQaQk9Bxxz+ErwAJTrkOCI6TmhoyQAAbADgJl0jlorTTSR594D0BpKKxXazT0AAy7yynAxBIE3/oSgKWDFpJANX9sGD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AAmkO4APxvh2AAiAAEA9IAARQDmQGaxcQU2GTKnhAMD1edgIvAo/E5vnsGpeH1KyYZ5QKaFqv/GAAF7QABAWXIkAAgPCSwDkEOQGTscjUFkQoWA0+AHmzIgOml+Awh37sN111111111111111111111111111111111111111111111111111111111111111133++/f77/ffvvrvDff7/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXg="
|
|
10641
|
+
},
|
|
10642
|
+
h265: {
|
|
10643
|
+
reconnecting: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLjAFwEgEQEADwDgDgDgDQDJdd4QDwCwCwCgCgCQCQCQCQCYNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAV0oBlPeTVLjjiybt/79hr8egLGkfgRr4BMQkiA4Kvw8jeWLF+WRCVyWx9qYu5G9T5CK0jQtgcXtpIjS8fOF3Fs7TooZzWpZ8ReTWIvMHVoz1Khj/MspUENld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",
|
|
10644
|
+
sleeping: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLjAFwEgEQEADwDgDgDgDQDFjo4wDgCwCwCgCgCQCQCQCQCYNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAnJVW/5yV+komUy56aphjzFvh52pfB2PTfCwCh7ggQKBSBYFGbEzvodhyojZdGeFaSykK9Ax2TQRMp4vmNtSZ21tm+X8AAJbdd/W7GfmdQAeYoPMrNuiQvN/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",
|
|
10645
|
+
offline: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLiwLgSAiBAB4DgHAOAaAyPGfQGALAWAoBQCQEgJASAmNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAnIRJY7mt6jxDg1ZAEbP7/LhpeVRCRSHYPE9hJm0I9bQrAjX0yu6L7lrKwJuj+U+EieuvMXkRVod2huH5MMqkgjezPIXhMMMbzPxp9/3NjL4R6GTuXhhGpNVRUat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",
|
|
10646
|
+
disabled: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLjAFwEgEQEADwDgDgDgDQDFlYmgDACwCwCgCgCQCQCQCQCYNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAnJXh0f6dh91ZYSfYA2WZGi8L4B4Km93Ubr5/EFPTj6FOBGEL/s1k6y5ZvJx9Rlg/VUGc79Ok5oWDJetrtsLEUH4QjulhGTw2WWHi1fKx08W4ltGWipQDk4q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",
|
|
10647
|
+
waking: "AAAAAUABDAH//wQIAAADAJ+oAAADAABdugJAAAAAAUIBAQQIAAADAJ+oAAADAABdoAKAgC0WW6SkwvAWgIAAAAMAgAAAAwCEAAAAAUQBwHGDEgAAAU4BBf///////////wQsot4JtRdH27tVpP5/wvxOeDI2NSAoYnVpbGQgMjE1KSAtIDQuMSsxLTFkMTE3YmU6W01hYyBPUyBYXVtjbGFuZyAxNi4wLjBdWzY0IGJpdF0gOGJpdCsxMGJpdCsxMmJpdCAtIEguMjY1L0hFVkMgY29kZWMgLSBDb3B5cmlnaHQgMjAxMy0yMDE4IChjKSBNdWx0aWNvcmV3YXJlLCBJbmMgLSBodHRwOi8veDI2NS5vcmcgLSBvcHRpb25zOiBjcHVpZD05OCBmcmFtZS10aHJlYWRzPTMgd3BwIG5vLXBtb2RlIG5vLXBtZSBuby1wc25yIG5vLXNzaW0gbG9nLWxldmVsPTIgYml0ZGVwdGg9OCBpbnB1dC1jc3A9MSBmcHM9MS8xIGlucHV0LXJlcz0xMjgweDcyMCBpbnRlcmxhY2U9MCB0b3RhbC1mcmFtZXM9MCBsZXZlbC1pZGM9MCBoaWdoLXRpZXI9MSB1aGQtYmQ9MCByZWY9MSBuby1hbGxvdy1ub24tY29uZm9ybWFuY2UgcmVwZWF0LWhlYWRlcnMgYW5uZXhiIG5vLWF1ZCBuby1lb2Igbm8tZW9zIG5vLWhyZCBpbmZvIGhhc2g9MCB0ZW1wb3JhbC1sYXllcnM9MCBuby1vcGVuLWdvcCBtaW4ta2V5aW50PTEga2V5aW50PTEgZ29wLWxvb2thaGVhZD0wIGJmcmFtZXM9MCBiLWFkYXB0PTAgbm8tYi1weXJhbWlkIGJmcmFtZS1iaWFzPTAgcmMtbG9va2FoZWFkPTAgbG9va2FoZWFkLXNsaWNlcz00IHNjZW5lY3V0PTAgbm8taGlzdC1zY2VuZWN1dCByYWRsPTAgbm8tc3BsaWNlIG5vLWludHJhLXJlZnJlc2ggY3R1PTMyIG1pbi1jdS1zaXplPTE2IG5vLXJlY3Qgbm8tYW1wIG1heC10dS1zaXplPTMyIHR1LWludGVyLWRlcHRoPTEgdHUtaW50cmEtZGVwdGg9MSBsaW1pdC10dT0wIHJkb3EtbGV2ZWw9MCBkeW5hbWljLXJkPTAuMDAgbm8tc3NpbS1yZCBuby1zaWduaGlkZSBuby10c2tpcCBuci1pbnRyYT0wIG5yLWludGVyPTAgbm8tY29uc3RyYWluZWQtaW50cmEgc3Ryb25nLWludHJhLXNtb290aGluZyBtYXgtbWVyZ2U9MiBsaW1pdC1yZWZzPTAgbm8tbGltaXQtbW9kZXMgbWU9MCBzdWJtZT0wIG1lcmFuZ2U9NTcgdGVtcG9yYWwtbXZwIG5vLWZyYW1lLWR1cCBuby1obWUgbm8td2VpZ2h0cCBuby13ZWlnaHRiIG5vLWFuYWx5emUtc3JjLXBpY3MgZGVibG9jaz0wOjAgbm8tc2FvIG5vLXNhby1ub24tZGVibG9jayByZD0yIHNlbGVjdGl2ZS1zYW89MCBlYXJseS1za2lwIHJza2lwIGZhc3QtaW50cmEgbm8tdHNraXAtZmFzdCBuby1jdS1sb3NzbGVzcyBuby1iLWludHJhIG5vLXNwbGl0cmQtc2tpcCByZHBlbmFsdHk9MCBwc3ktcmQ9Mi4wMCBwc3ktcmRvcT0wLjAwIG5vLXJkLXJlZmluZSBuby1sb3NzbGVzcyBjYnFwb2Zmcz0wIGNycXBvZmZzPTAgcmM9Y3JmIGNyZj0yOC4wIHFjb21wPTAuNjAgcXBzdGVwPTQgc3RhdHMtd3JpdGU9MCBzdGF0cy1yZWFkPTAgaXByYXRpbz0xLjQwIGFxLW1vZGU9MCBhcS1zdHJlbmd0aD0wLjAwIG5vLWN1dHJlZSB6b25lLWNvdW50PTAgbm8tc3RyaWN0LWNiciBxZy1zaXplPTMyIG5vLXJjLWdyYWluIHFwbWF4PTY5IHFwbWluPTAgbm8tY29uc3QtdmJ2IHNhcj0xIG92ZXJzY2FuPTAgdmlkZW9mb3JtYXQ9NSByYW5nZT0wIGNvbG9ycHJpbT0yIHRyYW5zZmVyPTIgY29sb3JtYXRyaXg9MiBjaHJvbWFsb2M9MCBkaXNwbGF5LXdpbmRvdz0wIGNsbD0wLDAgbWluLWx1bWE9MCBtYXgtbHVtYT0yNTUgbG9nMi1tYXgtcG9jLWxzYj04IHZ1aS10aW1pbmctaW5mbyB2dWktaHJkLWluZm8gc2xpY2VzPTEgbm8tb3B0LXFwLXBwcyBuby1vcHQtcmVmLWxpc3QtbGVuZ3RoLXBwcyBuby1tdWx0aS1wYXNzLW9wdC1ycHMgc2NlbmVjdXQtYmlhcz0wLjA1IG5vLW9wdC1jdS1kZWx0YS1xcCBuby1hcS1tb3Rpb24gbm8taGRyMTAgbm8taGRyMTAtb3B0IG5vLWRoZHIxMC1vcHQgbm8taWRyLXJlY292ZXJ5LXNlaSBhbmFseXNpcy1yZXVzZS1sZXZlbD0wIGFuYWx5c2lzLXNhdmUtcmV1c2UtbGV2ZWw9MCBhbmFseXNpcy1sb2FkLXJldXNlLWxldmVsPTAgc2NhbGUtZmFjdG9yPTAgcmVmaW5lLWludHJhPTAgcmVmaW5lLWludGVyPTAgcmVmaW5lLW12PTEgcmVmaW5lLWN0dS1kaXN0b3J0aW9uPTAgbm8tbGltaXQtc2FvIGN0dS1pbmZvPTAgbm8tbG93cGFzcy1kY3QgcmVmaW5lLWFuYWx5c2lzLXR5cGU9MCBjb3B5LXBpYz0xIG1heC1hdXNpemUtZmFjdG9yPTEuMCBuby1keW5hbWljLXJlZmluZSBuby1zaW5nbGUtc2VpIG5vLWhldmMtYXEgbm8tc3Z0IG5vLWZpZWxkIHFwLWFkYXB0YXRpb24tcmFuZ2U9MS4wMCBzY2VuZWN1dC1hd2FyZS1xcD0wY29uZm9ybWFuY2Utd2luZG93LW9mZnNldHMgcmlnaHQ9MCBib3R0b209MCBkZWNvZGVyLW1heC1yYXRlPTAgbm8tdmJ2LWxpdmUtbXVsdGktcGFzcyBuby1tY3N0ZiBuby1zYnJjIG5vLWZyYW1lLXJjgAAAASgBrcLiwLgSAiBAB4DgHAOAaAyfX/AGgLAWAoBQCQEgJASAmNEX/8/CcyLuuu2nGKAAAAMAAAMAAAMCEgdwaCTacYoAAAMAAAMAAAMABEQI1dtOMUAAAAMAAAMAAAMAElAMJyWgAAADAAADAAADAAAqYA5IgAAAAwAAAwAAAwAAGTARgAAAAwAAAwAAAwAAB9QAAAMAAAMAAAMAAAMAAQsAAAMAAAMAAAMAAAMAGBAAAAMAAAMAAAMAAAMBkQAAAwAAAwAAAwAADTgAAAMAAMsbsDkcoZgDIVg0QtuHSsRxkPs93x2tkl6E1gXx0vsrK+j+vQJ0cELr/DHTvsNk9haL5Nc9sUfbRjjmhBTJTjTszXpCeksgb575CVY08mk/BPfZmrL7JLcxTIpD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"
|
|
10648
|
+
}
|
|
10649
|
+
};
|
|
10650
|
+
var cache = {};
|
|
10651
|
+
/**
|
|
10652
|
+
* Get the pre-encoded placeholder frame for `(kind, codec)`. Buffer
|
|
10653
|
+
* is created once on first use per (codec, kind) pair and cached
|
|
10654
|
+
* permanently — safe to call from hot paths (~5-9KB per pair, ~60KB
|
|
10655
|
+
* worst-case across both codecs and all five states).
|
|
10656
|
+
*/
|
|
10657
|
+
function getPlaceholderFrame(kind, codec) {
|
|
10658
|
+
const codecCache = cache[codec] ?? (cache[codec] = {});
|
|
10659
|
+
const cached = codecCache[kind];
|
|
10660
|
+
if (cached) return cached;
|
|
10661
|
+
const buf = Buffer.from(FRAME_B64[codec][kind], "base64");
|
|
10662
|
+
codecCache[kind] = buf;
|
|
10663
|
+
return buf;
|
|
10664
|
+
}
|
|
10665
|
+
//#endregion
|
|
10666
|
+
//#region src/stream-broker/stream-broker/stream-pipe-server.ts
|
|
10667
|
+
/**
|
|
10668
|
+
* A lightweight TCP server that broadcasts raw encoded video bytes
|
|
10669
|
+
* (H.264/H.265 Annex-B) to all connected clients.
|
|
10670
|
+
*
|
|
10671
|
+
* Each StreamBroker owns one StreamPipeServer. Restreamers (e.g. go2rtc)
|
|
10672
|
+
* connect via `tcp://127.0.0.1:{port}` and receive the same byte stream
|
|
10673
|
+
* that the broker reads from the camera, eliminating duplicate RTSP
|
|
10674
|
+
* connections.
|
|
10675
|
+
*/
|
|
10676
|
+
/** Max bytes queued in a client's write buffer before we consider it too slow */
|
|
10677
|
+
var MAX_WRITE_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
10678
|
+
var StreamPipeServer = class {
|
|
10679
|
+
server;
|
|
10680
|
+
clients = /* @__PURE__ */ new Set();
|
|
10681
|
+
port = 0;
|
|
10682
|
+
started = false;
|
|
10683
|
+
logger;
|
|
10684
|
+
_onClientCountChanged = null;
|
|
10685
|
+
/** Register a callback invoked when pipe client count changes. */
|
|
10686
|
+
onClientCountChanged(cb) {
|
|
10687
|
+
this._onClientCountChanged = cb;
|
|
10688
|
+
}
|
|
10689
|
+
constructor(logger) {
|
|
10690
|
+
this.logger = logger;
|
|
10691
|
+
this.server = node_net.default.createServer((socket) => {
|
|
10692
|
+
this.handleConnection(socket);
|
|
10693
|
+
});
|
|
10694
|
+
this.server.on("error", (err) => {
|
|
10695
|
+
this.logger?.error("StreamPipeServer error", { meta: { error: err.message } });
|
|
10696
|
+
});
|
|
10697
|
+
}
|
|
10698
|
+
async start() {
|
|
10699
|
+
if (this.started) return;
|
|
10700
|
+
await new Promise((resolve, reject) => {
|
|
10701
|
+
this.server.once("error", reject);
|
|
10702
|
+
this.server.listen(0, "127.0.0.1", () => {
|
|
10703
|
+
this.server.removeListener("error", reject);
|
|
10704
|
+
const address = this.server.address();
|
|
10705
|
+
this.port = address.port;
|
|
10706
|
+
this.started = true;
|
|
10707
|
+
this.logger?.debug("StreamPipeServer listening", { meta: { port: this.port } });
|
|
10708
|
+
resolve();
|
|
10709
|
+
});
|
|
10710
|
+
});
|
|
10711
|
+
}
|
|
10712
|
+
/**
|
|
10713
|
+
* Broadcast raw encoded bytes to all connected clients.
|
|
10714
|
+
* Silently drops data for clients that are slow or disconnected.
|
|
10715
|
+
*/
|
|
10716
|
+
broadcast(data) {
|
|
10717
|
+
for (const client of this.clients) {
|
|
10718
|
+
if (client.destroyed) {
|
|
10719
|
+
this.clients.delete(client);
|
|
10720
|
+
continue;
|
|
10721
|
+
}
|
|
10722
|
+
if (client.writableLength > MAX_WRITE_BUFFER_BYTES) {
|
|
10723
|
+
this.logger?.warn("StreamPipeServer client buffer overflow — dropping client", { meta: { bufferMB: Number((client.writableLength / 1024 / 1024).toFixed(1)) } });
|
|
10724
|
+
this.removeClient(client);
|
|
10725
|
+
continue;
|
|
10726
|
+
}
|
|
10727
|
+
client.write(data, (err) => {
|
|
10728
|
+
if (err) {
|
|
10729
|
+
this.logger?.debug("StreamPipeServer write error, removing client", { meta: { error: err.message } });
|
|
10730
|
+
this.removeClient(client);
|
|
10731
|
+
}
|
|
10732
|
+
});
|
|
10733
|
+
}
|
|
10734
|
+
}
|
|
10735
|
+
getPort() {
|
|
10736
|
+
return this.port;
|
|
10737
|
+
}
|
|
10738
|
+
getUrl() {
|
|
10739
|
+
return `tcp://127.0.0.1:${this.port}`;
|
|
10740
|
+
}
|
|
10741
|
+
getClientCount() {
|
|
10742
|
+
return this.clients.size;
|
|
10743
|
+
}
|
|
10744
|
+
isStarted() {
|
|
10745
|
+
return this.started;
|
|
10746
|
+
}
|
|
10747
|
+
async stop() {
|
|
10748
|
+
if (!this.started) return;
|
|
10749
|
+
this.started = false;
|
|
10750
|
+
this._onClientCountChanged = null;
|
|
10751
|
+
for (const client of this.clients) client.destroy();
|
|
10752
|
+
this.clients.clear();
|
|
10753
|
+
await new Promise((resolve) => {
|
|
10754
|
+
this.server.close(() => {
|
|
10755
|
+
this.logger?.debug("StreamPipeServer stopped");
|
|
10756
|
+
resolve();
|
|
10757
|
+
});
|
|
10758
|
+
});
|
|
10759
|
+
}
|
|
10760
|
+
handleConnection(socket) {
|
|
10761
|
+
this.clients.add(socket);
|
|
10762
|
+
this.logger?.debug("StreamPipeServer client connected", { meta: { total: this.clients.size } });
|
|
10763
|
+
this._onClientCountChanged?.();
|
|
10764
|
+
socket.on("close", () => {
|
|
10292
10765
|
this.removeClient(socket);
|
|
10293
10766
|
});
|
|
10294
10767
|
socket.on("error", () => {
|
|
@@ -10394,6 +10867,18 @@ var StreamBroker = class StreamBroker {
|
|
|
10394
10867
|
audioRtpDecoder = null;
|
|
10395
10868
|
audioCodecSession = null;
|
|
10396
10869
|
/**
|
|
10870
|
+
* Live Opus egress encoder — lazily created when a WebRTC session negotiates
|
|
10871
|
+
* Opus (`opusConsumerCount > 0`). Encodes the SAME decoded PCM that feeds the
|
|
10872
|
+
* PCMU path into 48 kHz Opus access units, emitted as `codec:'opus'`
|
|
10873
|
+
* EncodedPackets ALONGSIDE the untouched PCMU packets (strictly additive — the
|
|
10874
|
+
* PCMU fan-out stays byte-identical for fallback sessions). Idled when the
|
|
10875
|
+
* last Opus consumer detaches. In-process (audio-codec cap / node-av), no
|
|
10876
|
+
* ffmpeg. See {@link feedOpusEncoder}.
|
|
10877
|
+
*/
|
|
10878
|
+
opusEncodeSession = null;
|
|
10879
|
+
/** Number of attached WebRTC sessions that negotiated Opus (demand gate). */
|
|
10880
|
+
opusConsumerCount = 0;
|
|
10881
|
+
/**
|
|
10397
10882
|
* Pending occupancy-linger teardown of {@link audioCodecSession} after
|
|
10398
10883
|
* the last audio consumer detached. Cancelled when a consumer returns
|
|
10399
10884
|
* within {@link AUDIO_CONSUMER_LINGER_MS}. See {@link reconcileAudioConsumer}.
|
|
@@ -10894,6 +11379,73 @@ var StreamBroker = class StreamBroker {
|
|
|
10894
11379
|
return this.encodedCallbacks.size > 0 || this.audioChunkPlane.subscriberCount > 0;
|
|
10895
11380
|
}
|
|
10896
11381
|
/**
|
|
11382
|
+
* Register a WebRTC session that negotiated Opus. Turns on the live Opus
|
|
11383
|
+
* egress encoder (lazily, on the first decoded PCM chunk). Additive — the
|
|
11384
|
+
* PCMU fan-out is untouched, so PCMU-fallback sessions are unaffected.
|
|
11385
|
+
*/
|
|
11386
|
+
acquireOpusEgress() {
|
|
11387
|
+
this.opusConsumerCount++;
|
|
11388
|
+
}
|
|
11389
|
+
/**
|
|
11390
|
+
* Deregister an Opus session. Idles (but keeps) the encoder when the last
|
|
11391
|
+
* Opus consumer detaches — the next {@link acquireOpusEgress} + PCM push
|
|
11392
|
+
* re-creates the upstream encode session, exactly like the decode client.
|
|
11393
|
+
*/
|
|
11394
|
+
releaseOpusEgress() {
|
|
11395
|
+
if (this.opusConsumerCount > 0) this.opusConsumerCount--;
|
|
11396
|
+
if (this.opusConsumerCount === 0 && this.opusEncodeSession) this.opusEncodeSession.idle().catch((err) => {
|
|
11397
|
+
this.logger?.warn("opus-egress: idle failed", { meta: { error: require_dist.errMsg(err) } });
|
|
11398
|
+
});
|
|
11399
|
+
}
|
|
11400
|
+
/**
|
|
11401
|
+
* Encode ONE canonical 20 ms Opus silence packet for a session's prestream
|
|
11402
|
+
* A/V-sync padding (Opus has no fixed silence byte). Returns `null` when the
|
|
11403
|
+
* audio-codec cap is unavailable. See {@link encodeOpusSilenceFrame}.
|
|
11404
|
+
*/
|
|
11405
|
+
async makeOpusSilenceFrame(channels) {
|
|
11406
|
+
if (!this.audioCodecApi) return null;
|
|
11407
|
+
return encodeOpusSilenceFrame(this.audioCodecApi, { channels });
|
|
11408
|
+
}
|
|
11409
|
+
/**
|
|
11410
|
+
* Feed one decoded PCM chunk (f32le, the decode contract) into the live Opus
|
|
11411
|
+
* egress encoder when an Opus consumer is attached. Lazily creates the encode
|
|
11412
|
+
* session sized to the chunk. No-op without Opus demand or the cap.
|
|
11413
|
+
*/
|
|
11414
|
+
feedOpusEncoder(chunk) {
|
|
11415
|
+
if (this.opusConsumerCount === 0) return;
|
|
11416
|
+
const api = this.audioCodecApi;
|
|
11417
|
+
if (!api) return;
|
|
11418
|
+
if (!this.opusEncodeSession) {
|
|
11419
|
+
const targetChannels = Math.min(2, Math.max(1, chunk.channels));
|
|
11420
|
+
this.opusEncodeSession = new OpusEncodeSession(api, {
|
|
11421
|
+
sourceSampleRate: chunk.sampleRate,
|
|
11422
|
+
sourceChannels: chunk.channels,
|
|
11423
|
+
sourceFormat: "f32le",
|
|
11424
|
+
targetSampleRate: 48e3,
|
|
11425
|
+
targetChannels,
|
|
11426
|
+
bitrateKbps: targetChannels >= 2 ? 64 : 48,
|
|
11427
|
+
tag: `broker:${this.deviceId}:opus-egress`
|
|
11428
|
+
}, (frame) => this.emitOpusEncoded(frame), this.logger ?? void 0);
|
|
11429
|
+
}
|
|
11430
|
+
this.opusEncodeSession.pushPcm(chunk);
|
|
11431
|
+
}
|
|
11432
|
+
/** Fan out one encoded Opus access unit as a `codec:'opus'` EncodedPacket. */
|
|
11433
|
+
emitOpusEncoded(frame) {
|
|
11434
|
+
if (this.encodedCallbacks.size === 0) return;
|
|
11435
|
+
const packet = {
|
|
11436
|
+
type: "audio",
|
|
11437
|
+
data: frame.data,
|
|
11438
|
+
pts: frame.ptsMs,
|
|
11439
|
+
dts: frame.ptsMs,
|
|
11440
|
+
keyframe: false,
|
|
11441
|
+
codec: "opus"
|
|
11442
|
+
};
|
|
11443
|
+
for (const [cb, entry] of this.encodedCallbacks) {
|
|
11444
|
+
cb(packet);
|
|
11445
|
+
entry.packetsDelivered += 1;
|
|
11446
|
+
}
|
|
11447
|
+
}
|
|
11448
|
+
/**
|
|
10897
11449
|
* Demand-gate the audio-codec decode session lifecycle. Called from
|
|
10898
11450
|
* every consumer add/remove edge (via {@link checkDemand}). While an
|
|
10899
11451
|
* audio consumer exists, cancel any pending linger-close. When
|
|
@@ -11994,6 +12546,17 @@ var StreamBroker = class StreamBroker {
|
|
|
11994
12546
|
cb(packet);
|
|
11995
12547
|
entry.packetsDelivered += 1;
|
|
11996
12548
|
}
|
|
12549
|
+
if (this.opusConsumerCount > 0 && this.audioCodecApi) {
|
|
12550
|
+
const pcm16 = this.audioCodec === "PCMA" ? alawToPcm(payload) : mulawToPcm(payload);
|
|
12551
|
+
const f32 = new Float32Array(pcm16.length);
|
|
12552
|
+
for (let i = 0; i < pcm16.length; i++) f32[i] = pcm16[i] / 32768;
|
|
12553
|
+
this.feedOpusEncoder({
|
|
12554
|
+
data: Buffer.from(f32.buffer, f32.byteOffset, f32.byteLength),
|
|
12555
|
+
sampleRate: 8e3,
|
|
12556
|
+
channels: 1,
|
|
12557
|
+
timestamp: pts
|
|
12558
|
+
});
|
|
12559
|
+
}
|
|
11997
12560
|
}
|
|
11998
12561
|
}
|
|
11999
12562
|
this.rtspRestreamer.pushAudioRtpPassthrough(rtpData);
|
|
@@ -12467,6 +13030,13 @@ var StreamBroker = class StreamBroker {
|
|
|
12467
13030
|
this.logger?.warn("audio-codec: session close failed", { meta: { error: require_dist.errMsg(err) } });
|
|
12468
13031
|
});
|
|
12469
13032
|
}
|
|
13033
|
+
if (this.opusEncodeSession) {
|
|
13034
|
+
const opus = this.opusEncodeSession;
|
|
13035
|
+
this.opusEncodeSession = null;
|
|
13036
|
+
opus.close().catch((err) => {
|
|
13037
|
+
this.logger?.warn("opus-egress: session close failed", { meta: { error: require_dist.errMsg(err) } });
|
|
13038
|
+
});
|
|
13039
|
+
}
|
|
12470
13040
|
}
|
|
12471
13041
|
/**
|
|
12472
13042
|
* Map an SDP audio track to an `AudioCodecSession` config the
|
|
@@ -12515,6 +13085,7 @@ var StreamBroker = class StreamBroker {
|
|
|
12515
13085
|
offsetBytes = end;
|
|
12516
13086
|
chunkOffsetMs += 20;
|
|
12517
13087
|
}
|
|
13088
|
+
this.feedOpusEncoder(chunk);
|
|
12518
13089
|
}
|
|
12519
13090
|
};
|
|
12520
13091
|
}
|
|
@@ -17128,8 +17699,8 @@ var SCRUB_PREFETCH_DIR_THRESHOLD = 2;
|
|
|
17128
17699
|
var RecordedFeeder = class {
|
|
17129
17700
|
deps;
|
|
17130
17701
|
clock = new MonotonicClock();
|
|
17131
|
-
/**
|
|
17132
|
-
audioClock
|
|
17702
|
+
/** Audio clock (PCMU 8 kHz / Opus 48 kHz); re-anchored together with video. */
|
|
17703
|
+
audioClock;
|
|
17133
17704
|
clockHasAdvanced = false;
|
|
17134
17705
|
/** Playback rate: 0 (paused) or a continuous factor in [0.25, 4]. */
|
|
17135
17706
|
rate = 1;
|
|
@@ -17212,6 +17783,18 @@ var RecordedFeeder = class {
|
|
|
17212
17783
|
scrubPrefetchInFlight = false;
|
|
17213
17784
|
constructor(deps) {
|
|
17214
17785
|
this.deps = deps;
|
|
17786
|
+
this.audioClock = new MonotonicClock(deps.audioClockRateHz ?? 8e3);
|
|
17787
|
+
}
|
|
17788
|
+
/**
|
|
17789
|
+
* The negotiated audio sink push fn (Opus preferred, else PCMU), or undefined
|
|
17790
|
+
* for a video-only sink. A feeder is wired with exactly ONE of the two.
|
|
17791
|
+
*/
|
|
17792
|
+
resolveAudioPush() {
|
|
17793
|
+
const sink = this.deps.sink;
|
|
17794
|
+
const opus = sink.pushAudioOpus;
|
|
17795
|
+
if (typeof opus === "function") return (data, rtpTs) => opus.call(sink, data, rtpTs);
|
|
17796
|
+
const pcmu = sink.pushAudioPcmu;
|
|
17797
|
+
if (typeof pcmu === "function") return (data, rtpTs) => pcmu.call(sink, data, rtpTs);
|
|
17215
17798
|
}
|
|
17216
17799
|
/**
|
|
17217
17800
|
* Seek to an epoch and (if rate > 0) begin forward playback. Resolves after
|
|
@@ -17731,7 +18314,8 @@ var RecordedFeeder = class {
|
|
|
17731
18314
|
*/
|
|
17732
18315
|
async paceSegment(prepared, gen, resumeAfterPtsMs = null) {
|
|
17733
18316
|
const rate = this.rate;
|
|
17734
|
-
const
|
|
18317
|
+
const audioPush = this.resolveAudioPush();
|
|
18318
|
+
const hasAudioSink = audioPush !== void 0 && rate === 1;
|
|
17735
18319
|
const schedule = [];
|
|
17736
18320
|
for (const au of prepared.aus) if (resumeAfterPtsMs === null || au.ptsMs > resumeAfterPtsMs) schedule.push({
|
|
17737
18321
|
ptsMs: au.ptsMs,
|
|
@@ -17775,8 +18359,7 @@ var RecordedFeeder = class {
|
|
|
17775
18359
|
this.lastFedVideoIdx = videoIdx++;
|
|
17776
18360
|
this.cursorMs = prepared.startMs + (item.video.ptsMs - firstVideoPtsMs);
|
|
17777
18361
|
} else if (item.audio) {
|
|
17778
|
-
|
|
17779
|
-
if (pushAudio) pushAudio.call(this.deps.sink, item.audio.data, this.audioClock.stamp(item.audio.ptsMs));
|
|
18362
|
+
if (audioPush) audioPush(item.audio.data, this.audioClock.stamp(item.audio.ptsMs));
|
|
17780
18363
|
}
|
|
17781
18364
|
}
|
|
17782
18365
|
if (pushedVideo) this.clockHasAdvanced = true;
|
|
@@ -17858,7 +18441,7 @@ var RecordedFeeder = class {
|
|
|
17858
18441
|
const video = await this.withTimeout(demux(bytes));
|
|
17859
18442
|
if (this.disposed || token !== this.seekToken) return null;
|
|
17860
18443
|
let audio = [];
|
|
17861
|
-
if (wantAudio && this.deps.demuxAudio && this.
|
|
18444
|
+
if (wantAudio && this.deps.demuxAudio && this.resolveAudioPush() !== void 0) {
|
|
17862
18445
|
try {
|
|
17863
18446
|
audio = await this.withTimeout(this.deps.demuxAudio(bytes));
|
|
17864
18447
|
} catch {
|
|
@@ -18003,7 +18586,154 @@ var TimelineSession = class {
|
|
|
18003
18586
|
this.feeder?.dispose();
|
|
18004
18587
|
this.feeder = null;
|
|
18005
18588
|
}
|
|
18006
|
-
};
|
|
18589
|
+
};
|
|
18590
|
+
//#endregion
|
|
18591
|
+
//#region src/stream-broker/recorded/avcc-annexb.ts
|
|
18592
|
+
/**
|
|
18593
|
+
* avcc-annexb — pure byte helpers to turn an ISO-BMFF (mp4) length-prefixed
|
|
18594
|
+
* video sample plus its `avcC`/`hvcC` decoder config into an Annex-B access
|
|
18595
|
+
* unit with the parameter sets prepended (SPS/PPS for H.264, VPS/SPS/PPS for
|
|
18596
|
+
* H.265).
|
|
18597
|
+
*
|
|
18598
|
+
* mp4 stores VCL NALs length-prefixed (AVCC/HVCC: a 1–4 byte big-endian length
|
|
18599
|
+
* field, `lengthSizeMinusOne+1`, before each NAL) and keeps the parameter sets
|
|
18600
|
+
* OUT of the samples, inside the `avcC`/`hvcC` box. A raw decoder / RTP
|
|
18601
|
+
* packetizer needs Annex-B start codes (`00 00 00 01`) AND the parameter sets
|
|
18602
|
+
* fused onto every IDR. These helpers do exactly that in JS — no ffmpeg, no
|
|
18603
|
+
* decode, byte copies only — so the feeder-scrub keyframe path can skip the
|
|
18604
|
+
* per-fragment ffmpeg spawn.
|
|
18605
|
+
*
|
|
18606
|
+
* All functions are pure and total for well-formed input; malformed config /
|
|
18607
|
+
* sample bytes throw a `RangeError` (the caller treats a throw as "fall back to
|
|
18608
|
+
* ffmpeg"). The `description` bytes are the box payload WITH the 8-byte box
|
|
18609
|
+
* header already stripped (i.e. starting at `configurationVersion`), matching
|
|
18610
|
+
* `mp4box`'s `avcC`/`hvcC` DataStream output minus header — see
|
|
18611
|
+
* `recorder/scrub/fmp4-keyframes.ts` `extractDescription`.
|
|
18612
|
+
*/
|
|
18613
|
+
/** Annex-B 4-byte start code prepended before every emitted NAL. */
|
|
18614
|
+
var START_CODE = Uint8Array.of(0, 0, 0, 1);
|
|
18615
|
+
/** Big-endian unsigned read of `size` (1..4) bytes at `off`. */
|
|
18616
|
+
function readUint(bytes, off, size) {
|
|
18617
|
+
if (off + size > bytes.length) throw new RangeError(`readUint out of range: off=${off} size=${size} len=${bytes.length}`);
|
|
18618
|
+
let v = 0;
|
|
18619
|
+
for (let i = 0; i < size; i++) v = v * 256 + bytes[off + i];
|
|
18620
|
+
return v;
|
|
18621
|
+
}
|
|
18622
|
+
/**
|
|
18623
|
+
* NAL length-prefix size in bytes (`lengthSizeMinusOne + 1`, 1..4) read from the
|
|
18624
|
+
* decoder config. `avcC` carries it at byte 4 (low 2 bits); `hvcC` at byte 21
|
|
18625
|
+
* (low 2 bits).
|
|
18626
|
+
*/
|
|
18627
|
+
function parseNalLengthSize(description, isHevc) {
|
|
18628
|
+
const idx = isHevc ? 21 : 4;
|
|
18629
|
+
if (description.length <= idx) throw new RangeError(`config too short for lengthSizeMinusOne (len=${description.length})`);
|
|
18630
|
+
return (description[idx] & 3) + 1;
|
|
18631
|
+
}
|
|
18632
|
+
/** Concatenate byte chunks into one Uint8Array. */
|
|
18633
|
+
function concat$1(chunks) {
|
|
18634
|
+
let total = 0;
|
|
18635
|
+
for (const c of chunks) total += c.length;
|
|
18636
|
+
const out = new Uint8Array(total);
|
|
18637
|
+
let off = 0;
|
|
18638
|
+
for (const c of chunks) {
|
|
18639
|
+
out.set(c, off);
|
|
18640
|
+
off += c.length;
|
|
18641
|
+
}
|
|
18642
|
+
return out;
|
|
18643
|
+
}
|
|
18644
|
+
/** Push one Annex-B NAL (start code + payload) onto `chunks`. */
|
|
18645
|
+
function pushNal(chunks, payload) {
|
|
18646
|
+
chunks.push(START_CODE, payload);
|
|
18647
|
+
}
|
|
18648
|
+
/**
|
|
18649
|
+
* Parse the `avcC` parameter sets (SPS then PPS), emitting each as an Annex-B
|
|
18650
|
+
* NAL. Layout after the 4-byte profile/level prefix: byte 4 low-2 = length
|
|
18651
|
+
* size; byte 5 low-5 = numSPS; then `[u16 len][SPS]…`; then `[u8 numPPS]`; then
|
|
18652
|
+
* `[u16 len][PPS]…`.
|
|
18653
|
+
*/
|
|
18654
|
+
function extractAvcParameterSets(desc) {
|
|
18655
|
+
const chunks = [];
|
|
18656
|
+
const numSps = desc[5] & 31;
|
|
18657
|
+
let p = 6;
|
|
18658
|
+
for (let i = 0; i < numSps; i++) {
|
|
18659
|
+
const len = readUint(desc, p, 2);
|
|
18660
|
+
p += 2;
|
|
18661
|
+
if (p + len > desc.length) throw new RangeError("avcC SPS length overruns config");
|
|
18662
|
+
pushNal(chunks, desc.subarray(p, p + len));
|
|
18663
|
+
p += len;
|
|
18664
|
+
}
|
|
18665
|
+
const numPps = readUint(desc, p, 1);
|
|
18666
|
+
p += 1;
|
|
18667
|
+
for (let i = 0; i < numPps; i++) {
|
|
18668
|
+
const len = readUint(desc, p, 2);
|
|
18669
|
+
p += 2;
|
|
18670
|
+
if (p + len > desc.length) throw new RangeError("avcC PPS length overruns config");
|
|
18671
|
+
pushNal(chunks, desc.subarray(p, p + len));
|
|
18672
|
+
p += len;
|
|
18673
|
+
}
|
|
18674
|
+
return chunks;
|
|
18675
|
+
}
|
|
18676
|
+
/**
|
|
18677
|
+
* Parse the `hvcC` parameter-set arrays (typically VPS, SPS, PPS in order),
|
|
18678
|
+
* emitting each contained NAL as Annex-B. Layout: byte 22 = numOfArrays; then
|
|
18679
|
+
* per array `[u8 flags+NALtype][u16 numNalus]` followed by `numNalus` ×
|
|
18680
|
+
* `[u16 len][NAL]`.
|
|
18681
|
+
*/
|
|
18682
|
+
function extractHevcParameterSets(desc) {
|
|
18683
|
+
const chunks = [];
|
|
18684
|
+
const numArrays = readUint(desc, 22, 1);
|
|
18685
|
+
let p = 23;
|
|
18686
|
+
for (let a = 0; a < numArrays; a++) {
|
|
18687
|
+
p += 1;
|
|
18688
|
+
const numNalus = readUint(desc, p, 2);
|
|
18689
|
+
p += 2;
|
|
18690
|
+
for (let n = 0; n < numNalus; n++) {
|
|
18691
|
+
const len = readUint(desc, p, 2);
|
|
18692
|
+
p += 2;
|
|
18693
|
+
if (p + len > desc.length) throw new RangeError("hvcC NAL length overruns config");
|
|
18694
|
+
pushNal(chunks, desc.subarray(p, p + len));
|
|
18695
|
+
p += len;
|
|
18696
|
+
}
|
|
18697
|
+
}
|
|
18698
|
+
return chunks;
|
|
18699
|
+
}
|
|
18700
|
+
/**
|
|
18701
|
+
* Parameter sets from the decoder config as one Annex-B blob (each NAL led by a
|
|
18702
|
+
* `00 00 00 01` start code): SPS+PPS for H.264, VPS+SPS+PPS (+ any hvcC arrays)
|
|
18703
|
+
* for H.265. Throws on a malformed config.
|
|
18704
|
+
*/
|
|
18705
|
+
function extractParameterSetsAnnexB(description, isHevc) {
|
|
18706
|
+
return concat$1(isHevc ? extractHevcParameterSets(description) : extractAvcParameterSets(description));
|
|
18707
|
+
}
|
|
18708
|
+
/**
|
|
18709
|
+
* Convert one length-prefixed (AVCC/HVCC) sample into Annex-B: walk each
|
|
18710
|
+
* `nalLengthSize`-byte length field, replacing it with a `00 00 00 01` start
|
|
18711
|
+
* code. Handles multi-NAL samples (multiple slices / SEI + VCL). Throws if a
|
|
18712
|
+
* length field overruns the sample.
|
|
18713
|
+
*/
|
|
18714
|
+
function avccSampleToAnnexB(sample, nalLengthSize) {
|
|
18715
|
+
const chunks = [];
|
|
18716
|
+
let p = 0;
|
|
18717
|
+
while (p + nalLengthSize <= sample.length) {
|
|
18718
|
+
const len = readUint(sample, p, nalLengthSize);
|
|
18719
|
+
p += nalLengthSize;
|
|
18720
|
+
if (len === 0) continue;
|
|
18721
|
+
if (p + len > sample.length) throw new RangeError("AVCC NAL length overruns sample");
|
|
18722
|
+
pushNal(chunks, sample.subarray(p, p + len));
|
|
18723
|
+
p += len;
|
|
18724
|
+
}
|
|
18725
|
+
if (chunks.length === 0) throw new RangeError("AVCC sample yielded no NALs");
|
|
18726
|
+
return concat$1(chunks);
|
|
18727
|
+
}
|
|
18728
|
+
/**
|
|
18729
|
+
* Build a standalone-decodable Annex-B keyframe access unit: the config's
|
|
18730
|
+
* parameter sets, then the sample's NALs, all Annex-B framed. Throws on
|
|
18731
|
+
* malformed input (caller falls back to the ffmpeg demux).
|
|
18732
|
+
*/
|
|
18733
|
+
function buildKeyframeAnnexB(sample, description, isHevc) {
|
|
18734
|
+
const nalLengthSize = parseNalLengthSize(description, isHevc);
|
|
18735
|
+
return concat$1([extractParameterSetsAnnexB(description, isHevc), avccSampleToAnnexB(sample, nalLengthSize)]);
|
|
18736
|
+
}
|
|
18007
18737
|
//#endregion
|
|
18008
18738
|
//#region src/stream-broker/recorded/ffmpeg-run-once.ts
|
|
18009
18739
|
/**
|
|
@@ -18272,7 +19002,7 @@ function demuxMpegTsToAnnexB(ts) {
|
|
|
18272
19002
|
let current = null;
|
|
18273
19003
|
const finalize = () => {
|
|
18274
19004
|
if (current === null) return;
|
|
18275
|
-
const pes = current.length === 1 ? current[0] : concat
|
|
19005
|
+
const pes = current.length === 1 ? current[0] : concat(current);
|
|
18276
19006
|
current = null;
|
|
18277
19007
|
const split = splitPes(pes);
|
|
18278
19008
|
if (split === null || split.es.length === 0) return;
|
|
@@ -18303,7 +19033,7 @@ function demuxMpegTsToAnnexB(ts) {
|
|
|
18303
19033
|
};
|
|
18304
19034
|
}
|
|
18305
19035
|
/** Concatenate TS payload fragments into one contiguous PES buffer. */
|
|
18306
|
-
function concat
|
|
19036
|
+
function concat(parts) {
|
|
18307
19037
|
let total = 0;
|
|
18308
19038
|
for (const p of parts) total += p.length;
|
|
18309
19039
|
const out = new Uint8Array(total);
|
|
@@ -18449,156 +19179,15 @@ async function demuxSegmentKeyframesToAnnexB(bytes, ffmpegPath = "ffmpeg") {
|
|
|
18449
19179
|
return keyframes.length > 0 ? keyframes : mapped.slice(0, 1);
|
|
18450
19180
|
}
|
|
18451
19181
|
//#endregion
|
|
18452
|
-
//#region src/stream-broker/recorded/avcc-annexb.ts
|
|
18453
|
-
/**
|
|
18454
|
-
* avcc-annexb — pure byte helpers to turn an ISO-BMFF (mp4) length-prefixed
|
|
18455
|
-
* video sample plus its `avcC`/`hvcC` decoder config into an Annex-B access
|
|
18456
|
-
* unit with the parameter sets prepended (SPS/PPS for H.264, VPS/SPS/PPS for
|
|
18457
|
-
* H.265).
|
|
18458
|
-
*
|
|
18459
|
-
* mp4 stores VCL NALs length-prefixed (AVCC/HVCC: a 1–4 byte big-endian length
|
|
18460
|
-
* field, `lengthSizeMinusOne+1`, before each NAL) and keeps the parameter sets
|
|
18461
|
-
* OUT of the samples, inside the `avcC`/`hvcC` box. A raw decoder / RTP
|
|
18462
|
-
* packetizer needs Annex-B start codes (`00 00 00 01`) AND the parameter sets
|
|
18463
|
-
* fused onto every IDR. These helpers do exactly that in JS — no ffmpeg, no
|
|
18464
|
-
* decode, byte copies only — so the feeder-scrub keyframe path can skip the
|
|
18465
|
-
* per-fragment ffmpeg spawn.
|
|
18466
|
-
*
|
|
18467
|
-
* All functions are pure and total for well-formed input; malformed config /
|
|
18468
|
-
* sample bytes throw a `RangeError` (the caller treats a throw as "fall back to
|
|
18469
|
-
* ffmpeg"). The `description` bytes are the box payload WITH the 8-byte box
|
|
18470
|
-
* header already stripped (i.e. starting at `configurationVersion`), matching
|
|
18471
|
-
* `mp4box`'s `avcC`/`hvcC` DataStream output minus header — see
|
|
18472
|
-
* `recorder/scrub/fmp4-keyframes.ts` `extractDescription`.
|
|
18473
|
-
*/
|
|
18474
|
-
/** Annex-B 4-byte start code prepended before every emitted NAL. */
|
|
18475
|
-
var START_CODE = Uint8Array.of(0, 0, 0, 1);
|
|
18476
|
-
/** Big-endian unsigned read of `size` (1..4) bytes at `off`. */
|
|
18477
|
-
function readUint(bytes, off, size) {
|
|
18478
|
-
if (off + size > bytes.length) throw new RangeError(`readUint out of range: off=${off} size=${size} len=${bytes.length}`);
|
|
18479
|
-
let v = 0;
|
|
18480
|
-
for (let i = 0; i < size; i++) v = v * 256 + bytes[off + i];
|
|
18481
|
-
return v;
|
|
18482
|
-
}
|
|
18483
|
-
/**
|
|
18484
|
-
* NAL length-prefix size in bytes (`lengthSizeMinusOne + 1`, 1..4) read from the
|
|
18485
|
-
* decoder config. `avcC` carries it at byte 4 (low 2 bits); `hvcC` at byte 21
|
|
18486
|
-
* (low 2 bits).
|
|
18487
|
-
*/
|
|
18488
|
-
function parseNalLengthSize(description, isHevc) {
|
|
18489
|
-
const idx = isHevc ? 21 : 4;
|
|
18490
|
-
if (description.length <= idx) throw new RangeError(`config too short for lengthSizeMinusOne (len=${description.length})`);
|
|
18491
|
-
return (description[idx] & 3) + 1;
|
|
18492
|
-
}
|
|
18493
|
-
/** Concatenate byte chunks into one Uint8Array. */
|
|
18494
|
-
function concat(chunks) {
|
|
18495
|
-
let total = 0;
|
|
18496
|
-
for (const c of chunks) total += c.length;
|
|
18497
|
-
const out = new Uint8Array(total);
|
|
18498
|
-
let off = 0;
|
|
18499
|
-
for (const c of chunks) {
|
|
18500
|
-
out.set(c, off);
|
|
18501
|
-
off += c.length;
|
|
18502
|
-
}
|
|
18503
|
-
return out;
|
|
18504
|
-
}
|
|
18505
|
-
/** Push one Annex-B NAL (start code + payload) onto `chunks`. */
|
|
18506
|
-
function pushNal(chunks, payload) {
|
|
18507
|
-
chunks.push(START_CODE, payload);
|
|
18508
|
-
}
|
|
18509
|
-
/**
|
|
18510
|
-
* Parse the `avcC` parameter sets (SPS then PPS), emitting each as an Annex-B
|
|
18511
|
-
* NAL. Layout after the 4-byte profile/level prefix: byte 4 low-2 = length
|
|
18512
|
-
* size; byte 5 low-5 = numSPS; then `[u16 len][SPS]…`; then `[u8 numPPS]`; then
|
|
18513
|
-
* `[u16 len][PPS]…`.
|
|
18514
|
-
*/
|
|
18515
|
-
function extractAvcParameterSets(desc) {
|
|
18516
|
-
const chunks = [];
|
|
18517
|
-
const numSps = desc[5] & 31;
|
|
18518
|
-
let p = 6;
|
|
18519
|
-
for (let i = 0; i < numSps; i++) {
|
|
18520
|
-
const len = readUint(desc, p, 2);
|
|
18521
|
-
p += 2;
|
|
18522
|
-
if (p + len > desc.length) throw new RangeError("avcC SPS length overruns config");
|
|
18523
|
-
pushNal(chunks, desc.subarray(p, p + len));
|
|
18524
|
-
p += len;
|
|
18525
|
-
}
|
|
18526
|
-
const numPps = readUint(desc, p, 1);
|
|
18527
|
-
p += 1;
|
|
18528
|
-
for (let i = 0; i < numPps; i++) {
|
|
18529
|
-
const len = readUint(desc, p, 2);
|
|
18530
|
-
p += 2;
|
|
18531
|
-
if (p + len > desc.length) throw new RangeError("avcC PPS length overruns config");
|
|
18532
|
-
pushNal(chunks, desc.subarray(p, p + len));
|
|
18533
|
-
p += len;
|
|
18534
|
-
}
|
|
18535
|
-
return chunks;
|
|
18536
|
-
}
|
|
18537
|
-
/**
|
|
18538
|
-
* Parse the `hvcC` parameter-set arrays (typically VPS, SPS, PPS in order),
|
|
18539
|
-
* emitting each contained NAL as Annex-B. Layout: byte 22 = numOfArrays; then
|
|
18540
|
-
* per array `[u8 flags+NALtype][u16 numNalus]` followed by `numNalus` ×
|
|
18541
|
-
* `[u16 len][NAL]`.
|
|
18542
|
-
*/
|
|
18543
|
-
function extractHevcParameterSets(desc) {
|
|
18544
|
-
const chunks = [];
|
|
18545
|
-
const numArrays = readUint(desc, 22, 1);
|
|
18546
|
-
let p = 23;
|
|
18547
|
-
for (let a = 0; a < numArrays; a++) {
|
|
18548
|
-
p += 1;
|
|
18549
|
-
const numNalus = readUint(desc, p, 2);
|
|
18550
|
-
p += 2;
|
|
18551
|
-
for (let n = 0; n < numNalus; n++) {
|
|
18552
|
-
const len = readUint(desc, p, 2);
|
|
18553
|
-
p += 2;
|
|
18554
|
-
if (p + len > desc.length) throw new RangeError("hvcC NAL length overruns config");
|
|
18555
|
-
pushNal(chunks, desc.subarray(p, p + len));
|
|
18556
|
-
p += len;
|
|
18557
|
-
}
|
|
18558
|
-
}
|
|
18559
|
-
return chunks;
|
|
18560
|
-
}
|
|
18561
|
-
/**
|
|
18562
|
-
* Parameter sets from the decoder config as one Annex-B blob (each NAL led by a
|
|
18563
|
-
* `00 00 00 01` start code): SPS+PPS for H.264, VPS+SPS+PPS (+ any hvcC arrays)
|
|
18564
|
-
* for H.265. Throws on a malformed config.
|
|
18565
|
-
*/
|
|
18566
|
-
function extractParameterSetsAnnexB(description, isHevc) {
|
|
18567
|
-
return concat(isHevc ? extractHevcParameterSets(description) : extractAvcParameterSets(description));
|
|
18568
|
-
}
|
|
18569
|
-
/**
|
|
18570
|
-
* Convert one length-prefixed (AVCC/HVCC) sample into Annex-B: walk each
|
|
18571
|
-
* `nalLengthSize`-byte length field, replacing it with a `00 00 00 01` start
|
|
18572
|
-
* code. Handles multi-NAL samples (multiple slices / SEI + VCL). Throws if a
|
|
18573
|
-
* length field overruns the sample.
|
|
18574
|
-
*/
|
|
18575
|
-
function avccSampleToAnnexB(sample, nalLengthSize) {
|
|
18576
|
-
const chunks = [];
|
|
18577
|
-
let p = 0;
|
|
18578
|
-
while (p + nalLengthSize <= sample.length) {
|
|
18579
|
-
const len = readUint(sample, p, nalLengthSize);
|
|
18580
|
-
p += nalLengthSize;
|
|
18581
|
-
if (len === 0) continue;
|
|
18582
|
-
if (p + len > sample.length) throw new RangeError("AVCC NAL length overruns sample");
|
|
18583
|
-
pushNal(chunks, sample.subarray(p, p + len));
|
|
18584
|
-
p += len;
|
|
18585
|
-
}
|
|
18586
|
-
if (chunks.length === 0) throw new RangeError("AVCC sample yielded no NALs");
|
|
18587
|
-
return concat(chunks);
|
|
18588
|
-
}
|
|
18589
|
-
/**
|
|
18590
|
-
* Build a standalone-decodable Annex-B keyframe access unit: the config's
|
|
18591
|
-
* parameter sets, then the sample's NALs, all Annex-B framed. Throws on
|
|
18592
|
-
* malformed input (caller falls back to the ffmpeg demux).
|
|
18593
|
-
*/
|
|
18594
|
-
function buildKeyframeAnnexB(sample, description, isHevc) {
|
|
18595
|
-
const nalLengthSize = parseNalLengthSize(description, isHevc);
|
|
18596
|
-
return concat([extractParameterSetsAnnexB(description, isHevc), avccSampleToAnnexB(sample, nalLengthSize)]);
|
|
18597
|
-
}
|
|
18598
|
-
//#endregion
|
|
18599
19182
|
//#region src/stream-broker/recorded/segment-demux-js.ts
|
|
18600
19183
|
/**
|
|
18601
|
-
* segment-demux-js — PURE-JS
|
|
19184
|
+
* segment-demux-js — PURE-JS in-process demux for recorded playback.
|
|
19185
|
+
*
|
|
19186
|
+
* Two flavours, both replacing a per-fragment ffmpeg spawn with an mp4box parse:
|
|
19187
|
+
* - {@link demuxSegmentKeyframesJs} / {@link demuxSegmentKeyframesPreferJs} —
|
|
19188
|
+
* KEYFRAME-only, for the feeder-scrub sub-mode.
|
|
19189
|
+
* - {@link demuxSegmentFullJs} / {@link demuxSegmentPreferJs} — FULL playback
|
|
19190
|
+
* (every access unit, sync + delta), the drop-in for `RecordedFeederDeps.demux`.
|
|
18602
19191
|
*
|
|
18603
19192
|
* Replaces the per-fragment ffmpeg spawn ({@link demuxSegmentKeyframesToAnnexB},
|
|
18604
19193
|
* a ~140 ms subprocess floor) with an in-process mp4box parse. A recorded `.m4s`
|
|
@@ -18659,6 +19248,52 @@ async function demuxSegmentKeyframesPreferJs(bytes, opts = {}) {
|
|
|
18659
19248
|
}
|
|
18660
19249
|
return demuxSegmentKeyframesToAnnexB(bytes, opts.ffmpegPath);
|
|
18661
19250
|
}
|
|
19251
|
+
/**
|
|
19252
|
+
* Pure-JS FULL-playback demux of one self-contained `.m4s` fragment: return
|
|
19253
|
+
* EVERY access unit (sync + delta) as params-fused Annex-B with segment-relative
|
|
19254
|
+
* `ptsMs`, matching the {@link AccessUnit} contract of {@link demuxSegmentToAnnexB}
|
|
19255
|
+
* (the ffmpeg mpegts path). Returns `null` if mp4box found no video / no
|
|
19256
|
+
* decodable sample (caller falls back to ffmpeg).
|
|
19257
|
+
*
|
|
19258
|
+
* Each sync sample is emitted through {@link buildKeyframeAnnexB} (parameter sets
|
|
19259
|
+
* fused ahead of the IDR — SPS/PPS for H.264, VPS/SPS/PPS for H.265); each delta
|
|
19260
|
+
* sample is emitted through {@link avccSampleToAnnexB} (its VCL NALs converted
|
|
19261
|
+
* from length-prefixed AVCC/HVCC to Annex-B, no parameter sets). `ptsMs` is the
|
|
19262
|
+
* sample composition time anchored to 0 at the first sample — the same
|
|
19263
|
+
* segment-relative timeline the ffmpeg PES-PTS path produces.
|
|
19264
|
+
*
|
|
19265
|
+
* Throws only on a genuinely malformed decoder config / sample; the wrapper
|
|
19266
|
+
* ({@link demuxSegmentPreferJs}) turns that into an ffmpeg fallback.
|
|
19267
|
+
*/
|
|
19268
|
+
async function demuxSegmentFullJs(bytes) {
|
|
19269
|
+
const extracted = await require_fmp4_keyframes.extractSamples(bytes, 0);
|
|
19270
|
+
if (!extracted || extracted.samples.length === 0) return null;
|
|
19271
|
+
const isHevc = isHevcCodec(extracted.codec);
|
|
19272
|
+
const codec = isHevc ? "H265" : "H264";
|
|
19273
|
+
const nalLengthSize = parseNalLengthSize(extracted.description, isHevc);
|
|
19274
|
+
return extracted.samples.map((s) => ({
|
|
19275
|
+
data: s.isSync ? buildKeyframeAnnexB(s.data, extracted.description, isHevc) : avccSampleToAnnexB(s.data, nalLengthSize),
|
|
19276
|
+
ptsMs: s.ts,
|
|
19277
|
+
keyframe: s.isSync,
|
|
19278
|
+
codec
|
|
19279
|
+
}));
|
|
19280
|
+
}
|
|
19281
|
+
/**
|
|
19282
|
+
* Feeder FULL-playback demux: try the pure-JS extractor first, fall back to the
|
|
19283
|
+
* ffmpeg spawn ({@link demuxSegmentToAnnexB}) if the JS parse yields no access
|
|
19284
|
+
* unit or throws on malformed bytes. Preserves the exact {@link AccessUnit}
|
|
19285
|
+
* contract either way, so it is a drop-in for `RecordedFeederDeps.demux`.
|
|
19286
|
+
*/
|
|
19287
|
+
async function demuxSegmentPreferJs(bytes, opts = {}) {
|
|
19288
|
+
try {
|
|
19289
|
+
const js = await demuxSegmentFullJs(bytes);
|
|
19290
|
+
if (js && js.length > 0) return js;
|
|
19291
|
+
opts.onJsFallback?.("mp4box parse found no access units");
|
|
19292
|
+
} catch (err) {
|
|
19293
|
+
opts.onJsFallback?.(`mp4box parse threw: ${String(err)}`);
|
|
19294
|
+
}
|
|
19295
|
+
return demuxSegmentToAnnexB(bytes, opts.ffmpegPath);
|
|
19296
|
+
}
|
|
18662
19297
|
//#endregion
|
|
18663
19298
|
//#region src/stream-broker/recorded/segment-audio.ts
|
|
18664
19299
|
/**
|
|
@@ -18743,6 +19378,147 @@ async function demuxSegmentToPcmu(bytes, ffmpegPath = "ffmpeg") {
|
|
|
18743
19378
|
return sliceMuLawToPcmuFrames(mulaw);
|
|
18744
19379
|
}
|
|
18745
19380
|
//#endregion
|
|
19381
|
+
//#region src/stream-broker/recorded/segment-audio-js.ts
|
|
19382
|
+
var import_mp4box_all = /* @__PURE__ */ require_chunk.__toESM(require_fmp4_keyframes.require_mp4box_all());
|
|
19383
|
+
/** True for an mp4box audio codec string that is Opus (`Opus`/`opus`). */
|
|
19384
|
+
function isOpusCodec(codec) {
|
|
19385
|
+
return /^opus$/i.test(codec);
|
|
19386
|
+
}
|
|
19387
|
+
/**
|
|
19388
|
+
* Phase 1: append the whole segment, flush, resolve the FIRST audio track when
|
|
19389
|
+
* `onReady` fires. Resolves null on any failure (no audio track, error, or
|
|
19390
|
+
* garbage bytes that never trigger a callback — a short timer settles those).
|
|
19391
|
+
* Mirrors `fmp4-keyframes.ts` `readTrack` but for the audio track.
|
|
19392
|
+
*/
|
|
19393
|
+
function readAudioTrack(file, segment) {
|
|
19394
|
+
return new Promise((resolve) => {
|
|
19395
|
+
let settled = false;
|
|
19396
|
+
const done = (v) => {
|
|
19397
|
+
if (settled) return;
|
|
19398
|
+
settled = true;
|
|
19399
|
+
clearTimeout(timer);
|
|
19400
|
+
resolve(v);
|
|
19401
|
+
};
|
|
19402
|
+
const timer = setTimeout(() => done(null), 250);
|
|
19403
|
+
file.onError = () => done(null);
|
|
19404
|
+
file.onReady = (info) => {
|
|
19405
|
+
const audio = info.audioTracks?.[0];
|
|
19406
|
+
if (!audio) return done(null);
|
|
19407
|
+
done({ audio });
|
|
19408
|
+
};
|
|
19409
|
+
const copy = segment.buffer.slice(segment.byteOffset, segment.byteOffset + segment.byteLength);
|
|
19410
|
+
copy.fileStart = 0;
|
|
19411
|
+
try {
|
|
19412
|
+
file.appendBuffer(copy);
|
|
19413
|
+
file.flush();
|
|
19414
|
+
} catch {
|
|
19415
|
+
done(null);
|
|
19416
|
+
}
|
|
19417
|
+
});
|
|
19418
|
+
}
|
|
19419
|
+
/**
|
|
19420
|
+
* Demux a recorded `.m4s` fragment's audio track and return its codec + all
|
|
19421
|
+
* access units, or null if the fragment carries no audio / no decodable sample.
|
|
19422
|
+
* Codec-agnostic: the caller decides what to do with a non-Opus codec.
|
|
19423
|
+
* No decode, no ffmpeg — byte copies only.
|
|
19424
|
+
*/
|
|
19425
|
+
async function extractAudioSamples(bytes) {
|
|
19426
|
+
const file = import_mp4box_all.createFile();
|
|
19427
|
+
const ready = await readAudioTrack(file, bytes);
|
|
19428
|
+
if (!ready) return null;
|
|
19429
|
+
const { audio } = ready;
|
|
19430
|
+
const collected = [];
|
|
19431
|
+
let firstCts = null;
|
|
19432
|
+
file.onSamples = (_id, _user, samples) => {
|
|
19433
|
+
for (const s of samples) {
|
|
19434
|
+
if (firstCts === null) firstCts = s.cts;
|
|
19435
|
+
const ptsMs = Math.round((s.cts - firstCts) / s.timescale * 1e3);
|
|
19436
|
+
collected.push({
|
|
19437
|
+
data: new Uint8Array(s.data),
|
|
19438
|
+
ptsMs
|
|
19439
|
+
});
|
|
19440
|
+
}
|
|
19441
|
+
};
|
|
19442
|
+
file.setExtractionOptions(audio.id, null, { nbSamples: 1e5 });
|
|
19443
|
+
try {
|
|
19444
|
+
file.start();
|
|
19445
|
+
} catch {
|
|
19446
|
+
return null;
|
|
19447
|
+
}
|
|
19448
|
+
if (collected.length === 0) return null;
|
|
19449
|
+
return {
|
|
19450
|
+
codec: audio.codec,
|
|
19451
|
+
sampleRate: audio.audio?.sample_rate ?? 0,
|
|
19452
|
+
channels: audio.audio?.channel_count ?? 0,
|
|
19453
|
+
accessUnits: collected
|
|
19454
|
+
};
|
|
19455
|
+
}
|
|
19456
|
+
/**
|
|
19457
|
+
* Pure-JS Opus audio demux of one fragment: return the fragment's Opus access
|
|
19458
|
+
* units, or `null` when the audio track is absent or NOT Opus (a legacy AAC
|
|
19459
|
+
* fragment → caller falls back to the ffmpeg AAC→Opus path). Throws only on a
|
|
19460
|
+
* genuinely malformed parse; the wrapper turns that into a fallback.
|
|
19461
|
+
*/
|
|
19462
|
+
async function demuxSegmentAudioOpusJs(bytes) {
|
|
19463
|
+
const extracted = await extractAudioSamples(bytes);
|
|
19464
|
+
if (!extracted || !isOpusCodec(extracted.codec)) return null;
|
|
19465
|
+
return extracted.accessUnits;
|
|
19466
|
+
}
|
|
19467
|
+
/**
|
|
19468
|
+
* ffmpeg args to transcode a fragment's audio (stdin) into a self-contained
|
|
19469
|
+
* fragmented-mp4 with an Opus track on stdout — the SAME container the recorder
|
|
19470
|
+
* writes (`ffmpeg-args.ts`), so {@link demuxSegmentAudioOpusJs} reads the result
|
|
19471
|
+
* back with no extra code. Used ONLY as the legacy-AAC fallback for Opus
|
|
19472
|
+
* sessions. `-vn` drops video; `-map 0:a:0` picks the audio track.
|
|
19473
|
+
*/
|
|
19474
|
+
var SEGMENT_AUDIO_OPUS_FFMPEG_ARGS = [
|
|
19475
|
+
"-hide_banner",
|
|
19476
|
+
"-loglevel",
|
|
19477
|
+
"error",
|
|
19478
|
+
"-i",
|
|
19479
|
+
"pipe:0",
|
|
19480
|
+
"-vn",
|
|
19481
|
+
"-map",
|
|
19482
|
+
"0:a:0",
|
|
19483
|
+
"-c:a",
|
|
19484
|
+
"libopus",
|
|
19485
|
+
"-b:a",
|
|
19486
|
+
"48k",
|
|
19487
|
+
"-f",
|
|
19488
|
+
"mp4",
|
|
19489
|
+
"-movflags",
|
|
19490
|
+
"+frag_keyframe+empty_moov+default_base_moof",
|
|
19491
|
+
"pipe:1"
|
|
19492
|
+
];
|
|
19493
|
+
/**
|
|
19494
|
+
* Opus-preferred recorded audio demux for Opus-negotiated sessions:
|
|
19495
|
+
* 1. Try the in-process Opus extraction (post-A1 fragments — NO ffmpeg).
|
|
19496
|
+
* 2. On a miss (legacy pre-A1 AAC fragment), transcode the fragment's audio
|
|
19497
|
+
* to an Opus fragmented-mp4 via ffmpeg and read THAT back in-process.
|
|
19498
|
+
* Returns `[]` (never throws) when there is no usable audio — recorded audio is
|
|
19499
|
+
* best-effort and must never block recorded video. Mirrors the video-side
|
|
19500
|
+
* `demuxSegmentPreferJs`.
|
|
19501
|
+
*/
|
|
19502
|
+
async function demuxSegmentAudioOpusPreferJs(bytes, opts = {}) {
|
|
19503
|
+
try {
|
|
19504
|
+
const direct = await demuxSegmentAudioOpusJs(bytes);
|
|
19505
|
+
if (direct) return direct;
|
|
19506
|
+
} catch {}
|
|
19507
|
+
opts.onFfmpegFallback?.("audio track is not Opus (legacy fragment)");
|
|
19508
|
+
try {
|
|
19509
|
+
const opusFmp4 = await runFfmpegOnce({
|
|
19510
|
+
ffmpegPath: opts.ffmpegPath ?? "ffmpeg",
|
|
19511
|
+
args: SEGMENT_AUDIO_OPUS_FFMPEG_ARGS,
|
|
19512
|
+
input: bytes,
|
|
19513
|
+
tolerateNonZeroExit: true
|
|
19514
|
+
});
|
|
19515
|
+
if (opusFmp4.length === 0) return [];
|
|
19516
|
+
return await demuxSegmentAudioOpusJs(opusFmp4) ?? [];
|
|
19517
|
+
} catch {
|
|
19518
|
+
return [];
|
|
19519
|
+
}
|
|
19520
|
+
}
|
|
19521
|
+
//#endregion
|
|
18746
19522
|
//#region src/stream-broker/webrtc/broker-webrtc-server.ts
|
|
18747
19523
|
/**
|
|
18748
19524
|
* Broker-integrated WebRTC server.
|
|
@@ -18766,6 +19542,14 @@ var ADAPTIVE_CONFIG = {
|
|
|
18766
19542
|
minTimeBetweenChangesMs: 6e4
|
|
18767
19543
|
};
|
|
18768
19544
|
/**
|
|
19545
|
+
* True when `broker` is an in-process StreamBroker exposing the Opus egress
|
|
19546
|
+
* controls. Uses `in` narrowing + `typeof` checks (no cast) so the returned
|
|
19547
|
+
* type predicate is sound.
|
|
19548
|
+
*/
|
|
19549
|
+
function supportsOpusEgress(broker) {
|
|
19550
|
+
return "acquireOpusEgress" in broker && typeof broker.acquireOpusEgress === "function" && "releaseOpusEgress" in broker && typeof broker.releaseOpusEgress === "function" && "makeOpusSilenceFrame" in broker && typeof broker.makeOpusSilenceFrame === "function";
|
|
19551
|
+
}
|
|
19552
|
+
/**
|
|
18769
19553
|
* Whether a WebRTC session for this broker must re-encode the source to
|
|
18770
19554
|
* Constrained Baseline H.264 so iOS (WebKit) can decode it. True only for
|
|
18771
19555
|
* an H.264 source whose profile-level-id is known AND non-Baseline
|
|
@@ -19352,16 +20136,34 @@ var BrokerWebrtcServer = class {
|
|
|
19352
20136
|
timestampMicros: packet.pts * 1e3
|
|
19353
20137
|
}
|
|
19354
20138
|
});
|
|
19355
|
-
} else if (packet.type === "audio")
|
|
19356
|
-
|
|
19357
|
-
|
|
19358
|
-
|
|
19359
|
-
|
|
19360
|
-
|
|
19361
|
-
|
|
19362
|
-
|
|
20139
|
+
} else if (packet.type === "audio") {
|
|
20140
|
+
const pktCodec = packet.codec?.toLowerCase();
|
|
20141
|
+
if (session?.isOpusAudio === true) {
|
|
20142
|
+
if (pktCodec !== "opus") return;
|
|
20143
|
+
pushFrame({
|
|
20144
|
+
type: "audio",
|
|
20145
|
+
frame: {
|
|
20146
|
+
data: packet.data,
|
|
20147
|
+
codec: "Opus",
|
|
20148
|
+
sampleRate: 48e3,
|
|
20149
|
+
channels: 2,
|
|
20150
|
+
timestampMicros: packet.pts * 1e3
|
|
20151
|
+
}
|
|
20152
|
+
});
|
|
20153
|
+
} else {
|
|
20154
|
+
if (pktCodec === "opus") return;
|
|
20155
|
+
pushFrame({
|
|
20156
|
+
type: "audio",
|
|
20157
|
+
frame: {
|
|
20158
|
+
data: packet.data,
|
|
20159
|
+
codec: pktCodec === "pcma" ? "Pcma" : "Pcmu",
|
|
20160
|
+
sampleRate: 8e3,
|
|
20161
|
+
channels: 1,
|
|
20162
|
+
timestampMicros: packet.pts * 1e3
|
|
20163
|
+
}
|
|
20164
|
+
});
|
|
19363
20165
|
}
|
|
19364
|
-
}
|
|
20166
|
+
}
|
|
19365
20167
|
}, annexbAttribution);
|
|
19366
20168
|
warmUpUnsubscribe?.();
|
|
19367
20169
|
const preBuffer = broker.getPreBuffer();
|
|
@@ -19534,46 +20336,84 @@ var BrokerWebrtcServer = class {
|
|
|
19534
20336
|
const readRecorded = this.readRecordedSegmentBytes;
|
|
19535
20337
|
const resolveFfmpeg = this.resolveFfmpegPath;
|
|
19536
20338
|
let scrubJsFallbackLogged = false;
|
|
20339
|
+
let fullJsFallbackLogged = false;
|
|
20340
|
+
let audioOpusFallbackLogged = false;
|
|
19537
20341
|
if (locateRecorded && readRecorded) {
|
|
19538
20342
|
let timeline;
|
|
19539
20343
|
timeline = new TimelineSession({
|
|
19540
20344
|
session,
|
|
19541
20345
|
deviceId,
|
|
19542
|
-
makeFeeder: (profile) =>
|
|
19543
|
-
|
|
19544
|
-
|
|
19545
|
-
|
|
19546
|
-
|
|
19547
|
-
|
|
19548
|
-
|
|
19549
|
-
|
|
19550
|
-
|
|
19551
|
-
|
|
19552
|
-
|
|
19553
|
-
|
|
20346
|
+
makeFeeder: (profile) => {
|
|
20347
|
+
const opusSession = session.isOpusAudio;
|
|
20348
|
+
return new RecordedFeeder({
|
|
20349
|
+
deviceId,
|
|
20350
|
+
profile,
|
|
20351
|
+
locate: locateRecorded,
|
|
20352
|
+
readBytes: readRecorded,
|
|
20353
|
+
demux: (b) => demuxSegmentPreferJs(b, {
|
|
20354
|
+
ffmpegPath: resolveFfmpeg?.(),
|
|
20355
|
+
onJsFallback: (reason) => {
|
|
20356
|
+
if (fullJsFallbackLogged) return;
|
|
20357
|
+
fullJsFallbackLogged = true;
|
|
20358
|
+
sessionLogger.warn("recorded playback: JS full demux failed — ffmpeg fallback (once/session)", { meta: {
|
|
20359
|
+
sessionId,
|
|
20360
|
+
deviceId,
|
|
20361
|
+
profile,
|
|
20362
|
+
reason
|
|
20363
|
+
} });
|
|
20364
|
+
}
|
|
20365
|
+
}),
|
|
20366
|
+
demuxScrub: (b) => demuxSegmentKeyframesPreferJs(b, {
|
|
20367
|
+
ffmpegPath: resolveFfmpeg?.(),
|
|
20368
|
+
onFfmpegFallback: (reason) => {
|
|
20369
|
+
if (scrubJsFallbackLogged) return;
|
|
20370
|
+
scrubJsFallbackLogged = true;
|
|
20371
|
+
sessionLogger.warn("recorded scrub: JS keyframe demux failed — ffmpeg fallback (once/session)", { meta: {
|
|
20372
|
+
sessionId,
|
|
20373
|
+
deviceId,
|
|
20374
|
+
profile,
|
|
20375
|
+
reason
|
|
20376
|
+
} });
|
|
20377
|
+
}
|
|
20378
|
+
}),
|
|
20379
|
+
demuxAudio: opusSession ? async (b) => {
|
|
20380
|
+
return (await demuxSegmentAudioOpusPreferJs(b, {
|
|
20381
|
+
ffmpegPath: resolveFfmpeg?.(),
|
|
20382
|
+
onFfmpegFallback: (reason) => {
|
|
20383
|
+
if (audioOpusFallbackLogged) return;
|
|
20384
|
+
audioOpusFallbackLogged = true;
|
|
20385
|
+
sessionLogger.warn("recorded audio: JS Opus demux missed — ffmpeg AAC→Opus fallback (once/session)", { meta: {
|
|
20386
|
+
sessionId,
|
|
20387
|
+
deviceId,
|
|
20388
|
+
profile,
|
|
20389
|
+
reason
|
|
20390
|
+
} });
|
|
20391
|
+
}
|
|
20392
|
+
})).map((au) => ({
|
|
20393
|
+
data: au.data,
|
|
20394
|
+
ptsMs: au.ptsMs
|
|
20395
|
+
}));
|
|
20396
|
+
} : (b) => demuxSegmentToPcmu(b, resolveFfmpeg?.()),
|
|
20397
|
+
audioClockRateHz: opusSession ? 48e3 : 8e3,
|
|
20398
|
+
sink: opusSession ? {
|
|
20399
|
+
pushAccessUnit: (data, ts, codec) => session.pushRecordedAccessUnit(data, ts, codec),
|
|
20400
|
+
pushAudioOpus: (opus, ts) => session.writeRecordedAudioOpus(Buffer.from(opus), ts)
|
|
20401
|
+
} : {
|
|
20402
|
+
pushAccessUnit: (data, ts, codec) => session.pushRecordedAccessUnit(data, ts, codec),
|
|
20403
|
+
pushAudioPcmu: (pcmu, ts) => session.writeRecordedAudio(Buffer.from(pcmu), ts)
|
|
20404
|
+
},
|
|
20405
|
+
onState: (s) => {
|
|
20406
|
+
sessionLogger.info("recorded: feeder state", { meta: {
|
|
19554
20407
|
sessionId,
|
|
19555
20408
|
deviceId,
|
|
19556
20409
|
profile,
|
|
19557
|
-
|
|
20410
|
+
state: s
|
|
19558
20411
|
} });
|
|
19559
|
-
|
|
19560
|
-
|
|
19561
|
-
|
|
19562
|
-
|
|
19563
|
-
|
|
19564
|
-
pushAudioPcmu: (pcmu, ts) => session.writeRecordedAudio(Buffer.from(pcmu), ts)
|
|
19565
|
-
},
|
|
19566
|
-
onState: (s) => {
|
|
19567
|
-
sessionLogger.info("recorded: feeder state", { meta: {
|
|
19568
|
-
sessionId,
|
|
19569
|
-
deviceId,
|
|
19570
|
-
profile,
|
|
19571
|
-
state: s
|
|
19572
|
-
} });
|
|
19573
|
-
timeline._emitState(s);
|
|
19574
|
-
},
|
|
19575
|
-
onPosition: (epochMs) => timeline._emitPosition(epochMs)
|
|
19576
|
-
})
|
|
20412
|
+
timeline._emitState(s);
|
|
20413
|
+
},
|
|
20414
|
+
onPosition: (epochMs) => timeline._emitPosition(epochMs)
|
|
20415
|
+
});
|
|
20416
|
+
}
|
|
19577
20417
|
});
|
|
19578
20418
|
sessionLogger.info("recorded: TimelineSession wired (control accessors present)", { meta: {
|
|
19579
20419
|
sessionId,
|
|
@@ -19597,6 +20437,13 @@ var BrokerWebrtcServer = class {
|
|
|
19597
20437
|
};
|
|
19598
20438
|
}
|
|
19599
20439
|
session.onConnected = () => {
|
|
20440
|
+
if (!entry.releaseOpusEgress && session.isOpusAudio && supportsOpusEgress(broker)) {
|
|
20441
|
+
broker.acquireOpusEgress();
|
|
20442
|
+
entry.releaseOpusEgress = () => broker.releaseOpusEgress();
|
|
20443
|
+
broker.makeOpusSilenceFrame(2).then((frame) => {
|
|
20444
|
+
if (frame) session.setOpusSilenceFrame(frame);
|
|
20445
|
+
}).catch(() => {});
|
|
20446
|
+
}
|
|
19600
20447
|
if (entry.attributionTagged) return;
|
|
19601
20448
|
let attempt = 0;
|
|
19602
20449
|
const tag = () => {
|
|
@@ -19795,6 +20642,8 @@ var BrokerWebrtcServer = class {
|
|
|
19795
20642
|
entry.unsubBroker();
|
|
19796
20643
|
entry.unsubRtp?.();
|
|
19797
20644
|
entry.unsubSdpParams?.();
|
|
20645
|
+
entry.releaseOpusEgress?.();
|
|
20646
|
+
entry.releaseOpusEgress = void 0;
|
|
19798
20647
|
entry.closeSource();
|
|
19799
20648
|
}
|
|
19800
20649
|
resolveBrokerId(streamId, hints = {}) {
|