From 10d035b868dfe7513807bb3ced15ca04c7c4f2dc Mon Sep 17 00:00:00 2001 From: David Colburn Date: Mon, 16 Mar 2026 22:43:29 +0800 Subject: [PATCH 01/15] egress v2 --- .github/workflows/slack-notifier.yaml | 2 +- protobufs/cloud_replay.proto | 38 +- protobufs/livekit_egress.proto | 658 +++++++++++++++++--------- protobufs/rpc/egress.proto | 14 +- 4 files changed, 477 insertions(+), 235 deletions(-) diff --git a/.github/workflows/slack-notifier.yaml b/.github/workflows/slack-notifier.yaml index 7770345bf..da4e22874 100644 --- a/.github/workflows/slack-notifier.yaml +++ b/.github/workflows/slack-notifier.yaml @@ -2,7 +2,7 @@ name: PR Slack Notifier on: pull_request: - types: [review_requested, reopened, closed] + types: [review_requested, reopened, closed, synchronize] pull_request_review: types: [submitted] diff --git a/protobufs/cloud_replay.proto b/protobufs/cloud_replay.proto index 705af0c5d..7de062ed3 100644 --- a/protobufs/cloud_replay.proto +++ b/protobufs/cloud_replay.proto @@ -1,3 +1,17 @@ +// Copyright 2026 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + syntax = "proto3"; package replay; @@ -7,17 +21,25 @@ option csharp_namespace = "LiveKit.Proto"; option ruby_package = "LiveKit::Proto"; import "google/protobuf/empty.proto"; +import "livekit_egress.proto"; import "livekit_models.proto"; import "logger/options.proto"; // Experimental (not currently available) service Replay { + // List replays rpc ListReplays(ListReplaysRequest) returns (ListReplaysResponse); - rpc DeleteReplay(DeleteReplayRequest) returns (google.protobuf.Empty); + // Playback controls rpc Playback(PlaybackRequest) returns (PlaybackResponse); rpc Seek(SeekRequest) returns (google.protobuf.Empty); rpc Close(ClosePlaybackRequest) returns (google.protobuf.Empty); + + // Export a stored replay using egress + rpc Export(livekit.ExportReplayRequest) returns (livekit.EgressInfo); + + // Delete all stored data + rpc DeleteReplay(DeleteReplayRequest) returns (google.protobuf.Empty); } message ListReplaysRequest { @@ -34,17 +56,13 @@ message ReplayInfo { string replay_id = 1 [(logger.name) = "replayID"]; string room_name = 2; int64 start_time = 3; - int64 duration = 4; -} - -message DeleteReplayRequest { - string replay_id = 1 [(logger.name) = "replayID"]; + int64 duration_ms = 4; } message PlaybackRequest { string replay_id = 1 [(logger.name) = "replayID"]; string playback_room = 2; // name of room to play into - int64 seek_offset = 3; // initial timestamp (ms) + int64 seek_offset_ms = 3; // initial timestamp (ms) } message PlaybackResponse { @@ -53,9 +71,13 @@ message PlaybackResponse { message SeekRequest { string playback_id = 1 [(logger.name) = "playbackID"]; - int64 seek_offset = 2; // timestamp (ms) + int64 seek_offset_ms = 2; // timestamp (ms) } message ClosePlaybackRequest { string playback_id = 1 [(logger.name) = "playbackID"]; } + +message DeleteReplayRequest { + string replay_id = 1 [(logger.name) = "replayID"]; +} diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index 2651a5921..ab09c289b 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -24,133 +24,181 @@ option csharp_namespace = "LiveKit.Proto"; option ruby_package = "LiveKit::Proto"; service Egress { - // start recording or streaming a room, participant, or tracks - rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo); - rpc StartWebEgress(WebEgressRequest) returns (EgressInfo); - rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo); - rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo); - rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo); + // Unified StartEgress RPC + rpc StartEgress(StartEgressRequest) returns (EgressInfo); - // update web composite layout - rpc UpdateLayout(UpdateLayoutRequest) returns (EgressInfo); + // Update url/template or stream outputs + rpc UpdateEgress(UpdateEgressRequest) returns (EgressInfo); - // add or remove stream endpoints - rpc UpdateStream(UpdateStreamRequest) returns (EgressInfo); - - // list available egress + // List available egress rpc ListEgress(ListEgressRequest) returns (ListEgressResponse); - // stop a recording or stream + // Stop a recording or stream rpc StopEgress(StopEgressRequest) returns (EgressInfo); + + // --- Deprecated --- + rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo) { option deprecated = true; }; + rpc StartWebEgress(WebEgressRequest) returns (EgressInfo) { option deprecated = true; }; + rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo) { option deprecated = true; }; + rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo) { option deprecated = true; }; + rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo) { option deprecated = true; }; + rpc UpdateLayout(UpdateLayoutRequest) returns (EgressInfo) { option deprecated = true; }; + rpc UpdateStream(UpdateStreamRequest) returns (EgressInfo) { option deprecated = true; }; } -// composite using a web browser -message RoomCompositeEgressRequest { - string room_name = 1; // required - string layout = 2; // (optional) - bool audio_only = 3; // (default false) - AudioMixing audio_mixing = 15; // only applies to audio_only egress (default DEFAULT_MIXING) - bool video_only = 4; // (default false) - string custom_base_url = 5; // template base url (default https://recorder.livekit.io) - oneof output { // deprecated (use _output fields) - EncodedFileOutput file = 6 [deprecated = true]; - StreamOutput stream = 7 [deprecated = true]; - SegmentedFileOutput segments = 10 [deprecated = true]; +// --- Core Request --- + +message StartEgressRequest { + string room_name = 1; + + oneof source { + TemplateSource template = 2; + WebSource web = 3; + MediaSource media = 4; } - oneof options { - EncodingOptionsPreset preset = 8; // (default H264_720P_30) - EncodingOptions advanced = 9; // (optional) + + // Optional — default H264_720P_30 + oneof encoding { + EncodingOptionsPreset preset = 5; + EncodingOptions advanced = 6; } - repeated EncodedFileOutput file_outputs = 11; - repeated StreamOutput stream_outputs = 12; - repeated SegmentedFileOutput segment_outputs = 13; - repeated ImageOutput image_outputs = 14; - repeated WebhookConfig webhooks = 16; // extra webhooks to call for this request + // At least one required + repeated Output outputs = 7; + + // Request-level storage default + StorageConfig storage = 8; - // NEXT_ID: 17 + // Optional additional webhook config + repeated WebhookConfig webhooks = 9; } -// record any website -message WebEgressRequest { +// --- Source Types --- + +// Room composite recording via layout template. +// Service generates token, constructs recorder URL, awaits start signal. +message TemplateSource { + string layout = 1; + bool audio_only = 2; + bool video_only = 3; + string custom_base_url = 4; +} + +// Record a custom URL via headless browser. +message WebSource { string url = 1; bool audio_only = 2; bool video_only = 3; - bool await_start_signal = 12; - oneof output { // deprecated (use _output fields) - EncodedFileOutput file = 4 [deprecated = true]; - StreamOutput stream = 5 [deprecated = true]; - SegmentedFileOutput segments = 6 [deprecated = true]; - } - oneof options { - EncodingOptionsPreset preset = 7; - EncodingOptions advanced = 8; + bool await_start_signal = 4; +} + +// Capture tracks directly from a room via SDK. +// Unifies deprecated Participant, TrackComposite, and Track egress. +message MediaSource { + oneof video { + string video_track_id = 1 [(logger.name) = "videoTrackID"]; + ParticipantVideo participant_video = 2; } - repeated EncodedFileOutput file_outputs = 9; - repeated StreamOutput stream_outputs = 10; - repeated SegmentedFileOutput segment_outputs = 11; - repeated ImageOutput image_outputs = 13; - repeated WebhookConfig webhooks = 14; // extra webhooks to call for this request + AudioConfig audio = 3; + DataConfig data = 4; +} - // NEXT_ID: 15 +message ParticipantVideo { + string identity = 1; + bool prefer_screen_share = 2; } -// record audio and video from a single participant -message ParticipantEgressRequest { - string room_name = 1; // required - string identity = 2; // required - bool screen_share = 3; // (default false) - oneof options { - EncodingOptionsPreset preset = 4; // (default H264_720P_30) - EncodingOptions advanced = 5; // (optional) +// --- Audio Configuration --- + +// Unified audio selection and channel routing. +// Each route specifies both which audio to capture and which channel to output to. +message AudioConfig { + // If empty, all audio captured in both channels. + // If non-empty, only matching audio is captured and routed. Unmatched is excluded. + repeated AudioRoute routes = 1; +} + +message AudioRoute { + oneof match { + string track_id = 1 [(logger.name) = "trackID"]; + string participant_identity = 2; + ParticipantInfo.Kind participant_kind = 3; } - repeated EncodedFileOutput file_outputs = 6; - repeated StreamOutput stream_outputs = 7; - repeated SegmentedFileOutput segment_outputs = 8; - repeated ImageOutput image_outputs = 9; + AudioChannel channel = 4; +} + +enum AudioChannel { + AUDIO_CHANNEL_BOTH = 0; + AUDIO_CHANNEL_LEFT = 1; + AUDIO_CHANNEL_RIGHT = 2; +} - repeated WebhookConfig webhooks = 10; // extra webhooks to call for this request +// --- Data Track Configuration --- - // NEXT_ID: 11 +message DataConfig { + // If empty, all data tracks captured. + // If non-empty, only matching data tracks are captured. + repeated DataSelector selectors = 1; } -// containerize up to one audio and one video track -message TrackCompositeEgressRequest { - string room_name = 1; // required - string audio_track_id = 2 [(logger.name) = "audioTrackID"]; // (optional) - string video_track_id = 3 [(logger.name) = "videoTrackID"]; // (optional) - oneof output { // deprecated (use _output fields) - EncodedFileOutput file = 4 [deprecated = true]; - StreamOutput stream = 5 [deprecated = true]; - SegmentedFileOutput segments = 8 [deprecated = true]; - } - oneof options { - EncodingOptionsPreset preset = 6; // (default H264_720P_30) - EncodingOptions advanced = 7; // (optional) +message DataSelector { + oneof match { + string track_id = 1 [(logger.name) = "trackID"]; + string participant_identity = 2; + string topic = 3; } - repeated EncodedFileOutput file_outputs = 11; - repeated StreamOutput stream_outputs = 12; - repeated SegmentedFileOutput segment_outputs = 13; - repeated ImageOutput image_outputs = 14; +} - repeated WebhookConfig webhooks = 15; // extra webhooks to call for this request +// --- Encoding --- - // NEXT_ID: 16 +enum EncodingOptionsPreset { + H264_720P_30 = 0; // 1280x720, 30fps, 3000kpbs, H.264_MAIN / OPUS + H264_720P_60 = 1; // 1280x720, 60fps, 4500kbps, H.264_MAIN / OPUS + H264_1080P_30 = 2; // 1920x1080, 30fps, 4500kbps, H.264_MAIN / OPUS + H264_1080P_60 = 3; // 1920x1080, 60fps, 6000kbps, H.264_MAIN / OPUS + PORTRAIT_H264_720P_30 = 4; // 720x1280, 30fps, 3000kpbs, H.264_MAIN / OPUS + PORTRAIT_H264_720P_60 = 5; // 720x1280, 60fps, 4500kbps, H.264_MAIN / OPUS + PORTRAIT_H264_1080P_30 = 6; // 1080x1920, 30fps, 4500kbps, H.264_MAIN / OPUS + PORTRAIT_H264_1080P_60 = 7; // 1080x1920, 60fps, 6000kbps, H.264_MAIN / OPUS } -// record tracks individually, without transcoding -message TrackEgressRequest { - string room_name = 1; // required - string track_id = 2 [(logger.name) = "trackID"]; // required - oneof output { // required - DirectFileOutput file = 3; - string websocket_url = 4; +message EncodingOptions { + int32 width = 1; // (default 1920) + int32 height = 2; // (default 1080) + int32 depth = 3; // (default 24) + int32 framerate = 4; // (default 30) + AudioCodec audio_codec = 5; // (default OPUS) + int32 audio_bitrate = 6; // (default 128) + int32 audio_quality = 11; // quality setting on audio encoder + int32 audio_frequency = 7; // (default 44100) + VideoCodec video_codec = 8; // (default H264_MAIN) + int32 video_bitrate = 9; // (default 4500) + int32 video_quality = 12; // quality setting on video encoder + double key_frame_interval = 10; // in seconds (default 4s for streaming, segment duration for segmented output, encoder default for files) +} + +// --- Output Types --- + +message Output { + oneof config { + FileOutput file = 1; + StreamOutput stream = 2; // reuses v1 StreamOutput + SegmentedFileOutput segments = 3; // reuses v1 SegmentedFileOutput + ImageOutput images = 4; // reuses v1 ImageOutput + McapOutput mcap = 5; } - repeated WebhookConfig webhooks = 5; // extra webhooks to call for this request + // Per-output storage override (falls back to request, then server) + StorageConfig storage = 6; +} - // NEXT_ID: 6 +// Unified file output — replaces v1 EncodedFileOutput and DirectFileOutput. +// Whether transcoded depends on encoding options on the request. +message FileOutput { + EncodedFileType file_type = 1; + string filepath = 2; + bool disable_manifest = 3; } enum EncodedFileType { @@ -160,26 +208,16 @@ enum EncodedFileType { MP3 = 3; } -message EncodedFileOutput { - EncodedFileType file_type = 1; // (optional) - string filepath = 2; // see egress docs for templating (default {room_name}-{time}) - bool disable_manifest = 6; // disable upload of manifest file (default false) - oneof output { - S3Upload s3 = 3; - GCPUpload gcp = 4; - AzureBlobUpload azure = 5; - AliOSSUpload aliOSS = 7; - } -} - -enum SegmentedFileProtocol { - DEFAULT_SEGMENTED_FILE_PROTOCOL = 0; - HLS_PROTOCOL = 1; +message StreamOutput { + StreamProtocol protocol = 1; // required + repeated string urls = 2; // required } -enum SegmentedFileSuffix { - INDEX = 0; - TIMESTAMP = 1; +enum StreamProtocol { + DEFAULT_PROTOCOL = 0; // protocol chosen based on urls + RTMP = 1; + SRT = 2; + WEBSOCKET = 3; } // Used to generate HLS segments or other kind of segmented output @@ -191,31 +229,27 @@ message SegmentedFileOutput { uint32 segment_duration = 4; // in seconds (optional) SegmentedFileSuffix filename_suffix = 10; // (optional, default INDEX) bool disable_manifest = 8; // disable upload of manifest file (default false) - oneof output { // required - S3Upload s3 = 5; - GCPUpload gcp = 6; - AzureBlobUpload azure = 7; - AliOSSUpload aliOSS = 9; - } -} -message DirectFileOutput { - string filepath = 1; // see egress docs for templating (default {track_id}-{time}) - bool disable_manifest = 5; // disable upload of manifest file (default false) + // --- Deprecated --- oneof output { - S3Upload s3 = 2; - GCPUpload gcp = 3; - AzureBlobUpload azure = 4; - AliOSSUpload aliOSS = 6; + S3Upload s3 = 5 [deprecated = true]; + GCPUpload gcp = 6 [deprecated = true]; + AzureBlobUpload azure = 7 [deprecated = true]; + AliOSSUpload aliOSS = 9 [deprecated = true]; } } -enum ImageFileSuffix { - IMAGE_SUFFIX_INDEX = 0; - IMAGE_SUFFIX_TIMESTAMP = 1; - IMAGE_SUFFIX_NONE_OVERWRITE = 2; // Do not append any suffix and overwrite the existing image with the latest +enum SegmentedFileProtocol { + DEFAULT_SEGMENTED_FILE_PROTOCOL = 0; + HLS_PROTOCOL = 1; +} + +enum SegmentedFileSuffix { + INDEX = 0; + TIMESTAMP = 1; } +// Capture images at a specified interval message ImageOutput { uint32 capture_interval = 1; // in seconds (required) int32 width = 2; // (optional, defaults to track width) @@ -224,11 +258,36 @@ message ImageOutput { ImageFileSuffix filename_suffix = 5; // (optional, default INDEX) ImageCodec image_codec = 6; // (optional) bool disable_manifest = 7; // disable upload of manifest file (default false) - oneof output { // required - S3Upload s3 = 8; - GCPUpload gcp = 9; - AzureBlobUpload azure = 10; - AliOSSUpload aliOSS = 11; + + // --- Deprecated --- + oneof output { + S3Upload s3 = 8 [deprecated = true]; + GCPUpload gcp = 9 [deprecated = true]; + AzureBlobUpload azure = 10 [deprecated = true]; + AliOSSUpload aliOSS = 11 [deprecated = true]; + } +} + +enum ImageFileSuffix { + IMAGE_SUFFIX_INDEX = 0; + IMAGE_SUFFIX_TIMESTAMP = 1; + IMAGE_SUFFIX_NONE_OVERWRITE = 2; // Do not append any suffix and overwrite the existing image with the latest +} + +// Raw track data packaged into MCAP container format. +message McapOutput { + string filepath = 1; + bool disable_manifest = 2; +} + +// --- Storage --- + +message StorageConfig { + oneof provider { + S3Upload s3 = 1; + GCPUpload gcp = 2; + AzureBlobUpload azure = 3; + AliOSSUpload ali_oss = 4; } } @@ -236,7 +295,7 @@ message S3Upload { string access_key = 1 [(logger.redact) = true]; string secret = 2 [(logger.redact) = true]; string session_token = 11 [(logger.redact) = true]; - string assume_role_arn = 12 [(logger.redact) = true]; // ARN of the role to assume for file upload. Egress will make an AssumeRole API call using the provided access_key and secret to assume that role. On LiveKit cloud, this is only available on accounts that have the feature enabled + string assume_role_arn = 12 [(logger.redact) = true]; // ARN of the role to assume for file upload. Egress will make an AssumeRole API call using the provided access_key and secret to assume that role. On LiveKit cloud, this is only available on accounts that have the feature enabled string assume_role_external_id = 13 [(logger.redact) = true, (logger.name) = "assumeRoleExternalID"]; // ExternalID to use when assuming role for upload string region = 3; string endpoint = 4; @@ -274,129 +333,95 @@ message AliOSSUpload { message ProxyConfig { string url = 1; string username = 2; - string password = 3; + string password = 3 [(logger.redact) = true]; } -enum StreamProtocol { - DEFAULT_PROTOCOL = 0; // protocol chosen based on urls - RTMP = 1; - SRT = 2; -} - -message StreamOutput { - StreamProtocol protocol = 1; // required - repeated string urls = 2; // required -} - -enum AudioMixing { - DEFAULT_MIXING = 0; // all users are mixed together - DUAL_CHANNEL_AGENT = 1; // agent audio in the left channel, all other audio in the right channel - DUAL_CHANNEL_ALTERNATE = 2; // each new audio track alternates between left and right channels -} - -message EncodingOptions { - int32 width = 1; // (default 1920) - int32 height = 2; // (default 1080) - int32 depth = 3; // (default 24) - int32 framerate = 4; // (default 30) - AudioCodec audio_codec = 5; // (default OPUS) - int32 audio_bitrate = 6; // (default 128) - int32 audio_quality = 11; // quality setting on audio encoder - int32 audio_frequency = 7; // (default 44100) - VideoCodec video_codec = 8; // (default H264_MAIN) - int32 video_bitrate = 9; // (default 4500) - int32 video_quality = 12; // quality setting on video encoder - double key_frame_interval = 10; // in seconds (default 4s for streaming, segment duration for segmented output, encoder default for files) -} - -enum EncodingOptionsPreset { - H264_720P_30 = 0; // 1280x720, 30fps, 3000kpbs, H.264_MAIN / OPUS - H264_720P_60 = 1; // 1280x720, 60fps, 4500kbps, H.264_MAIN / OPUS - H264_1080P_30 = 2; // 1920x1080, 30fps, 4500kbps, H.264_MAIN / OPUS - H264_1080P_60 = 3; // 1920x1080, 60fps, 6000kbps, H.264_MAIN / OPUS - PORTRAIT_H264_720P_30 = 4; // 720x1280, 30fps, 3000kpbs, H.264_MAIN / OPUS - PORTRAIT_H264_720P_60 = 5; // 720x1280, 60fps, 4500kbps, H.264_MAIN / OPUS - PORTRAIT_H264_1080P_30 = 6; // 1080x1920, 30fps, 4500kbps, H.264_MAIN / OPUS - PORTRAIT_H264_1080P_60 = 7; // 1080x1920, 60fps, 6000kbps, H.264_MAIN / OPUS -} - -message UpdateLayoutRequest { - string egress_id = 1 [(logger.name) = "egressID"]; - string layout = 2; -} - -message UpdateStreamRequest { - string egress_id = 1 [(logger.name) = "egressID"]; - repeated string add_output_urls = 2; - repeated string remove_output_urls = 3; -} +// --- Control RPCs --- message ListEgressRequest { - string room_name = 1; // (optional, filter by room name) + string room_name = 1; // (optional, filter by room name) string egress_id = 2 [(logger.name) = "egressID"]; // (optional, filter by egress ID) - bool active = 3; // (optional, list active egress only) + bool active = 3; // (optional, list active egress only) } message ListEgressResponse { repeated EgressInfo items = 1; } -message StopEgressRequest { +message UpdateEgressRequest { string egress_id = 1 [(logger.name) = "egressID"]; + string url = 2; + string layout = 3; + repeated string add_stream_urls = 4; + repeated string remove_stream_urls = 5; } -enum EgressStatus { - EGRESS_STARTING = 0; - EGRESS_ACTIVE = 1; - EGRESS_ENDING = 2; - EGRESS_COMPLETE = 3; - EGRESS_FAILED = 4; - EGRESS_ABORTED = 5; - EGRESS_LIMIT_REACHED = 6; +message StopEgressRequest { + string egress_id = 1 [(logger.name) = "egressID"]; } -enum EgressSourceType { - EGRESS_SOURCE_TYPE_WEB = 0; - EGRESS_SOURCE_TYPE_SDK = 1; -} +// --- Egress Info --- message EgressInfo { string egress_id = 1 [(logger.name) = "egressID"]; string room_id = 2 [(logger.name) = "roomID"]; string room_name = 13; + EgressSourceType source_type = 26; EgressStatus status = 3; + int64 started_at = 10; int64 ended_at = 11; int64 updated_at = 18; - string details = 21; - string error = 9; - int32 error_code = 22; + oneof request { - RoomCompositeEgressRequest room_composite = 4; - WebEgressRequest web = 14; - ParticipantEgressRequest participant = 19; - TrackCompositeEgressRequest track_composite = 5; - TrackEgressRequest track = 6; - } - oneof result { // deprecated (use _result fields) - StreamInfoList stream = 7 [deprecated = true]; - FileInfo file = 8 [deprecated = true]; - SegmentsInfo segments = 12 [deprecated = true]; + StartEgressRequest egress = 29; + ExportReplayRequest replay = 30; + + RoomCompositeEgressRequest room_composite = 4 [deprecated = true]; + WebEgressRequest web = 14 [deprecated = true]; + ParticipantEgressRequest participant = 19 [deprecated = true]; + TrackCompositeEgressRequest track_composite = 5 [deprecated = true]; + TrackEgressRequest track = 6 [deprecated = true]; } + repeated StreamInfo stream_results = 15; repeated FileInfo file_results = 16; repeated SegmentsInfo segment_results = 17; repeated ImagesInfo image_results = 20; + repeated McapInfo mcap_results = 28; + + string error = 9; + int32 error_code = 22; + string details = 21; + string manifest_location = 23; bool backup_storage_used = 25; int32 retry_count = 27; - // next ID: 28 + + // next ID: 31 + + // --- Deprecated --- + oneof result { + StreamInfoList stream = 7 [deprecated = true]; + FileInfo file = 8 [deprecated = true]; + SegmentsInfo segments = 12 [deprecated = true]; + } } -message StreamInfoList { - option deprecated = true; - repeated StreamInfo info = 1; +enum EgressSourceType { + EGRESS_SOURCE_TYPE_WEB = 0; + EGRESS_SOURCE_TYPE_SDK = 1; +} + +enum EgressStatus { + EGRESS_STARTING = 0; + EGRESS_ACTIVE = 1; + EGRESS_ENDING = 2; + EGRESS_COMPLETE = 3; + EGRESS_FAILED = 4; + EGRESS_ABORTED = 5; + EGRESS_LIMIT_REACHED = 6; } message StreamInfo { @@ -444,6 +469,18 @@ message ImagesInfo { int64 ended_at = 3; } +message McapInfo { + string filename = 1; + int64 started_at = 2; + int64 ended_at = 3; + int64 duration = 4; + int64 size = 5; + string location = 6; + int64 track_count = 7; +} + +// --- Auto Egress --- + message AutoParticipantEgress { oneof options { EncodingOptionsPreset preset = 1; // (default H264_720P_30) @@ -463,3 +500,182 @@ message AutoTrackEgress { AliOSSUpload aliOSS = 6; } } + +// --- Replay Export (message only — RPC defined in cloud_replay.proto) --- + +message ExportReplayRequest { + string replay_id = 1 [(logger.name) = "replayID"]; + int64 start_offset_ms = 2; + int64 end_offset_ms = 3; + + oneof source { + TemplateSource template = 4; + WebSource web = 5; + MediaSource media = 6; + } + + oneof encoding { + EncodingOptionsPreset preset = 7; + EncodingOptions advanced = 8; + } + + repeated Output outputs = 9; + StorageConfig storage = 10; + repeated WebhookConfig webhooks = 11; +} + +// --- Deprecated --- + +message RoomCompositeEgressRequest { + option deprecated = true; + + string room_name = 1; + string layout = 2; + bool audio_only = 3; + AudioMixing audio_mixing = 15; + bool video_only = 4; + string custom_base_url = 5; + oneof output { + EncodedFileOutput file = 6 [deprecated = true]; + StreamOutput stream = 7 [deprecated = true]; + SegmentedFileOutput segments = 10 [deprecated = true]; + } + oneof options { + EncodingOptionsPreset preset = 8; + EncodingOptions advanced = 9; + } + repeated EncodedFileOutput file_outputs = 11; + repeated StreamOutput stream_outputs = 12; + repeated SegmentedFileOutput segment_outputs = 13; + repeated ImageOutput image_outputs = 14; + repeated WebhookConfig webhooks = 16; +} + +enum AudioMixing { + DEFAULT_MIXING = 0; + DUAL_CHANNEL_AGENT = 1; + DUAL_CHANNEL_ALTERNATE = 2; +} + +message WebEgressRequest { + option deprecated = true; + + string url = 1; + bool audio_only = 2; + bool video_only = 3; + bool await_start_signal = 12; + oneof output { + EncodedFileOutput file = 4 [deprecated = true]; + StreamOutput stream = 5 [deprecated = true]; + SegmentedFileOutput segments = 6 [deprecated = true]; + } + oneof options { + EncodingOptionsPreset preset = 7; + EncodingOptions advanced = 8; + } + repeated EncodedFileOutput file_outputs = 9; + repeated StreamOutput stream_outputs = 10; + repeated SegmentedFileOutput segment_outputs = 11; + repeated ImageOutput image_outputs = 13; + repeated WebhookConfig webhooks = 14; +} + +// record audio and video from a single participant +message ParticipantEgressRequest { + option deprecated = true; + + string room_name = 1; + string identity = 2; + bool screen_share = 3; + oneof options { + EncodingOptionsPreset preset = 4; + EncodingOptions advanced = 5; + } + repeated EncodedFileOutput file_outputs = 6; + repeated StreamOutput stream_outputs = 7; + repeated SegmentedFileOutput segment_outputs = 8; + repeated ImageOutput image_outputs = 9; + repeated WebhookConfig webhooks = 10; +} + +message TrackCompositeEgressRequest { + option deprecated = true; + + string room_name = 1; + string audio_track_id = 2 [(logger.name) = "audioTrackID"]; + string video_track_id = 3 [(logger.name) = "videoTrackID"]; + oneof output { + EncodedFileOutput file = 4 [deprecated = true]; + StreamOutput stream = 5 [deprecated = true]; + SegmentedFileOutput segments = 8 [deprecated = true]; + } + oneof options { + EncodingOptionsPreset preset = 6; + EncodingOptions advanced = 7; + } + repeated EncodedFileOutput file_outputs = 11; + repeated StreamOutput stream_outputs = 12; + repeated SegmentedFileOutput segment_outputs = 13; + repeated ImageOutput image_outputs = 14; + repeated WebhookConfig webhooks = 15; +} + +message TrackEgressRequest { + option deprecated = true; + + string room_name = 1; + string track_id = 2 [(logger.name) = "trackID"]; + oneof output { + DirectFileOutput file = 3; + string websocket_url = 4; + } + repeated WebhookConfig webhooks = 5; +} + +message DirectFileOutput { + option deprecated = true; + + string filepath = 1; + bool disable_manifest = 5; + oneof output { + S3Upload s3 = 2; + GCPUpload gcp = 3; + AzureBlobUpload azure = 4; + AliOSSUpload aliOSS = 6; + } +} + +message EncodedFileOutput { + option deprecated = true; + + EncodedFileType file_type = 1; + string filepath = 2; + bool disable_manifest = 6; + oneof output { + S3Upload s3 = 3; + GCPUpload gcp = 4; + AzureBlobUpload azure = 5; + AliOSSUpload aliOSS = 7; + } +} + +message UpdateLayoutRequest { + option deprecated = true; + + string egress_id = 1 [(logger.name) = "egressID"]; + string layout = 2; +} + +message UpdateStreamRequest { + option deprecated = true; + + string egress_id = 1 [(logger.name) = "egressID"]; + repeated string add_output_urls = 2; + repeated string remove_output_urls = 3; +} + +message StreamInfoList { + option deprecated = true; + + repeated StreamInfo info = 1; +} diff --git a/protobufs/rpc/egress.proto b/protobufs/rpc/egress.proto index 8ce476711..8eabe7ee3 100644 --- a/protobufs/rpc/egress.proto +++ b/protobufs/rpc/egress.proto @@ -48,11 +48,15 @@ message StartEgressRequest { // request oneof request { - livekit.RoomCompositeEgressRequest room_composite = 5; - livekit.WebEgressRequest web = 11; - livekit.ParticipantEgressRequest participant = 13; - livekit.TrackCompositeEgressRequest track_composite = 6; - livekit.TrackEgressRequest track = 7; + livekit.StartEgressRequest egress = 16; + livekit.ExportReplayRequest replay = 17; + + // --- deprecated --- + livekit.RoomCompositeEgressRequest room_composite = 5 [deprecated = true]; + livekit.WebEgressRequest web = 11 [deprecated = true]; + livekit.ParticipantEgressRequest participant = 13 [deprecated = true]; + livekit.TrackCompositeEgressRequest track_composite = 6 [deprecated = true]; + livekit.TrackEgressRequest track = 7 [deprecated = true]; } // connection info From b8653abda65d36e1727090d3ad56c2b851be52fd Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:11:32 +0000 Subject: [PATCH 02/15] generated protobuf --- livekit/livekit_egress.pb.go | 5504 +++++++++++++++++++++---------- livekit/livekit_egress.twirp.go | 1907 +++++++---- replay/cloud_replay.pb.go | 240 +- replay/cloud_replay.twirp.go | 731 ++-- rpc/egress.pb.go | 118 +- rpc/egress.psrpc.go | 81 +- 6 files changed, 5705 insertions(+), 2876 deletions(-) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index 1bc0c4d4a..ddab641d6 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -36,6 +36,119 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type AudioChannel int32 + +const ( + AudioChannel_AUDIO_CHANNEL_BOTH AudioChannel = 0 + AudioChannel_AUDIO_CHANNEL_LEFT AudioChannel = 1 + AudioChannel_AUDIO_CHANNEL_RIGHT AudioChannel = 2 +) + +// Enum value maps for AudioChannel. +var ( + AudioChannel_name = map[int32]string{ + 0: "AUDIO_CHANNEL_BOTH", + 1: "AUDIO_CHANNEL_LEFT", + 2: "AUDIO_CHANNEL_RIGHT", + } + AudioChannel_value = map[string]int32{ + "AUDIO_CHANNEL_BOTH": 0, + "AUDIO_CHANNEL_LEFT": 1, + "AUDIO_CHANNEL_RIGHT": 2, + } +) + +func (x AudioChannel) Enum() *AudioChannel { + p := new(AudioChannel) + *p = x + return p +} + +func (x AudioChannel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AudioChannel) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_egress_proto_enumTypes[0].Descriptor() +} + +func (AudioChannel) Type() protoreflect.EnumType { + return &file_livekit_egress_proto_enumTypes[0] +} + +func (x AudioChannel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AudioChannel.Descriptor instead. +func (AudioChannel) EnumDescriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{0} +} + +type EncodingOptionsPreset int32 + +const ( + EncodingOptionsPreset_H264_720P_30 EncodingOptionsPreset = 0 // 1280x720, 30fps, 3000kpbs, H.264_MAIN / OPUS + EncodingOptionsPreset_H264_720P_60 EncodingOptionsPreset = 1 // 1280x720, 60fps, 4500kbps, H.264_MAIN / OPUS + EncodingOptionsPreset_H264_1080P_30 EncodingOptionsPreset = 2 // 1920x1080, 30fps, 4500kbps, H.264_MAIN / OPUS + EncodingOptionsPreset_H264_1080P_60 EncodingOptionsPreset = 3 // 1920x1080, 60fps, 6000kbps, H.264_MAIN / OPUS + EncodingOptionsPreset_PORTRAIT_H264_720P_30 EncodingOptionsPreset = 4 // 720x1280, 30fps, 3000kpbs, H.264_MAIN / OPUS + EncodingOptionsPreset_PORTRAIT_H264_720P_60 EncodingOptionsPreset = 5 // 720x1280, 60fps, 4500kbps, H.264_MAIN / OPUS + EncodingOptionsPreset_PORTRAIT_H264_1080P_30 EncodingOptionsPreset = 6 // 1080x1920, 30fps, 4500kbps, H.264_MAIN / OPUS + EncodingOptionsPreset_PORTRAIT_H264_1080P_60 EncodingOptionsPreset = 7 // 1080x1920, 60fps, 6000kbps, H.264_MAIN / OPUS +) + +// Enum value maps for EncodingOptionsPreset. +var ( + EncodingOptionsPreset_name = map[int32]string{ + 0: "H264_720P_30", + 1: "H264_720P_60", + 2: "H264_1080P_30", + 3: "H264_1080P_60", + 4: "PORTRAIT_H264_720P_30", + 5: "PORTRAIT_H264_720P_60", + 6: "PORTRAIT_H264_1080P_30", + 7: "PORTRAIT_H264_1080P_60", + } + EncodingOptionsPreset_value = map[string]int32{ + "H264_720P_30": 0, + "H264_720P_60": 1, + "H264_1080P_30": 2, + "H264_1080P_60": 3, + "PORTRAIT_H264_720P_30": 4, + "PORTRAIT_H264_720P_60": 5, + "PORTRAIT_H264_1080P_30": 6, + "PORTRAIT_H264_1080P_60": 7, + } +) + +func (x EncodingOptionsPreset) Enum() *EncodingOptionsPreset { + p := new(EncodingOptionsPreset) + *p = x + return p +} + +func (x EncodingOptionsPreset) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EncodingOptionsPreset) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_egress_proto_enumTypes[1].Descriptor() +} + +func (EncodingOptionsPreset) Type() protoreflect.EnumType { + return &file_livekit_egress_proto_enumTypes[1] +} + +func (x EncodingOptionsPreset) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EncodingOptionsPreset.Descriptor instead. +func (EncodingOptionsPreset) EnumDescriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{1} +} + type EncodedFileType int32 const ( @@ -72,11 +185,11 @@ func (x EncodedFileType) String() string { } func (EncodedFileType) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[0].Descriptor() + return file_livekit_egress_proto_enumTypes[2].Descriptor() } func (EncodedFileType) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[0] + return &file_livekit_egress_proto_enumTypes[2] } func (x EncodedFileType) Number() protoreflect.EnumNumber { @@ -85,7 +198,59 @@ func (x EncodedFileType) Number() protoreflect.EnumNumber { // Deprecated: Use EncodedFileType.Descriptor instead. func (EncodedFileType) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{0} + return file_livekit_egress_proto_rawDescGZIP(), []int{2} +} + +type StreamProtocol int32 + +const ( + StreamProtocol_DEFAULT_PROTOCOL StreamProtocol = 0 // protocol chosen based on urls + StreamProtocol_RTMP StreamProtocol = 1 + StreamProtocol_SRT StreamProtocol = 2 + StreamProtocol_WEBSOCKET StreamProtocol = 3 +) + +// Enum value maps for StreamProtocol. +var ( + StreamProtocol_name = map[int32]string{ + 0: "DEFAULT_PROTOCOL", + 1: "RTMP", + 2: "SRT", + 3: "WEBSOCKET", + } + StreamProtocol_value = map[string]int32{ + "DEFAULT_PROTOCOL": 0, + "RTMP": 1, + "SRT": 2, + "WEBSOCKET": 3, + } +) + +func (x StreamProtocol) Enum() *StreamProtocol { + p := new(StreamProtocol) + *p = x + return p +} + +func (x StreamProtocol) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StreamProtocol) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_egress_proto_enumTypes[3].Descriptor() +} + +func (StreamProtocol) Type() protoreflect.EnumType { + return &file_livekit_egress_proto_enumTypes[3] +} + +func (x StreamProtocol) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StreamProtocol.Descriptor instead. +func (StreamProtocol) EnumDescriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{3} } type SegmentedFileProtocol int32 @@ -118,11 +283,11 @@ func (x SegmentedFileProtocol) String() string { } func (SegmentedFileProtocol) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[1].Descriptor() + return file_livekit_egress_proto_enumTypes[4].Descriptor() } func (SegmentedFileProtocol) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[1] + return &file_livekit_egress_proto_enumTypes[4] } func (x SegmentedFileProtocol) Number() protoreflect.EnumNumber { @@ -131,7 +296,7 @@ func (x SegmentedFileProtocol) Number() protoreflect.EnumNumber { // Deprecated: Use SegmentedFileProtocol.Descriptor instead. func (SegmentedFileProtocol) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{1} + return file_livekit_egress_proto_rawDescGZIP(), []int{4} } type SegmentedFileSuffix int32 @@ -164,11 +329,11 @@ func (x SegmentedFileSuffix) String() string { } func (SegmentedFileSuffix) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[2].Descriptor() + return file_livekit_egress_proto_enumTypes[5].Descriptor() } func (SegmentedFileSuffix) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[2] + return &file_livekit_egress_proto_enumTypes[5] } func (x SegmentedFileSuffix) Number() protoreflect.EnumNumber { @@ -177,7 +342,7 @@ func (x SegmentedFileSuffix) Number() protoreflect.EnumNumber { // Deprecated: Use SegmentedFileSuffix.Descriptor instead. func (SegmentedFileSuffix) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{2} + return file_livekit_egress_proto_rawDescGZIP(), []int{5} } type ImageFileSuffix int32 @@ -213,11 +378,11 @@ func (x ImageFileSuffix) String() string { } func (ImageFileSuffix) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[3].Descriptor() + return file_livekit_egress_proto_enumTypes[6].Descriptor() } func (ImageFileSuffix) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[3] + return &file_livekit_egress_proto_enumTypes[6] } func (x ImageFileSuffix) Number() protoreflect.EnumNumber { @@ -226,221 +391,105 @@ func (x ImageFileSuffix) Number() protoreflect.EnumNumber { // Deprecated: Use ImageFileSuffix.Descriptor instead. func (ImageFileSuffix) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{3} + return file_livekit_egress_proto_rawDescGZIP(), []int{6} } -type StreamProtocol int32 +type EgressSourceType int32 const ( - StreamProtocol_DEFAULT_PROTOCOL StreamProtocol = 0 // protocol chosen based on urls - StreamProtocol_RTMP StreamProtocol = 1 - StreamProtocol_SRT StreamProtocol = 2 + EgressSourceType_EGRESS_SOURCE_TYPE_WEB EgressSourceType = 0 + EgressSourceType_EGRESS_SOURCE_TYPE_SDK EgressSourceType = 1 ) -// Enum value maps for StreamProtocol. +// Enum value maps for EgressSourceType. var ( - StreamProtocol_name = map[int32]string{ - 0: "DEFAULT_PROTOCOL", - 1: "RTMP", - 2: "SRT", + EgressSourceType_name = map[int32]string{ + 0: "EGRESS_SOURCE_TYPE_WEB", + 1: "EGRESS_SOURCE_TYPE_SDK", } - StreamProtocol_value = map[string]int32{ - "DEFAULT_PROTOCOL": 0, - "RTMP": 1, - "SRT": 2, + EgressSourceType_value = map[string]int32{ + "EGRESS_SOURCE_TYPE_WEB": 0, + "EGRESS_SOURCE_TYPE_SDK": 1, } ) -func (x StreamProtocol) Enum() *StreamProtocol { - p := new(StreamProtocol) +func (x EgressSourceType) Enum() *EgressSourceType { + p := new(EgressSourceType) *p = x return p } -func (x StreamProtocol) String() string { +func (x EgressSourceType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (StreamProtocol) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[4].Descriptor() +func (EgressSourceType) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_egress_proto_enumTypes[7].Descriptor() } -func (StreamProtocol) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[4] +func (EgressSourceType) Type() protoreflect.EnumType { + return &file_livekit_egress_proto_enumTypes[7] } -func (x StreamProtocol) Number() protoreflect.EnumNumber { +func (x EgressSourceType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use StreamProtocol.Descriptor instead. -func (StreamProtocol) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{4} +// Deprecated: Use EgressSourceType.Descriptor instead. +func (EgressSourceType) EnumDescriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{7} } -type AudioMixing int32 +type EgressStatus int32 const ( - AudioMixing_DEFAULT_MIXING AudioMixing = 0 // all users are mixed together - AudioMixing_DUAL_CHANNEL_AGENT AudioMixing = 1 // agent audio in the left channel, all other audio in the right channel - AudioMixing_DUAL_CHANNEL_ALTERNATE AudioMixing = 2 // each new audio track alternates between left and right channels + EgressStatus_EGRESS_STARTING EgressStatus = 0 + EgressStatus_EGRESS_ACTIVE EgressStatus = 1 + EgressStatus_EGRESS_ENDING EgressStatus = 2 + EgressStatus_EGRESS_COMPLETE EgressStatus = 3 + EgressStatus_EGRESS_FAILED EgressStatus = 4 + EgressStatus_EGRESS_ABORTED EgressStatus = 5 + EgressStatus_EGRESS_LIMIT_REACHED EgressStatus = 6 ) -// Enum value maps for AudioMixing. +// Enum value maps for EgressStatus. var ( - AudioMixing_name = map[int32]string{ - 0: "DEFAULT_MIXING", - 1: "DUAL_CHANNEL_AGENT", - 2: "DUAL_CHANNEL_ALTERNATE", + EgressStatus_name = map[int32]string{ + 0: "EGRESS_STARTING", + 1: "EGRESS_ACTIVE", + 2: "EGRESS_ENDING", + 3: "EGRESS_COMPLETE", + 4: "EGRESS_FAILED", + 5: "EGRESS_ABORTED", + 6: "EGRESS_LIMIT_REACHED", } - AudioMixing_value = map[string]int32{ - "DEFAULT_MIXING": 0, - "DUAL_CHANNEL_AGENT": 1, - "DUAL_CHANNEL_ALTERNATE": 2, + EgressStatus_value = map[string]int32{ + "EGRESS_STARTING": 0, + "EGRESS_ACTIVE": 1, + "EGRESS_ENDING": 2, + "EGRESS_COMPLETE": 3, + "EGRESS_FAILED": 4, + "EGRESS_ABORTED": 5, + "EGRESS_LIMIT_REACHED": 6, } ) -func (x AudioMixing) Enum() *AudioMixing { - p := new(AudioMixing) +func (x EgressStatus) Enum() *EgressStatus { + p := new(EgressStatus) *p = x return p } -func (x AudioMixing) String() string { +func (x EgressStatus) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (AudioMixing) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[5].Descriptor() -} - -func (AudioMixing) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[5] -} - -func (x AudioMixing) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use AudioMixing.Descriptor instead. -func (AudioMixing) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{5} -} - -type EncodingOptionsPreset int32 - -const ( - EncodingOptionsPreset_H264_720P_30 EncodingOptionsPreset = 0 // 1280x720, 30fps, 3000kpbs, H.264_MAIN / OPUS - EncodingOptionsPreset_H264_720P_60 EncodingOptionsPreset = 1 // 1280x720, 60fps, 4500kbps, H.264_MAIN / OPUS - EncodingOptionsPreset_H264_1080P_30 EncodingOptionsPreset = 2 // 1920x1080, 30fps, 4500kbps, H.264_MAIN / OPUS - EncodingOptionsPreset_H264_1080P_60 EncodingOptionsPreset = 3 // 1920x1080, 60fps, 6000kbps, H.264_MAIN / OPUS - EncodingOptionsPreset_PORTRAIT_H264_720P_30 EncodingOptionsPreset = 4 // 720x1280, 30fps, 3000kpbs, H.264_MAIN / OPUS - EncodingOptionsPreset_PORTRAIT_H264_720P_60 EncodingOptionsPreset = 5 // 720x1280, 60fps, 4500kbps, H.264_MAIN / OPUS - EncodingOptionsPreset_PORTRAIT_H264_1080P_30 EncodingOptionsPreset = 6 // 1080x1920, 30fps, 4500kbps, H.264_MAIN / OPUS - EncodingOptionsPreset_PORTRAIT_H264_1080P_60 EncodingOptionsPreset = 7 // 1080x1920, 60fps, 6000kbps, H.264_MAIN / OPUS -) - -// Enum value maps for EncodingOptionsPreset. -var ( - EncodingOptionsPreset_name = map[int32]string{ - 0: "H264_720P_30", - 1: "H264_720P_60", - 2: "H264_1080P_30", - 3: "H264_1080P_60", - 4: "PORTRAIT_H264_720P_30", - 5: "PORTRAIT_H264_720P_60", - 6: "PORTRAIT_H264_1080P_30", - 7: "PORTRAIT_H264_1080P_60", - } - EncodingOptionsPreset_value = map[string]int32{ - "H264_720P_30": 0, - "H264_720P_60": 1, - "H264_1080P_30": 2, - "H264_1080P_60": 3, - "PORTRAIT_H264_720P_30": 4, - "PORTRAIT_H264_720P_60": 5, - "PORTRAIT_H264_1080P_30": 6, - "PORTRAIT_H264_1080P_60": 7, - } -) - -func (x EncodingOptionsPreset) Enum() *EncodingOptionsPreset { - p := new(EncodingOptionsPreset) - *p = x - return p -} - -func (x EncodingOptionsPreset) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (EncodingOptionsPreset) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[6].Descriptor() -} - -func (EncodingOptionsPreset) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[6] -} - -func (x EncodingOptionsPreset) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use EncodingOptionsPreset.Descriptor instead. -func (EncodingOptionsPreset) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{6} -} - -type EgressStatus int32 - -const ( - EgressStatus_EGRESS_STARTING EgressStatus = 0 - EgressStatus_EGRESS_ACTIVE EgressStatus = 1 - EgressStatus_EGRESS_ENDING EgressStatus = 2 - EgressStatus_EGRESS_COMPLETE EgressStatus = 3 - EgressStatus_EGRESS_FAILED EgressStatus = 4 - EgressStatus_EGRESS_ABORTED EgressStatus = 5 - EgressStatus_EGRESS_LIMIT_REACHED EgressStatus = 6 -) - -// Enum value maps for EgressStatus. -var ( - EgressStatus_name = map[int32]string{ - 0: "EGRESS_STARTING", - 1: "EGRESS_ACTIVE", - 2: "EGRESS_ENDING", - 3: "EGRESS_COMPLETE", - 4: "EGRESS_FAILED", - 5: "EGRESS_ABORTED", - 6: "EGRESS_LIMIT_REACHED", - } - EgressStatus_value = map[string]int32{ - "EGRESS_STARTING": 0, - "EGRESS_ACTIVE": 1, - "EGRESS_ENDING": 2, - "EGRESS_COMPLETE": 3, - "EGRESS_FAILED": 4, - "EGRESS_ABORTED": 5, - "EGRESS_LIMIT_REACHED": 6, - } -) - -func (x EgressStatus) Enum() *EgressStatus { - p := new(EgressStatus) - *p = x - return p -} - -func (x EgressStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (EgressStatus) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[7].Descriptor() +func (EgressStatus) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_egress_proto_enumTypes[8].Descriptor() } func (EgressStatus) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[7] + return &file_livekit_egress_proto_enumTypes[8] } func (x EgressStatus) Number() protoreflect.EnumNumber { @@ -449,53 +498,56 @@ func (x EgressStatus) Number() protoreflect.EnumNumber { // Deprecated: Use EgressStatus.Descriptor instead. func (EgressStatus) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{7} + return file_livekit_egress_proto_rawDescGZIP(), []int{8} } -type EgressSourceType int32 +type AudioMixing int32 const ( - EgressSourceType_EGRESS_SOURCE_TYPE_WEB EgressSourceType = 0 - EgressSourceType_EGRESS_SOURCE_TYPE_SDK EgressSourceType = 1 + AudioMixing_DEFAULT_MIXING AudioMixing = 0 + AudioMixing_DUAL_CHANNEL_AGENT AudioMixing = 1 + AudioMixing_DUAL_CHANNEL_ALTERNATE AudioMixing = 2 ) -// Enum value maps for EgressSourceType. +// Enum value maps for AudioMixing. var ( - EgressSourceType_name = map[int32]string{ - 0: "EGRESS_SOURCE_TYPE_WEB", - 1: "EGRESS_SOURCE_TYPE_SDK", + AudioMixing_name = map[int32]string{ + 0: "DEFAULT_MIXING", + 1: "DUAL_CHANNEL_AGENT", + 2: "DUAL_CHANNEL_ALTERNATE", } - EgressSourceType_value = map[string]int32{ - "EGRESS_SOURCE_TYPE_WEB": 0, - "EGRESS_SOURCE_TYPE_SDK": 1, + AudioMixing_value = map[string]int32{ + "DEFAULT_MIXING": 0, + "DUAL_CHANNEL_AGENT": 1, + "DUAL_CHANNEL_ALTERNATE": 2, } ) -func (x EgressSourceType) Enum() *EgressSourceType { - p := new(EgressSourceType) +func (x AudioMixing) Enum() *AudioMixing { + p := new(AudioMixing) *p = x return p } -func (x EgressSourceType) String() string { +func (x AudioMixing) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (EgressSourceType) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[8].Descriptor() +func (AudioMixing) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_egress_proto_enumTypes[9].Descriptor() } -func (EgressSourceType) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[8] +func (AudioMixing) Type() protoreflect.EnumType { + return &file_livekit_egress_proto_enumTypes[9] } -func (x EgressSourceType) Number() protoreflect.EnumNumber { +func (x AudioMixing) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use EgressSourceType.Descriptor instead. -func (EgressSourceType) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{8} +// Deprecated: Use AudioMixing.Descriptor instead. +func (AudioMixing) EnumDescriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{9} } type StreamInfo_Status int32 @@ -531,11 +583,11 @@ func (x StreamInfo_Status) String() string { } func (StreamInfo_Status) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_egress_proto_enumTypes[9].Descriptor() + return file_livekit_egress_proto_enumTypes[10].Descriptor() } func (StreamInfo_Status) Type() protoreflect.EnumType { - return &file_livekit_egress_proto_enumTypes[9] + return &file_livekit_egress_proto_enumTypes[10] } func (x StreamInfo_Status) Number() protoreflect.EnumNumber { @@ -544,52 +596,49 @@ func (x StreamInfo_Status) Number() protoreflect.EnumNumber { // Deprecated: Use StreamInfo_Status.Descriptor instead. func (StreamInfo_Status) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{23, 0} + return file_livekit_egress_proto_rawDescGZIP(), []int{27, 0} } -// composite using a web browser -type RoomCompositeEgressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // required - Layout string `protobuf:"bytes,2,opt,name=layout,proto3" json:"layout,omitempty"` // (optional) - AudioOnly bool `protobuf:"varint,3,opt,name=audio_only,json=audioOnly,proto3" json:"audio_only,omitempty"` // (default false) - AudioMixing AudioMixing `protobuf:"varint,15,opt,name=audio_mixing,json=audioMixing,proto3,enum=livekit.AudioMixing" json:"audio_mixing,omitempty"` // only applies to audio_only egress (default DEFAULT_MIXING) - VideoOnly bool `protobuf:"varint,4,opt,name=video_only,json=videoOnly,proto3" json:"video_only,omitempty"` // (default false) - CustomBaseUrl string `protobuf:"bytes,5,opt,name=custom_base_url,json=customBaseUrl,proto3" json:"custom_base_url,omitempty"` // template base url (default https://recorder.livekit.io) - // Types that are valid to be assigned to Output: +type StartEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` + // Types that are valid to be assigned to Source: // - // *RoomCompositeEgressRequest_File - // *RoomCompositeEgressRequest_Stream - // *RoomCompositeEgressRequest_Segments - Output isRoomCompositeEgressRequest_Output `protobuf_oneof:"output"` - // Types that are valid to be assigned to Options: + // *StartEgressRequest_Template + // *StartEgressRequest_Web + // *StartEgressRequest_Media + Source isStartEgressRequest_Source `protobuf_oneof:"source"` + // Optional — default H264_720P_30 // - // *RoomCompositeEgressRequest_Preset - // *RoomCompositeEgressRequest_Advanced - Options isRoomCompositeEgressRequest_Options `protobuf_oneof:"options"` - FileOutputs []*EncodedFileOutput `protobuf:"bytes,11,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` - StreamOutputs []*StreamOutput `protobuf:"bytes,12,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` - SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,13,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` - ImageOutputs []*ImageOutput `protobuf:"bytes,14,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` - Webhooks []*WebhookConfig `protobuf:"bytes,16,rep,name=webhooks,proto3" json:"webhooks,omitempty"` // extra webhooks to call for this request - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Types that are valid to be assigned to Encoding: + // + // *StartEgressRequest_Preset + // *StartEgressRequest_Advanced + Encoding isStartEgressRequest_Encoding `protobuf_oneof:"encoding"` + // At least one required + Outputs []*Output `protobuf:"bytes,7,rep,name=outputs,proto3" json:"outputs,omitempty"` + // Request-level storage default + Storage *StorageConfig `protobuf:"bytes,8,opt,name=storage,proto3" json:"storage,omitempty"` + // Optional additional webhook config + Webhooks []*WebhookConfig `protobuf:"bytes,9,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *RoomCompositeEgressRequest) Reset() { - *x = RoomCompositeEgressRequest{} +func (x *StartEgressRequest) Reset() { + *x = StartEgressRequest{} mi := &file_livekit_egress_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RoomCompositeEgressRequest) String() string { +func (x *StartEgressRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoomCompositeEgressRequest) ProtoMessage() {} +func (*StartEgressRequest) ProtoMessage() {} -func (x *RoomCompositeEgressRequest) ProtoReflect() protoreflect.Message { +func (x *StartEgressRequest) ProtoReflect() protoreflect.Message { mi := &file_livekit_egress_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -601,233 +650,232 @@ func (x *RoomCompositeEgressRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoomCompositeEgressRequest.ProtoReflect.Descriptor instead. -func (*RoomCompositeEgressRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use StartEgressRequest.ProtoReflect.Descriptor instead. +func (*StartEgressRequest) Descriptor() ([]byte, []int) { return file_livekit_egress_proto_rawDescGZIP(), []int{0} } -func (x *RoomCompositeEgressRequest) GetRoomName() string { +func (x *StartEgressRequest) GetRoomName() string { if x != nil { return x.RoomName } return "" } -func (x *RoomCompositeEgressRequest) GetLayout() string { +func (x *StartEgressRequest) GetSource() isStartEgressRequest_Source { if x != nil { - return x.Layout + return x.Source } - return "" + return nil } -func (x *RoomCompositeEgressRequest) GetAudioOnly() bool { +func (x *StartEgressRequest) GetTemplate() *TemplateSource { if x != nil { - return x.AudioOnly + if x, ok := x.Source.(*StartEgressRequest_Template); ok { + return x.Template + } } - return false + return nil } -func (x *RoomCompositeEgressRequest) GetAudioMixing() AudioMixing { +func (x *StartEgressRequest) GetWeb() *WebSource { if x != nil { - return x.AudioMixing + if x, ok := x.Source.(*StartEgressRequest_Web); ok { + return x.Web + } } - return AudioMixing_DEFAULT_MIXING + return nil } -func (x *RoomCompositeEgressRequest) GetVideoOnly() bool { +func (x *StartEgressRequest) GetMedia() *MediaSource { if x != nil { - return x.VideoOnly + if x, ok := x.Source.(*StartEgressRequest_Media); ok { + return x.Media + } } - return false + return nil } -func (x *RoomCompositeEgressRequest) GetCustomBaseUrl() string { +func (x *StartEgressRequest) GetEncoding() isStartEgressRequest_Encoding { if x != nil { - return x.CustomBaseUrl + return x.Encoding } - return "" + return nil } -func (x *RoomCompositeEgressRequest) GetOutput() isRoomCompositeEgressRequest_Output { +func (x *StartEgressRequest) GetPreset() EncodingOptionsPreset { if x != nil { - return x.Output + if x, ok := x.Encoding.(*StartEgressRequest_Preset); ok { + return x.Preset + } } - return nil + return EncodingOptionsPreset_H264_720P_30 } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *RoomCompositeEgressRequest) GetFile() *EncodedFileOutput { +func (x *StartEgressRequest) GetAdvanced() *EncodingOptions { if x != nil { - if x, ok := x.Output.(*RoomCompositeEgressRequest_File); ok { - return x.File + if x, ok := x.Encoding.(*StartEgressRequest_Advanced); ok { + return x.Advanced } } return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *RoomCompositeEgressRequest) GetStream() *StreamOutput { +func (x *StartEgressRequest) GetOutputs() []*Output { if x != nil { - if x, ok := x.Output.(*RoomCompositeEgressRequest_Stream); ok { - return x.Stream - } + return x.Outputs } return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *RoomCompositeEgressRequest) GetSegments() *SegmentedFileOutput { +func (x *StartEgressRequest) GetStorage() *StorageConfig { if x != nil { - if x, ok := x.Output.(*RoomCompositeEgressRequest_Segments); ok { - return x.Segments - } + return x.Storage } return nil } -func (x *RoomCompositeEgressRequest) GetOptions() isRoomCompositeEgressRequest_Options { +func (x *StartEgressRequest) GetWebhooks() []*WebhookConfig { if x != nil { - return x.Options + return x.Webhooks } return nil } -func (x *RoomCompositeEgressRequest) GetPreset() EncodingOptionsPreset { - if x != nil { - if x, ok := x.Options.(*RoomCompositeEgressRequest_Preset); ok { - return x.Preset - } - } - return EncodingOptionsPreset_H264_720P_30 +type isStartEgressRequest_Source interface { + isStartEgressRequest_Source() } -func (x *RoomCompositeEgressRequest) GetAdvanced() *EncodingOptions { - if x != nil { - if x, ok := x.Options.(*RoomCompositeEgressRequest_Advanced); ok { - return x.Advanced - } - } - return nil +type StartEgressRequest_Template struct { + Template *TemplateSource `protobuf:"bytes,2,opt,name=template,proto3,oneof"` } -func (x *RoomCompositeEgressRequest) GetFileOutputs() []*EncodedFileOutput { - if x != nil { - return x.FileOutputs - } - return nil +type StartEgressRequest_Web struct { + Web *WebSource `protobuf:"bytes,3,opt,name=web,proto3,oneof"` } -func (x *RoomCompositeEgressRequest) GetStreamOutputs() []*StreamOutput { - if x != nil { - return x.StreamOutputs - } - return nil +type StartEgressRequest_Media struct { + Media *MediaSource `protobuf:"bytes,4,opt,name=media,proto3,oneof"` } -func (x *RoomCompositeEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { - if x != nil { - return x.SegmentOutputs - } - return nil -} +func (*StartEgressRequest_Template) isStartEgressRequest_Source() {} -func (x *RoomCompositeEgressRequest) GetImageOutputs() []*ImageOutput { - if x != nil { - return x.ImageOutputs - } - return nil -} +func (*StartEgressRequest_Web) isStartEgressRequest_Source() {} -func (x *RoomCompositeEgressRequest) GetWebhooks() []*WebhookConfig { - if x != nil { - return x.Webhooks - } - return nil +func (*StartEgressRequest_Media) isStartEgressRequest_Source() {} + +type isStartEgressRequest_Encoding interface { + isStartEgressRequest_Encoding() } -type isRoomCompositeEgressRequest_Output interface { - isRoomCompositeEgressRequest_Output() +type StartEgressRequest_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,5,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` } -type RoomCompositeEgressRequest_File struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - File *EncodedFileOutput `protobuf:"bytes,6,opt,name=file,proto3,oneof"` +type StartEgressRequest_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,6,opt,name=advanced,proto3,oneof"` } -type RoomCompositeEgressRequest_Stream struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - Stream *StreamOutput `protobuf:"bytes,7,opt,name=stream,proto3,oneof"` +func (*StartEgressRequest_Preset) isStartEgressRequest_Encoding() {} + +func (*StartEgressRequest_Advanced) isStartEgressRequest_Encoding() {} + +// Room composite recording via layout template. +// Service generates token, constructs recorder URL, awaits start signal. +type TemplateSource struct { + state protoimpl.MessageState `protogen:"open.v1"` + Layout string `protobuf:"bytes,1,opt,name=layout,proto3" json:"layout,omitempty"` + AudioOnly bool `protobuf:"varint,2,opt,name=audio_only,json=audioOnly,proto3" json:"audio_only,omitempty"` + VideoOnly bool `protobuf:"varint,3,opt,name=video_only,json=videoOnly,proto3" json:"video_only,omitempty"` + CustomBaseUrl string `protobuf:"bytes,4,opt,name=custom_base_url,json=customBaseUrl,proto3" json:"custom_base_url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -type RoomCompositeEgressRequest_Segments struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - Segments *SegmentedFileOutput `protobuf:"bytes,10,opt,name=segments,proto3,oneof"` +func (x *TemplateSource) Reset() { + *x = TemplateSource{} + mi := &file_livekit_egress_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (*RoomCompositeEgressRequest_File) isRoomCompositeEgressRequest_Output() {} +func (x *TemplateSource) String() string { + return protoimpl.X.MessageStringOf(x) +} -func (*RoomCompositeEgressRequest_Stream) isRoomCompositeEgressRequest_Output() {} +func (*TemplateSource) ProtoMessage() {} -func (*RoomCompositeEgressRequest_Segments) isRoomCompositeEgressRequest_Output() {} +func (x *TemplateSource) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} -type isRoomCompositeEgressRequest_Options interface { - isRoomCompositeEgressRequest_Options() +// Deprecated: Use TemplateSource.ProtoReflect.Descriptor instead. +func (*TemplateSource) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{1} } -type RoomCompositeEgressRequest_Preset struct { - Preset EncodingOptionsPreset `protobuf:"varint,8,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` // (default H264_720P_30) +func (x *TemplateSource) GetLayout() string { + if x != nil { + return x.Layout + } + return "" } -type RoomCompositeEgressRequest_Advanced struct { - Advanced *EncodingOptions `protobuf:"bytes,9,opt,name=advanced,proto3,oneof"` // (optional) +func (x *TemplateSource) GetAudioOnly() bool { + if x != nil { + return x.AudioOnly + } + return false } -func (*RoomCompositeEgressRequest_Preset) isRoomCompositeEgressRequest_Options() {} +func (x *TemplateSource) GetVideoOnly() bool { + if x != nil { + return x.VideoOnly + } + return false +} -func (*RoomCompositeEgressRequest_Advanced) isRoomCompositeEgressRequest_Options() {} +func (x *TemplateSource) GetCustomBaseUrl() string { + if x != nil { + return x.CustomBaseUrl + } + return "" +} -// record any website -type WebEgressRequest struct { +// Record a custom URL via headless browser. +type WebSource struct { state protoimpl.MessageState `protogen:"open.v1"` Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` AudioOnly bool `protobuf:"varint,2,opt,name=audio_only,json=audioOnly,proto3" json:"audio_only,omitempty"` VideoOnly bool `protobuf:"varint,3,opt,name=video_only,json=videoOnly,proto3" json:"video_only,omitempty"` - AwaitStartSignal bool `protobuf:"varint,12,opt,name=await_start_signal,json=awaitStartSignal,proto3" json:"await_start_signal,omitempty"` - // Types that are valid to be assigned to Output: - // - // *WebEgressRequest_File - // *WebEgressRequest_Stream - // *WebEgressRequest_Segments - Output isWebEgressRequest_Output `protobuf_oneof:"output"` - // Types that are valid to be assigned to Options: - // - // *WebEgressRequest_Preset - // *WebEgressRequest_Advanced - Options isWebEgressRequest_Options `protobuf_oneof:"options"` - FileOutputs []*EncodedFileOutput `protobuf:"bytes,9,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` - StreamOutputs []*StreamOutput `protobuf:"bytes,10,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` - SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,11,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` - ImageOutputs []*ImageOutput `protobuf:"bytes,13,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` - Webhooks []*WebhookConfig `protobuf:"bytes,14,rep,name=webhooks,proto3" json:"webhooks,omitempty"` // extra webhooks to call for this request - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + AwaitStartSignal bool `protobuf:"varint,4,opt,name=await_start_signal,json=awaitStartSignal,proto3" json:"await_start_signal,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *WebEgressRequest) Reset() { - *x = WebEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[1] +func (x *WebSource) Reset() { + *x = WebSource{} + mi := &file_livekit_egress_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *WebEgressRequest) String() string { +func (x *WebSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WebEgressRequest) ProtoMessage() {} +func (*WebSource) ProtoMessage() {} -func (x *WebEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[1] +func (x *WebSource) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -838,212 +886,217 @@ func (x *WebEgressRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WebEgressRequest.ProtoReflect.Descriptor instead. -func (*WebEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{1} +// Deprecated: Use WebSource.ProtoReflect.Descriptor instead. +func (*WebSource) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{2} } -func (x *WebEgressRequest) GetUrl() string { +func (x *WebSource) GetUrl() string { if x != nil { return x.Url } return "" } -func (x *WebEgressRequest) GetAudioOnly() bool { +func (x *WebSource) GetAudioOnly() bool { if x != nil { return x.AudioOnly } return false } -func (x *WebEgressRequest) GetVideoOnly() bool { +func (x *WebSource) GetVideoOnly() bool { if x != nil { return x.VideoOnly } return false } -func (x *WebEgressRequest) GetAwaitStartSignal() bool { +func (x *WebSource) GetAwaitStartSignal() bool { if x != nil { return x.AwaitStartSignal } return false } -func (x *WebEgressRequest) GetOutput() isWebEgressRequest_Output { - if x != nil { - return x.Output - } - return nil +// Capture tracks directly from a room via SDK. +// Unifies deprecated Participant, TrackComposite, and Track egress. +type MediaSource struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Video: + // + // *MediaSource_VideoTrackId + // *MediaSource_ParticipantVideo + Video isMediaSource_Video `protobuf_oneof:"video"` + Audio *AudioConfig `protobuf:"bytes,3,opt,name=audio,proto3" json:"audio,omitempty"` + Data *DataConfig `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *WebEgressRequest) GetFile() *EncodedFileOutput { - if x != nil { - if x, ok := x.Output.(*WebEgressRequest_File); ok { - return x.File - } - } - return nil +func (x *MediaSource) Reset() { + *x = MediaSource{} + mi := &file_livekit_egress_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *WebEgressRequest) GetStream() *StreamOutput { - if x != nil { - if x, ok := x.Output.(*WebEgressRequest_Stream); ok { - return x.Stream - } - } - return nil +func (x *MediaSource) String() string { + return protoimpl.X.MessageStringOf(x) } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *WebEgressRequest) GetSegments() *SegmentedFileOutput { +func (*MediaSource) ProtoMessage() {} + +func (x *MediaSource) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[3] if x != nil { - if x, ok := x.Output.(*WebEgressRequest_Segments); ok { - return x.Segments + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - return nil + return mi.MessageOf(x) } -func (x *WebEgressRequest) GetOptions() isWebEgressRequest_Options { +// Deprecated: Use MediaSource.ProtoReflect.Descriptor instead. +func (*MediaSource) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{3} +} + +func (x *MediaSource) GetVideo() isMediaSource_Video { if x != nil { - return x.Options + return x.Video } return nil } -func (x *WebEgressRequest) GetPreset() EncodingOptionsPreset { +func (x *MediaSource) GetVideoTrackId() string { if x != nil { - if x, ok := x.Options.(*WebEgressRequest_Preset); ok { - return x.Preset + if x, ok := x.Video.(*MediaSource_VideoTrackId); ok { + return x.VideoTrackId } } - return EncodingOptionsPreset_H264_720P_30 + return "" } -func (x *WebEgressRequest) GetAdvanced() *EncodingOptions { +func (x *MediaSource) GetParticipantVideo() *ParticipantVideo { if x != nil { - if x, ok := x.Options.(*WebEgressRequest_Advanced); ok { - return x.Advanced + if x, ok := x.Video.(*MediaSource_ParticipantVideo); ok { + return x.ParticipantVideo } } return nil } -func (x *WebEgressRequest) GetFileOutputs() []*EncodedFileOutput { +func (x *MediaSource) GetAudio() *AudioConfig { if x != nil { - return x.FileOutputs + return x.Audio } return nil } -func (x *WebEgressRequest) GetStreamOutputs() []*StreamOutput { +func (x *MediaSource) GetData() *DataConfig { if x != nil { - return x.StreamOutputs + return x.Data } return nil } -func (x *WebEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { - if x != nil { - return x.SegmentOutputs - } - return nil +type isMediaSource_Video interface { + isMediaSource_Video() } -func (x *WebEgressRequest) GetImageOutputs() []*ImageOutput { - if x != nil { - return x.ImageOutputs - } - return nil +type MediaSource_VideoTrackId struct { + VideoTrackId string `protobuf:"bytes,1,opt,name=video_track_id,json=videoTrackId,proto3,oneof"` } -func (x *WebEgressRequest) GetWebhooks() []*WebhookConfig { - if x != nil { - return x.Webhooks - } - return nil +type MediaSource_ParticipantVideo struct { + ParticipantVideo *ParticipantVideo `protobuf:"bytes,2,opt,name=participant_video,json=participantVideo,proto3,oneof"` } -type isWebEgressRequest_Output interface { - isWebEgressRequest_Output() -} +func (*MediaSource_VideoTrackId) isMediaSource_Video() {} -type WebEgressRequest_File struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - File *EncodedFileOutput `protobuf:"bytes,4,opt,name=file,proto3,oneof"` +func (*MediaSource_ParticipantVideo) isMediaSource_Video() {} + +type ParticipantVideo struct { + state protoimpl.MessageState `protogen:"open.v1"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + PreferScreenShare bool `protobuf:"varint,2,opt,name=prefer_screen_share,json=preferScreenShare,proto3" json:"prefer_screen_share,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -type WebEgressRequest_Stream struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - Stream *StreamOutput `protobuf:"bytes,5,opt,name=stream,proto3,oneof"` +func (x *ParticipantVideo) Reset() { + *x = ParticipantVideo{} + mi := &file_livekit_egress_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -type WebEgressRequest_Segments struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - Segments *SegmentedFileOutput `protobuf:"bytes,6,opt,name=segments,proto3,oneof"` +func (x *ParticipantVideo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*WebEgressRequest_File) isWebEgressRequest_Output() {} +func (*ParticipantVideo) ProtoMessage() {} -func (*WebEgressRequest_Stream) isWebEgressRequest_Output() {} +func (x *ParticipantVideo) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} -func (*WebEgressRequest_Segments) isWebEgressRequest_Output() {} +// Deprecated: Use ParticipantVideo.ProtoReflect.Descriptor instead. +func (*ParticipantVideo) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{4} +} -type isWebEgressRequest_Options interface { - isWebEgressRequest_Options() +func (x *ParticipantVideo) GetIdentity() string { + if x != nil { + return x.Identity + } + return "" } -type WebEgressRequest_Preset struct { - Preset EncodingOptionsPreset `protobuf:"varint,7,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` +func (x *ParticipantVideo) GetPreferScreenShare() bool { + if x != nil { + return x.PreferScreenShare + } + return false } -type WebEgressRequest_Advanced struct { - Advanced *EncodingOptions `protobuf:"bytes,8,opt,name=advanced,proto3,oneof"` +// Unified audio selection and channel routing. +// Each route specifies both which audio to capture and which channel to output to. +type AudioConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // If empty, all audio captured in both channels. + // If non-empty, only matching audio is captured and routed. Unmatched is excluded. + Routes []*AudioRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (*WebEgressRequest_Preset) isWebEgressRequest_Options() {} - -func (*WebEgressRequest_Advanced) isWebEgressRequest_Options() {} - -// record audio and video from a single participant -type ParticipantEgressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // required - Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` // required - ScreenShare bool `protobuf:"varint,3,opt,name=screen_share,json=screenShare,proto3" json:"screen_share,omitempty"` // (default false) - // Types that are valid to be assigned to Options: - // - // *ParticipantEgressRequest_Preset - // *ParticipantEgressRequest_Advanced - Options isParticipantEgressRequest_Options `protobuf_oneof:"options"` - FileOutputs []*EncodedFileOutput `protobuf:"bytes,6,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` - StreamOutputs []*StreamOutput `protobuf:"bytes,7,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` - SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,8,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` - ImageOutputs []*ImageOutput `protobuf:"bytes,9,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` - Webhooks []*WebhookConfig `protobuf:"bytes,10,rep,name=webhooks,proto3" json:"webhooks,omitempty"` // extra webhooks to call for this request - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ParticipantEgressRequest) Reset() { - *x = ParticipantEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[2] +func (x *AudioConfig) Reset() { + *x = AudioConfig{} + mi := &file_livekit_egress_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ParticipantEgressRequest) String() string { +func (x *AudioConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ParticipantEgressRequest) ProtoMessage() {} +func (*AudioConfig) ProtoMessage() {} -func (x *ParticipantEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[2] +func (x *AudioConfig) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1054,149 +1107,148 @@ func (x *ParticipantEgressRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ParticipantEgressRequest.ProtoReflect.Descriptor instead. -func (*ParticipantEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{2} +// Deprecated: Use AudioConfig.ProtoReflect.Descriptor instead. +func (*AudioConfig) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{5} } -func (x *ParticipantEgressRequest) GetRoomName() string { +func (x *AudioConfig) GetRoutes() []*AudioRoute { if x != nil { - return x.RoomName + return x.Routes } - return "" + return nil } -func (x *ParticipantEgressRequest) GetIdentity() string { - if x != nil { - return x.Identity - } - return "" +type AudioRoute struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Match: + // + // *AudioRoute_TrackId + // *AudioRoute_ParticipantIdentity + // *AudioRoute_ParticipantKind + Match isAudioRoute_Match `protobuf_oneof:"match"` + Channel AudioChannel `protobuf:"varint,4,opt,name=channel,proto3,enum=livekit.AudioChannel" json:"channel,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *ParticipantEgressRequest) GetScreenShare() bool { - if x != nil { - return x.ScreenShare - } - return false +func (x *AudioRoute) Reset() { + *x = AudioRoute{} + mi := &file_livekit_egress_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *ParticipantEgressRequest) GetOptions() isParticipantEgressRequest_Options { - if x != nil { - return x.Options - } - return nil +func (x *AudioRoute) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ParticipantEgressRequest) GetPreset() EncodingOptionsPreset { +func (*AudioRoute) ProtoMessage() {} + +func (x *AudioRoute) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[6] if x != nil { - if x, ok := x.Options.(*ParticipantEgressRequest_Preset); ok { - return x.Preset + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - return EncodingOptionsPreset_H264_720P_30 + return mi.MessageOf(x) } -func (x *ParticipantEgressRequest) GetAdvanced() *EncodingOptions { - if x != nil { - if x, ok := x.Options.(*ParticipantEgressRequest_Advanced); ok { - return x.Advanced - } - } - return nil +// Deprecated: Use AudioRoute.ProtoReflect.Descriptor instead. +func (*AudioRoute) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{6} } -func (x *ParticipantEgressRequest) GetFileOutputs() []*EncodedFileOutput { +func (x *AudioRoute) GetMatch() isAudioRoute_Match { if x != nil { - return x.FileOutputs + return x.Match } return nil } -func (x *ParticipantEgressRequest) GetStreamOutputs() []*StreamOutput { +func (x *AudioRoute) GetTrackId() string { if x != nil { - return x.StreamOutputs + if x, ok := x.Match.(*AudioRoute_TrackId); ok { + return x.TrackId + } } - return nil + return "" } -func (x *ParticipantEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { +func (x *AudioRoute) GetParticipantIdentity() string { if x != nil { - return x.SegmentOutputs + if x, ok := x.Match.(*AudioRoute_ParticipantIdentity); ok { + return x.ParticipantIdentity + } } - return nil + return "" } -func (x *ParticipantEgressRequest) GetImageOutputs() []*ImageOutput { +func (x *AudioRoute) GetParticipantKind() ParticipantInfo_Kind { if x != nil { - return x.ImageOutputs + if x, ok := x.Match.(*AudioRoute_ParticipantKind); ok { + return x.ParticipantKind + } } - return nil + return ParticipantInfo_STANDARD } -func (x *ParticipantEgressRequest) GetWebhooks() []*WebhookConfig { +func (x *AudioRoute) GetChannel() AudioChannel { if x != nil { - return x.Webhooks + return x.Channel } - return nil + return AudioChannel_AUDIO_CHANNEL_BOTH } -type isParticipantEgressRequest_Options interface { - isParticipantEgressRequest_Options() +type isAudioRoute_Match interface { + isAudioRoute_Match() } -type ParticipantEgressRequest_Preset struct { - Preset EncodingOptionsPreset `protobuf:"varint,4,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` // (default H264_720P_30) +type AudioRoute_TrackId struct { + TrackId string `protobuf:"bytes,1,opt,name=track_id,json=trackId,proto3,oneof"` } -type ParticipantEgressRequest_Advanced struct { - Advanced *EncodingOptions `protobuf:"bytes,5,opt,name=advanced,proto3,oneof"` // (optional) +type AudioRoute_ParticipantIdentity struct { + ParticipantIdentity string `protobuf:"bytes,2,opt,name=participant_identity,json=participantIdentity,proto3,oneof"` } -func (*ParticipantEgressRequest_Preset) isParticipantEgressRequest_Options() {} +type AudioRoute_ParticipantKind struct { + ParticipantKind ParticipantInfo_Kind `protobuf:"varint,3,opt,name=participant_kind,json=participantKind,proto3,enum=livekit.ParticipantInfo_Kind,oneof"` +} -func (*ParticipantEgressRequest_Advanced) isParticipantEgressRequest_Options() {} +func (*AudioRoute_TrackId) isAudioRoute_Match() {} -// containerize up to one audio and one video track -type TrackCompositeEgressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // required - AudioTrackId string `protobuf:"bytes,2,opt,name=audio_track_id,json=audioTrackId,proto3" json:"audio_track_id,omitempty"` // (optional) - VideoTrackId string `protobuf:"bytes,3,opt,name=video_track_id,json=videoTrackId,proto3" json:"video_track_id,omitempty"` // (optional) - // Types that are valid to be assigned to Output: - // - // *TrackCompositeEgressRequest_File - // *TrackCompositeEgressRequest_Stream - // *TrackCompositeEgressRequest_Segments - Output isTrackCompositeEgressRequest_Output `protobuf_oneof:"output"` - // Types that are valid to be assigned to Options: - // - // *TrackCompositeEgressRequest_Preset - // *TrackCompositeEgressRequest_Advanced - Options isTrackCompositeEgressRequest_Options `protobuf_oneof:"options"` - FileOutputs []*EncodedFileOutput `protobuf:"bytes,11,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` - StreamOutputs []*StreamOutput `protobuf:"bytes,12,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` - SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,13,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` - ImageOutputs []*ImageOutput `protobuf:"bytes,14,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` - Webhooks []*WebhookConfig `protobuf:"bytes,15,rep,name=webhooks,proto3" json:"webhooks,omitempty"` // extra webhooks to call for this request - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (*AudioRoute_ParticipantIdentity) isAudioRoute_Match() {} + +func (*AudioRoute_ParticipantKind) isAudioRoute_Match() {} + +type DataConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // If empty, all data tracks captured. + // If non-empty, only matching data tracks are captured. + Selectors []*DataSelector `protobuf:"bytes,1,rep,name=selectors,proto3" json:"selectors,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *TrackCompositeEgressRequest) Reset() { - *x = TrackCompositeEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[3] +func (x *DataConfig) Reset() { + *x = DataConfig{} + mi := &file_livekit_egress_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *TrackCompositeEgressRequest) String() string { +func (x *DataConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TrackCompositeEgressRequest) ProtoMessage() {} +func (*DataConfig) ProtoMessage() {} -func (x *TrackCompositeEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[3] +func (x *DataConfig) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1207,200 +1259,149 @@ func (x *TrackCompositeEgressRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TrackCompositeEgressRequest.ProtoReflect.Descriptor instead. -func (*TrackCompositeEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{3} +// Deprecated: Use DataConfig.ProtoReflect.Descriptor instead. +func (*DataConfig) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{7} } -func (x *TrackCompositeEgressRequest) GetRoomName() string { +func (x *DataConfig) GetSelectors() []*DataSelector { if x != nil { - return x.RoomName + return x.Selectors } - return "" + return nil } -func (x *TrackCompositeEgressRequest) GetAudioTrackId() string { - if x != nil { - return x.AudioTrackId - } - return "" +type DataSelector struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Match: + // + // *DataSelector_TrackId + // *DataSelector_ParticipantIdentity + // *DataSelector_Topic + Match isDataSelector_Match `protobuf_oneof:"match"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *TrackCompositeEgressRequest) GetVideoTrackId() string { - if x != nil { - return x.VideoTrackId - } - return "" +func (x *DataSelector) Reset() { + *x = DataSelector{} + mi := &file_livekit_egress_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *TrackCompositeEgressRequest) GetOutput() isTrackCompositeEgressRequest_Output { - if x != nil { - return x.Output - } - return nil +func (x *DataSelector) String() string { + return protoimpl.X.MessageStringOf(x) } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *TrackCompositeEgressRequest) GetFile() *EncodedFileOutput { - if x != nil { - if x, ok := x.Output.(*TrackCompositeEgressRequest_File); ok { - return x.File - } - } - return nil -} +func (*DataSelector) ProtoMessage() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *TrackCompositeEgressRequest) GetStream() *StreamOutput { +func (x *DataSelector) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[8] if x != nil { - if x, ok := x.Output.(*TrackCompositeEgressRequest_Stream); ok { - return x.Stream + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - return nil + return mi.MessageOf(x) } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *TrackCompositeEgressRequest) GetSegments() *SegmentedFileOutput { - if x != nil { - if x, ok := x.Output.(*TrackCompositeEgressRequest_Segments); ok { - return x.Segments - } - } - return nil +// Deprecated: Use DataSelector.ProtoReflect.Descriptor instead. +func (*DataSelector) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{8} } -func (x *TrackCompositeEgressRequest) GetOptions() isTrackCompositeEgressRequest_Options { +func (x *DataSelector) GetMatch() isDataSelector_Match { if x != nil { - return x.Options + return x.Match } return nil } -func (x *TrackCompositeEgressRequest) GetPreset() EncodingOptionsPreset { +func (x *DataSelector) GetTrackId() string { if x != nil { - if x, ok := x.Options.(*TrackCompositeEgressRequest_Preset); ok { - return x.Preset + if x, ok := x.Match.(*DataSelector_TrackId); ok { + return x.TrackId } } - return EncodingOptionsPreset_H264_720P_30 + return "" } -func (x *TrackCompositeEgressRequest) GetAdvanced() *EncodingOptions { +func (x *DataSelector) GetParticipantIdentity() string { if x != nil { - if x, ok := x.Options.(*TrackCompositeEgressRequest_Advanced); ok { - return x.Advanced + if x, ok := x.Match.(*DataSelector_ParticipantIdentity); ok { + return x.ParticipantIdentity } } - return nil -} - -func (x *TrackCompositeEgressRequest) GetFileOutputs() []*EncodedFileOutput { - if x != nil { - return x.FileOutputs - } - return nil -} - -func (x *TrackCompositeEgressRequest) GetStreamOutputs() []*StreamOutput { - if x != nil { - return x.StreamOutputs - } - return nil -} - -func (x *TrackCompositeEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { - if x != nil { - return x.SegmentOutputs - } - return nil -} - -func (x *TrackCompositeEgressRequest) GetImageOutputs() []*ImageOutput { - if x != nil { - return x.ImageOutputs - } - return nil + return "" } -func (x *TrackCompositeEgressRequest) GetWebhooks() []*WebhookConfig { +func (x *DataSelector) GetTopic() string { if x != nil { - return x.Webhooks + if x, ok := x.Match.(*DataSelector_Topic); ok { + return x.Topic + } } - return nil + return "" } -type isTrackCompositeEgressRequest_Output interface { - isTrackCompositeEgressRequest_Output() +type isDataSelector_Match interface { + isDataSelector_Match() } -type TrackCompositeEgressRequest_File struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - File *EncodedFileOutput `protobuf:"bytes,4,opt,name=file,proto3,oneof"` +type DataSelector_TrackId struct { + TrackId string `protobuf:"bytes,1,opt,name=track_id,json=trackId,proto3,oneof"` } -type TrackCompositeEgressRequest_Stream struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - Stream *StreamOutput `protobuf:"bytes,5,opt,name=stream,proto3,oneof"` +type DataSelector_ParticipantIdentity struct { + ParticipantIdentity string `protobuf:"bytes,2,opt,name=participant_identity,json=participantIdentity,proto3,oneof"` } -type TrackCompositeEgressRequest_Segments struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. - Segments *SegmentedFileOutput `protobuf:"bytes,8,opt,name=segments,proto3,oneof"` +type DataSelector_Topic struct { + Topic string `protobuf:"bytes,3,opt,name=topic,proto3,oneof"` } -func (*TrackCompositeEgressRequest_File) isTrackCompositeEgressRequest_Output() {} +func (*DataSelector_TrackId) isDataSelector_Match() {} -func (*TrackCompositeEgressRequest_Stream) isTrackCompositeEgressRequest_Output() {} +func (*DataSelector_ParticipantIdentity) isDataSelector_Match() {} -func (*TrackCompositeEgressRequest_Segments) isTrackCompositeEgressRequest_Output() {} +func (*DataSelector_Topic) isDataSelector_Match() {} -type isTrackCompositeEgressRequest_Options interface { - isTrackCompositeEgressRequest_Options() -} - -type TrackCompositeEgressRequest_Preset struct { - Preset EncodingOptionsPreset `protobuf:"varint,6,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` // (default H264_720P_30) -} - -type TrackCompositeEgressRequest_Advanced struct { - Advanced *EncodingOptions `protobuf:"bytes,7,opt,name=advanced,proto3,oneof"` // (optional) -} - -func (*TrackCompositeEgressRequest_Preset) isTrackCompositeEgressRequest_Options() {} - -func (*TrackCompositeEgressRequest_Advanced) isTrackCompositeEgressRequest_Options() {} - -// record tracks individually, without transcoding -type TrackEgressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // required - TrackId string `protobuf:"bytes,2,opt,name=track_id,json=trackId,proto3" json:"track_id,omitempty"` // required - // Types that are valid to be assigned to Output: - // - // *TrackEgressRequest_File - // *TrackEgressRequest_WebsocketUrl - Output isTrackEgressRequest_Output `protobuf_oneof:"output"` - Webhooks []*WebhookConfig `protobuf:"bytes,5,rep,name=webhooks,proto3" json:"webhooks,omitempty"` // extra webhooks to call for this request - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type EncodingOptions struct { + state protoimpl.MessageState `protogen:"open.v1"` + Width int32 `protobuf:"varint,1,opt,name=width,proto3" json:"width,omitempty"` // (default 1920) + Height int32 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` // (default 1080) + Depth int32 `protobuf:"varint,3,opt,name=depth,proto3" json:"depth,omitempty"` // (default 24) + Framerate int32 `protobuf:"varint,4,opt,name=framerate,proto3" json:"framerate,omitempty"` // (default 30) + AudioCodec AudioCodec `protobuf:"varint,5,opt,name=audio_codec,json=audioCodec,proto3,enum=livekit.AudioCodec" json:"audio_codec,omitempty"` // (default OPUS) + AudioBitrate int32 `protobuf:"varint,6,opt,name=audio_bitrate,json=audioBitrate,proto3" json:"audio_bitrate,omitempty"` // (default 128) + AudioQuality int32 `protobuf:"varint,11,opt,name=audio_quality,json=audioQuality,proto3" json:"audio_quality,omitempty"` // quality setting on audio encoder + AudioFrequency int32 `protobuf:"varint,7,opt,name=audio_frequency,json=audioFrequency,proto3" json:"audio_frequency,omitempty"` // (default 44100) + VideoCodec VideoCodec `protobuf:"varint,8,opt,name=video_codec,json=videoCodec,proto3,enum=livekit.VideoCodec" json:"video_codec,omitempty"` // (default H264_MAIN) + VideoBitrate int32 `protobuf:"varint,9,opt,name=video_bitrate,json=videoBitrate,proto3" json:"video_bitrate,omitempty"` // (default 4500) + VideoQuality int32 `protobuf:"varint,12,opt,name=video_quality,json=videoQuality,proto3" json:"video_quality,omitempty"` // quality setting on video encoder + KeyFrameInterval float64 `protobuf:"fixed64,10,opt,name=key_frame_interval,json=keyFrameInterval,proto3" json:"key_frame_interval,omitempty"` // in seconds (default 4s for streaming, segment duration for segmented output, encoder default for files) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *TrackEgressRequest) Reset() { - *x = TrackEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[4] +func (x *EncodingOptions) Reset() { + *x = EncodingOptions{} + mi := &file_livekit_egress_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *TrackEgressRequest) String() string { +func (x *EncodingOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TrackEgressRequest) ProtoMessage() {} +func (*EncodingOptions) ProtoMessage() {} -func (x *TrackEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[4] +func (x *EncodingOptions) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1411,104 +1412,126 @@ func (x *TrackEgressRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TrackEgressRequest.ProtoReflect.Descriptor instead. -func (*TrackEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{4} +// Deprecated: Use EncodingOptions.ProtoReflect.Descriptor instead. +func (*EncodingOptions) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{9} } -func (x *TrackEgressRequest) GetRoomName() string { +func (x *EncodingOptions) GetWidth() int32 { if x != nil { - return x.RoomName + return x.Width } - return "" + return 0 } -func (x *TrackEgressRequest) GetTrackId() string { +func (x *EncodingOptions) GetHeight() int32 { if x != nil { - return x.TrackId + return x.Height } - return "" + return 0 } -func (x *TrackEgressRequest) GetOutput() isTrackEgressRequest_Output { +func (x *EncodingOptions) GetDepth() int32 { if x != nil { - return x.Output + return x.Depth } - return nil + return 0 } -func (x *TrackEgressRequest) GetFile() *DirectFileOutput { +func (x *EncodingOptions) GetFramerate() int32 { if x != nil { - if x, ok := x.Output.(*TrackEgressRequest_File); ok { - return x.File - } + return x.Framerate } - return nil + return 0 } -func (x *TrackEgressRequest) GetWebsocketUrl() string { +func (x *EncodingOptions) GetAudioCodec() AudioCodec { if x != nil { - if x, ok := x.Output.(*TrackEgressRequest_WebsocketUrl); ok { - return x.WebsocketUrl - } + return x.AudioCodec } - return "" + return AudioCodec_DEFAULT_AC } -func (x *TrackEgressRequest) GetWebhooks() []*WebhookConfig { +func (x *EncodingOptions) GetAudioBitrate() int32 { if x != nil { - return x.Webhooks + return x.AudioBitrate } - return nil + return 0 } -type isTrackEgressRequest_Output interface { - isTrackEgressRequest_Output() +func (x *EncodingOptions) GetAudioQuality() int32 { + if x != nil { + return x.AudioQuality + } + return 0 } -type TrackEgressRequest_File struct { - File *DirectFileOutput `protobuf:"bytes,3,opt,name=file,proto3,oneof"` +func (x *EncodingOptions) GetAudioFrequency() int32 { + if x != nil { + return x.AudioFrequency + } + return 0 } -type TrackEgressRequest_WebsocketUrl struct { - WebsocketUrl string `protobuf:"bytes,4,opt,name=websocket_url,json=websocketUrl,proto3,oneof"` +func (x *EncodingOptions) GetVideoCodec() VideoCodec { + if x != nil { + return x.VideoCodec + } + return VideoCodec_DEFAULT_VC } -func (*TrackEgressRequest_File) isTrackEgressRequest_Output() {} +func (x *EncodingOptions) GetVideoBitrate() int32 { + if x != nil { + return x.VideoBitrate + } + return 0 +} -func (*TrackEgressRequest_WebsocketUrl) isTrackEgressRequest_Output() {} +func (x *EncodingOptions) GetVideoQuality() int32 { + if x != nil { + return x.VideoQuality + } + return 0 +} -type EncodedFileOutput struct { - state protoimpl.MessageState `protogen:"open.v1"` - FileType EncodedFileType `protobuf:"varint,1,opt,name=file_type,json=fileType,proto3,enum=livekit.EncodedFileType" json:"file_type,omitempty"` // (optional) - Filepath string `protobuf:"bytes,2,opt,name=filepath,proto3" json:"filepath,omitempty"` // see egress docs for templating (default {room_name}-{time}) - DisableManifest bool `protobuf:"varint,6,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) - // Types that are valid to be assigned to Output: +func (x *EncodingOptions) GetKeyFrameInterval() float64 { + if x != nil { + return x.KeyFrameInterval + } + return 0 +} + +type Output struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Config: // - // *EncodedFileOutput_S3 - // *EncodedFileOutput_Gcp - // *EncodedFileOutput_Azure - // *EncodedFileOutput_AliOSS - Output isEncodedFileOutput_Output `protobuf_oneof:"output"` + // *Output_File + // *Output_Stream + // *Output_Segments + // *Output_Images + // *Output_Mcap + Config isOutput_Config `protobuf_oneof:"config"` + // Per-output storage override (falls back to request, then server) + Storage *StorageConfig `protobuf:"bytes,6,opt,name=storage,proto3" json:"storage,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *EncodedFileOutput) Reset() { - *x = EncodedFileOutput{} - mi := &file_livekit_egress_proto_msgTypes[5] +func (x *Output) Reset() { + *x = Output{} + mi := &file_livekit_egress_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EncodedFileOutput) String() string { +func (x *Output) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EncodedFileOutput) ProtoMessage() {} +func (*Output) ProtoMessage() {} -func (x *EncodedFileOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[5] +func (x *Output) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1519,139 +1542,130 @@ func (x *EncodedFileOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EncodedFileOutput.ProtoReflect.Descriptor instead. -func (*EncodedFileOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{5} -} - -func (x *EncodedFileOutput) GetFileType() EncodedFileType { - if x != nil { - return x.FileType - } - return EncodedFileType_DEFAULT_FILETYPE +// Deprecated: Use Output.ProtoReflect.Descriptor instead. +func (*Output) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{10} } -func (x *EncodedFileOutput) GetFilepath() string { +func (x *Output) GetConfig() isOutput_Config { if x != nil { - return x.Filepath + return x.Config } - return "" + return nil } -func (x *EncodedFileOutput) GetDisableManifest() bool { +func (x *Output) GetFile() *FileOutput { if x != nil { - return x.DisableManifest + if x, ok := x.Config.(*Output_File); ok { + return x.File + } } - return false + return nil } -func (x *EncodedFileOutput) GetOutput() isEncodedFileOutput_Output { +func (x *Output) GetStream() *StreamOutput { if x != nil { - return x.Output + if x, ok := x.Config.(*Output_Stream); ok { + return x.Stream + } } return nil } -func (x *EncodedFileOutput) GetS3() *S3Upload { +func (x *Output) GetSegments() *SegmentedFileOutput { if x != nil { - if x, ok := x.Output.(*EncodedFileOutput_S3); ok { - return x.S3 + if x, ok := x.Config.(*Output_Segments); ok { + return x.Segments } } return nil } -func (x *EncodedFileOutput) GetGcp() *GCPUpload { +func (x *Output) GetImages() *ImageOutput { if x != nil { - if x, ok := x.Output.(*EncodedFileOutput_Gcp); ok { - return x.Gcp + if x, ok := x.Config.(*Output_Images); ok { + return x.Images } } return nil } -func (x *EncodedFileOutput) GetAzure() *AzureBlobUpload { +func (x *Output) GetMcap() *McapOutput { if x != nil { - if x, ok := x.Output.(*EncodedFileOutput_Azure); ok { - return x.Azure + if x, ok := x.Config.(*Output_Mcap); ok { + return x.Mcap } } return nil } -func (x *EncodedFileOutput) GetAliOSS() *AliOSSUpload { +func (x *Output) GetStorage() *StorageConfig { if x != nil { - if x, ok := x.Output.(*EncodedFileOutput_AliOSS); ok { - return x.AliOSS - } + return x.Storage } return nil } -type isEncodedFileOutput_Output interface { - isEncodedFileOutput_Output() +type isOutput_Config interface { + isOutput_Config() } -type EncodedFileOutput_S3 struct { - S3 *S3Upload `protobuf:"bytes,3,opt,name=s3,proto3,oneof"` +type Output_File struct { + File *FileOutput `protobuf:"bytes,1,opt,name=file,proto3,oneof"` } -type EncodedFileOutput_Gcp struct { - Gcp *GCPUpload `protobuf:"bytes,4,opt,name=gcp,proto3,oneof"` +type Output_Stream struct { + Stream *StreamOutput `protobuf:"bytes,2,opt,name=stream,proto3,oneof"` // reuses v1 StreamOutput } -type EncodedFileOutput_Azure struct { - Azure *AzureBlobUpload `protobuf:"bytes,5,opt,name=azure,proto3,oneof"` +type Output_Segments struct { + Segments *SegmentedFileOutput `protobuf:"bytes,3,opt,name=segments,proto3,oneof"` // reuses v1 SegmentedFileOutput } -type EncodedFileOutput_AliOSS struct { - AliOSS *AliOSSUpload `protobuf:"bytes,7,opt,name=aliOSS,proto3,oneof"` +type Output_Images struct { + Images *ImageOutput `protobuf:"bytes,4,opt,name=images,proto3,oneof"` // reuses v1 ImageOutput } -func (*EncodedFileOutput_S3) isEncodedFileOutput_Output() {} +type Output_Mcap struct { + Mcap *McapOutput `protobuf:"bytes,5,opt,name=mcap,proto3,oneof"` +} -func (*EncodedFileOutput_Gcp) isEncodedFileOutput_Output() {} +func (*Output_File) isOutput_Config() {} -func (*EncodedFileOutput_Azure) isEncodedFileOutput_Output() {} +func (*Output_Stream) isOutput_Config() {} -func (*EncodedFileOutput_AliOSS) isEncodedFileOutput_Output() {} +func (*Output_Segments) isOutput_Config() {} -// Used to generate HLS segments or other kind of segmented output -type SegmentedFileOutput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Protocol SegmentedFileProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=livekit.SegmentedFileProtocol" json:"protocol,omitempty"` // (optional) - FilenamePrefix string `protobuf:"bytes,2,opt,name=filename_prefix,json=filenamePrefix,proto3" json:"filename_prefix,omitempty"` // (optional) - PlaylistName string `protobuf:"bytes,3,opt,name=playlist_name,json=playlistName,proto3" json:"playlist_name,omitempty"` // (optional) - LivePlaylistName string `protobuf:"bytes,11,opt,name=live_playlist_name,json=livePlaylistName,proto3" json:"live_playlist_name,omitempty"` // (optional, disabled if not provided). Path of a live playlist - SegmentDuration uint32 `protobuf:"varint,4,opt,name=segment_duration,json=segmentDuration,proto3" json:"segment_duration,omitempty"` // in seconds (optional) - FilenameSuffix SegmentedFileSuffix `protobuf:"varint,10,opt,name=filename_suffix,json=filenameSuffix,proto3,enum=livekit.SegmentedFileSuffix" json:"filename_suffix,omitempty"` // (optional, default INDEX) - DisableManifest bool `protobuf:"varint,8,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) - // Types that are valid to be assigned to Output: - // - // *SegmentedFileOutput_S3 - // *SegmentedFileOutput_Gcp - // *SegmentedFileOutput_Azure - // *SegmentedFileOutput_AliOSS - Output isSegmentedFileOutput_Output `protobuf_oneof:"output"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (*Output_Images) isOutput_Config() {} + +func (*Output_Mcap) isOutput_Config() {} + +// Unified file output — replaces v1 EncodedFileOutput and DirectFileOutput. +// Whether transcoded depends on encoding options on the request. +type FileOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileType EncodedFileType `protobuf:"varint,1,opt,name=file_type,json=fileType,proto3,enum=livekit.EncodedFileType" json:"file_type,omitempty"` + Filepath string `protobuf:"bytes,2,opt,name=filepath,proto3" json:"filepath,omitempty"` + DisableManifest bool `protobuf:"varint,3,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *SegmentedFileOutput) Reset() { - *x = SegmentedFileOutput{} - mi := &file_livekit_egress_proto_msgTypes[6] +func (x *FileOutput) Reset() { + *x = FileOutput{} + mi := &file_livekit_egress_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *SegmentedFileOutput) String() string { +func (x *FileOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SegmentedFileOutput) ProtoMessage() {} +func (*FileOutput) ProtoMessage() {} -func (x *SegmentedFileOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[6] +func (x *FileOutput) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1662,161 +1676,122 @@ func (x *SegmentedFileOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SegmentedFileOutput.ProtoReflect.Descriptor instead. -func (*SegmentedFileOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{6} +// Deprecated: Use FileOutput.ProtoReflect.Descriptor instead. +func (*FileOutput) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{11} } -func (x *SegmentedFileOutput) GetProtocol() SegmentedFileProtocol { +func (x *FileOutput) GetFileType() EncodedFileType { if x != nil { - return x.Protocol + return x.FileType } - return SegmentedFileProtocol_DEFAULT_SEGMENTED_FILE_PROTOCOL + return EncodedFileType_DEFAULT_FILETYPE } -func (x *SegmentedFileOutput) GetFilenamePrefix() string { +func (x *FileOutput) GetFilepath() string { if x != nil { - return x.FilenamePrefix + return x.Filepath } return "" } -func (x *SegmentedFileOutput) GetPlaylistName() string { - if x != nil { - return x.PlaylistName - } - return "" -} - -func (x *SegmentedFileOutput) GetLivePlaylistName() string { +func (x *FileOutput) GetDisableManifest() bool { if x != nil { - return x.LivePlaylistName + return x.DisableManifest } - return "" + return false } -func (x *SegmentedFileOutput) GetSegmentDuration() uint32 { - if x != nil { - return x.SegmentDuration - } - return 0 +type StreamOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Protocol StreamProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=livekit.StreamProtocol" json:"protocol,omitempty"` // required + Urls []string `protobuf:"bytes,2,rep,name=urls,proto3" json:"urls,omitempty"` // required + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *SegmentedFileOutput) GetFilenameSuffix() SegmentedFileSuffix { - if x != nil { - return x.FilenameSuffix - } - return SegmentedFileSuffix_INDEX +func (x *StreamOutput) Reset() { + *x = StreamOutput{} + mi := &file_livekit_egress_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *SegmentedFileOutput) GetDisableManifest() bool { - if x != nil { - return x.DisableManifest - } - return false +func (x *StreamOutput) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *SegmentedFileOutput) GetOutput() isSegmentedFileOutput_Output { - if x != nil { - return x.Output - } - return nil -} +func (*StreamOutput) ProtoMessage() {} -func (x *SegmentedFileOutput) GetS3() *S3Upload { +func (x *StreamOutput) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[12] if x != nil { - if x, ok := x.Output.(*SegmentedFileOutput_S3); ok { - return x.S3 + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms } - return nil + return mi.MessageOf(x) } -func (x *SegmentedFileOutput) GetGcp() *GCPUpload { - if x != nil { - if x, ok := x.Output.(*SegmentedFileOutput_Gcp); ok { - return x.Gcp - } - } - return nil +// Deprecated: Use StreamOutput.ProtoReflect.Descriptor instead. +func (*StreamOutput) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{12} } -func (x *SegmentedFileOutput) GetAzure() *AzureBlobUpload { +func (x *StreamOutput) GetProtocol() StreamProtocol { if x != nil { - if x, ok := x.Output.(*SegmentedFileOutput_Azure); ok { - return x.Azure - } + return x.Protocol } - return nil + return StreamProtocol_DEFAULT_PROTOCOL } -func (x *SegmentedFileOutput) GetAliOSS() *AliOSSUpload { +func (x *StreamOutput) GetUrls() []string { if x != nil { - if x, ok := x.Output.(*SegmentedFileOutput_AliOSS); ok { - return x.AliOSS - } + return x.Urls } return nil } -type isSegmentedFileOutput_Output interface { - isSegmentedFileOutput_Output() -} - -type SegmentedFileOutput_S3 struct { - S3 *S3Upload `protobuf:"bytes,5,opt,name=s3,proto3,oneof"` -} - -type SegmentedFileOutput_Gcp struct { - Gcp *GCPUpload `protobuf:"bytes,6,opt,name=gcp,proto3,oneof"` -} - -type SegmentedFileOutput_Azure struct { - Azure *AzureBlobUpload `protobuf:"bytes,7,opt,name=azure,proto3,oneof"` -} - -type SegmentedFileOutput_AliOSS struct { - AliOSS *AliOSSUpload `protobuf:"bytes,9,opt,name=aliOSS,proto3,oneof"` -} - -func (*SegmentedFileOutput_S3) isSegmentedFileOutput_Output() {} - -func (*SegmentedFileOutput_Gcp) isSegmentedFileOutput_Output() {} - -func (*SegmentedFileOutput_Azure) isSegmentedFileOutput_Output() {} - -func (*SegmentedFileOutput_AliOSS) isSegmentedFileOutput_Output() {} - -type DirectFileOutput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Filepath string `protobuf:"bytes,1,opt,name=filepath,proto3" json:"filepath,omitempty"` // see egress docs for templating (default {track_id}-{time}) - DisableManifest bool `protobuf:"varint,5,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) +// Used to generate HLS segments or other kind of segmented output +type SegmentedFileOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Protocol SegmentedFileProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=livekit.SegmentedFileProtocol" json:"protocol,omitempty"` // (optional) + FilenamePrefix string `protobuf:"bytes,2,opt,name=filename_prefix,json=filenamePrefix,proto3" json:"filename_prefix,omitempty"` // (optional) + PlaylistName string `protobuf:"bytes,3,opt,name=playlist_name,json=playlistName,proto3" json:"playlist_name,omitempty"` // (optional) + LivePlaylistName string `protobuf:"bytes,11,opt,name=live_playlist_name,json=livePlaylistName,proto3" json:"live_playlist_name,omitempty"` // (optional, disabled if not provided). Path of a live playlist + SegmentDuration uint32 `protobuf:"varint,4,opt,name=segment_duration,json=segmentDuration,proto3" json:"segment_duration,omitempty"` // in seconds (optional) + FilenameSuffix SegmentedFileSuffix `protobuf:"varint,10,opt,name=filename_suffix,json=filenameSuffix,proto3,enum=livekit.SegmentedFileSuffix" json:"filename_suffix,omitempty"` // (optional, default INDEX) + DisableManifest bool `protobuf:"varint,8,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) + // --- Deprecated --- + // // Types that are valid to be assigned to Output: // - // *DirectFileOutput_S3 - // *DirectFileOutput_Gcp - // *DirectFileOutput_Azure - // *DirectFileOutput_AliOSS - Output isDirectFileOutput_Output `protobuf_oneof:"output"` + // *SegmentedFileOutput_S3 + // *SegmentedFileOutput_Gcp + // *SegmentedFileOutput_Azure + // *SegmentedFileOutput_AliOSS + Output isSegmentedFileOutput_Output `protobuf_oneof:"output"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *DirectFileOutput) Reset() { - *x = DirectFileOutput{} - mi := &file_livekit_egress_proto_msgTypes[7] +func (x *SegmentedFileOutput) Reset() { + *x = SegmentedFileOutput{} + mi := &file_livekit_egress_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *DirectFileOutput) String() string { +func (x *SegmentedFileOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DirectFileOutput) ProtoMessage() {} +func (*SegmentedFileOutput) ProtoMessage() {} -func (x *DirectFileOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[7] +func (x *SegmentedFileOutput) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1827,96 +1802,140 @@ func (x *DirectFileOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DirectFileOutput.ProtoReflect.Descriptor instead. -func (*DirectFileOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{7} +// Deprecated: Use SegmentedFileOutput.ProtoReflect.Descriptor instead. +func (*SegmentedFileOutput) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{13} } -func (x *DirectFileOutput) GetFilepath() string { +func (x *SegmentedFileOutput) GetProtocol() SegmentedFileProtocol { if x != nil { - return x.Filepath + return x.Protocol + } + return SegmentedFileProtocol_DEFAULT_SEGMENTED_FILE_PROTOCOL +} + +func (x *SegmentedFileOutput) GetFilenamePrefix() string { + if x != nil { + return x.FilenamePrefix } return "" } -func (x *DirectFileOutput) GetDisableManifest() bool { +func (x *SegmentedFileOutput) GetPlaylistName() string { + if x != nil { + return x.PlaylistName + } + return "" +} + +func (x *SegmentedFileOutput) GetLivePlaylistName() string { + if x != nil { + return x.LivePlaylistName + } + return "" +} + +func (x *SegmentedFileOutput) GetSegmentDuration() uint32 { + if x != nil { + return x.SegmentDuration + } + return 0 +} + +func (x *SegmentedFileOutput) GetFilenameSuffix() SegmentedFileSuffix { + if x != nil { + return x.FilenameSuffix + } + return SegmentedFileSuffix_INDEX +} + +func (x *SegmentedFileOutput) GetDisableManifest() bool { if x != nil { return x.DisableManifest } return false } -func (x *DirectFileOutput) GetOutput() isDirectFileOutput_Output { +func (x *SegmentedFileOutput) GetOutput() isSegmentedFileOutput_Output { if x != nil { return x.Output } return nil } -func (x *DirectFileOutput) GetS3() *S3Upload { +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *SegmentedFileOutput) GetS3() *S3Upload { if x != nil { - if x, ok := x.Output.(*DirectFileOutput_S3); ok { + if x, ok := x.Output.(*SegmentedFileOutput_S3); ok { return x.S3 } } return nil } -func (x *DirectFileOutput) GetGcp() *GCPUpload { +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *SegmentedFileOutput) GetGcp() *GCPUpload { if x != nil { - if x, ok := x.Output.(*DirectFileOutput_Gcp); ok { + if x, ok := x.Output.(*SegmentedFileOutput_Gcp); ok { return x.Gcp } } return nil } -func (x *DirectFileOutput) GetAzure() *AzureBlobUpload { +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *SegmentedFileOutput) GetAzure() *AzureBlobUpload { if x != nil { - if x, ok := x.Output.(*DirectFileOutput_Azure); ok { + if x, ok := x.Output.(*SegmentedFileOutput_Azure); ok { return x.Azure } } return nil } -func (x *DirectFileOutput) GetAliOSS() *AliOSSUpload { +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *SegmentedFileOutput) GetAliOSS() *AliOSSUpload { if x != nil { - if x, ok := x.Output.(*DirectFileOutput_AliOSS); ok { + if x, ok := x.Output.(*SegmentedFileOutput_AliOSS); ok { return x.AliOSS } } return nil } -type isDirectFileOutput_Output interface { - isDirectFileOutput_Output() +type isSegmentedFileOutput_Output interface { + isSegmentedFileOutput_Output() } -type DirectFileOutput_S3 struct { - S3 *S3Upload `protobuf:"bytes,2,opt,name=s3,proto3,oneof"` +type SegmentedFileOutput_S3 struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + S3 *S3Upload `protobuf:"bytes,5,opt,name=s3,proto3,oneof"` } -type DirectFileOutput_Gcp struct { - Gcp *GCPUpload `protobuf:"bytes,3,opt,name=gcp,proto3,oneof"` +type SegmentedFileOutput_Gcp struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Gcp *GCPUpload `protobuf:"bytes,6,opt,name=gcp,proto3,oneof"` } -type DirectFileOutput_Azure struct { - Azure *AzureBlobUpload `protobuf:"bytes,4,opt,name=azure,proto3,oneof"` +type SegmentedFileOutput_Azure struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Azure *AzureBlobUpload `protobuf:"bytes,7,opt,name=azure,proto3,oneof"` } -type DirectFileOutput_AliOSS struct { - AliOSS *AliOSSUpload `protobuf:"bytes,6,opt,name=aliOSS,proto3,oneof"` +type SegmentedFileOutput_AliOSS struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + AliOSS *AliOSSUpload `protobuf:"bytes,9,opt,name=aliOSS,proto3,oneof"` } -func (*DirectFileOutput_S3) isDirectFileOutput_Output() {} +func (*SegmentedFileOutput_S3) isSegmentedFileOutput_Output() {} -func (*DirectFileOutput_Gcp) isDirectFileOutput_Output() {} +func (*SegmentedFileOutput_Gcp) isSegmentedFileOutput_Output() {} -func (*DirectFileOutput_Azure) isDirectFileOutput_Output() {} +func (*SegmentedFileOutput_Azure) isSegmentedFileOutput_Output() {} -func (*DirectFileOutput_AliOSS) isDirectFileOutput_Output() {} +func (*SegmentedFileOutput_AliOSS) isSegmentedFileOutput_Output() {} +// Capture images at a specified interval type ImageOutput struct { state protoimpl.MessageState `protogen:"open.v1"` CaptureInterval uint32 `protobuf:"varint,1,opt,name=capture_interval,json=captureInterval,proto3" json:"capture_interval,omitempty"` // in seconds (required) @@ -1926,6 +1945,8 @@ type ImageOutput struct { FilenameSuffix ImageFileSuffix `protobuf:"varint,5,opt,name=filename_suffix,json=filenameSuffix,proto3,enum=livekit.ImageFileSuffix" json:"filename_suffix,omitempty"` // (optional, default INDEX) ImageCodec ImageCodec `protobuf:"varint,6,opt,name=image_codec,json=imageCodec,proto3,enum=livekit.ImageCodec" json:"image_codec,omitempty"` // (optional) DisableManifest bool `protobuf:"varint,7,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) + // --- Deprecated --- + // // Types that are valid to be assigned to Output: // // *ImageOutput_S3 @@ -1939,7 +1960,7 @@ type ImageOutput struct { func (x *ImageOutput) Reset() { *x = ImageOutput{} - mi := &file_livekit_egress_proto_msgTypes[8] + mi := &file_livekit_egress_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1951,7 +1972,7 @@ func (x *ImageOutput) String() string { func (*ImageOutput) ProtoMessage() {} func (x *ImageOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[8] + mi := &file_livekit_egress_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1964,7 +1985,7 @@ func (x *ImageOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageOutput.ProtoReflect.Descriptor instead. func (*ImageOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{8} + return file_livekit_egress_proto_rawDescGZIP(), []int{14} } func (x *ImageOutput) GetCaptureInterval() uint32 { @@ -2023,6 +2044,7 @@ func (x *ImageOutput) GetOutput() isImageOutput_Output { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetS3() *S3Upload { if x != nil { if x, ok := x.Output.(*ImageOutput_S3); ok { @@ -2032,6 +2054,7 @@ func (x *ImageOutput) GetS3() *S3Upload { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetGcp() *GCPUpload { if x != nil { if x, ok := x.Output.(*ImageOutput_Gcp); ok { @@ -2041,6 +2064,7 @@ func (x *ImageOutput) GetGcp() *GCPUpload { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetAzure() *AzureBlobUpload { if x != nil { if x, ok := x.Output.(*ImageOutput_Azure); ok { @@ -2050,6 +2074,7 @@ func (x *ImageOutput) GetAzure() *AzureBlobUpload { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetAliOSS() *AliOSSUpload { if x != nil { if x, ok := x.Output.(*ImageOutput_AliOSS); ok { @@ -2064,18 +2089,22 @@ type isImageOutput_Output interface { } type ImageOutput_S3 struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. S3 *S3Upload `protobuf:"bytes,8,opt,name=s3,proto3,oneof"` } type ImageOutput_Gcp struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. Gcp *GCPUpload `protobuf:"bytes,9,opt,name=gcp,proto3,oneof"` } type ImageOutput_Azure struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. Azure *AzureBlobUpload `protobuf:"bytes,10,opt,name=azure,proto3,oneof"` } type ImageOutput_AliOSS struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. AliOSS *AliOSSUpload `protobuf:"bytes,11,opt,name=aliOSS,proto3,oneof"` } @@ -2087,6 +2116,173 @@ func (*ImageOutput_Azure) isImageOutput_Output() {} func (*ImageOutput_AliOSS) isImageOutput_Output() {} +// Raw track data packaged into MCAP container format. +type McapOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Filepath string `protobuf:"bytes,1,opt,name=filepath,proto3" json:"filepath,omitempty"` + DisableManifest bool `protobuf:"varint,2,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *McapOutput) Reset() { + *x = McapOutput{} + mi := &file_livekit_egress_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *McapOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*McapOutput) ProtoMessage() {} + +func (x *McapOutput) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use McapOutput.ProtoReflect.Descriptor instead. +func (*McapOutput) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{15} +} + +func (x *McapOutput) GetFilepath() string { + if x != nil { + return x.Filepath + } + return "" +} + +func (x *McapOutput) GetDisableManifest() bool { + if x != nil { + return x.DisableManifest + } + return false +} + +type StorageConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Provider: + // + // *StorageConfig_S3 + // *StorageConfig_Gcp + // *StorageConfig_Azure + // *StorageConfig_AliOss + Provider isStorageConfig_Provider `protobuf_oneof:"provider"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StorageConfig) Reset() { + *x = StorageConfig{} + mi := &file_livekit_egress_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StorageConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StorageConfig) ProtoMessage() {} + +func (x *StorageConfig) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StorageConfig.ProtoReflect.Descriptor instead. +func (*StorageConfig) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{16} +} + +func (x *StorageConfig) GetProvider() isStorageConfig_Provider { + if x != nil { + return x.Provider + } + return nil +} + +func (x *StorageConfig) GetS3() *S3Upload { + if x != nil { + if x, ok := x.Provider.(*StorageConfig_S3); ok { + return x.S3 + } + } + return nil +} + +func (x *StorageConfig) GetGcp() *GCPUpload { + if x != nil { + if x, ok := x.Provider.(*StorageConfig_Gcp); ok { + return x.Gcp + } + } + return nil +} + +func (x *StorageConfig) GetAzure() *AzureBlobUpload { + if x != nil { + if x, ok := x.Provider.(*StorageConfig_Azure); ok { + return x.Azure + } + } + return nil +} + +func (x *StorageConfig) GetAliOss() *AliOSSUpload { + if x != nil { + if x, ok := x.Provider.(*StorageConfig_AliOss); ok { + return x.AliOss + } + } + return nil +} + +type isStorageConfig_Provider interface { + isStorageConfig_Provider() +} + +type StorageConfig_S3 struct { + S3 *S3Upload `protobuf:"bytes,1,opt,name=s3,proto3,oneof"` +} + +type StorageConfig_Gcp struct { + Gcp *GCPUpload `protobuf:"bytes,2,opt,name=gcp,proto3,oneof"` +} + +type StorageConfig_Azure struct { + Azure *AzureBlobUpload `protobuf:"bytes,3,opt,name=azure,proto3,oneof"` +} + +type StorageConfig_AliOss struct { + AliOss *AliOSSUpload `protobuf:"bytes,4,opt,name=ali_oss,json=aliOss,proto3,oneof"` +} + +func (*StorageConfig_S3) isStorageConfig_Provider() {} + +func (*StorageConfig_Gcp) isStorageConfig_Provider() {} + +func (*StorageConfig_Azure) isStorageConfig_Provider() {} + +func (*StorageConfig_AliOss) isStorageConfig_Provider() {} + type S3Upload struct { state protoimpl.MessageState `protogen:"open.v1"` AccessKey string `protobuf:"bytes,1,opt,name=access_key,json=accessKey,proto3" json:"access_key,omitempty"` @@ -2108,7 +2304,7 @@ type S3Upload struct { func (x *S3Upload) Reset() { *x = S3Upload{} - mi := &file_livekit_egress_proto_msgTypes[9] + mi := &file_livekit_egress_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2120,7 +2316,7 @@ func (x *S3Upload) String() string { func (*S3Upload) ProtoMessage() {} func (x *S3Upload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[9] + mi := &file_livekit_egress_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2133,7 +2329,7 @@ func (x *S3Upload) ProtoReflect() protoreflect.Message { // Deprecated: Use S3Upload.ProtoReflect.Descriptor instead. func (*S3Upload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{9} + return file_livekit_egress_proto_rawDescGZIP(), []int{17} } func (x *S3Upload) GetAccessKey() string { @@ -2239,7 +2435,7 @@ type GCPUpload struct { func (x *GCPUpload) Reset() { *x = GCPUpload{} - mi := &file_livekit_egress_proto_msgTypes[10] + mi := &file_livekit_egress_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2251,7 +2447,7 @@ func (x *GCPUpload) String() string { func (*GCPUpload) ProtoMessage() {} func (x *GCPUpload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[10] + mi := &file_livekit_egress_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2264,7 +2460,7 @@ func (x *GCPUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use GCPUpload.ProtoReflect.Descriptor instead. func (*GCPUpload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{10} + return file_livekit_egress_proto_rawDescGZIP(), []int{18} } func (x *GCPUpload) GetCredentials() string { @@ -2299,7 +2495,7 @@ type AzureBlobUpload struct { func (x *AzureBlobUpload) Reset() { *x = AzureBlobUpload{} - mi := &file_livekit_egress_proto_msgTypes[11] + mi := &file_livekit_egress_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2311,7 +2507,7 @@ func (x *AzureBlobUpload) String() string { func (*AzureBlobUpload) ProtoMessage() {} func (x *AzureBlobUpload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[11] + mi := &file_livekit_egress_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2324,7 +2520,7 @@ func (x *AzureBlobUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureBlobUpload.ProtoReflect.Descriptor instead. func (*AzureBlobUpload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{11} + return file_livekit_egress_proto_rawDescGZIP(), []int{19} } func (x *AzureBlobUpload) GetAccountName() string { @@ -2361,7 +2557,7 @@ type AliOSSUpload struct { func (x *AliOSSUpload) Reset() { *x = AliOSSUpload{} - mi := &file_livekit_egress_proto_msgTypes[12] + mi := &file_livekit_egress_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2373,7 +2569,7 @@ func (x *AliOSSUpload) String() string { func (*AliOSSUpload) ProtoMessage() {} func (x *AliOSSUpload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[12] + mi := &file_livekit_egress_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2386,7 +2582,7 @@ func (x *AliOSSUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use AliOSSUpload.ProtoReflect.Descriptor instead. func (*AliOSSUpload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{12} + return file_livekit_egress_proto_rawDescGZIP(), []int{20} } func (x *AliOSSUpload) GetAccessKey() string { @@ -2435,7 +2631,7 @@ type ProxyConfig struct { func (x *ProxyConfig) Reset() { *x = ProxyConfig{} - mi := &file_livekit_egress_proto_msgTypes[13] + mi := &file_livekit_egress_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2447,7 +2643,7 @@ func (x *ProxyConfig) String() string { func (*ProxyConfig) ProtoMessage() {} func (x *ProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[13] + mi := &file_livekit_egress_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2460,7 +2656,7 @@ func (x *ProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ProxyConfig.ProtoReflect.Descriptor instead. func (*ProxyConfig) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{13} + return file_livekit_egress_proto_rawDescGZIP(), []int{21} } func (x *ProxyConfig) GetUrl() string { @@ -2484,29 +2680,30 @@ func (x *ProxyConfig) GetPassword() string { return "" } -type StreamOutput struct { +type ListEgressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Protocol StreamProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=livekit.StreamProtocol" json:"protocol,omitempty"` // required - Urls []string `protobuf:"bytes,2,rep,name=urls,proto3" json:"urls,omitempty"` // required + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // (optional, filter by room name) + EgressId string `protobuf:"bytes,2,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` // (optional, filter by egress ID) + Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` // (optional, list active egress only) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *StreamOutput) Reset() { - *x = StreamOutput{} - mi := &file_livekit_egress_proto_msgTypes[14] +func (x *ListEgressRequest) Reset() { + *x = ListEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *StreamOutput) String() string { +func (x *ListEgressRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StreamOutput) ProtoMessage() {} +func (*ListEgressRequest) ProtoMessage() {} -func (x *StreamOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[14] +func (x *ListEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2517,58 +2714,54 @@ func (x *StreamOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StreamOutput.ProtoReflect.Descriptor instead. -func (*StreamOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{14} +// Deprecated: Use ListEgressRequest.ProtoReflect.Descriptor instead. +func (*ListEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{22} } -func (x *StreamOutput) GetProtocol() StreamProtocol { +func (x *ListEgressRequest) GetRoomName() string { if x != nil { - return x.Protocol + return x.RoomName } - return StreamProtocol_DEFAULT_PROTOCOL + return "" } -func (x *StreamOutput) GetUrls() []string { +func (x *ListEgressRequest) GetEgressId() string { if x != nil { - return x.Urls + return x.EgressId } - return nil + return "" } -type EncodingOptions struct { - state protoimpl.MessageState `protogen:"open.v1"` - Width int32 `protobuf:"varint,1,opt,name=width,proto3" json:"width,omitempty"` // (default 1920) - Height int32 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` // (default 1080) - Depth int32 `protobuf:"varint,3,opt,name=depth,proto3" json:"depth,omitempty"` // (default 24) - Framerate int32 `protobuf:"varint,4,opt,name=framerate,proto3" json:"framerate,omitempty"` // (default 30) - AudioCodec AudioCodec `protobuf:"varint,5,opt,name=audio_codec,json=audioCodec,proto3,enum=livekit.AudioCodec" json:"audio_codec,omitempty"` // (default OPUS) - AudioBitrate int32 `protobuf:"varint,6,opt,name=audio_bitrate,json=audioBitrate,proto3" json:"audio_bitrate,omitempty"` // (default 128) - AudioQuality int32 `protobuf:"varint,11,opt,name=audio_quality,json=audioQuality,proto3" json:"audio_quality,omitempty"` // quality setting on audio encoder - AudioFrequency int32 `protobuf:"varint,7,opt,name=audio_frequency,json=audioFrequency,proto3" json:"audio_frequency,omitempty"` // (default 44100) - VideoCodec VideoCodec `protobuf:"varint,8,opt,name=video_codec,json=videoCodec,proto3,enum=livekit.VideoCodec" json:"video_codec,omitempty"` // (default H264_MAIN) - VideoBitrate int32 `protobuf:"varint,9,opt,name=video_bitrate,json=videoBitrate,proto3" json:"video_bitrate,omitempty"` // (default 4500) - VideoQuality int32 `protobuf:"varint,12,opt,name=video_quality,json=videoQuality,proto3" json:"video_quality,omitempty"` // quality setting on video encoder - KeyFrameInterval float64 `protobuf:"fixed64,10,opt,name=key_frame_interval,json=keyFrameInterval,proto3" json:"key_frame_interval,omitempty"` // in seconds (default 4s for streaming, segment duration for segmented output, encoder default for files) - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +func (x *ListEgressRequest) GetActive() bool { + if x != nil { + return x.Active + } + return false } -func (x *EncodingOptions) Reset() { - *x = EncodingOptions{} - mi := &file_livekit_egress_proto_msgTypes[15] +type ListEgressResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*EgressInfo `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListEgressResponse) Reset() { + *x = ListEgressResponse{} + mi := &file_livekit_egress_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *EncodingOptions) String() string { +func (x *ListEgressResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EncodingOptions) ProtoMessage() {} +func (*ListEgressResponse) ProtoMessage() {} -func (x *EncodingOptions) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[15] +func (x *ListEgressResponse) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2579,118 +2772,44 @@ func (x *EncodingOptions) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EncodingOptions.ProtoReflect.Descriptor instead. -func (*EncodingOptions) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{15} +// Deprecated: Use ListEgressResponse.ProtoReflect.Descriptor instead. +func (*ListEgressResponse) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{23} } -func (x *EncodingOptions) GetWidth() int32 { +func (x *ListEgressResponse) GetItems() []*EgressInfo { if x != nil { - return x.Width + return x.Items } - return 0 + return nil } -func (x *EncodingOptions) GetHeight() int32 { - if x != nil { - return x.Height - } - return 0 +type UpdateEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Layout string `protobuf:"bytes,3,opt,name=layout,proto3" json:"layout,omitempty"` + AddStreamUrls []string `protobuf:"bytes,4,rep,name=add_stream_urls,json=addStreamUrls,proto3" json:"add_stream_urls,omitempty"` + RemoveStreamUrls []string `protobuf:"bytes,5,rep,name=remove_stream_urls,json=removeStreamUrls,proto3" json:"remove_stream_urls,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *EncodingOptions) GetDepth() int32 { - if x != nil { - return x.Depth - } - return 0 -} - -func (x *EncodingOptions) GetFramerate() int32 { - if x != nil { - return x.Framerate - } - return 0 -} - -func (x *EncodingOptions) GetAudioCodec() AudioCodec { - if x != nil { - return x.AudioCodec - } - return AudioCodec_DEFAULT_AC -} - -func (x *EncodingOptions) GetAudioBitrate() int32 { - if x != nil { - return x.AudioBitrate - } - return 0 -} - -func (x *EncodingOptions) GetAudioQuality() int32 { - if x != nil { - return x.AudioQuality - } - return 0 -} - -func (x *EncodingOptions) GetAudioFrequency() int32 { - if x != nil { - return x.AudioFrequency - } - return 0 -} - -func (x *EncodingOptions) GetVideoCodec() VideoCodec { - if x != nil { - return x.VideoCodec - } - return VideoCodec_DEFAULT_VC -} - -func (x *EncodingOptions) GetVideoBitrate() int32 { - if x != nil { - return x.VideoBitrate - } - return 0 -} - -func (x *EncodingOptions) GetVideoQuality() int32 { - if x != nil { - return x.VideoQuality - } - return 0 -} - -func (x *EncodingOptions) GetKeyFrameInterval() float64 { - if x != nil { - return x.KeyFrameInterval - } - return 0 -} - -type UpdateLayoutRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` - Layout string `protobuf:"bytes,2,opt,name=layout,proto3" json:"layout,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *UpdateLayoutRequest) Reset() { - *x = UpdateLayoutRequest{} - mi := &file_livekit_egress_proto_msgTypes[16] +func (x *UpdateEgressRequest) Reset() { + *x = UpdateEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *UpdateLayoutRequest) String() string { +func (x *UpdateEgressRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateLayoutRequest) ProtoMessage() {} +func (*UpdateEgressRequest) ProtoMessage() {} -func (x *UpdateLayoutRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[16] +func (x *UpdateEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2701,185 +2820,42 @@ func (x *UpdateLayoutRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateLayoutRequest.ProtoReflect.Descriptor instead. -func (*UpdateLayoutRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{16} +// Deprecated: Use UpdateEgressRequest.ProtoReflect.Descriptor instead. +func (*UpdateEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{24} } -func (x *UpdateLayoutRequest) GetEgressId() string { +func (x *UpdateEgressRequest) GetEgressId() string { if x != nil { return x.EgressId } return "" } -func (x *UpdateLayoutRequest) GetLayout() string { +func (x *UpdateEgressRequest) GetUrl() string { if x != nil { - return x.Layout + return x.Url } return "" } -type UpdateStreamRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` - AddOutputUrls []string `protobuf:"bytes,2,rep,name=add_output_urls,json=addOutputUrls,proto3" json:"add_output_urls,omitempty"` - RemoveOutputUrls []string `protobuf:"bytes,3,rep,name=remove_output_urls,json=removeOutputUrls,proto3" json:"remove_output_urls,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *UpdateStreamRequest) Reset() { - *x = UpdateStreamRequest{} - mi := &file_livekit_egress_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *UpdateStreamRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateStreamRequest) ProtoMessage() {} - -func (x *UpdateStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[17] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateStreamRequest.ProtoReflect.Descriptor instead. -func (*UpdateStreamRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{17} -} - -func (x *UpdateStreamRequest) GetEgressId() string { +func (x *UpdateEgressRequest) GetLayout() string { if x != nil { - return x.EgressId + return x.Layout } return "" } -func (x *UpdateStreamRequest) GetAddOutputUrls() []string { - if x != nil { - return x.AddOutputUrls - } - return nil -} - -func (x *UpdateStreamRequest) GetRemoveOutputUrls() []string { +func (x *UpdateEgressRequest) GetAddStreamUrls() []string { if x != nil { - return x.RemoveOutputUrls + return x.AddStreamUrls } return nil } -type ListEgressRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // (optional, filter by room name) - EgressId string `protobuf:"bytes,2,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` // (optional, filter by egress ID) - Active bool `protobuf:"varint,3,opt,name=active,proto3" json:"active,omitempty"` // (optional, list active egress only) - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ListEgressRequest) Reset() { - *x = ListEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListEgressRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListEgressRequest) ProtoMessage() {} - -func (x *ListEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[18] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListEgressRequest.ProtoReflect.Descriptor instead. -func (*ListEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{18} -} - -func (x *ListEgressRequest) GetRoomName() string { - if x != nil { - return x.RoomName - } - return "" -} - -func (x *ListEgressRequest) GetEgressId() string { - if x != nil { - return x.EgressId - } - return "" -} - -func (x *ListEgressRequest) GetActive() bool { - if x != nil { - return x.Active - } - return false -} - -type ListEgressResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Items []*EgressInfo `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ListEgressResponse) Reset() { - *x = ListEgressResponse{} - mi := &file_livekit_egress_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListEgressResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListEgressResponse) ProtoMessage() {} - -func (x *ListEgressResponse) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[19] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListEgressResponse.ProtoReflect.Descriptor instead. -func (*ListEgressResponse) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{19} -} - -func (x *ListEgressResponse) GetItems() []*EgressInfo { +func (x *UpdateEgressRequest) GetRemoveStreamUrls() []string { if x != nil { - return x.Items + return x.RemoveStreamUrls } return nil } @@ -2893,7 +2869,7 @@ type StopEgressRequest struct { func (x *StopEgressRequest) Reset() { *x = StopEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[20] + mi := &file_livekit_egress_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2905,7 +2881,7 @@ func (x *StopEgressRequest) String() string { func (*StopEgressRequest) ProtoMessage() {} func (x *StopEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[20] + mi := &file_livekit_egress_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2918,7 +2894,7 @@ func (x *StopEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopEgressRequest.ProtoReflect.Descriptor instead. func (*StopEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{20} + return file_livekit_egress_proto_rawDescGZIP(), []int{25} } func (x *StopEgressRequest) GetEgressId() string { @@ -2938,37 +2914,42 @@ type EgressInfo struct { StartedAt int64 `protobuf:"varint,10,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` EndedAt int64 `protobuf:"varint,11,opt,name=ended_at,json=endedAt,proto3" json:"ended_at,omitempty"` UpdatedAt int64 `protobuf:"varint,18,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - Details string `protobuf:"bytes,21,opt,name=details,proto3" json:"details,omitempty"` - Error string `protobuf:"bytes,9,opt,name=error,proto3" json:"error,omitempty"` - ErrorCode int32 `protobuf:"varint,22,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` // Types that are valid to be assigned to Request: // + // *EgressInfo_Egress + // *EgressInfo_Replay // *EgressInfo_RoomComposite // *EgressInfo_Web // *EgressInfo_Participant // *EgressInfo_TrackComposite // *EgressInfo_Track - Request isEgressInfo_Request `protobuf_oneof:"request"` + Request isEgressInfo_Request `protobuf_oneof:"request"` + StreamResults []*StreamInfo `protobuf:"bytes,15,rep,name=stream_results,json=streamResults,proto3" json:"stream_results,omitempty"` + FileResults []*FileInfo `protobuf:"bytes,16,rep,name=file_results,json=fileResults,proto3" json:"file_results,omitempty"` + SegmentResults []*SegmentsInfo `protobuf:"bytes,17,rep,name=segment_results,json=segmentResults,proto3" json:"segment_results,omitempty"` + ImageResults []*ImagesInfo `protobuf:"bytes,20,rep,name=image_results,json=imageResults,proto3" json:"image_results,omitempty"` + McapResults []*McapInfo `protobuf:"bytes,28,rep,name=mcap_results,json=mcapResults,proto3" json:"mcap_results,omitempty"` + Error string `protobuf:"bytes,9,opt,name=error,proto3" json:"error,omitempty"` + ErrorCode int32 `protobuf:"varint,22,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + Details string `protobuf:"bytes,21,opt,name=details,proto3" json:"details,omitempty"` + ManifestLocation string `protobuf:"bytes,23,opt,name=manifest_location,json=manifestLocation,proto3" json:"manifest_location,omitempty"` + BackupStorageUsed bool `protobuf:"varint,25,opt,name=backup_storage_used,json=backupStorageUsed,proto3" json:"backup_storage_used,omitempty"` + RetryCount int32 `protobuf:"varint,27,opt,name=retry_count,json=retryCount,proto3" json:"retry_count,omitempty"` + // --- Deprecated --- + // // Types that are valid to be assigned to Result: // // *EgressInfo_Stream // *EgressInfo_File // *EgressInfo_Segments - Result isEgressInfo_Result `protobuf_oneof:"result"` - StreamResults []*StreamInfo `protobuf:"bytes,15,rep,name=stream_results,json=streamResults,proto3" json:"stream_results,omitempty"` - FileResults []*FileInfo `protobuf:"bytes,16,rep,name=file_results,json=fileResults,proto3" json:"file_results,omitempty"` - SegmentResults []*SegmentsInfo `protobuf:"bytes,17,rep,name=segment_results,json=segmentResults,proto3" json:"segment_results,omitempty"` - ImageResults []*ImagesInfo `protobuf:"bytes,20,rep,name=image_results,json=imageResults,proto3" json:"image_results,omitempty"` - ManifestLocation string `protobuf:"bytes,23,opt,name=manifest_location,json=manifestLocation,proto3" json:"manifest_location,omitempty"` - BackupStorageUsed bool `protobuf:"varint,25,opt,name=backup_storage_used,json=backupStorageUsed,proto3" json:"backup_storage_used,omitempty"` - RetryCount int32 `protobuf:"varint,27,opt,name=retry_count,json=retryCount,proto3" json:"retry_count,omitempty"` // next ID: 28 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Result isEgressInfo_Result `protobuf_oneof:"result"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EgressInfo) Reset() { *x = EgressInfo{} - mi := &file_livekit_egress_proto_msgTypes[21] + mi := &file_livekit_egress_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2980,7 +2961,7 @@ func (x *EgressInfo) String() string { func (*EgressInfo) ProtoMessage() {} func (x *EgressInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[21] + mi := &file_livekit_egress_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2993,7 +2974,7 @@ func (x *EgressInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EgressInfo.ProtoReflect.Descriptor instead. func (*EgressInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{21} + return file_livekit_egress_proto_rawDescGZIP(), []int{26} } func (x *EgressInfo) GetEgressId() string { @@ -3052,34 +3033,32 @@ func (x *EgressInfo) GetUpdatedAt() int64 { return 0 } -func (x *EgressInfo) GetDetails() string { - if x != nil { - return x.Details - } - return "" -} - -func (x *EgressInfo) GetError() string { +func (x *EgressInfo) GetRequest() isEgressInfo_Request { if x != nil { - return x.Error + return x.Request } - return "" + return nil } -func (x *EgressInfo) GetErrorCode() int32 { +func (x *EgressInfo) GetEgress() *StartEgressRequest { if x != nil { - return x.ErrorCode + if x, ok := x.Request.(*EgressInfo_Egress); ok { + return x.Egress + } } - return 0 + return nil } -func (x *EgressInfo) GetRequest() isEgressInfo_Request { +func (x *EgressInfo) GetReplay() *ExportReplayRequest { if x != nil { - return x.Request + if x, ok := x.Request.(*EgressInfo_Replay); ok { + return x.Replay + } } return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetRoomComposite() *RoomCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_RoomComposite); ok { @@ -3089,6 +3068,7 @@ func (x *EgressInfo) GetRoomComposite() *RoomCompositeEgressRequest { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetWeb() *WebEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Web); ok { @@ -3098,6 +3078,7 @@ func (x *EgressInfo) GetWeb() *WebEgressRequest { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetParticipant() *ParticipantEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Participant); ok { @@ -3107,6 +3088,7 @@ func (x *EgressInfo) GetParticipant() *ParticipantEgressRequest { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetTrackComposite() *TrackCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_TrackComposite); ok { @@ -3116,6 +3098,7 @@ func (x *EgressInfo) GetTrackComposite() *TrackCompositeEgressRequest { return nil } +// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetTrack() *TrackEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Track); ok { @@ -3125,69 +3108,60 @@ func (x *EgressInfo) GetTrack() *TrackEgressRequest { return nil } -func (x *EgressInfo) GetResult() isEgressInfo_Result { +func (x *EgressInfo) GetStreamResults() []*StreamInfo { if x != nil { - return x.Result + return x.StreamResults } return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *EgressInfo) GetStream() *StreamInfoList { +func (x *EgressInfo) GetFileResults() []*FileInfo { if x != nil { - if x, ok := x.Result.(*EgressInfo_Stream); ok { - return x.Stream - } + return x.FileResults } return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *EgressInfo) GetFile() *FileInfo { +func (x *EgressInfo) GetSegmentResults() []*SegmentsInfo { if x != nil { - if x, ok := x.Result.(*EgressInfo_File); ok { - return x.File - } + return x.SegmentResults } return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. -func (x *EgressInfo) GetSegments() *SegmentsInfo { +func (x *EgressInfo) GetImageResults() []*ImagesInfo { if x != nil { - if x, ok := x.Result.(*EgressInfo_Segments); ok { - return x.Segments - } + return x.ImageResults } return nil } -func (x *EgressInfo) GetStreamResults() []*StreamInfo { +func (x *EgressInfo) GetMcapResults() []*McapInfo { if x != nil { - return x.StreamResults + return x.McapResults } return nil } -func (x *EgressInfo) GetFileResults() []*FileInfo { +func (x *EgressInfo) GetError() string { if x != nil { - return x.FileResults + return x.Error } - return nil + return "" } -func (x *EgressInfo) GetSegmentResults() []*SegmentsInfo { +func (x *EgressInfo) GetErrorCode() int32 { if x != nil { - return x.SegmentResults + return x.ErrorCode } - return nil + return 0 } -func (x *EgressInfo) GetImageResults() []*ImagesInfo { +func (x *EgressInfo) GetDetails() string { if x != nil { - return x.ImageResults + return x.Details } - return nil + return "" } func (x *EgressInfo) GetManifestLocation() string { @@ -3211,30 +3185,84 @@ func (x *EgressInfo) GetRetryCount() int32 { return 0 } +func (x *EgressInfo) GetResult() isEgressInfo_Result { + if x != nil { + return x.Result + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *EgressInfo) GetStream() *StreamInfoList { + if x != nil { + if x, ok := x.Result.(*EgressInfo_Stream); ok { + return x.Stream + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *EgressInfo) GetFile() *FileInfo { + if x != nil { + if x, ok := x.Result.(*EgressInfo_File); ok { + return x.File + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *EgressInfo) GetSegments() *SegmentsInfo { + if x != nil { + if x, ok := x.Result.(*EgressInfo_Segments); ok { + return x.Segments + } + } + return nil +} + type isEgressInfo_Request interface { isEgressInfo_Request() } +type EgressInfo_Egress struct { + Egress *StartEgressRequest `protobuf:"bytes,29,opt,name=egress,proto3,oneof"` +} + +type EgressInfo_Replay struct { + Replay *ExportReplayRequest `protobuf:"bytes,30,opt,name=replay,proto3,oneof"` +} + type EgressInfo_RoomComposite struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. RoomComposite *RoomCompositeEgressRequest `protobuf:"bytes,4,opt,name=room_composite,json=roomComposite,proto3,oneof"` } type EgressInfo_Web struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. Web *WebEgressRequest `protobuf:"bytes,14,opt,name=web,proto3,oneof"` } type EgressInfo_Participant struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. Participant *ParticipantEgressRequest `protobuf:"bytes,19,opt,name=participant,proto3,oneof"` } type EgressInfo_TrackComposite struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. TrackComposite *TrackCompositeEgressRequest `protobuf:"bytes,5,opt,name=track_composite,json=trackComposite,proto3,oneof"` } type EgressInfo_Track struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. Track *TrackEgressRequest `protobuf:"bytes,6,opt,name=track,proto3,oneof"` } +func (*EgressInfo_Egress) isEgressInfo_Request() {} + +func (*EgressInfo_Replay) isEgressInfo_Request() {} + func (*EgressInfo_RoomComposite) isEgressInfo_Request() {} func (*EgressInfo_Web) isEgressInfo_Request() {} @@ -3270,51 +3298,6 @@ func (*EgressInfo_File) isEgressInfo_Result() {} func (*EgressInfo_Segments) isEgressInfo_Result() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. -type StreamInfoList struct { - state protoimpl.MessageState `protogen:"open.v1"` - Info []*StreamInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *StreamInfoList) Reset() { - *x = StreamInfoList{} - mi := &file_livekit_egress_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *StreamInfoList) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StreamInfoList) ProtoMessage() {} - -func (x *StreamInfoList) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[22] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StreamInfoList.ProtoReflect.Descriptor instead. -func (*StreamInfoList) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{22} -} - -func (x *StreamInfoList) GetInfo() []*StreamInfo { - if x != nil { - return x.Info - } - return nil -} - type StreamInfo struct { state protoimpl.MessageState `protogen:"open.v1"` Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` @@ -3331,7 +3314,7 @@ type StreamInfo struct { func (x *StreamInfo) Reset() { *x = StreamInfo{} - mi := &file_livekit_egress_proto_msgTypes[23] + mi := &file_livekit_egress_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3343,7 +3326,7 @@ func (x *StreamInfo) String() string { func (*StreamInfo) ProtoMessage() {} func (x *StreamInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[23] + mi := &file_livekit_egress_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3356,7 +3339,7 @@ func (x *StreamInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamInfo.ProtoReflect.Descriptor instead. func (*StreamInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{23} + return file_livekit_egress_proto_rawDescGZIP(), []int{27} } func (x *StreamInfo) GetUrl() string { @@ -3429,7 +3412,7 @@ type FileInfo struct { func (x *FileInfo) Reset() { *x = FileInfo{} - mi := &file_livekit_egress_proto_msgTypes[24] + mi := &file_livekit_egress_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3441,7 +3424,7 @@ func (x *FileInfo) String() string { func (*FileInfo) ProtoMessage() {} func (x *FileInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[24] + mi := &file_livekit_egress_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3454,7 +3437,7 @@ func (x *FileInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use FileInfo.ProtoReflect.Descriptor instead. func (*FileInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{24} + return file_livekit_egress_proto_rawDescGZIP(), []int{28} } func (x *FileInfo) GetFilename() string { @@ -3516,7 +3499,7 @@ type SegmentsInfo struct { func (x *SegmentsInfo) Reset() { *x = SegmentsInfo{} - mi := &file_livekit_egress_proto_msgTypes[25] + mi := &file_livekit_egress_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3528,7 +3511,7 @@ func (x *SegmentsInfo) String() string { func (*SegmentsInfo) ProtoMessage() {} func (x *SegmentsInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[25] + mi := &file_livekit_egress_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3541,7 +3524,7 @@ func (x *SegmentsInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SegmentsInfo.ProtoReflect.Descriptor instead. func (*SegmentsInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{25} + return file_livekit_egress_proto_rawDescGZIP(), []int{29} } func (x *SegmentsInfo) GetPlaylistName() string { @@ -3619,7 +3602,7 @@ type ImagesInfo struct { func (x *ImagesInfo) Reset() { *x = ImagesInfo{} - mi := &file_livekit_egress_proto_msgTypes[26] + mi := &file_livekit_egress_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3631,7 +3614,7 @@ func (x *ImagesInfo) String() string { func (*ImagesInfo) ProtoMessage() {} func (x *ImagesInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[26] + mi := &file_livekit_egress_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3644,7 +3627,7 @@ func (x *ImagesInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ImagesInfo.ProtoReflect.Descriptor instead. func (*ImagesInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{26} + return file_livekit_egress_proto_rawDescGZIP(), []int{30} } func (x *ImagesInfo) GetFilenamePrefix() string { @@ -3675,34 +3658,34 @@ func (x *ImagesInfo) GetEndedAt() int64 { return 0 } -type AutoParticipantEgress struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Options: - // - // *AutoParticipantEgress_Preset - // *AutoParticipantEgress_Advanced - Options isAutoParticipantEgress_Options `protobuf_oneof:"options"` - FileOutputs []*EncodedFileOutput `protobuf:"bytes,3,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` - SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,4,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type McapInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` + StartedAt int64 `protobuf:"varint,2,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + EndedAt int64 `protobuf:"varint,3,opt,name=ended_at,json=endedAt,proto3" json:"ended_at,omitempty"` + Duration int64 `protobuf:"varint,4,opt,name=duration,proto3" json:"duration,omitempty"` + Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` + Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` + TrackCount int64 `protobuf:"varint,7,opt,name=track_count,json=trackCount,proto3" json:"track_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *AutoParticipantEgress) Reset() { - *x = AutoParticipantEgress{} - mi := &file_livekit_egress_proto_msgTypes[27] +func (x *McapInfo) Reset() { + *x = McapInfo{} + mi := &file_livekit_egress_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AutoParticipantEgress) String() string { +func (x *McapInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoParticipantEgress) ProtoMessage() {} +func (*McapInfo) ProtoMessage() {} -func (x *AutoParticipantEgress) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[27] +func (x *McapInfo) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3713,60 +3696,152 @@ func (x *AutoParticipantEgress) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoParticipantEgress.ProtoReflect.Descriptor instead. -func (*AutoParticipantEgress) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{27} +// Deprecated: Use McapInfo.ProtoReflect.Descriptor instead. +func (*McapInfo) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{31} } -func (x *AutoParticipantEgress) GetOptions() isAutoParticipantEgress_Options { +func (x *McapInfo) GetFilename() string { if x != nil { - return x.Options + return x.Filename } - return nil + return "" } -func (x *AutoParticipantEgress) GetPreset() EncodingOptionsPreset { +func (x *McapInfo) GetStartedAt() int64 { if x != nil { - if x, ok := x.Options.(*AutoParticipantEgress_Preset); ok { - return x.Preset - } + return x.StartedAt } - return EncodingOptionsPreset_H264_720P_30 + return 0 } -func (x *AutoParticipantEgress) GetAdvanced() *EncodingOptions { +func (x *McapInfo) GetEndedAt() int64 { if x != nil { - if x, ok := x.Options.(*AutoParticipantEgress_Advanced); ok { - return x.Advanced - } + return x.EndedAt } - return nil + return 0 } -func (x *AutoParticipantEgress) GetFileOutputs() []*EncodedFileOutput { +func (x *McapInfo) GetDuration() int64 { if x != nil { - return x.FileOutputs + return x.Duration } - return nil + return 0 } -func (x *AutoParticipantEgress) GetSegmentOutputs() []*SegmentedFileOutput { +func (x *McapInfo) GetSize() int64 { if x != nil { - return x.SegmentOutputs + return x.Size } - return nil -} - -type isAutoParticipantEgress_Options interface { - isAutoParticipantEgress_Options() + return 0 } -type AutoParticipantEgress_Preset struct { - Preset EncodingOptionsPreset `protobuf:"varint,1,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` // (default H264_720P_30) +func (x *McapInfo) GetLocation() string { + if x != nil { + return x.Location + } + return "" } -type AutoParticipantEgress_Advanced struct { - Advanced *EncodingOptions `protobuf:"bytes,2,opt,name=advanced,proto3,oneof"` // (optional) +func (x *McapInfo) GetTrackCount() int64 { + if x != nil { + return x.TrackCount + } + return 0 +} + +type AutoParticipantEgress struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Options: + // + // *AutoParticipantEgress_Preset + // *AutoParticipantEgress_Advanced + Options isAutoParticipantEgress_Options `protobuf_oneof:"options"` + FileOutputs []*EncodedFileOutput `protobuf:"bytes,3,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` + SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,4,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AutoParticipantEgress) Reset() { + *x = AutoParticipantEgress{} + mi := &file_livekit_egress_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoParticipantEgress) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoParticipantEgress) ProtoMessage() {} + +func (x *AutoParticipantEgress) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoParticipantEgress.ProtoReflect.Descriptor instead. +func (*AutoParticipantEgress) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{32} +} + +func (x *AutoParticipantEgress) GetOptions() isAutoParticipantEgress_Options { + if x != nil { + return x.Options + } + return nil +} + +func (x *AutoParticipantEgress) GetPreset() EncodingOptionsPreset { + if x != nil { + if x, ok := x.Options.(*AutoParticipantEgress_Preset); ok { + return x.Preset + } + } + return EncodingOptionsPreset_H264_720P_30 +} + +func (x *AutoParticipantEgress) GetAdvanced() *EncodingOptions { + if x != nil { + if x, ok := x.Options.(*AutoParticipantEgress_Advanced); ok { + return x.Advanced + } + } + return nil +} + +func (x *AutoParticipantEgress) GetFileOutputs() []*EncodedFileOutput { + if x != nil { + return x.FileOutputs + } + return nil +} + +func (x *AutoParticipantEgress) GetSegmentOutputs() []*SegmentedFileOutput { + if x != nil { + return x.SegmentOutputs + } + return nil +} + +type isAutoParticipantEgress_Options interface { + isAutoParticipantEgress_Options() +} + +type AutoParticipantEgress_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,1,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` // (default H264_720P_30) +} + +type AutoParticipantEgress_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,2,opt,name=advanced,proto3,oneof"` // (optional) } func (*AutoParticipantEgress_Preset) isAutoParticipantEgress_Options() {} @@ -3790,7 +3865,7 @@ type AutoTrackEgress struct { func (x *AutoTrackEgress) Reset() { *x = AutoTrackEgress{} - mi := &file_livekit_egress_proto_msgTypes[28] + mi := &file_livekit_egress_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3802,7 +3877,7 @@ func (x *AutoTrackEgress) String() string { func (*AutoTrackEgress) ProtoMessage() {} func (x *AutoTrackEgress) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[28] + mi := &file_livekit_egress_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3815,7 +3890,7 @@ func (x *AutoTrackEgress) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoTrackEgress.ProtoReflect.Descriptor instead. func (*AutoTrackEgress) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{28} + return file_livekit_egress_proto_rawDescGZIP(), []int{33} } func (x *AutoTrackEgress) GetFilepath() string { @@ -3903,98 +3978,1650 @@ func (*AutoTrackEgress_Azure) isAutoTrackEgress_Output() {} func (*AutoTrackEgress_AliOSS) isAutoTrackEgress_Output() {} -var File_livekit_egress_proto protoreflect.FileDescriptor +type ExportReplayRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` + StartOffsetMs int64 `protobuf:"varint,2,opt,name=start_offset_ms,json=startOffsetMs,proto3" json:"start_offset_ms,omitempty"` + EndOffsetMs int64 `protobuf:"varint,3,opt,name=end_offset_ms,json=endOffsetMs,proto3" json:"end_offset_ms,omitempty"` + // Types that are valid to be assigned to Source: + // + // *ExportReplayRequest_Template + // *ExportReplayRequest_Web + // *ExportReplayRequest_Media + Source isExportReplayRequest_Source `protobuf_oneof:"source"` + // Types that are valid to be assigned to Encoding: + // + // *ExportReplayRequest_Preset + // *ExportReplayRequest_Advanced + Encoding isExportReplayRequest_Encoding `protobuf_oneof:"encoding"` + Outputs []*Output `protobuf:"bytes,9,rep,name=outputs,proto3" json:"outputs,omitempty"` + Storage *StorageConfig `protobuf:"bytes,10,opt,name=storage,proto3" json:"storage,omitempty"` + Webhooks []*WebhookConfig `protobuf:"bytes,11,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} -const file_livekit_egress_proto_rawDesc = "" + - "\n" + - "\x14livekit_egress.proto\x12\alivekit\x1a\x14livekit_models.proto\x1a\x14logger/options.proto\"\xd5\x06\n" + - "\x1aRoomCompositeEgressRequest\x12\x1b\n" + - "\troom_name\x18\x01 \x01(\tR\broomName\x12\x16\n" + - "\x06layout\x18\x02 \x01(\tR\x06layout\x12\x1d\n" + - "\n" + - "audio_only\x18\x03 \x01(\bR\taudioOnly\x127\n" + - "\faudio_mixing\x18\x0f \x01(\x0e2\x14.livekit.AudioMixingR\vaudioMixing\x12\x1d\n" + - "\n" + - "video_only\x18\x04 \x01(\bR\tvideoOnly\x12&\n" + - "\x0fcustom_base_url\x18\x05 \x01(\tR\rcustomBaseUrl\x124\n" + - "\x04file\x18\x06 \x01(\v2\x1a.livekit.EncodedFileOutputB\x02\x18\x01H\x00R\x04file\x123\n" + - "\x06stream\x18\a \x01(\v2\x15.livekit.StreamOutputB\x02\x18\x01H\x00R\x06stream\x12>\n" + - "\bsegments\x18\n" + - " \x01(\v2\x1c.livekit.SegmentedFileOutputB\x02\x18\x01H\x00R\bsegments\x128\n" + - "\x06preset\x18\b \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + - "\badvanced\x18\t \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12=\n" + - "\ffile_outputs\x18\v \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + - "\x0estream_outputs\x18\f \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + - "\x0fsegment_outputs\x18\r \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + - "\rimage_outputs\x18\x0e \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\x10 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + - "\x06outputB\t\n" + - "\aoptions\"\xf5\x05\n" + - "\x10WebEgressRequest\x12\x10\n" + - "\x03url\x18\x01 \x01(\tR\x03url\x12\x1d\n" + - "\n" + - "audio_only\x18\x02 \x01(\bR\taudioOnly\x12\x1d\n" + - "\n" + - "video_only\x18\x03 \x01(\bR\tvideoOnly\x12,\n" + - "\x12await_start_signal\x18\f \x01(\bR\x10awaitStartSignal\x124\n" + - "\x04file\x18\x04 \x01(\v2\x1a.livekit.EncodedFileOutputB\x02\x18\x01H\x00R\x04file\x123\n" + - "\x06stream\x18\x05 \x01(\v2\x15.livekit.StreamOutputB\x02\x18\x01H\x00R\x06stream\x12>\n" + - "\bsegments\x18\x06 \x01(\v2\x1c.livekit.SegmentedFileOutputB\x02\x18\x01H\x00R\bsegments\x128\n" + - "\x06preset\x18\a \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + - "\badvanced\x18\b \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12=\n" + - "\ffile_outputs\x18\t \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + - "\x0estream_outputs\x18\n" + - " \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + - "\x0fsegment_outputs\x18\v \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + - "\rimage_outputs\x18\r \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\x0e \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + - "\x06outputB\t\n" + - "\aoptions\"\xa6\x04\n" + - "\x18ParticipantEgressRequest\x12\x1b\n" + - "\troom_name\x18\x01 \x01(\tR\broomName\x12\x1a\n" + - "\bidentity\x18\x02 \x01(\tR\bidentity\x12!\n" + - "\fscreen_share\x18\x03 \x01(\bR\vscreenShare\x128\n" + - "\x06preset\x18\x04 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x00R\x06preset\x126\n" + - "\badvanced\x18\x05 \x01(\v2\x18.livekit.EncodingOptionsH\x00R\badvanced\x12=\n" + - "\ffile_outputs\x18\x06 \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + - "\x0estream_outputs\x18\a \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + - "\x0fsegment_outputs\x18\b \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + - "\rimage_outputs\x18\t \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\n" + - " \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\t\n" + - "\aoptions\"\x8f\x06\n" + - "\x1bTrackCompositeEgressRequest\x12\x1b\n" + - "\troom_name\x18\x01 \x01(\tR\broomName\x126\n" + - "\x0eaudio_track_id\x18\x02 \x01(\tB\x10\x9a\xec,\faudioTrackIDR\faudioTrackId\x126\n" + - "\x0evideo_track_id\x18\x03 \x01(\tB\x10\x9a\xec,\fvideoTrackIDR\fvideoTrackId\x124\n" + - "\x04file\x18\x04 \x01(\v2\x1a.livekit.EncodedFileOutputB\x02\x18\x01H\x00R\x04file\x123\n" + - "\x06stream\x18\x05 \x01(\v2\x15.livekit.StreamOutputB\x02\x18\x01H\x00R\x06stream\x12>\n" + - "\bsegments\x18\b \x01(\v2\x1c.livekit.SegmentedFileOutputB\x02\x18\x01H\x00R\bsegments\x128\n" + - "\x06preset\x18\x06 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + - "\badvanced\x18\a \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12=\n" + - "\ffile_outputs\x18\v \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + - "\x0estream_outputs\x18\f \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + - "\x0fsegment_outputs\x18\r \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + - "\rimage_outputs\x18\x0e \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\x0f \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + - "\x06outputB\t\n" + - "\aoptions\"\xef\x01\n" + - "\x12TrackEgressRequest\x12\x1b\n" + - "\troom_name\x18\x01 \x01(\tR\broomName\x12&\n" + - "\btrack_id\x18\x02 \x01(\tB\v\x9a\xec,\atrackIDR\atrackId\x12/\n" + - "\x04file\x18\x03 \x01(\v2\x19.livekit.DirectFileOutputH\x00R\x04file\x12%\n" + - "\rwebsocket_url\x18\x04 \x01(\tH\x00R\fwebsocketUrl\x122\n" + - "\bwebhooks\x18\x05 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + - "\x06output\"\xcb\x02\n" + - "\x11EncodedFileOutput\x125\n" + +func (x *ExportReplayRequest) Reset() { + *x = ExportReplayRequest{} + mi := &file_livekit_egress_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExportReplayRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportReplayRequest) ProtoMessage() {} + +func (x *ExportReplayRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[34] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportReplayRequest.ProtoReflect.Descriptor instead. +func (*ExportReplayRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{34} +} + +func (x *ExportReplayRequest) GetReplayId() string { + if x != nil { + return x.ReplayId + } + return "" +} + +func (x *ExportReplayRequest) GetStartOffsetMs() int64 { + if x != nil { + return x.StartOffsetMs + } + return 0 +} + +func (x *ExportReplayRequest) GetEndOffsetMs() int64 { + if x != nil { + return x.EndOffsetMs + } + return 0 +} + +func (x *ExportReplayRequest) GetSource() isExportReplayRequest_Source { + if x != nil { + return x.Source + } + return nil +} + +func (x *ExportReplayRequest) GetTemplate() *TemplateSource { + if x != nil { + if x, ok := x.Source.(*ExportReplayRequest_Template); ok { + return x.Template + } + } + return nil +} + +func (x *ExportReplayRequest) GetWeb() *WebSource { + if x != nil { + if x, ok := x.Source.(*ExportReplayRequest_Web); ok { + return x.Web + } + } + return nil +} + +func (x *ExportReplayRequest) GetMedia() *MediaSource { + if x != nil { + if x, ok := x.Source.(*ExportReplayRequest_Media); ok { + return x.Media + } + } + return nil +} + +func (x *ExportReplayRequest) GetEncoding() isExportReplayRequest_Encoding { + if x != nil { + return x.Encoding + } + return nil +} + +func (x *ExportReplayRequest) GetPreset() EncodingOptionsPreset { + if x != nil { + if x, ok := x.Encoding.(*ExportReplayRequest_Preset); ok { + return x.Preset + } + } + return EncodingOptionsPreset_H264_720P_30 +} + +func (x *ExportReplayRequest) GetAdvanced() *EncodingOptions { + if x != nil { + if x, ok := x.Encoding.(*ExportReplayRequest_Advanced); ok { + return x.Advanced + } + } + return nil +} + +func (x *ExportReplayRequest) GetOutputs() []*Output { + if x != nil { + return x.Outputs + } + return nil +} + +func (x *ExportReplayRequest) GetStorage() *StorageConfig { + if x != nil { + return x.Storage + } + return nil +} + +func (x *ExportReplayRequest) GetWebhooks() []*WebhookConfig { + if x != nil { + return x.Webhooks + } + return nil +} + +type isExportReplayRequest_Source interface { + isExportReplayRequest_Source() +} + +type ExportReplayRequest_Template struct { + Template *TemplateSource `protobuf:"bytes,4,opt,name=template,proto3,oneof"` +} + +type ExportReplayRequest_Web struct { + Web *WebSource `protobuf:"bytes,5,opt,name=web,proto3,oneof"` +} + +type ExportReplayRequest_Media struct { + Media *MediaSource `protobuf:"bytes,6,opt,name=media,proto3,oneof"` +} + +func (*ExportReplayRequest_Template) isExportReplayRequest_Source() {} + +func (*ExportReplayRequest_Web) isExportReplayRequest_Source() {} + +func (*ExportReplayRequest_Media) isExportReplayRequest_Source() {} + +type isExportReplayRequest_Encoding interface { + isExportReplayRequest_Encoding() +} + +type ExportReplayRequest_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,7,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` +} + +type ExportReplayRequest_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,8,opt,name=advanced,proto3,oneof"` +} + +func (*ExportReplayRequest_Preset) isExportReplayRequest_Encoding() {} + +func (*ExportReplayRequest_Advanced) isExportReplayRequest_Encoding() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type RoomCompositeEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` + Layout string `protobuf:"bytes,2,opt,name=layout,proto3" json:"layout,omitempty"` + AudioOnly bool `protobuf:"varint,3,opt,name=audio_only,json=audioOnly,proto3" json:"audio_only,omitempty"` + AudioMixing AudioMixing `protobuf:"varint,15,opt,name=audio_mixing,json=audioMixing,proto3,enum=livekit.AudioMixing" json:"audio_mixing,omitempty"` + VideoOnly bool `protobuf:"varint,4,opt,name=video_only,json=videoOnly,proto3" json:"video_only,omitempty"` + CustomBaseUrl string `protobuf:"bytes,5,opt,name=custom_base_url,json=customBaseUrl,proto3" json:"custom_base_url,omitempty"` + // Types that are valid to be assigned to Output: + // + // *RoomCompositeEgressRequest_File + // *RoomCompositeEgressRequest_Stream + // *RoomCompositeEgressRequest_Segments + Output isRoomCompositeEgressRequest_Output `protobuf_oneof:"output"` + // Types that are valid to be assigned to Options: + // + // *RoomCompositeEgressRequest_Preset + // *RoomCompositeEgressRequest_Advanced + Options isRoomCompositeEgressRequest_Options `protobuf_oneof:"options"` + FileOutputs []*EncodedFileOutput `protobuf:"bytes,11,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` + StreamOutputs []*StreamOutput `protobuf:"bytes,12,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` + SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,13,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` + ImageOutputs []*ImageOutput `protobuf:"bytes,14,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` + Webhooks []*WebhookConfig `protobuf:"bytes,16,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RoomCompositeEgressRequest) Reset() { + *x = RoomCompositeEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RoomCompositeEgressRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoomCompositeEgressRequest) ProtoMessage() {} + +func (x *RoomCompositeEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[35] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoomCompositeEgressRequest.ProtoReflect.Descriptor instead. +func (*RoomCompositeEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{35} +} + +func (x *RoomCompositeEgressRequest) GetRoomName() string { + if x != nil { + return x.RoomName + } + return "" +} + +func (x *RoomCompositeEgressRequest) GetLayout() string { + if x != nil { + return x.Layout + } + return "" +} + +func (x *RoomCompositeEgressRequest) GetAudioOnly() bool { + if x != nil { + return x.AudioOnly + } + return false +} + +func (x *RoomCompositeEgressRequest) GetAudioMixing() AudioMixing { + if x != nil { + return x.AudioMixing + } + return AudioMixing_DEFAULT_MIXING +} + +func (x *RoomCompositeEgressRequest) GetVideoOnly() bool { + if x != nil { + return x.VideoOnly + } + return false +} + +func (x *RoomCompositeEgressRequest) GetCustomBaseUrl() string { + if x != nil { + return x.CustomBaseUrl + } + return "" +} + +func (x *RoomCompositeEgressRequest) GetOutput() isRoomCompositeEgressRequest_Output { + if x != nil { + return x.Output + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *RoomCompositeEgressRequest) GetFile() *EncodedFileOutput { + if x != nil { + if x, ok := x.Output.(*RoomCompositeEgressRequest_File); ok { + return x.File + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *RoomCompositeEgressRequest) GetStream() *StreamOutput { + if x != nil { + if x, ok := x.Output.(*RoomCompositeEgressRequest_Stream); ok { + return x.Stream + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *RoomCompositeEgressRequest) GetSegments() *SegmentedFileOutput { + if x != nil { + if x, ok := x.Output.(*RoomCompositeEgressRequest_Segments); ok { + return x.Segments + } + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetOptions() isRoomCompositeEgressRequest_Options { + if x != nil { + return x.Options + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetPreset() EncodingOptionsPreset { + if x != nil { + if x, ok := x.Options.(*RoomCompositeEgressRequest_Preset); ok { + return x.Preset + } + } + return EncodingOptionsPreset_H264_720P_30 +} + +func (x *RoomCompositeEgressRequest) GetAdvanced() *EncodingOptions { + if x != nil { + if x, ok := x.Options.(*RoomCompositeEgressRequest_Advanced); ok { + return x.Advanced + } + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetFileOutputs() []*EncodedFileOutput { + if x != nil { + return x.FileOutputs + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetStreamOutputs() []*StreamOutput { + if x != nil { + return x.StreamOutputs + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { + if x != nil { + return x.SegmentOutputs + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetImageOutputs() []*ImageOutput { + if x != nil { + return x.ImageOutputs + } + return nil +} + +func (x *RoomCompositeEgressRequest) GetWebhooks() []*WebhookConfig { + if x != nil { + return x.Webhooks + } + return nil +} + +type isRoomCompositeEgressRequest_Output interface { + isRoomCompositeEgressRequest_Output() +} + +type RoomCompositeEgressRequest_File struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + File *EncodedFileOutput `protobuf:"bytes,6,opt,name=file,proto3,oneof"` +} + +type RoomCompositeEgressRequest_Stream struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Stream *StreamOutput `protobuf:"bytes,7,opt,name=stream,proto3,oneof"` +} + +type RoomCompositeEgressRequest_Segments struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Segments *SegmentedFileOutput `protobuf:"bytes,10,opt,name=segments,proto3,oneof"` +} + +func (*RoomCompositeEgressRequest_File) isRoomCompositeEgressRequest_Output() {} + +func (*RoomCompositeEgressRequest_Stream) isRoomCompositeEgressRequest_Output() {} + +func (*RoomCompositeEgressRequest_Segments) isRoomCompositeEgressRequest_Output() {} + +type isRoomCompositeEgressRequest_Options interface { + isRoomCompositeEgressRequest_Options() +} + +type RoomCompositeEgressRequest_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,8,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` +} + +type RoomCompositeEgressRequest_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,9,opt,name=advanced,proto3,oneof"` +} + +func (*RoomCompositeEgressRequest_Preset) isRoomCompositeEgressRequest_Options() {} + +func (*RoomCompositeEgressRequest_Advanced) isRoomCompositeEgressRequest_Options() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type WebEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + AudioOnly bool `protobuf:"varint,2,opt,name=audio_only,json=audioOnly,proto3" json:"audio_only,omitempty"` + VideoOnly bool `protobuf:"varint,3,opt,name=video_only,json=videoOnly,proto3" json:"video_only,omitempty"` + AwaitStartSignal bool `protobuf:"varint,12,opt,name=await_start_signal,json=awaitStartSignal,proto3" json:"await_start_signal,omitempty"` + // Types that are valid to be assigned to Output: + // + // *WebEgressRequest_File + // *WebEgressRequest_Stream + // *WebEgressRequest_Segments + Output isWebEgressRequest_Output `protobuf_oneof:"output"` + // Types that are valid to be assigned to Options: + // + // *WebEgressRequest_Preset + // *WebEgressRequest_Advanced + Options isWebEgressRequest_Options `protobuf_oneof:"options"` + FileOutputs []*EncodedFileOutput `protobuf:"bytes,9,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` + StreamOutputs []*StreamOutput `protobuf:"bytes,10,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` + SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,11,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` + ImageOutputs []*ImageOutput `protobuf:"bytes,13,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` + Webhooks []*WebhookConfig `protobuf:"bytes,14,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *WebEgressRequest) Reset() { + *x = WebEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WebEgressRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WebEgressRequest) ProtoMessage() {} + +func (x *WebEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WebEgressRequest.ProtoReflect.Descriptor instead. +func (*WebEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{36} +} + +func (x *WebEgressRequest) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *WebEgressRequest) GetAudioOnly() bool { + if x != nil { + return x.AudioOnly + } + return false +} + +func (x *WebEgressRequest) GetVideoOnly() bool { + if x != nil { + return x.VideoOnly + } + return false +} + +func (x *WebEgressRequest) GetAwaitStartSignal() bool { + if x != nil { + return x.AwaitStartSignal + } + return false +} + +func (x *WebEgressRequest) GetOutput() isWebEgressRequest_Output { + if x != nil { + return x.Output + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *WebEgressRequest) GetFile() *EncodedFileOutput { + if x != nil { + if x, ok := x.Output.(*WebEgressRequest_File); ok { + return x.File + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *WebEgressRequest) GetStream() *StreamOutput { + if x != nil { + if x, ok := x.Output.(*WebEgressRequest_Stream); ok { + return x.Stream + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *WebEgressRequest) GetSegments() *SegmentedFileOutput { + if x != nil { + if x, ok := x.Output.(*WebEgressRequest_Segments); ok { + return x.Segments + } + } + return nil +} + +func (x *WebEgressRequest) GetOptions() isWebEgressRequest_Options { + if x != nil { + return x.Options + } + return nil +} + +func (x *WebEgressRequest) GetPreset() EncodingOptionsPreset { + if x != nil { + if x, ok := x.Options.(*WebEgressRequest_Preset); ok { + return x.Preset + } + } + return EncodingOptionsPreset_H264_720P_30 +} + +func (x *WebEgressRequest) GetAdvanced() *EncodingOptions { + if x != nil { + if x, ok := x.Options.(*WebEgressRequest_Advanced); ok { + return x.Advanced + } + } + return nil +} + +func (x *WebEgressRequest) GetFileOutputs() []*EncodedFileOutput { + if x != nil { + return x.FileOutputs + } + return nil +} + +func (x *WebEgressRequest) GetStreamOutputs() []*StreamOutput { + if x != nil { + return x.StreamOutputs + } + return nil +} + +func (x *WebEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { + if x != nil { + return x.SegmentOutputs + } + return nil +} + +func (x *WebEgressRequest) GetImageOutputs() []*ImageOutput { + if x != nil { + return x.ImageOutputs + } + return nil +} + +func (x *WebEgressRequest) GetWebhooks() []*WebhookConfig { + if x != nil { + return x.Webhooks + } + return nil +} + +type isWebEgressRequest_Output interface { + isWebEgressRequest_Output() +} + +type WebEgressRequest_File struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + File *EncodedFileOutput `protobuf:"bytes,4,opt,name=file,proto3,oneof"` +} + +type WebEgressRequest_Stream struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Stream *StreamOutput `protobuf:"bytes,5,opt,name=stream,proto3,oneof"` +} + +type WebEgressRequest_Segments struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Segments *SegmentedFileOutput `protobuf:"bytes,6,opt,name=segments,proto3,oneof"` +} + +func (*WebEgressRequest_File) isWebEgressRequest_Output() {} + +func (*WebEgressRequest_Stream) isWebEgressRequest_Output() {} + +func (*WebEgressRequest_Segments) isWebEgressRequest_Output() {} + +type isWebEgressRequest_Options interface { + isWebEgressRequest_Options() +} + +type WebEgressRequest_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,7,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` +} + +type WebEgressRequest_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,8,opt,name=advanced,proto3,oneof"` +} + +func (*WebEgressRequest_Preset) isWebEgressRequest_Options() {} + +func (*WebEgressRequest_Advanced) isWebEgressRequest_Options() {} + +// record audio and video from a single participant +// +// Deprecated: Marked as deprecated in livekit_egress.proto. +type ParticipantEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` + Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + ScreenShare bool `protobuf:"varint,3,opt,name=screen_share,json=screenShare,proto3" json:"screen_share,omitempty"` + // Types that are valid to be assigned to Options: + // + // *ParticipantEgressRequest_Preset + // *ParticipantEgressRequest_Advanced + Options isParticipantEgressRequest_Options `protobuf_oneof:"options"` + FileOutputs []*EncodedFileOutput `protobuf:"bytes,6,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` + StreamOutputs []*StreamOutput `protobuf:"bytes,7,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` + SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,8,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` + ImageOutputs []*ImageOutput `protobuf:"bytes,9,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` + Webhooks []*WebhookConfig `protobuf:"bytes,10,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ParticipantEgressRequest) Reset() { + *x = ParticipantEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ParticipantEgressRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParticipantEgressRequest) ProtoMessage() {} + +func (x *ParticipantEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParticipantEgressRequest.ProtoReflect.Descriptor instead. +func (*ParticipantEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{37} +} + +func (x *ParticipantEgressRequest) GetRoomName() string { + if x != nil { + return x.RoomName + } + return "" +} + +func (x *ParticipantEgressRequest) GetIdentity() string { + if x != nil { + return x.Identity + } + return "" +} + +func (x *ParticipantEgressRequest) GetScreenShare() bool { + if x != nil { + return x.ScreenShare + } + return false +} + +func (x *ParticipantEgressRequest) GetOptions() isParticipantEgressRequest_Options { + if x != nil { + return x.Options + } + return nil +} + +func (x *ParticipantEgressRequest) GetPreset() EncodingOptionsPreset { + if x != nil { + if x, ok := x.Options.(*ParticipantEgressRequest_Preset); ok { + return x.Preset + } + } + return EncodingOptionsPreset_H264_720P_30 +} + +func (x *ParticipantEgressRequest) GetAdvanced() *EncodingOptions { + if x != nil { + if x, ok := x.Options.(*ParticipantEgressRequest_Advanced); ok { + return x.Advanced + } + } + return nil +} + +func (x *ParticipantEgressRequest) GetFileOutputs() []*EncodedFileOutput { + if x != nil { + return x.FileOutputs + } + return nil +} + +func (x *ParticipantEgressRequest) GetStreamOutputs() []*StreamOutput { + if x != nil { + return x.StreamOutputs + } + return nil +} + +func (x *ParticipantEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { + if x != nil { + return x.SegmentOutputs + } + return nil +} + +func (x *ParticipantEgressRequest) GetImageOutputs() []*ImageOutput { + if x != nil { + return x.ImageOutputs + } + return nil +} + +func (x *ParticipantEgressRequest) GetWebhooks() []*WebhookConfig { + if x != nil { + return x.Webhooks + } + return nil +} + +type isParticipantEgressRequest_Options interface { + isParticipantEgressRequest_Options() +} + +type ParticipantEgressRequest_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,4,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` +} + +type ParticipantEgressRequest_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,5,opt,name=advanced,proto3,oneof"` +} + +func (*ParticipantEgressRequest_Preset) isParticipantEgressRequest_Options() {} + +func (*ParticipantEgressRequest_Advanced) isParticipantEgressRequest_Options() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type TrackCompositeEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` + AudioTrackId string `protobuf:"bytes,2,opt,name=audio_track_id,json=audioTrackId,proto3" json:"audio_track_id,omitempty"` + VideoTrackId string `protobuf:"bytes,3,opt,name=video_track_id,json=videoTrackId,proto3" json:"video_track_id,omitempty"` + // Types that are valid to be assigned to Output: + // + // *TrackCompositeEgressRequest_File + // *TrackCompositeEgressRequest_Stream + // *TrackCompositeEgressRequest_Segments + Output isTrackCompositeEgressRequest_Output `protobuf_oneof:"output"` + // Types that are valid to be assigned to Options: + // + // *TrackCompositeEgressRequest_Preset + // *TrackCompositeEgressRequest_Advanced + Options isTrackCompositeEgressRequest_Options `protobuf_oneof:"options"` + FileOutputs []*EncodedFileOutput `protobuf:"bytes,11,rep,name=file_outputs,json=fileOutputs,proto3" json:"file_outputs,omitempty"` + StreamOutputs []*StreamOutput `protobuf:"bytes,12,rep,name=stream_outputs,json=streamOutputs,proto3" json:"stream_outputs,omitempty"` + SegmentOutputs []*SegmentedFileOutput `protobuf:"bytes,13,rep,name=segment_outputs,json=segmentOutputs,proto3" json:"segment_outputs,omitempty"` + ImageOutputs []*ImageOutput `protobuf:"bytes,14,rep,name=image_outputs,json=imageOutputs,proto3" json:"image_outputs,omitempty"` + Webhooks []*WebhookConfig `protobuf:"bytes,15,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TrackCompositeEgressRequest) Reset() { + *x = TrackCompositeEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TrackCompositeEgressRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackCompositeEgressRequest) ProtoMessage() {} + +func (x *TrackCompositeEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackCompositeEgressRequest.ProtoReflect.Descriptor instead. +func (*TrackCompositeEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{38} +} + +func (x *TrackCompositeEgressRequest) GetRoomName() string { + if x != nil { + return x.RoomName + } + return "" +} + +func (x *TrackCompositeEgressRequest) GetAudioTrackId() string { + if x != nil { + return x.AudioTrackId + } + return "" +} + +func (x *TrackCompositeEgressRequest) GetVideoTrackId() string { + if x != nil { + return x.VideoTrackId + } + return "" +} + +func (x *TrackCompositeEgressRequest) GetOutput() isTrackCompositeEgressRequest_Output { + if x != nil { + return x.Output + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *TrackCompositeEgressRequest) GetFile() *EncodedFileOutput { + if x != nil { + if x, ok := x.Output.(*TrackCompositeEgressRequest_File); ok { + return x.File + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *TrackCompositeEgressRequest) GetStream() *StreamOutput { + if x != nil { + if x, ok := x.Output.(*TrackCompositeEgressRequest_Stream); ok { + return x.Stream + } + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *TrackCompositeEgressRequest) GetSegments() *SegmentedFileOutput { + if x != nil { + if x, ok := x.Output.(*TrackCompositeEgressRequest_Segments); ok { + return x.Segments + } + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetOptions() isTrackCompositeEgressRequest_Options { + if x != nil { + return x.Options + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetPreset() EncodingOptionsPreset { + if x != nil { + if x, ok := x.Options.(*TrackCompositeEgressRequest_Preset); ok { + return x.Preset + } + } + return EncodingOptionsPreset_H264_720P_30 +} + +func (x *TrackCompositeEgressRequest) GetAdvanced() *EncodingOptions { + if x != nil { + if x, ok := x.Options.(*TrackCompositeEgressRequest_Advanced); ok { + return x.Advanced + } + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetFileOutputs() []*EncodedFileOutput { + if x != nil { + return x.FileOutputs + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetStreamOutputs() []*StreamOutput { + if x != nil { + return x.StreamOutputs + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetSegmentOutputs() []*SegmentedFileOutput { + if x != nil { + return x.SegmentOutputs + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetImageOutputs() []*ImageOutput { + if x != nil { + return x.ImageOutputs + } + return nil +} + +func (x *TrackCompositeEgressRequest) GetWebhooks() []*WebhookConfig { + if x != nil { + return x.Webhooks + } + return nil +} + +type isTrackCompositeEgressRequest_Output interface { + isTrackCompositeEgressRequest_Output() +} + +type TrackCompositeEgressRequest_File struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + File *EncodedFileOutput `protobuf:"bytes,4,opt,name=file,proto3,oneof"` +} + +type TrackCompositeEgressRequest_Stream struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Stream *StreamOutput `protobuf:"bytes,5,opt,name=stream,proto3,oneof"` +} + +type TrackCompositeEgressRequest_Segments struct { + // Deprecated: Marked as deprecated in livekit_egress.proto. + Segments *SegmentedFileOutput `protobuf:"bytes,8,opt,name=segments,proto3,oneof"` +} + +func (*TrackCompositeEgressRequest_File) isTrackCompositeEgressRequest_Output() {} + +func (*TrackCompositeEgressRequest_Stream) isTrackCompositeEgressRequest_Output() {} + +func (*TrackCompositeEgressRequest_Segments) isTrackCompositeEgressRequest_Output() {} + +type isTrackCompositeEgressRequest_Options interface { + isTrackCompositeEgressRequest_Options() +} + +type TrackCompositeEgressRequest_Preset struct { + Preset EncodingOptionsPreset `protobuf:"varint,6,opt,name=preset,proto3,enum=livekit.EncodingOptionsPreset,oneof"` +} + +type TrackCompositeEgressRequest_Advanced struct { + Advanced *EncodingOptions `protobuf:"bytes,7,opt,name=advanced,proto3,oneof"` +} + +func (*TrackCompositeEgressRequest_Preset) isTrackCompositeEgressRequest_Options() {} + +func (*TrackCompositeEgressRequest_Advanced) isTrackCompositeEgressRequest_Options() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type TrackEgressRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` + TrackId string `protobuf:"bytes,2,opt,name=track_id,json=trackId,proto3" json:"track_id,omitempty"` + // Types that are valid to be assigned to Output: + // + // *TrackEgressRequest_File + // *TrackEgressRequest_WebsocketUrl + Output isTrackEgressRequest_Output `protobuf_oneof:"output"` + Webhooks []*WebhookConfig `protobuf:"bytes,5,rep,name=webhooks,proto3" json:"webhooks,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TrackEgressRequest) Reset() { + *x = TrackEgressRequest{} + mi := &file_livekit_egress_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TrackEgressRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackEgressRequest) ProtoMessage() {} + +func (x *TrackEgressRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[39] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackEgressRequest.ProtoReflect.Descriptor instead. +func (*TrackEgressRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{39} +} + +func (x *TrackEgressRequest) GetRoomName() string { + if x != nil { + return x.RoomName + } + return "" +} + +func (x *TrackEgressRequest) GetTrackId() string { + if x != nil { + return x.TrackId + } + return "" +} + +func (x *TrackEgressRequest) GetOutput() isTrackEgressRequest_Output { + if x != nil { + return x.Output + } + return nil +} + +func (x *TrackEgressRequest) GetFile() *DirectFileOutput { + if x != nil { + if x, ok := x.Output.(*TrackEgressRequest_File); ok { + return x.File + } + } + return nil +} + +func (x *TrackEgressRequest) GetWebsocketUrl() string { + if x != nil { + if x, ok := x.Output.(*TrackEgressRequest_WebsocketUrl); ok { + return x.WebsocketUrl + } + } + return "" +} + +func (x *TrackEgressRequest) GetWebhooks() []*WebhookConfig { + if x != nil { + return x.Webhooks + } + return nil +} + +type isTrackEgressRequest_Output interface { + isTrackEgressRequest_Output() +} + +type TrackEgressRequest_File struct { + File *DirectFileOutput `protobuf:"bytes,3,opt,name=file,proto3,oneof"` +} + +type TrackEgressRequest_WebsocketUrl struct { + WebsocketUrl string `protobuf:"bytes,4,opt,name=websocket_url,json=websocketUrl,proto3,oneof"` +} + +func (*TrackEgressRequest_File) isTrackEgressRequest_Output() {} + +func (*TrackEgressRequest_WebsocketUrl) isTrackEgressRequest_Output() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type DirectFileOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Filepath string `protobuf:"bytes,1,opt,name=filepath,proto3" json:"filepath,omitempty"` + DisableManifest bool `protobuf:"varint,5,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` + // Types that are valid to be assigned to Output: + // + // *DirectFileOutput_S3 + // *DirectFileOutput_Gcp + // *DirectFileOutput_Azure + // *DirectFileOutput_AliOSS + Output isDirectFileOutput_Output `protobuf_oneof:"output"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DirectFileOutput) Reset() { + *x = DirectFileOutput{} + mi := &file_livekit_egress_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DirectFileOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DirectFileOutput) ProtoMessage() {} + +func (x *DirectFileOutput) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[40] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DirectFileOutput.ProtoReflect.Descriptor instead. +func (*DirectFileOutput) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{40} +} + +func (x *DirectFileOutput) GetFilepath() string { + if x != nil { + return x.Filepath + } + return "" +} + +func (x *DirectFileOutput) GetDisableManifest() bool { + if x != nil { + return x.DisableManifest + } + return false +} + +func (x *DirectFileOutput) GetOutput() isDirectFileOutput_Output { + if x != nil { + return x.Output + } + return nil +} + +func (x *DirectFileOutput) GetS3() *S3Upload { + if x != nil { + if x, ok := x.Output.(*DirectFileOutput_S3); ok { + return x.S3 + } + } + return nil +} + +func (x *DirectFileOutput) GetGcp() *GCPUpload { + if x != nil { + if x, ok := x.Output.(*DirectFileOutput_Gcp); ok { + return x.Gcp + } + } + return nil +} + +func (x *DirectFileOutput) GetAzure() *AzureBlobUpload { + if x != nil { + if x, ok := x.Output.(*DirectFileOutput_Azure); ok { + return x.Azure + } + } + return nil +} + +func (x *DirectFileOutput) GetAliOSS() *AliOSSUpload { + if x != nil { + if x, ok := x.Output.(*DirectFileOutput_AliOSS); ok { + return x.AliOSS + } + } + return nil +} + +type isDirectFileOutput_Output interface { + isDirectFileOutput_Output() +} + +type DirectFileOutput_S3 struct { + S3 *S3Upload `protobuf:"bytes,2,opt,name=s3,proto3,oneof"` +} + +type DirectFileOutput_Gcp struct { + Gcp *GCPUpload `protobuf:"bytes,3,opt,name=gcp,proto3,oneof"` +} + +type DirectFileOutput_Azure struct { + Azure *AzureBlobUpload `protobuf:"bytes,4,opt,name=azure,proto3,oneof"` +} + +type DirectFileOutput_AliOSS struct { + AliOSS *AliOSSUpload `protobuf:"bytes,6,opt,name=aliOSS,proto3,oneof"` +} + +func (*DirectFileOutput_S3) isDirectFileOutput_Output() {} + +func (*DirectFileOutput_Gcp) isDirectFileOutput_Output() {} + +func (*DirectFileOutput_Azure) isDirectFileOutput_Output() {} + +func (*DirectFileOutput_AliOSS) isDirectFileOutput_Output() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type EncodedFileOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + FileType EncodedFileType `protobuf:"varint,1,opt,name=file_type,json=fileType,proto3,enum=livekit.EncodedFileType" json:"file_type,omitempty"` + Filepath string `protobuf:"bytes,2,opt,name=filepath,proto3" json:"filepath,omitempty"` + DisableManifest bool `protobuf:"varint,6,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` + // Types that are valid to be assigned to Output: + // + // *EncodedFileOutput_S3 + // *EncodedFileOutput_Gcp + // *EncodedFileOutput_Azure + // *EncodedFileOutput_AliOSS + Output isEncodedFileOutput_Output `protobuf_oneof:"output"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EncodedFileOutput) Reset() { + *x = EncodedFileOutput{} + mi := &file_livekit_egress_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EncodedFileOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EncodedFileOutput) ProtoMessage() {} + +func (x *EncodedFileOutput) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[41] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EncodedFileOutput.ProtoReflect.Descriptor instead. +func (*EncodedFileOutput) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{41} +} + +func (x *EncodedFileOutput) GetFileType() EncodedFileType { + if x != nil { + return x.FileType + } + return EncodedFileType_DEFAULT_FILETYPE +} + +func (x *EncodedFileOutput) GetFilepath() string { + if x != nil { + return x.Filepath + } + return "" +} + +func (x *EncodedFileOutput) GetDisableManifest() bool { + if x != nil { + return x.DisableManifest + } + return false +} + +func (x *EncodedFileOutput) GetOutput() isEncodedFileOutput_Output { + if x != nil { + return x.Output + } + return nil +} + +func (x *EncodedFileOutput) GetS3() *S3Upload { + if x != nil { + if x, ok := x.Output.(*EncodedFileOutput_S3); ok { + return x.S3 + } + } + return nil +} + +func (x *EncodedFileOutput) GetGcp() *GCPUpload { + if x != nil { + if x, ok := x.Output.(*EncodedFileOutput_Gcp); ok { + return x.Gcp + } + } + return nil +} + +func (x *EncodedFileOutput) GetAzure() *AzureBlobUpload { + if x != nil { + if x, ok := x.Output.(*EncodedFileOutput_Azure); ok { + return x.Azure + } + } + return nil +} + +func (x *EncodedFileOutput) GetAliOSS() *AliOSSUpload { + if x != nil { + if x, ok := x.Output.(*EncodedFileOutput_AliOSS); ok { + return x.AliOSS + } + } + return nil +} + +type isEncodedFileOutput_Output interface { + isEncodedFileOutput_Output() +} + +type EncodedFileOutput_S3 struct { + S3 *S3Upload `protobuf:"bytes,3,opt,name=s3,proto3,oneof"` +} + +type EncodedFileOutput_Gcp struct { + Gcp *GCPUpload `protobuf:"bytes,4,opt,name=gcp,proto3,oneof"` +} + +type EncodedFileOutput_Azure struct { + Azure *AzureBlobUpload `protobuf:"bytes,5,opt,name=azure,proto3,oneof"` +} + +type EncodedFileOutput_AliOSS struct { + AliOSS *AliOSSUpload `protobuf:"bytes,7,opt,name=aliOSS,proto3,oneof"` +} + +func (*EncodedFileOutput_S3) isEncodedFileOutput_Output() {} + +func (*EncodedFileOutput_Gcp) isEncodedFileOutput_Output() {} + +func (*EncodedFileOutput_Azure) isEncodedFileOutput_Output() {} + +func (*EncodedFileOutput_AliOSS) isEncodedFileOutput_Output() {} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type UpdateLayoutRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` + Layout string `protobuf:"bytes,2,opt,name=layout,proto3" json:"layout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateLayoutRequest) Reset() { + *x = UpdateLayoutRequest{} + mi := &file_livekit_egress_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateLayoutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateLayoutRequest) ProtoMessage() {} + +func (x *UpdateLayoutRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[42] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateLayoutRequest.ProtoReflect.Descriptor instead. +func (*UpdateLayoutRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{42} +} + +func (x *UpdateLayoutRequest) GetEgressId() string { + if x != nil { + return x.EgressId + } + return "" +} + +func (x *UpdateLayoutRequest) GetLayout() string { + if x != nil { + return x.Layout + } + return "" +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type UpdateStreamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` + AddOutputUrls []string `protobuf:"bytes,2,rep,name=add_output_urls,json=addOutputUrls,proto3" json:"add_output_urls,omitempty"` + RemoveOutputUrls []string `protobuf:"bytes,3,rep,name=remove_output_urls,json=removeOutputUrls,proto3" json:"remove_output_urls,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateStreamRequest) Reset() { + *x = UpdateStreamRequest{} + mi := &file_livekit_egress_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateStreamRequest) ProtoMessage() {} + +func (x *UpdateStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[43] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateStreamRequest.ProtoReflect.Descriptor instead. +func (*UpdateStreamRequest) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{43} +} + +func (x *UpdateStreamRequest) GetEgressId() string { + if x != nil { + return x.EgressId + } + return "" +} + +func (x *UpdateStreamRequest) GetAddOutputUrls() []string { + if x != nil { + return x.AddOutputUrls + } + return nil +} + +func (x *UpdateStreamRequest) GetRemoveOutputUrls() []string { + if x != nil { + return x.RemoveOutputUrls + } + return nil +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +type StreamInfoList struct { + state protoimpl.MessageState `protogen:"open.v1"` + Info []*StreamInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StreamInfoList) Reset() { + *x = StreamInfoList{} + mi := &file_livekit_egress_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StreamInfoList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamInfoList) ProtoMessage() {} + +func (x *StreamInfoList) ProtoReflect() protoreflect.Message { + mi := &file_livekit_egress_proto_msgTypes[44] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamInfoList.ProtoReflect.Descriptor instead. +func (*StreamInfoList) Descriptor() ([]byte, []int) { + return file_livekit_egress_proto_rawDescGZIP(), []int{44} +} + +func (x *StreamInfoList) GetInfo() []*StreamInfo { + if x != nil { + return x.Info + } + return nil +} + +var File_livekit_egress_proto protoreflect.FileDescriptor + +const file_livekit_egress_proto_rawDesc = "" + + "\n" + + "\x14livekit_egress.proto\x12\alivekit\x1a\x14livekit_models.proto\x1a\x14logger/options.proto\"\xd7\x03\n" + + "\x12StartEgressRequest\x12\x1b\n" + + "\troom_name\x18\x01 \x01(\tR\broomName\x125\n" + + "\btemplate\x18\x02 \x01(\v2\x17.livekit.TemplateSourceH\x00R\btemplate\x12&\n" + + "\x03web\x18\x03 \x01(\v2\x12.livekit.WebSourceH\x00R\x03web\x12,\n" + + "\x05media\x18\x04 \x01(\v2\x14.livekit.MediaSourceH\x00R\x05media\x128\n" + + "\x06preset\x18\x05 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + + "\badvanced\x18\x06 \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12)\n" + + "\aoutputs\x18\a \x03(\v2\x0f.livekit.OutputR\aoutputs\x120\n" + + "\astorage\x18\b \x01(\v2\x16.livekit.StorageConfigR\astorage\x122\n" + + "\bwebhooks\x18\t \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + + "\x06sourceB\n" + + "\n" + + "\bencoding\"\x8e\x01\n" + + "\x0eTemplateSource\x12\x16\n" + + "\x06layout\x18\x01 \x01(\tR\x06layout\x12\x1d\n" + + "\n" + + "audio_only\x18\x02 \x01(\bR\taudioOnly\x12\x1d\n" + + "\n" + + "video_only\x18\x03 \x01(\bR\tvideoOnly\x12&\n" + + "\x0fcustom_base_url\x18\x04 \x01(\tR\rcustomBaseUrl\"\x89\x01\n" + + "\tWebSource\x12\x10\n" + + "\x03url\x18\x01 \x01(\tR\x03url\x12\x1d\n" + + "\n" + + "audio_only\x18\x02 \x01(\bR\taudioOnly\x12\x1d\n" + + "\n" + + "video_only\x18\x03 \x01(\bR\tvideoOnly\x12,\n" + + "\x12await_start_signal\x18\x04 \x01(\bR\x10awaitStartSignal\"\xef\x01\n" + + "\vMediaSource\x128\n" + + "\x0evideo_track_id\x18\x01 \x01(\tB\x10\x9a\xec,\fvideoTrackIDH\x00R\fvideoTrackId\x12H\n" + + "\x11participant_video\x18\x02 \x01(\v2\x19.livekit.ParticipantVideoH\x00R\x10participantVideo\x12*\n" + + "\x05audio\x18\x03 \x01(\v2\x14.livekit.AudioConfigR\x05audio\x12'\n" + + "\x04data\x18\x04 \x01(\v2\x13.livekit.DataConfigR\x04dataB\a\n" + + "\x05video\"^\n" + + "\x10ParticipantVideo\x12\x1a\n" + + "\bidentity\x18\x01 \x01(\tR\bidentity\x12.\n" + + "\x13prefer_screen_share\x18\x02 \x01(\bR\x11preferScreenShare\":\n" + + "\vAudioConfig\x12+\n" + + "\x06routes\x18\x01 \x03(\v2\x13.livekit.AudioRouteR\x06routes\"\xf1\x01\n" + + "\n" + + "AudioRoute\x12(\n" + + "\btrack_id\x18\x01 \x01(\tB\v\x9a\xec,\atrackIDH\x00R\atrackId\x123\n" + + "\x14participant_identity\x18\x02 \x01(\tH\x00R\x13participantIdentity\x12J\n" + + "\x10participant_kind\x18\x03 \x01(\x0e2\x1d.livekit.ParticipantInfo.KindH\x00R\x0fparticipantKind\x12/\n" + + "\achannel\x18\x04 \x01(\x0e2\x15.livekit.AudioChannelR\achannelB\a\n" + + "\x05match\"A\n" + + "\n" + + "DataConfig\x123\n" + + "\tselectors\x18\x01 \x03(\v2\x15.livekit.DataSelectorR\tselectors\"\x8e\x01\n" + + "\fDataSelector\x12(\n" + + "\btrack_id\x18\x01 \x01(\tB\v\x9a\xec,\atrackIDH\x00R\atrackId\x123\n" + + "\x14participant_identity\x18\x02 \x01(\tH\x00R\x13participantIdentity\x12\x16\n" + + "\x05topic\x18\x03 \x01(\tH\x00R\x05topicB\a\n" + + "\x05match\"\xca\x03\n" + + "\x0fEncodingOptions\x12\x14\n" + + "\x05width\x18\x01 \x01(\x05R\x05width\x12\x16\n" + + "\x06height\x18\x02 \x01(\x05R\x06height\x12\x14\n" + + "\x05depth\x18\x03 \x01(\x05R\x05depth\x12\x1c\n" + + "\tframerate\x18\x04 \x01(\x05R\tframerate\x124\n" + + "\vaudio_codec\x18\x05 \x01(\x0e2\x13.livekit.AudioCodecR\n" + + "audioCodec\x12#\n" + + "\raudio_bitrate\x18\x06 \x01(\x05R\faudioBitrate\x12#\n" + + "\raudio_quality\x18\v \x01(\x05R\faudioQuality\x12'\n" + + "\x0faudio_frequency\x18\a \x01(\x05R\x0eaudioFrequency\x124\n" + + "\vvideo_codec\x18\b \x01(\x0e2\x13.livekit.VideoCodecR\n" + + "videoCodec\x12#\n" + + "\rvideo_bitrate\x18\t \x01(\x05R\fvideoBitrate\x12#\n" + + "\rvideo_quality\x18\f \x01(\x05R\fvideoQuality\x12,\n" + + "\x12key_frame_interval\x18\n" + + " \x01(\x01R\x10keyFrameInterval\"\xb7\x02\n" + + "\x06Output\x12)\n" + + "\x04file\x18\x01 \x01(\v2\x13.livekit.FileOutputH\x00R\x04file\x12/\n" + + "\x06stream\x18\x02 \x01(\v2\x15.livekit.StreamOutputH\x00R\x06stream\x12:\n" + + "\bsegments\x18\x03 \x01(\v2\x1c.livekit.SegmentedFileOutputH\x00R\bsegments\x12.\n" + + "\x06images\x18\x04 \x01(\v2\x14.livekit.ImageOutputH\x00R\x06images\x12)\n" + + "\x04mcap\x18\x05 \x01(\v2\x13.livekit.McapOutputH\x00R\x04mcap\x120\n" + + "\astorage\x18\x06 \x01(\v2\x16.livekit.StorageConfigR\astorageB\b\n" + + "\x06config\"\x8a\x01\n" + + "\n" + + "FileOutput\x125\n" + "\tfile_type\x18\x01 \x01(\x0e2\x18.livekit.EncodedFileTypeR\bfileType\x12\x1a\n" + "\bfilepath\x18\x02 \x01(\tR\bfilepath\x12)\n" + - "\x10disable_manifest\x18\x06 \x01(\bR\x0fdisableManifest\x12#\n" + - "\x02s3\x18\x03 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + - "\x03gcp\x18\x04 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + - "\x05azure\x18\x05 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + - "\x06aliOSS\x18\a \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output\"\xa4\x04\n" + + "\x10disable_manifest\x18\x03 \x01(\bR\x0fdisableManifest\"W\n" + + "\fStreamOutput\x123\n" + + "\bprotocol\x18\x01 \x01(\x0e2\x17.livekit.StreamProtocolR\bprotocol\x12\x12\n" + + "\x04urls\x18\x02 \x03(\tR\x04urls\"\xb4\x04\n" + "\x13SegmentedFileOutput\x12:\n" + "\bprotocol\x18\x01 \x01(\x0e2\x1e.livekit.SegmentedFileProtocolR\bprotocol\x12'\n" + "\x0ffilename_prefix\x18\x02 \x01(\tR\x0efilenamePrefix\x12#\n" + @@ -4003,20 +5630,12 @@ const file_livekit_egress_proto_rawDesc = "" + "\x10segment_duration\x18\x04 \x01(\rR\x0fsegmentDuration\x12E\n" + "\x0ffilename_suffix\x18\n" + " \x01(\x0e2\x1c.livekit.SegmentedFileSuffixR\x0efilenameSuffix\x12)\n" + - "\x10disable_manifest\x18\b \x01(\bR\x0fdisableManifest\x12#\n" + - "\x02s3\x18\x05 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + - "\x03gcp\x18\x06 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + - "\x05azure\x18\a \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + - "\x06aliOSS\x18\t \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output\"\x93\x02\n" + - "\x10DirectFileOutput\x12\x1a\n" + - "\bfilepath\x18\x01 \x01(\tR\bfilepath\x12)\n" + - "\x10disable_manifest\x18\x05 \x01(\bR\x0fdisableManifest\x12#\n" + - "\x02s3\x18\x02 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + - "\x03gcp\x18\x03 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + - "\x05azure\x18\x04 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + - "\x06aliOSS\x18\x06 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output\"\xed\x03\n" + + "\x10disable_manifest\x18\b \x01(\bR\x0fdisableManifest\x12'\n" + + "\x02s3\x18\x05 \x01(\v2\x11.livekit.S3UploadB\x02\x18\x01H\x00R\x02s3\x12*\n" + + "\x03gcp\x18\x06 \x01(\v2\x12.livekit.GCPUploadB\x02\x18\x01H\x00R\x03gcp\x124\n" + + "\x05azure\x18\a \x01(\v2\x18.livekit.AzureBlobUploadB\x02\x18\x01H\x00R\x05azure\x123\n" + + "\x06aliOSS\x18\t \x01(\v2\x15.livekit.AliOSSUploadB\x02\x18\x01H\x00R\x06aliOSSB\b\n" + + "\x06output\"\xfd\x03\n" + "\vImageOutput\x12)\n" + "\x10capture_interval\x18\x01 \x01(\rR\x0fcaptureInterval\x12\x14\n" + "\x05width\x18\x02 \x01(\x05R\x05width\x12\x16\n" + @@ -4025,13 +5644,24 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0ffilename_suffix\x18\x05 \x01(\x0e2\x18.livekit.ImageFileSuffixR\x0efilenameSuffix\x124\n" + "\vimage_codec\x18\x06 \x01(\x0e2\x13.livekit.ImageCodecR\n" + "imageCodec\x12)\n" + - "\x10disable_manifest\x18\a \x01(\bR\x0fdisableManifest\x12#\n" + - "\x02s3\x18\b \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + - "\x03gcp\x18\t \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + + "\x10disable_manifest\x18\a \x01(\bR\x0fdisableManifest\x12'\n" + + "\x02s3\x18\b \x01(\v2\x11.livekit.S3UploadB\x02\x18\x01H\x00R\x02s3\x12*\n" + + "\x03gcp\x18\t \x01(\v2\x12.livekit.GCPUploadB\x02\x18\x01H\x00R\x03gcp\x124\n" + "\x05azure\x18\n" + - " \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + - "\x06aliOSS\x18\v \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output\"\xe2\x04\n" + + " \x01(\v2\x18.livekit.AzureBlobUploadB\x02\x18\x01H\x00R\x05azure\x123\n" + + "\x06aliOSS\x18\v \x01(\v2\x15.livekit.AliOSSUploadB\x02\x18\x01H\x00R\x06aliOSSB\b\n" + + "\x06output\"S\n" + + "\n" + + "McapOutput\x12\x1a\n" + + "\bfilepath\x18\x01 \x01(\tR\bfilepath\x12)\n" + + "\x10disable_manifest\x18\x02 \x01(\bR\x0fdisableManifest\"\xcc\x01\n" + + "\rStorageConfig\x12#\n" + + "\x02s3\x18\x01 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + + "\x03gcp\x18\x02 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + + "\x05azure\x18\x03 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x120\n" + + "\aali_oss\x18\x04 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOssB\n" + + "\n" + + "\bprovider\"\xe2\x04\n" + "\bS3Upload\x12#\n" + "\n" + "access_key\x18\x01 \x01(\tB\x04\x88\xec,\x01R\taccessKey\x12\x1c\n" + @@ -4066,45 +5696,25 @@ const file_livekit_egress_proto_rawDesc = "" + "\x06secret\x18\x02 \x01(\tB\x04\x88\xec,\x01R\x06secret\x12\x16\n" + "\x06region\x18\x03 \x01(\tR\x06region\x12\x1a\n" + "\bendpoint\x18\x04 \x01(\tR\bendpoint\x12\x16\n" + - "\x06bucket\x18\x05 \x01(\tR\x06bucket\"W\n" + + "\x06bucket\x18\x05 \x01(\tR\x06bucket\"]\n" + "\vProxyConfig\x12\x10\n" + "\x03url\x18\x01 \x01(\tR\x03url\x12\x1a\n" + - "\busername\x18\x02 \x01(\tR\busername\x12\x1a\n" + - "\bpassword\x18\x03 \x01(\tR\bpassword\"W\n" + - "\fStreamOutput\x123\n" + - "\bprotocol\x18\x01 \x01(\x0e2\x17.livekit.StreamProtocolR\bprotocol\x12\x12\n" + - "\x04urls\x18\x02 \x03(\tR\x04urls\"\xca\x03\n" + - "\x0fEncodingOptions\x12\x14\n" + - "\x05width\x18\x01 \x01(\x05R\x05width\x12\x16\n" + - "\x06height\x18\x02 \x01(\x05R\x06height\x12\x14\n" + - "\x05depth\x18\x03 \x01(\x05R\x05depth\x12\x1c\n" + - "\tframerate\x18\x04 \x01(\x05R\tframerate\x124\n" + - "\vaudio_codec\x18\x05 \x01(\x0e2\x13.livekit.AudioCodecR\n" + - "audioCodec\x12#\n" + - "\raudio_bitrate\x18\x06 \x01(\x05R\faudioBitrate\x12#\n" + - "\raudio_quality\x18\v \x01(\x05R\faudioQuality\x12'\n" + - "\x0faudio_frequency\x18\a \x01(\x05R\x0eaudioFrequency\x124\n" + - "\vvideo_codec\x18\b \x01(\x0e2\x13.livekit.VideoCodecR\n" + - "videoCodec\x12#\n" + - "\rvideo_bitrate\x18\t \x01(\x05R\fvideoBitrate\x12#\n" + - "\rvideo_quality\x18\f \x01(\x05R\fvideoQuality\x12,\n" + - "\x12key_frame_interval\x18\n" + - " \x01(\x01R\x10keyFrameInterval\"X\n" + - "\x13UpdateLayoutRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12\x16\n" + - "\x06layout\x18\x02 \x01(\tR\x06layout\"\x96\x01\n" + - "\x13UpdateStreamRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12&\n" + - "\x0fadd_output_urls\x18\x02 \x03(\tR\raddOutputUrls\x12,\n" + - "\x12remove_output_urls\x18\x03 \x03(\tR\x10removeOutputUrls\"s\n" + + "\busername\x18\x02 \x01(\tR\busername\x12 \n" + + "\bpassword\x18\x03 \x01(\tB\x04\x88\xec,\x01R\bpassword\"s\n" + "\x11ListEgressRequest\x12\x1b\n" + "\troom_name\x18\x01 \x01(\tR\broomName\x12)\n" + "\tegress_id\x18\x02 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12\x16\n" + "\x06active\x18\x03 \x01(\bR\x06active\"?\n" + "\x12ListEgressResponse\x12)\n" + - "\x05items\x18\x01 \x03(\v2\x13.livekit.EgressInfoR\x05items\">\n" + + "\x05items\x18\x01 \x03(\v2\x13.livekit.EgressInfoR\x05items\"\xc0\x01\n" + + "\x13UpdateEgressRequest\x12)\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12\x10\n" + + "\x03url\x18\x02 \x01(\tR\x03url\x12\x16\n" + + "\x06layout\x18\x03 \x01(\tR\x06layout\x12&\n" + + "\x0fadd_stream_urls\x18\x04 \x03(\tR\raddStreamUrls\x12,\n" + + "\x12remove_stream_urls\x18\x05 \x03(\tR\x10removeStreamUrls\">\n" + "\x11StopEgressRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\xf2\t\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\xab\v\n" + "\n" + "EgressInfo\x12)\n" + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12#\n" + @@ -4119,31 +5729,32 @@ const file_livekit_egress_proto_rawDesc = "" + " \x01(\x03R\tstartedAt\x12\x19\n" + "\bended_at\x18\v \x01(\x03R\aendedAt\x12\x1d\n" + "\n" + - "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x12\x18\n" + - "\adetails\x18\x15 \x01(\tR\adetails\x12\x14\n" + - "\x05error\x18\t \x01(\tR\x05error\x12\x1d\n" + - "\n" + - "error_code\x18\x16 \x01(\x05R\terrorCode\x12L\n" + - "\x0eroom_composite\x18\x04 \x01(\v2#.livekit.RoomCompositeEgressRequestH\x00R\rroomComposite\x12-\n" + - "\x03web\x18\x0e \x01(\v2\x19.livekit.WebEgressRequestH\x00R\x03web\x12E\n" + - "\vparticipant\x18\x13 \x01(\v2!.livekit.ParticipantEgressRequestH\x00R\vparticipant\x12O\n" + - "\x0ftrack_composite\x18\x05 \x01(\v2$.livekit.TrackCompositeEgressRequestH\x00R\x0etrackComposite\x123\n" + - "\x05track\x18\x06 \x01(\v2\x1b.livekit.TrackEgressRequestH\x00R\x05track\x125\n" + - "\x06stream\x18\a \x01(\v2\x17.livekit.StreamInfoListB\x02\x18\x01H\x01R\x06stream\x12+\n" + - "\x04file\x18\b \x01(\v2\x11.livekit.FileInfoB\x02\x18\x01H\x01R\x04file\x127\n" + - "\bsegments\x18\f \x01(\v2\x15.livekit.SegmentsInfoB\x02\x18\x01H\x01R\bsegments\x12:\n" + + "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x125\n" + + "\x06egress\x18\x1d \x01(\v2\x1b.livekit.StartEgressRequestH\x00R\x06egress\x126\n" + + "\x06replay\x18\x1e \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12P\n" + + "\x0eroom_composite\x18\x04 \x01(\v2#.livekit.RoomCompositeEgressRequestB\x02\x18\x01H\x00R\rroomComposite\x121\n" + + "\x03web\x18\x0e \x01(\v2\x19.livekit.WebEgressRequestB\x02\x18\x01H\x00R\x03web\x12I\n" + + "\vparticipant\x18\x13 \x01(\v2!.livekit.ParticipantEgressRequestB\x02\x18\x01H\x00R\vparticipant\x12S\n" + + "\x0ftrack_composite\x18\x05 \x01(\v2$.livekit.TrackCompositeEgressRequestB\x02\x18\x01H\x00R\x0etrackComposite\x127\n" + + "\x05track\x18\x06 \x01(\v2\x1b.livekit.TrackEgressRequestB\x02\x18\x01H\x00R\x05track\x12:\n" + "\x0estream_results\x18\x0f \x03(\v2\x13.livekit.StreamInfoR\rstreamResults\x124\n" + "\ffile_results\x18\x10 \x03(\v2\x11.livekit.FileInfoR\vfileResults\x12>\n" + "\x0fsegment_results\x18\x11 \x03(\v2\x15.livekit.SegmentsInfoR\x0esegmentResults\x128\n" + - "\rimage_results\x18\x14 \x03(\v2\x13.livekit.ImagesInfoR\fimageResults\x12+\n" + + "\rimage_results\x18\x14 \x03(\v2\x13.livekit.ImagesInfoR\fimageResults\x124\n" + + "\fmcap_results\x18\x1c \x03(\v2\x11.livekit.McapInfoR\vmcapResults\x12\x14\n" + + "\x05error\x18\t \x01(\tR\x05error\x12\x1d\n" + + "\n" + + "error_code\x18\x16 \x01(\x05R\terrorCode\x12\x18\n" + + "\adetails\x18\x15 \x01(\tR\adetails\x12+\n" + "\x11manifest_location\x18\x17 \x01(\tR\x10manifestLocation\x12.\n" + "\x13backup_storage_used\x18\x19 \x01(\bR\x11backupStorageUsed\x12\x1f\n" + "\vretry_count\x18\x1b \x01(\x05R\n" + - "retryCountB\t\n" + + "retryCount\x125\n" + + "\x06stream\x18\a \x01(\v2\x17.livekit.StreamInfoListB\x02\x18\x01H\x01R\x06stream\x12+\n" + + "\x04file\x18\b \x01(\v2\x11.livekit.FileInfoB\x02\x18\x01H\x01R\x04file\x127\n" + + "\bsegments\x18\f \x01(\v2\x15.livekit.SegmentsInfoB\x02\x18\x01H\x01R\bsegmentsB\t\n" + "\arequestB\b\n" + - "\x06result\"=\n" + - "\x0eStreamInfoList\x12'\n" + - "\x04info\x18\x01 \x03(\v2\x13.livekit.StreamInfoR\x04info:\x02\x18\x01\"\xac\x02\n" + + "\x06result\"\xac\x02\n" + "\n" + "StreamInfo\x12\x10\n" + "\x03url\x18\x01 \x01(\tR\x03url\x12\x1d\n" + @@ -4187,7 +5798,17 @@ const file_livekit_egress_proto_rawDesc = "" + "imageCount\x12\x1d\n" + "\n" + "started_at\x18\x02 \x01(\x03R\tstartedAt\x12\x19\n" + - "\bended_at\x18\x03 \x01(\x03R\aendedAt\"\x9a\x02\n" + + "\bended_at\x18\x03 \x01(\x03R\aendedAt\"\xcd\x01\n" + + "\bMcapInfo\x12\x1a\n" + + "\bfilename\x18\x01 \x01(\tR\bfilename\x12\x1d\n" + + "\n" + + "started_at\x18\x02 \x01(\x03R\tstartedAt\x12\x19\n" + + "\bended_at\x18\x03 \x01(\x03R\aendedAt\x12\x1a\n" + + "\bduration\x18\x04 \x01(\x03R\bduration\x12\x12\n" + + "\x04size\x18\x05 \x01(\x03R\x04size\x12\x1a\n" + + "\blocation\x18\x06 \x01(\tR\blocation\x12\x1f\n" + + "\vtrack_count\x18\a \x01(\x03R\n" + + "trackCount\"\x9a\x02\n" + "\x15AutoParticipantEgress\x128\n" + "\x06preset\x18\x01 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x00R\x06preset\x126\n" + "\badvanced\x18\x02 \x01(\v2\x18.livekit.EncodingOptionsH\x00R\badvanced\x12=\n" + @@ -4201,12 +5822,150 @@ const file_livekit_egress_proto_rawDesc = "" + "\x03gcp\x18\x03 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + "\x05azure\x18\x04 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + "\x06aliOSS\x18\x06 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output*B\n" + + "\x06output\"\xb2\x04\n" + + "\x13ExportReplayRequest\x12)\n" + + "\treplay_id\x18\x01 \x01(\tB\f\x9a\xec,\breplayIDR\breplayId\x12&\n" + + "\x0fstart_offset_ms\x18\x02 \x01(\x03R\rstartOffsetMs\x12\"\n" + + "\rend_offset_ms\x18\x03 \x01(\x03R\vendOffsetMs\x125\n" + + "\btemplate\x18\x04 \x01(\v2\x17.livekit.TemplateSourceH\x00R\btemplate\x12&\n" + + "\x03web\x18\x05 \x01(\v2\x12.livekit.WebSourceH\x00R\x03web\x12,\n" + + "\x05media\x18\x06 \x01(\v2\x14.livekit.MediaSourceH\x00R\x05media\x128\n" + + "\x06preset\x18\a \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + + "\badvanced\x18\b \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12)\n" + + "\aoutputs\x18\t \x03(\v2\x0f.livekit.OutputR\aoutputs\x120\n" + + "\astorage\x18\n" + + " \x01(\v2\x16.livekit.StorageConfigR\astorage\x122\n" + + "\bwebhooks\x18\v \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + + "\x06sourceB\n" + + "\n" + + "\bencoding\"\xd9\x06\n" + + "\x1aRoomCompositeEgressRequest\x12\x1b\n" + + "\troom_name\x18\x01 \x01(\tR\broomName\x12\x16\n" + + "\x06layout\x18\x02 \x01(\tR\x06layout\x12\x1d\n" + + "\n" + + "audio_only\x18\x03 \x01(\bR\taudioOnly\x127\n" + + "\faudio_mixing\x18\x0f \x01(\x0e2\x14.livekit.AudioMixingR\vaudioMixing\x12\x1d\n" + + "\n" + + "video_only\x18\x04 \x01(\bR\tvideoOnly\x12&\n" + + "\x0fcustom_base_url\x18\x05 \x01(\tR\rcustomBaseUrl\x124\n" + + "\x04file\x18\x06 \x01(\v2\x1a.livekit.EncodedFileOutputB\x02\x18\x01H\x00R\x04file\x123\n" + + "\x06stream\x18\a \x01(\v2\x15.livekit.StreamOutputB\x02\x18\x01H\x00R\x06stream\x12>\n" + + "\bsegments\x18\n" + + " \x01(\v2\x1c.livekit.SegmentedFileOutputB\x02\x18\x01H\x00R\bsegments\x128\n" + + "\x06preset\x18\b \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + + "\badvanced\x18\t \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12=\n" + + "\ffile_outputs\x18\v \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + + "\x0estream_outputs\x18\f \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + + "\x0fsegment_outputs\x18\r \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + + "\rimage_outputs\x18\x0e \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + + "\bwebhooks\x18\x10 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\x06outputB\t\n" + + "\aoptions\"\xf9\x05\n" + + "\x10WebEgressRequest\x12\x10\n" + + "\x03url\x18\x01 \x01(\tR\x03url\x12\x1d\n" + + "\n" + + "audio_only\x18\x02 \x01(\bR\taudioOnly\x12\x1d\n" + + "\n" + + "video_only\x18\x03 \x01(\bR\tvideoOnly\x12,\n" + + "\x12await_start_signal\x18\f \x01(\bR\x10awaitStartSignal\x124\n" + + "\x04file\x18\x04 \x01(\v2\x1a.livekit.EncodedFileOutputB\x02\x18\x01H\x00R\x04file\x123\n" + + "\x06stream\x18\x05 \x01(\v2\x15.livekit.StreamOutputB\x02\x18\x01H\x00R\x06stream\x12>\n" + + "\bsegments\x18\x06 \x01(\v2\x1c.livekit.SegmentedFileOutputB\x02\x18\x01H\x00R\bsegments\x128\n" + + "\x06preset\x18\a \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + + "\badvanced\x18\b \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12=\n" + + "\ffile_outputs\x18\t \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + + "\x0estream_outputs\x18\n" + + " \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + + "\x0fsegment_outputs\x18\v \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + + "\rimage_outputs\x18\r \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + + "\bwebhooks\x18\x0e \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\x06outputB\t\n" + + "\aoptions\"\xaa\x04\n" + + "\x18ParticipantEgressRequest\x12\x1b\n" + + "\troom_name\x18\x01 \x01(\tR\broomName\x12\x1a\n" + + "\bidentity\x18\x02 \x01(\tR\bidentity\x12!\n" + + "\fscreen_share\x18\x03 \x01(\bR\vscreenShare\x128\n" + + "\x06preset\x18\x04 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x00R\x06preset\x126\n" + + "\badvanced\x18\x05 \x01(\v2\x18.livekit.EncodingOptionsH\x00R\badvanced\x12=\n" + + "\ffile_outputs\x18\x06 \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + + "\x0estream_outputs\x18\a \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + + "\x0fsegment_outputs\x18\b \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + + "\rimage_outputs\x18\t \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + + "\bwebhooks\x18\n" + + " \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\t\n" + + "\aoptions\"\x93\x06\n" + + "\x1bTrackCompositeEgressRequest\x12\x1b\n" + + "\troom_name\x18\x01 \x01(\tR\broomName\x126\n" + + "\x0eaudio_track_id\x18\x02 \x01(\tB\x10\x9a\xec,\faudioTrackIDR\faudioTrackId\x126\n" + + "\x0evideo_track_id\x18\x03 \x01(\tB\x10\x9a\xec,\fvideoTrackIDR\fvideoTrackId\x124\n" + + "\x04file\x18\x04 \x01(\v2\x1a.livekit.EncodedFileOutputB\x02\x18\x01H\x00R\x04file\x123\n" + + "\x06stream\x18\x05 \x01(\v2\x15.livekit.StreamOutputB\x02\x18\x01H\x00R\x06stream\x12>\n" + + "\bsegments\x18\b \x01(\v2\x1c.livekit.SegmentedFileOutputB\x02\x18\x01H\x00R\bsegments\x128\n" + + "\x06preset\x18\x06 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x01R\x06preset\x126\n" + + "\badvanced\x18\a \x01(\v2\x18.livekit.EncodingOptionsH\x01R\badvanced\x12=\n" + + "\ffile_outputs\x18\v \x03(\v2\x1a.livekit.EncodedFileOutputR\vfileOutputs\x12<\n" + + "\x0estream_outputs\x18\f \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + + "\x0fsegment_outputs\x18\r \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + + "\rimage_outputs\x18\x0e \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + + "\bwebhooks\x18\x0f \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\x06outputB\t\n" + + "\aoptions\"\xf3\x01\n" + + "\x12TrackEgressRequest\x12\x1b\n" + + "\troom_name\x18\x01 \x01(\tR\broomName\x12&\n" + + "\btrack_id\x18\x02 \x01(\tB\v\x9a\xec,\atrackIDR\atrackId\x12/\n" + + "\x04file\x18\x03 \x01(\v2\x19.livekit.DirectFileOutputH\x00R\x04file\x12%\n" + + "\rwebsocket_url\x18\x04 \x01(\tH\x00R\fwebsocketUrl\x122\n" + + "\bwebhooks\x18\x05 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\x06output\"\x97\x02\n" + + "\x10DirectFileOutput\x12\x1a\n" + + "\bfilepath\x18\x01 \x01(\tR\bfilepath\x12)\n" + + "\x10disable_manifest\x18\x05 \x01(\bR\x0fdisableManifest\x12#\n" + + "\x02s3\x18\x02 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + + "\x03gcp\x18\x03 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + + "\x05azure\x18\x04 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + + "\x06aliOSS\x18\x06 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSS:\x02\x18\x01B\b\n" + + "\x06output\"\xcf\x02\n" + + "\x11EncodedFileOutput\x125\n" + + "\tfile_type\x18\x01 \x01(\x0e2\x18.livekit.EncodedFileTypeR\bfileType\x12\x1a\n" + + "\bfilepath\x18\x02 \x01(\tR\bfilepath\x12)\n" + + "\x10disable_manifest\x18\x06 \x01(\bR\x0fdisableManifest\x12#\n" + + "\x02s3\x18\x03 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + + "\x03gcp\x18\x04 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + + "\x05azure\x18\x05 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + + "\x06aliOSS\x18\a \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSS:\x02\x18\x01B\b\n" + + "\x06output\"\\\n" + + "\x13UpdateLayoutRequest\x12)\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12\x16\n" + + "\x06layout\x18\x02 \x01(\tR\x06layout:\x02\x18\x01\"\x9a\x01\n" + + "\x13UpdateStreamRequest\x12)\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12&\n" + + "\x0fadd_output_urls\x18\x02 \x03(\tR\raddOutputUrls\x12,\n" + + "\x12remove_output_urls\x18\x03 \x03(\tR\x10removeOutputUrls:\x02\x18\x01\"=\n" + + "\x0eStreamInfoList\x12'\n" + + "\x04info\x18\x01 \x03(\v2\x13.livekit.StreamInfoR\x04info:\x02\x18\x01*W\n" + + "\fAudioChannel\x12\x16\n" + + "\x12AUDIO_CHANNEL_BOTH\x10\x00\x12\x16\n" + + "\x12AUDIO_CHANNEL_LEFT\x10\x01\x12\x17\n" + + "\x13AUDIO_CHANNEL_RIGHT\x10\x02*\xcf\x01\n" + + "\x15EncodingOptionsPreset\x12\x10\n" + + "\fH264_720P_30\x10\x00\x12\x10\n" + + "\fH264_720P_60\x10\x01\x12\x11\n" + + "\rH264_1080P_30\x10\x02\x12\x11\n" + + "\rH264_1080P_60\x10\x03\x12\x19\n" + + "\x15PORTRAIT_H264_720P_30\x10\x04\x12\x19\n" + + "\x15PORTRAIT_H264_720P_60\x10\x05\x12\x1a\n" + + "\x16PORTRAIT_H264_1080P_30\x10\x06\x12\x1a\n" + + "\x16PORTRAIT_H264_1080P_60\x10\a*B\n" + "\x0fEncodedFileType\x12\x14\n" + "\x10DEFAULT_FILETYPE\x10\x00\x12\a\n" + "\x03MP4\x10\x01\x12\a\n" + "\x03OGG\x10\x02\x12\a\n" + - "\x03MP3\x10\x03*N\n" + + "\x03MP3\x10\x03*H\n" + + "\x0eStreamProtocol\x12\x14\n" + + "\x10DEFAULT_PROTOCOL\x10\x00\x12\b\n" + + "\x04RTMP\x10\x01\x12\a\n" + + "\x03SRT\x10\x02\x12\r\n" + + "\tWEBSOCKET\x10\x03*N\n" + "\x15SegmentedFileProtocol\x12#\n" + "\x1fDEFAULT_SEGMENTED_FILE_PROTOCOL\x10\x00\x12\x10\n" + "\fHLS_PROTOCOL\x10\x01*/\n" + @@ -4216,24 +5975,10 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fImageFileSuffix\x12\x16\n" + "\x12IMAGE_SUFFIX_INDEX\x10\x00\x12\x1a\n" + "\x16IMAGE_SUFFIX_TIMESTAMP\x10\x01\x12\x1f\n" + - "\x1bIMAGE_SUFFIX_NONE_OVERWRITE\x10\x02*9\n" + - "\x0eStreamProtocol\x12\x14\n" + - "\x10DEFAULT_PROTOCOL\x10\x00\x12\b\n" + - "\x04RTMP\x10\x01\x12\a\n" + - "\x03SRT\x10\x02*U\n" + - "\vAudioMixing\x12\x12\n" + - "\x0eDEFAULT_MIXING\x10\x00\x12\x16\n" + - "\x12DUAL_CHANNEL_AGENT\x10\x01\x12\x1a\n" + - "\x16DUAL_CHANNEL_ALTERNATE\x10\x02*\xcf\x01\n" + - "\x15EncodingOptionsPreset\x12\x10\n" + - "\fH264_720P_30\x10\x00\x12\x10\n" + - "\fH264_720P_60\x10\x01\x12\x11\n" + - "\rH264_1080P_30\x10\x02\x12\x11\n" + - "\rH264_1080P_60\x10\x03\x12\x19\n" + - "\x15PORTRAIT_H264_720P_30\x10\x04\x12\x19\n" + - "\x15PORTRAIT_H264_720P_60\x10\x05\x12\x1a\n" + - "\x16PORTRAIT_H264_1080P_30\x10\x06\x12\x1a\n" + - "\x16PORTRAIT_H264_1080P_60\x10\a*\x9f\x01\n" + + "\x1bIMAGE_SUFFIX_NONE_OVERWRITE\x10\x02*J\n" + + "\x10EgressSourceType\x12\x1a\n" + + "\x16EGRESS_SOURCE_TYPE_WEB\x10\x00\x12\x1a\n" + + "\x16EGRESS_SOURCE_TYPE_SDK\x10\x01*\x9f\x01\n" + "\fEgressStatus\x12\x13\n" + "\x0fEGRESS_STARTING\x10\x00\x12\x11\n" + "\rEGRESS_ACTIVE\x10\x01\x12\x11\n" + @@ -4241,22 +5986,25 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fEGRESS_COMPLETE\x10\x03\x12\x11\n" + "\rEGRESS_FAILED\x10\x04\x12\x12\n" + "\x0eEGRESS_ABORTED\x10\x05\x12\x18\n" + - "\x14EGRESS_LIMIT_REACHED\x10\x06*J\n" + - "\x10EgressSourceType\x12\x1a\n" + - "\x16EGRESS_SOURCE_TYPE_WEB\x10\x00\x12\x1a\n" + - "\x16EGRESS_SOURCE_TYPE_SDK\x10\x012\x9c\x05\n" + - "\x06Egress\x12T\n" + - "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12@\n" + - "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\x12P\n" + - "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\x12V\n" + - "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12D\n" + - "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + - "\fUpdateLayout\x12\x1c.livekit.UpdateLayoutRequest\x1a\x13.livekit.EgressInfo\x12A\n" + - "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\x12E\n" + + "\x14EGRESS_LIMIT_REACHED\x10\x06*U\n" + + "\vAudioMixing\x12\x12\n" + + "\x0eDEFAULT_MIXING\x10\x00\x12\x16\n" + + "\x12DUAL_CHANNEL_AGENT\x10\x01\x12\x1a\n" + + "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\xc3\x06\n" + + "\x06Egress\x12?\n" + + "\vStartEgress\x12\x1b.livekit.StartEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + + "\fUpdateEgress\x12\x1c.livekit.UpdateEgressRequest\x1a\x13.livekit.EgressInfo\x12E\n" + "\n" + "ListEgress\x12\x1a.livekit.ListEgressRequest\x1a\x1b.livekit.ListEgressResponse\x12=\n" + "\n" + - "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfoBFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\x12Y\n" + + "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12E\n" + + "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12U\n" + + "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12[\n" + + "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12I\n" + + "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12F\n" + + "\fUpdateLayout\x12\x1c.livekit.UpdateLayoutRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12F\n" + + "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01BFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_livekit_egress_proto_rawDescOnce sync.Once @@ -4270,170 +6018,229 @@ func file_livekit_egress_proto_rawDescGZIP() []byte { return file_livekit_egress_proto_rawDescData } -var file_livekit_egress_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_livekit_egress_proto_msgTypes = make([]protoimpl.MessageInfo, 30) +var file_livekit_egress_proto_enumTypes = make([]protoimpl.EnumInfo, 11) +var file_livekit_egress_proto_msgTypes = make([]protoimpl.MessageInfo, 46) var file_livekit_egress_proto_goTypes = []any{ - (EncodedFileType)(0), // 0: livekit.EncodedFileType - (SegmentedFileProtocol)(0), // 1: livekit.SegmentedFileProtocol - (SegmentedFileSuffix)(0), // 2: livekit.SegmentedFileSuffix - (ImageFileSuffix)(0), // 3: livekit.ImageFileSuffix - (StreamProtocol)(0), // 4: livekit.StreamProtocol - (AudioMixing)(0), // 5: livekit.AudioMixing - (EncodingOptionsPreset)(0), // 6: livekit.EncodingOptionsPreset - (EgressStatus)(0), // 7: livekit.EgressStatus - (EgressSourceType)(0), // 8: livekit.EgressSourceType - (StreamInfo_Status)(0), // 9: livekit.StreamInfo.Status - (*RoomCompositeEgressRequest)(nil), // 10: livekit.RoomCompositeEgressRequest - (*WebEgressRequest)(nil), // 11: livekit.WebEgressRequest - (*ParticipantEgressRequest)(nil), // 12: livekit.ParticipantEgressRequest - (*TrackCompositeEgressRequest)(nil), // 13: livekit.TrackCompositeEgressRequest - (*TrackEgressRequest)(nil), // 14: livekit.TrackEgressRequest - (*EncodedFileOutput)(nil), // 15: livekit.EncodedFileOutput - (*SegmentedFileOutput)(nil), // 16: livekit.SegmentedFileOutput - (*DirectFileOutput)(nil), // 17: livekit.DirectFileOutput - (*ImageOutput)(nil), // 18: livekit.ImageOutput - (*S3Upload)(nil), // 19: livekit.S3Upload - (*GCPUpload)(nil), // 20: livekit.GCPUpload - (*AzureBlobUpload)(nil), // 21: livekit.AzureBlobUpload - (*AliOSSUpload)(nil), // 22: livekit.AliOSSUpload - (*ProxyConfig)(nil), // 23: livekit.ProxyConfig - (*StreamOutput)(nil), // 24: livekit.StreamOutput - (*EncodingOptions)(nil), // 25: livekit.EncodingOptions - (*UpdateLayoutRequest)(nil), // 26: livekit.UpdateLayoutRequest - (*UpdateStreamRequest)(nil), // 27: livekit.UpdateStreamRequest - (*ListEgressRequest)(nil), // 28: livekit.ListEgressRequest - (*ListEgressResponse)(nil), // 29: livekit.ListEgressResponse - (*StopEgressRequest)(nil), // 30: livekit.StopEgressRequest - (*EgressInfo)(nil), // 31: livekit.EgressInfo - (*StreamInfoList)(nil), // 32: livekit.StreamInfoList - (*StreamInfo)(nil), // 33: livekit.StreamInfo - (*FileInfo)(nil), // 34: livekit.FileInfo - (*SegmentsInfo)(nil), // 35: livekit.SegmentsInfo - (*ImagesInfo)(nil), // 36: livekit.ImagesInfo - (*AutoParticipantEgress)(nil), // 37: livekit.AutoParticipantEgress - (*AutoTrackEgress)(nil), // 38: livekit.AutoTrackEgress - nil, // 39: livekit.S3Upload.MetadataEntry - (*WebhookConfig)(nil), // 40: livekit.WebhookConfig - (ImageCodec)(0), // 41: livekit.ImageCodec - (AudioCodec)(0), // 42: livekit.AudioCodec - (VideoCodec)(0), // 43: livekit.VideoCodec + (AudioChannel)(0), // 0: livekit.AudioChannel + (EncodingOptionsPreset)(0), // 1: livekit.EncodingOptionsPreset + (EncodedFileType)(0), // 2: livekit.EncodedFileType + (StreamProtocol)(0), // 3: livekit.StreamProtocol + (SegmentedFileProtocol)(0), // 4: livekit.SegmentedFileProtocol + (SegmentedFileSuffix)(0), // 5: livekit.SegmentedFileSuffix + (ImageFileSuffix)(0), // 6: livekit.ImageFileSuffix + (EgressSourceType)(0), // 7: livekit.EgressSourceType + (EgressStatus)(0), // 8: livekit.EgressStatus + (AudioMixing)(0), // 9: livekit.AudioMixing + (StreamInfo_Status)(0), // 10: livekit.StreamInfo.Status + (*StartEgressRequest)(nil), // 11: livekit.StartEgressRequest + (*TemplateSource)(nil), // 12: livekit.TemplateSource + (*WebSource)(nil), // 13: livekit.WebSource + (*MediaSource)(nil), // 14: livekit.MediaSource + (*ParticipantVideo)(nil), // 15: livekit.ParticipantVideo + (*AudioConfig)(nil), // 16: livekit.AudioConfig + (*AudioRoute)(nil), // 17: livekit.AudioRoute + (*DataConfig)(nil), // 18: livekit.DataConfig + (*DataSelector)(nil), // 19: livekit.DataSelector + (*EncodingOptions)(nil), // 20: livekit.EncodingOptions + (*Output)(nil), // 21: livekit.Output + (*FileOutput)(nil), // 22: livekit.FileOutput + (*StreamOutput)(nil), // 23: livekit.StreamOutput + (*SegmentedFileOutput)(nil), // 24: livekit.SegmentedFileOutput + (*ImageOutput)(nil), // 25: livekit.ImageOutput + (*McapOutput)(nil), // 26: livekit.McapOutput + (*StorageConfig)(nil), // 27: livekit.StorageConfig + (*S3Upload)(nil), // 28: livekit.S3Upload + (*GCPUpload)(nil), // 29: livekit.GCPUpload + (*AzureBlobUpload)(nil), // 30: livekit.AzureBlobUpload + (*AliOSSUpload)(nil), // 31: livekit.AliOSSUpload + (*ProxyConfig)(nil), // 32: livekit.ProxyConfig + (*ListEgressRequest)(nil), // 33: livekit.ListEgressRequest + (*ListEgressResponse)(nil), // 34: livekit.ListEgressResponse + (*UpdateEgressRequest)(nil), // 35: livekit.UpdateEgressRequest + (*StopEgressRequest)(nil), // 36: livekit.StopEgressRequest + (*EgressInfo)(nil), // 37: livekit.EgressInfo + (*StreamInfo)(nil), // 38: livekit.StreamInfo + (*FileInfo)(nil), // 39: livekit.FileInfo + (*SegmentsInfo)(nil), // 40: livekit.SegmentsInfo + (*ImagesInfo)(nil), // 41: livekit.ImagesInfo + (*McapInfo)(nil), // 42: livekit.McapInfo + (*AutoParticipantEgress)(nil), // 43: livekit.AutoParticipantEgress + (*AutoTrackEgress)(nil), // 44: livekit.AutoTrackEgress + (*ExportReplayRequest)(nil), // 45: livekit.ExportReplayRequest + (*RoomCompositeEgressRequest)(nil), // 46: livekit.RoomCompositeEgressRequest + (*WebEgressRequest)(nil), // 47: livekit.WebEgressRequest + (*ParticipantEgressRequest)(nil), // 48: livekit.ParticipantEgressRequest + (*TrackCompositeEgressRequest)(nil), // 49: livekit.TrackCompositeEgressRequest + (*TrackEgressRequest)(nil), // 50: livekit.TrackEgressRequest + (*DirectFileOutput)(nil), // 51: livekit.DirectFileOutput + (*EncodedFileOutput)(nil), // 52: livekit.EncodedFileOutput + (*UpdateLayoutRequest)(nil), // 53: livekit.UpdateLayoutRequest + (*UpdateStreamRequest)(nil), // 54: livekit.UpdateStreamRequest + (*StreamInfoList)(nil), // 55: livekit.StreamInfoList + nil, // 56: livekit.S3Upload.MetadataEntry + (*WebhookConfig)(nil), // 57: livekit.WebhookConfig + (ParticipantInfo_Kind)(0), // 58: livekit.ParticipantInfo.Kind + (AudioCodec)(0), // 59: livekit.AudioCodec + (VideoCodec)(0), // 60: livekit.VideoCodec + (ImageCodec)(0), // 61: livekit.ImageCodec } var file_livekit_egress_proto_depIdxs = []int32{ - 5, // 0: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing - 15, // 1: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 24, // 2: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 16, // 3: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 6, // 4: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 25, // 5: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 15, // 6: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 7: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 16, // 8: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 18, // 9: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 40, // 10: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 15, // 11: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput - 24, // 12: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput - 16, // 13: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 6, // 14: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 25, // 15: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions - 15, // 16: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 17: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 16, // 18: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 18, // 19: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 40, // 20: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 6, // 21: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 25, // 22: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions - 15, // 23: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 24: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 16, // 25: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 18, // 26: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 40, // 27: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 15, // 28: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 24, // 29: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 16, // 30: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 6, // 31: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 25, // 32: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 15, // 33: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 34: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 16, // 35: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 18, // 36: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 40, // 37: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 17, // 38: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput - 40, // 39: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 0, // 40: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType - 19, // 41: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload - 20, // 42: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload - 21, // 43: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload - 22, // 44: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 1, // 45: livekit.SegmentedFileOutput.protocol:type_name -> livekit.SegmentedFileProtocol - 2, // 46: livekit.SegmentedFileOutput.filename_suffix:type_name -> livekit.SegmentedFileSuffix - 19, // 47: livekit.SegmentedFileOutput.s3:type_name -> livekit.S3Upload - 20, // 48: livekit.SegmentedFileOutput.gcp:type_name -> livekit.GCPUpload - 21, // 49: livekit.SegmentedFileOutput.azure:type_name -> livekit.AzureBlobUpload - 22, // 50: livekit.SegmentedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 19, // 51: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload - 20, // 52: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload - 21, // 53: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload - 22, // 54: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 3, // 55: livekit.ImageOutput.filename_suffix:type_name -> livekit.ImageFileSuffix - 41, // 56: livekit.ImageOutput.image_codec:type_name -> livekit.ImageCodec - 19, // 57: livekit.ImageOutput.s3:type_name -> livekit.S3Upload - 20, // 58: livekit.ImageOutput.gcp:type_name -> livekit.GCPUpload - 21, // 59: livekit.ImageOutput.azure:type_name -> livekit.AzureBlobUpload - 22, // 60: livekit.ImageOutput.aliOSS:type_name -> livekit.AliOSSUpload - 39, // 61: livekit.S3Upload.metadata:type_name -> livekit.S3Upload.MetadataEntry - 23, // 62: livekit.S3Upload.proxy:type_name -> livekit.ProxyConfig - 23, // 63: livekit.GCPUpload.proxy:type_name -> livekit.ProxyConfig - 4, // 64: livekit.StreamOutput.protocol:type_name -> livekit.StreamProtocol - 42, // 65: livekit.EncodingOptions.audio_codec:type_name -> livekit.AudioCodec - 43, // 66: livekit.EncodingOptions.video_codec:type_name -> livekit.VideoCodec - 31, // 67: livekit.ListEgressResponse.items:type_name -> livekit.EgressInfo - 8, // 68: livekit.EgressInfo.source_type:type_name -> livekit.EgressSourceType - 7, // 69: livekit.EgressInfo.status:type_name -> livekit.EgressStatus - 10, // 70: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest - 11, // 71: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest - 12, // 72: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest - 13, // 73: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest - 14, // 74: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest - 32, // 75: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList - 34, // 76: livekit.EgressInfo.file:type_name -> livekit.FileInfo - 35, // 77: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo - 33, // 78: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo - 34, // 79: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo - 35, // 80: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo - 36, // 81: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo - 33, // 82: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo - 9, // 83: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status - 6, // 84: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset - 25, // 85: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions - 15, // 86: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput - 16, // 87: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput - 19, // 88: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload - 20, // 89: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload - 21, // 90: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload - 22, // 91: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload - 10, // 92: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest - 11, // 93: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest - 12, // 94: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest - 13, // 95: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest - 14, // 96: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest - 26, // 97: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest - 27, // 98: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest - 28, // 99: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest - 30, // 100: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest - 31, // 101: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo - 31, // 102: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo - 31, // 103: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo - 31, // 104: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo - 31, // 105: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo - 31, // 106: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo - 31, // 107: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo - 29, // 108: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse - 31, // 109: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo - 101, // [101:110] is the sub-list for method output_type - 92, // [92:101] is the sub-list for method input_type - 92, // [92:92] is the sub-list for extension type_name - 92, // [92:92] is the sub-list for extension extendee - 0, // [0:92] is the sub-list for field type_name + 12, // 0: livekit.StartEgressRequest.template:type_name -> livekit.TemplateSource + 13, // 1: livekit.StartEgressRequest.web:type_name -> livekit.WebSource + 14, // 2: livekit.StartEgressRequest.media:type_name -> livekit.MediaSource + 1, // 3: livekit.StartEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 4: livekit.StartEgressRequest.advanced:type_name -> livekit.EncodingOptions + 21, // 5: livekit.StartEgressRequest.outputs:type_name -> livekit.Output + 27, // 6: livekit.StartEgressRequest.storage:type_name -> livekit.StorageConfig + 57, // 7: livekit.StartEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 15, // 8: livekit.MediaSource.participant_video:type_name -> livekit.ParticipantVideo + 16, // 9: livekit.MediaSource.audio:type_name -> livekit.AudioConfig + 18, // 10: livekit.MediaSource.data:type_name -> livekit.DataConfig + 17, // 11: livekit.AudioConfig.routes:type_name -> livekit.AudioRoute + 58, // 12: livekit.AudioRoute.participant_kind:type_name -> livekit.ParticipantInfo.Kind + 0, // 13: livekit.AudioRoute.channel:type_name -> livekit.AudioChannel + 19, // 14: livekit.DataConfig.selectors:type_name -> livekit.DataSelector + 59, // 15: livekit.EncodingOptions.audio_codec:type_name -> livekit.AudioCodec + 60, // 16: livekit.EncodingOptions.video_codec:type_name -> livekit.VideoCodec + 22, // 17: livekit.Output.file:type_name -> livekit.FileOutput + 23, // 18: livekit.Output.stream:type_name -> livekit.StreamOutput + 24, // 19: livekit.Output.segments:type_name -> livekit.SegmentedFileOutput + 25, // 20: livekit.Output.images:type_name -> livekit.ImageOutput + 26, // 21: livekit.Output.mcap:type_name -> livekit.McapOutput + 27, // 22: livekit.Output.storage:type_name -> livekit.StorageConfig + 2, // 23: livekit.FileOutput.file_type:type_name -> livekit.EncodedFileType + 3, // 24: livekit.StreamOutput.protocol:type_name -> livekit.StreamProtocol + 4, // 25: livekit.SegmentedFileOutput.protocol:type_name -> livekit.SegmentedFileProtocol + 5, // 26: livekit.SegmentedFileOutput.filename_suffix:type_name -> livekit.SegmentedFileSuffix + 28, // 27: livekit.SegmentedFileOutput.s3:type_name -> livekit.S3Upload + 29, // 28: livekit.SegmentedFileOutput.gcp:type_name -> livekit.GCPUpload + 30, // 29: livekit.SegmentedFileOutput.azure:type_name -> livekit.AzureBlobUpload + 31, // 30: livekit.SegmentedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 6, // 31: livekit.ImageOutput.filename_suffix:type_name -> livekit.ImageFileSuffix + 61, // 32: livekit.ImageOutput.image_codec:type_name -> livekit.ImageCodec + 28, // 33: livekit.ImageOutput.s3:type_name -> livekit.S3Upload + 29, // 34: livekit.ImageOutput.gcp:type_name -> livekit.GCPUpload + 30, // 35: livekit.ImageOutput.azure:type_name -> livekit.AzureBlobUpload + 31, // 36: livekit.ImageOutput.aliOSS:type_name -> livekit.AliOSSUpload + 28, // 37: livekit.StorageConfig.s3:type_name -> livekit.S3Upload + 29, // 38: livekit.StorageConfig.gcp:type_name -> livekit.GCPUpload + 30, // 39: livekit.StorageConfig.azure:type_name -> livekit.AzureBlobUpload + 31, // 40: livekit.StorageConfig.ali_oss:type_name -> livekit.AliOSSUpload + 56, // 41: livekit.S3Upload.metadata:type_name -> livekit.S3Upload.MetadataEntry + 32, // 42: livekit.S3Upload.proxy:type_name -> livekit.ProxyConfig + 32, // 43: livekit.GCPUpload.proxy:type_name -> livekit.ProxyConfig + 37, // 44: livekit.ListEgressResponse.items:type_name -> livekit.EgressInfo + 7, // 45: livekit.EgressInfo.source_type:type_name -> livekit.EgressSourceType + 8, // 46: livekit.EgressInfo.status:type_name -> livekit.EgressStatus + 11, // 47: livekit.EgressInfo.egress:type_name -> livekit.StartEgressRequest + 45, // 48: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest + 46, // 49: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest + 47, // 50: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest + 48, // 51: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest + 49, // 52: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest + 50, // 53: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest + 38, // 54: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo + 39, // 55: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo + 40, // 56: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo + 41, // 57: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo + 42, // 58: livekit.EgressInfo.mcap_results:type_name -> livekit.McapInfo + 55, // 59: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList + 39, // 60: livekit.EgressInfo.file:type_name -> livekit.FileInfo + 40, // 61: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo + 10, // 62: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status + 1, // 63: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 64: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions + 52, // 65: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput + 24, // 66: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput + 28, // 67: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload + 29, // 68: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload + 30, // 69: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload + 31, // 70: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload + 12, // 71: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource + 13, // 72: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource + 14, // 73: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource + 1, // 74: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 75: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions + 21, // 76: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output + 27, // 77: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig + 57, // 78: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig + 9, // 79: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing + 52, // 80: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 81: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 82: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 83: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 84: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 52, // 85: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 86: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 87: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 88: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 57, // 89: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 52, // 90: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 91: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 92: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 93: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 94: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions + 52, // 95: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 96: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 97: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 98: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 57, // 99: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 1, // 100: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 101: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions + 52, // 102: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 103: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 104: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 105: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 57, // 106: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 52, // 107: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 108: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 109: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 110: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 111: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 52, // 112: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 113: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 114: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 115: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 57, // 116: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 51, // 117: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput + 57, // 118: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 28, // 119: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload + 29, // 120: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload + 30, // 121: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload + 31, // 122: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 2, // 123: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType + 28, // 124: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload + 29, // 125: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload + 30, // 126: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload + 31, // 127: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 38, // 128: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo + 11, // 129: livekit.Egress.StartEgress:input_type -> livekit.StartEgressRequest + 35, // 130: livekit.Egress.UpdateEgress:input_type -> livekit.UpdateEgressRequest + 33, // 131: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest + 36, // 132: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest + 46, // 133: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest + 47, // 134: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest + 48, // 135: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest + 49, // 136: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest + 50, // 137: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest + 53, // 138: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest + 54, // 139: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest + 37, // 140: livekit.Egress.StartEgress:output_type -> livekit.EgressInfo + 37, // 141: livekit.Egress.UpdateEgress:output_type -> livekit.EgressInfo + 34, // 142: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse + 37, // 143: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo + 37, // 144: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo + 37, // 145: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo + 37, // 146: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo + 37, // 147: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo + 37, // 148: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo + 37, // 149: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo + 37, // 150: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo + 140, // [140:151] is the sub-list for method output_type + 129, // [129:140] is the sub-list for method input_type + 129, // [129:129] is the sub-list for extension type_name + 129, // [129:129] is the sub-list for extension extendee + 0, // [0:129] is the sub-list for field type_name } func init() { file_livekit_egress_proto_init() } @@ -4443,59 +6250,54 @@ func file_livekit_egress_proto_init() { } file_livekit_models_proto_init() file_livekit_egress_proto_msgTypes[0].OneofWrappers = []any{ - (*RoomCompositeEgressRequest_File)(nil), - (*RoomCompositeEgressRequest_Stream)(nil), - (*RoomCompositeEgressRequest_Segments)(nil), - (*RoomCompositeEgressRequest_Preset)(nil), - (*RoomCompositeEgressRequest_Advanced)(nil), - } - file_livekit_egress_proto_msgTypes[1].OneofWrappers = []any{ - (*WebEgressRequest_File)(nil), - (*WebEgressRequest_Stream)(nil), - (*WebEgressRequest_Segments)(nil), - (*WebEgressRequest_Preset)(nil), - (*WebEgressRequest_Advanced)(nil), - } - file_livekit_egress_proto_msgTypes[2].OneofWrappers = []any{ - (*ParticipantEgressRequest_Preset)(nil), - (*ParticipantEgressRequest_Advanced)(nil), + (*StartEgressRequest_Template)(nil), + (*StartEgressRequest_Web)(nil), + (*StartEgressRequest_Media)(nil), + (*StartEgressRequest_Preset)(nil), + (*StartEgressRequest_Advanced)(nil), } file_livekit_egress_proto_msgTypes[3].OneofWrappers = []any{ - (*TrackCompositeEgressRequest_File)(nil), - (*TrackCompositeEgressRequest_Stream)(nil), - (*TrackCompositeEgressRequest_Segments)(nil), - (*TrackCompositeEgressRequest_Preset)(nil), - (*TrackCompositeEgressRequest_Advanced)(nil), - } - file_livekit_egress_proto_msgTypes[4].OneofWrappers = []any{ - (*TrackEgressRequest_File)(nil), - (*TrackEgressRequest_WebsocketUrl)(nil), - } - file_livekit_egress_proto_msgTypes[5].OneofWrappers = []any{ - (*EncodedFileOutput_S3)(nil), - (*EncodedFileOutput_Gcp)(nil), - (*EncodedFileOutput_Azure)(nil), - (*EncodedFileOutput_AliOSS)(nil), + (*MediaSource_VideoTrackId)(nil), + (*MediaSource_ParticipantVideo)(nil), } file_livekit_egress_proto_msgTypes[6].OneofWrappers = []any{ + (*AudioRoute_TrackId)(nil), + (*AudioRoute_ParticipantIdentity)(nil), + (*AudioRoute_ParticipantKind)(nil), + } + file_livekit_egress_proto_msgTypes[8].OneofWrappers = []any{ + (*DataSelector_TrackId)(nil), + (*DataSelector_ParticipantIdentity)(nil), + (*DataSelector_Topic)(nil), + } + file_livekit_egress_proto_msgTypes[10].OneofWrappers = []any{ + (*Output_File)(nil), + (*Output_Stream)(nil), + (*Output_Segments)(nil), + (*Output_Images)(nil), + (*Output_Mcap)(nil), + } + file_livekit_egress_proto_msgTypes[13].OneofWrappers = []any{ (*SegmentedFileOutput_S3)(nil), (*SegmentedFileOutput_Gcp)(nil), (*SegmentedFileOutput_Azure)(nil), (*SegmentedFileOutput_AliOSS)(nil), } - file_livekit_egress_proto_msgTypes[7].OneofWrappers = []any{ - (*DirectFileOutput_S3)(nil), - (*DirectFileOutput_Gcp)(nil), - (*DirectFileOutput_Azure)(nil), - (*DirectFileOutput_AliOSS)(nil), - } - file_livekit_egress_proto_msgTypes[8].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[14].OneofWrappers = []any{ (*ImageOutput_S3)(nil), (*ImageOutput_Gcp)(nil), (*ImageOutput_Azure)(nil), (*ImageOutput_AliOSS)(nil), } - file_livekit_egress_proto_msgTypes[21].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[16].OneofWrappers = []any{ + (*StorageConfig_S3)(nil), + (*StorageConfig_Gcp)(nil), + (*StorageConfig_Azure)(nil), + (*StorageConfig_AliOss)(nil), + } + file_livekit_egress_proto_msgTypes[26].OneofWrappers = []any{ + (*EgressInfo_Egress)(nil), + (*EgressInfo_Replay)(nil), (*EgressInfo_RoomComposite)(nil), (*EgressInfo_Web)(nil), (*EgressInfo_Participant)(nil), @@ -4505,23 +6307,71 @@ func file_livekit_egress_proto_init() { (*EgressInfo_File)(nil), (*EgressInfo_Segments)(nil), } - file_livekit_egress_proto_msgTypes[27].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[32].OneofWrappers = []any{ (*AutoParticipantEgress_Preset)(nil), (*AutoParticipantEgress_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[28].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[33].OneofWrappers = []any{ (*AutoTrackEgress_S3)(nil), (*AutoTrackEgress_Gcp)(nil), (*AutoTrackEgress_Azure)(nil), (*AutoTrackEgress_AliOSS)(nil), } + file_livekit_egress_proto_msgTypes[34].OneofWrappers = []any{ + (*ExportReplayRequest_Template)(nil), + (*ExportReplayRequest_Web)(nil), + (*ExportReplayRequest_Media)(nil), + (*ExportReplayRequest_Preset)(nil), + (*ExportReplayRequest_Advanced)(nil), + } + file_livekit_egress_proto_msgTypes[35].OneofWrappers = []any{ + (*RoomCompositeEgressRequest_File)(nil), + (*RoomCompositeEgressRequest_Stream)(nil), + (*RoomCompositeEgressRequest_Segments)(nil), + (*RoomCompositeEgressRequest_Preset)(nil), + (*RoomCompositeEgressRequest_Advanced)(nil), + } + file_livekit_egress_proto_msgTypes[36].OneofWrappers = []any{ + (*WebEgressRequest_File)(nil), + (*WebEgressRequest_Stream)(nil), + (*WebEgressRequest_Segments)(nil), + (*WebEgressRequest_Preset)(nil), + (*WebEgressRequest_Advanced)(nil), + } + file_livekit_egress_proto_msgTypes[37].OneofWrappers = []any{ + (*ParticipantEgressRequest_Preset)(nil), + (*ParticipantEgressRequest_Advanced)(nil), + } + file_livekit_egress_proto_msgTypes[38].OneofWrappers = []any{ + (*TrackCompositeEgressRequest_File)(nil), + (*TrackCompositeEgressRequest_Stream)(nil), + (*TrackCompositeEgressRequest_Segments)(nil), + (*TrackCompositeEgressRequest_Preset)(nil), + (*TrackCompositeEgressRequest_Advanced)(nil), + } + file_livekit_egress_proto_msgTypes[39].OneofWrappers = []any{ + (*TrackEgressRequest_File)(nil), + (*TrackEgressRequest_WebsocketUrl)(nil), + } + file_livekit_egress_proto_msgTypes[40].OneofWrappers = []any{ + (*DirectFileOutput_S3)(nil), + (*DirectFileOutput_Gcp)(nil), + (*DirectFileOutput_Azure)(nil), + (*DirectFileOutput_AliOSS)(nil), + } + file_livekit_egress_proto_msgTypes[41].OneofWrappers = []any{ + (*EncodedFileOutput_S3)(nil), + (*EncodedFileOutput_Gcp)(nil), + (*EncodedFileOutput_Azure)(nil), + (*EncodedFileOutput_AliOSS)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_livekit_egress_proto_rawDesc), len(file_livekit_egress_proto_rawDesc)), - NumEnums: 10, - NumMessages: 30, + NumEnums: 11, + NumMessages: 46, NumExtensions: 0, NumServices: 1, }, diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index b84f1dc0e..41d9607be 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -27,7 +27,19 @@ const _ = twirp.TwirpPackageMinVersion_8_1_0 // ================ type Egress interface { - // start recording or streaming a room, participant, or tracks + // Unified StartEgress RPC + StartEgress(context.Context, *StartEgressRequest) (*EgressInfo, error) + + // Update url/template or stream outputs + UpdateEgress(context.Context, *UpdateEgressRequest) (*EgressInfo, error) + + // List available egress + ListEgress(context.Context, *ListEgressRequest) (*ListEgressResponse, error) + + // Stop a recording or stream + StopEgress(context.Context, *StopEgressRequest) (*EgressInfo, error) + + // --- Deprecated --- StartRoomCompositeEgress(context.Context, *RoomCompositeEgressRequest) (*EgressInfo, error) StartWebEgress(context.Context, *WebEgressRequest) (*EgressInfo, error) @@ -38,17 +50,9 @@ type Egress interface { StartTrackEgress(context.Context, *TrackEgressRequest) (*EgressInfo, error) - // update web composite layout UpdateLayout(context.Context, *UpdateLayoutRequest) (*EgressInfo, error) - // add or remove stream endpoints UpdateStream(context.Context, *UpdateStreamRequest) (*EgressInfo, error) - - // list available egress - ListEgress(context.Context, *ListEgressRequest) (*ListEgressResponse, error) - - // stop a recording or stream - StopEgress(context.Context, *StopEgressRequest) (*EgressInfo, error) } // ====================== @@ -57,7 +61,7 @@ type Egress interface { type egressProtobufClient struct { client HTTPClient - urls [9]string + urls [11]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -85,7 +89,11 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") - urls := [9]string{ + urls := [11]string{ + serviceURL + "StartEgress", + serviceURL + "UpdateEgress", + serviceURL + "ListEgress", + serviceURL + "StopEgress", serviceURL + "StartRoomCompositeEgress", serviceURL + "StartWebEgress", serviceURL + "StartParticipantEgress", @@ -93,8 +101,6 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl serviceURL + "StartTrackEgress", serviceURL + "UpdateLayout", serviceURL + "UpdateStream", - serviceURL + "ListEgress", - serviceURL + "StopEgress", } return &egressProtobufClient{ @@ -105,20 +111,20 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl } } -func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") - caller := c.callStartRoomCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") + caller := c.callStartEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*StartEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") } - return c.callStartRoomCompositeEgress(ctx, typedReq) + return c.callStartEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -134,7 +140,7 @@ func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in return caller(ctx, in) } -func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) if err != nil { @@ -151,20 +157,20 @@ func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, return out, nil } -func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) UpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") - caller := c.callStartWebEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") + caller := c.callUpdateEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") } - return c.callStartWebEgress(ctx, typedReq) + return c.callUpdateEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -180,7 +186,7 @@ func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgress return caller(ctx, in) } -func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callUpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { @@ -197,26 +203,26 @@ func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEg return out, nil } -func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") - caller := c.callStartParticipantEgress + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + caller := c.callListEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return c.callStartParticipantEgress(ctx, typedReq) + return c.callListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -226,8 +232,8 @@ func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *P return caller(ctx, in) } -func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) +func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { + out := new(ListEgressResponse) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -243,20 +249,20 @@ func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, i return out, nil } -func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") - caller := c.callStartTrackCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + caller := c.callStopEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return c.callStartTrackCompositeEgress(ctx, typedReq) + return c.callStopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -272,7 +278,7 @@ func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in return caller(ctx, in) } -func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { @@ -289,20 +295,20 @@ func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context return out, nil } -func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") - caller := c.callStartTrackEgress + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + caller := c.callStartRoomCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return c.callStartTrackEgress(ctx, typedReq) + return c.callStartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -318,7 +324,7 @@ func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEg return caller(ctx, in) } -func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) if err != nil { @@ -335,20 +341,20 @@ func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *Tra return out, nil } -func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") - caller := c.callUpdateLayout + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + caller := c.callStartWebEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return c.callUpdateLayout(ctx, typedReq) + return c.callStartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -364,7 +370,7 @@ func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayou return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { @@ -381,20 +387,20 @@ func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateL return out, nil } -func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") - caller := c.callUpdateStream + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + caller := c.callStartParticipantEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return c.callUpdateStream(ctx, typedReq) + return c.callStartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -410,7 +416,7 @@ func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStrea return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[6], in, out) if err != nil { @@ -427,26 +433,26 @@ func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateS return out, nil } -func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { +func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") - caller := c.callListEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + caller := c.callStartTrackCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return c.callListEgress(ctx, typedReq) + return c.callStartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -456,8 +462,8 @@ func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressReq return caller(ctx, in) } -func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - out := new(ListEgressResponse) +func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[7], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -473,20 +479,20 @@ func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgres return out, nil } -func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") - caller := c.callStopEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + caller := c.callStartTrackEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return c.callStopEgress(ctx, typedReq) + return c.callStartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -502,7 +508,7 @@ func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressReq return caller(ctx, in) } -func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[8], in, out) if err != nil { @@ -519,13 +525,105 @@ func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgres return out, nil } +func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + caller := c.callUpdateLayout + if c.interceptor != nil { + caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*UpdateLayoutRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + } + return c.callUpdateLayout(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { + out := new(EgressInfo) + ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[9], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + +func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + caller := c.callUpdateStream + if c.interceptor != nil { + caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*UpdateStreamRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + } + return c.callUpdateStream(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { + out := new(EgressInfo) + ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[10], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + // ================== // Egress JSON Client // ================== type egressJSONClient struct { client HTTPClient - urls [9]string + urls [11]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -553,7 +651,11 @@ func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.Client // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") - urls := [9]string{ + urls := [11]string{ + serviceURL + "StartEgress", + serviceURL + "UpdateEgress", + serviceURL + "ListEgress", + serviceURL + "StopEgress", serviceURL + "StartRoomCompositeEgress", serviceURL + "StartWebEgress", serviceURL + "StartParticipantEgress", @@ -561,8 +663,6 @@ func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.Client serviceURL + "StartTrackEgress", serviceURL + "UpdateLayout", serviceURL + "UpdateStream", - serviceURL + "ListEgress", - serviceURL + "StopEgress", } return &egressJSONClient{ @@ -573,20 +673,20 @@ func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.Client } } -func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") - caller := c.callStartRoomCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") + caller := c.callStartEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*StartEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") } - return c.callStartRoomCompositeEgress(ctx, typedReq) + return c.callStartEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -602,7 +702,7 @@ func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *Roo return caller(ctx, in) } -func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) if err != nil { @@ -619,20 +719,20 @@ func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in return out, nil } -func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) UpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") - caller := c.callStartWebEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") + caller := c.callUpdateEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") } - return c.callStartWebEgress(ctx, typedReq) + return c.callUpdateEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -648,7 +748,7 @@ func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequ return caller(ctx, in) } -func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callUpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { @@ -665,26 +765,26 @@ func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgress return out, nil } -func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") - caller := c.callStartParticipantEgress + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + caller := c.callListEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return c.callStartParticipantEgress(ctx, typedReq) + return c.callListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -694,8 +794,8 @@ func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *Parti return caller(ctx, in) } -func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) +func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { + out := new(ListEgressResponse) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -711,20 +811,20 @@ func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *P return out, nil } -func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") - caller := c.callStartTrackCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + caller := c.callStopEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return c.callStartTrackCompositeEgress(ctx, typedReq) + return c.callStopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -740,7 +840,7 @@ func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *Tr return caller(ctx, in) } -func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { @@ -757,20 +857,20 @@ func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in return out, nil } -func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") - caller := c.callStartTrackEgress + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + caller := c.callStartRoomCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return c.callStartTrackEgress(ctx, typedReq) + return c.callStartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -786,7 +886,7 @@ func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgress return caller(ctx, in) } -func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) if err != nil { @@ -803,20 +903,20 @@ func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEg return out, nil } -func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") - caller := c.callUpdateLayout + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + caller := c.callStartWebEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return c.callUpdateLayout(ctx, typedReq) + return c.callStartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -832,7 +932,7 @@ func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutReq return caller(ctx, in) } -func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { @@ -849,20 +949,20 @@ func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayou return out, nil } -func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") - caller := c.callUpdateStream + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + caller := c.callStartParticipantEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return c.callUpdateStream(ctx, typedReq) + return c.callStartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -878,7 +978,7 @@ func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamReq return caller(ctx, in) } -func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[6], in, out) if err != nil { @@ -895,26 +995,26 @@ func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStrea return out, nil } -func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { +func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") - caller := c.callListEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + caller := c.callStartTrackCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return c.callListEgress(ctx, typedReq) + return c.callStartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -924,8 +1024,8 @@ func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest return caller(ctx, in) } -func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - out := new(ListEgressResponse) +func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[7], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -941,20 +1041,20 @@ func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressReq return out, nil } -func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") - caller := c.callStopEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + caller := c.callStartTrackEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return c.callStopEgress(ctx, typedReq) + return c.callStartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -970,7 +1070,7 @@ func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest return caller(ctx, in) } -func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[8], in, out) if err != nil { @@ -987,6 +1087,98 @@ func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressReq return out, nil } +func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + caller := c.callUpdateLayout + if c.interceptor != nil { + caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*UpdateLayoutRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + } + return c.callUpdateLayout(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { + out := new(EgressInfo) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[9], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + +func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + caller := c.callUpdateStream + if c.interceptor != nil { + caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*UpdateStreamRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + } + return c.callUpdateStream(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { + out := new(EgressInfo) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[10], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + // ===================== // Egress Server Handler // ===================== @@ -1042,83 +1234,449 @@ func (s *egressServer) handleRequestBodyError(ctx context.Context, resp http.Res s.writeError(ctx, resp, twirp.NewError(twirp.DeadlineExceeded, "failed to read request: deadline exceeded")) return } - s.writeError(ctx, resp, twirp.WrapError(malformedRequestError(msg), err)) + s.writeError(ctx, resp, twirp.WrapError(malformedRequestError(msg), err)) +} + +// EgressPathPrefix is a convenience constant that may identify URL paths. +// Should be used with caution, it only matches routes generated by Twirp Go clients, +// with the default "/twirp" prefix and default CamelCase service and method names. +// More info: https://twitchtv.github.io/twirp/docs/routing.html +const EgressPathPrefix = "/twirp/livekit.Egress/" + +func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { + ctx := req.Context() + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithResponseWriter(ctx, resp) + + var err error + ctx, err = callRequestReceived(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + if req.Method != "POST" { + msg := fmt.Sprintf("unsupported method %q (only POST is allowed)", req.Method) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + return + } + + // Verify path format: []/./ + prefix, pkgService, method := parseTwirpPath(req.URL.Path) + if pkgService != "livekit.Egress" { + msg := fmt.Sprintf("no handler for path %q", req.URL.Path) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + return + } + if prefix != s.pathPrefix { + msg := fmt.Sprintf("invalid path prefix %q, expected %q, on path %q", prefix, s.pathPrefix, req.URL.Path) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + return + } + + switch method { + case "StartEgress": + s.serveStartEgress(ctx, resp, req) + return + case "UpdateEgress": + s.serveUpdateEgress(ctx, resp, req) + return + case "ListEgress": + s.serveListEgress(ctx, resp, req) + return + case "StopEgress": + s.serveStopEgress(ctx, resp, req) + return + case "StartRoomCompositeEgress": + s.serveStartRoomCompositeEgress(ctx, resp, req) + return + case "StartWebEgress": + s.serveStartWebEgress(ctx, resp, req) + return + case "StartParticipantEgress": + s.serveStartParticipantEgress(ctx, resp, req) + return + case "StartTrackCompositeEgress": + s.serveStartTrackCompositeEgress(ctx, resp, req) + return + case "StartTrackEgress": + s.serveStartTrackEgress(ctx, resp, req) + return + case "UpdateLayout": + s.serveUpdateLayout(ctx, resp, req) + return + case "UpdateStream": + s.serveUpdateStream(ctx, resp, req) + return + default: + msg := fmt.Sprintf("no handler for path %q", req.URL.Path) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + return + } +} + +func (s *egressServer) serveStartEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + header := req.Header.Get("Content-Type") + i := strings.Index(header, ";") + if i == -1 { + i = len(header) + } + switch strings.TrimSpace(strings.ToLower(header[:i])) { + case "application/json": + s.serveStartEgressJSON(ctx, resp, req) + case "application/protobuf": + s.serveStartEgressProtobuf(ctx, resp, req) + default: + msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) + twerr := badRouteError(msg, req.Method, req.URL.Path) + s.writeError(ctx, resp, twerr) + } +} + +func (s *egressServer) serveStartEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + d := json.NewDecoder(req.Body) + rawReqBody := json.RawMessage{} + if err := d.Decode(&rawReqBody); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + reqContent := new(StartEgressRequest) + unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} + if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + + handler := s.Egress.StartEgress + if s.interceptor != nil { + handler = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*StartEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") + } + return s.Egress.StartEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *EgressInfo + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartEgress. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + marshaler := &protojson.MarshalOptions{UseProtoNames: !s.jsonCamelCase, EmitUnpopulated: !s.jsonSkipDefaults} + respBytes, err := marshaler.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/json") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *egressServer) serveStartEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + buf, err := io.ReadAll(req.Body) + if err != nil { + s.handleRequestBodyError(ctx, resp, "failed to read request body", err) + return + } + reqContent := new(StartEgressRequest) + if err = proto.Unmarshal(buf, reqContent); err != nil { + s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) + return + } + + handler := s.Egress.StartEgress + if s.interceptor != nil { + handler = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*StartEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") + } + return s.Egress.StartEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *EgressInfo + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartEgress. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + respBytes, err := proto.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/protobuf") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *egressServer) serveUpdateEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + header := req.Header.Get("Content-Type") + i := strings.Index(header, ";") + if i == -1 { + i = len(header) + } + switch strings.TrimSpace(strings.ToLower(header[:i])) { + case "application/json": + s.serveUpdateEgressJSON(ctx, resp, req) + case "application/protobuf": + s.serveUpdateEgressProtobuf(ctx, resp, req) + default: + msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) + twerr := badRouteError(msg, req.Method, req.URL.Path) + s.writeError(ctx, resp, twerr) + } +} + +func (s *egressServer) serveUpdateEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + d := json.NewDecoder(req.Body) + rawReqBody := json.RawMessage{} + if err := d.Decode(&rawReqBody); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + reqContent := new(UpdateEgressRequest) + unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} + if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + + handler := s.Egress.UpdateEgress + if s.interceptor != nil { + handler = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*UpdateEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") + } + return s.Egress.UpdateEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *EgressInfo + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateEgress. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + marshaler := &protojson.MarshalOptions{UseProtoNames: !s.jsonCamelCase, EmitUnpopulated: !s.jsonSkipDefaults} + respBytes, err := marshaler.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/json") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) } -// EgressPathPrefix is a convenience constant that may identify URL paths. -// Should be used with caution, it only matches routes generated by Twirp Go clients, -// with the default "/twirp" prefix and default CamelCase service and method names. -// More info: https://twitchtv.github.io/twirp/docs/routing.html -const EgressPathPrefix = "/twirp/livekit.Egress/" - -func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { - ctx := req.Context() - ctx = ctxsetters.WithPackageName(ctx, "livekit") - ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithResponseWriter(ctx, resp) - +func (s *egressServer) serveUpdateEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx, err = callRequestReceived(ctx, s.hooks) + ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") + ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) return } - if req.Method != "POST" { - msg := fmt.Sprintf("unsupported method %q (only POST is allowed)", req.Method) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + buf, err := io.ReadAll(req.Body) + if err != nil { + s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - - // Verify path format: []/./ - prefix, pkgService, method := parseTwirpPath(req.URL.Path) - if pkgService != "livekit.Egress" { - msg := fmt.Sprintf("no handler for path %q", req.URL.Path) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + reqContent := new(UpdateEgressRequest) + if err = proto.Unmarshal(buf, reqContent); err != nil { + s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - if prefix != s.pathPrefix { - msg := fmt.Sprintf("invalid path prefix %q, expected %q, on path %q", prefix, s.pathPrefix, req.URL.Path) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) - return + + handler := s.Egress.UpdateEgress + if s.interceptor != nil { + handler = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*UpdateEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") + } + return s.Egress.UpdateEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } } - switch method { - case "StartRoomCompositeEgress": - s.serveStartRoomCompositeEgress(ctx, resp, req) - return - case "StartWebEgress": - s.serveStartWebEgress(ctx, resp, req) - return - case "StartParticipantEgress": - s.serveStartParticipantEgress(ctx, resp, req) - return - case "StartTrackCompositeEgress": - s.serveStartTrackCompositeEgress(ctx, resp, req) - return - case "StartTrackEgress": - s.serveStartTrackEgress(ctx, resp, req) - return - case "UpdateLayout": - s.serveUpdateLayout(ctx, resp, req) - return - case "UpdateStream": - s.serveUpdateStream(ctx, resp, req) - return - case "ListEgress": - s.serveListEgress(ctx, resp, req) + // Call service method + var respContent *EgressInfo + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) return - case "StopEgress": - s.serveStopEgress(ctx, resp, req) + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateEgress. nil responses are not supported")) return - default: - msg := fmt.Sprintf("no handler for path %q", req.URL.Path) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + } + + ctx = callResponsePrepared(ctx, s.hooks) + + respBytes, err := proto.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) return } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/protobuf") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1126,9 +1684,9 @@ func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp h } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartRoomCompositeEgressJSON(ctx, resp, req) + s.serveListEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartRoomCompositeEgressProtobuf(ctx, resp, req) + s.serveListEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1136,9 +1694,9 @@ func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp h } } -func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1151,29 +1709,29 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(RoomCompositeEgressRequest) + reqContent := new(ListEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartRoomCompositeEgress + handler := s.Egress.ListEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return s.Egress.StartRoomCompositeEgress(ctx, typedReq) + return s.Egress.ListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -1182,7 +1740,7 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re } // Call service method - var respContent *EgressInfo + var respContent *ListEgressResponse func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1193,7 +1751,7 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) return } @@ -1219,9 +1777,9 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1233,28 +1791,28 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(RoomCompositeEgressRequest) + reqContent := new(ListEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartRoomCompositeEgress + handler := s.Egress.ListEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return s.Egress.StartRoomCompositeEgress(ctx, typedReq) + return s.Egress.ListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -1263,7 +1821,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context } // Call service method - var respContent *EgressInfo + var respContent *ListEgressResponse func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1274,7 +1832,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) return } @@ -1298,7 +1856,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1306,9 +1864,9 @@ func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.Respon } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartWebEgressJSON(ctx, resp, req) + s.serveStopEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartWebEgressProtobuf(ctx, resp, req) + s.serveStopEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1316,9 +1874,9 @@ func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.Respon } } -func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1331,23 +1889,23 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(WebEgressRequest) + reqContent := new(StopEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartWebEgress + handler := s.Egress.StopEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return s.Egress.StartWebEgress(ctx, typedReq) + return s.Egress.StopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1373,7 +1931,7 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) return } @@ -1399,9 +1957,9 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1413,22 +1971,22 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(WebEgressRequest) + reqContent := new(StopEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartWebEgress + handler := s.Egress.StopEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return s.Egress.StartWebEgress(ctx, typedReq) + return s.Egress.StopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1454,7 +2012,7 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) return } @@ -1478,7 +2036,7 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1486,9 +2044,9 @@ func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp htt } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartParticipantEgressJSON(ctx, resp, req) + s.serveStartRoomCompositeEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartParticipantEgressProtobuf(ctx, resp, req) + s.serveStartRoomCompositeEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1496,9 +2054,9 @@ func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp htt } } -func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1511,23 +2069,23 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ParticipantEgressRequest) + reqContent := new(RoomCompositeEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartParticipantEgress + handler := s.Egress.StartRoomCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return s.Egress.StartParticipantEgress(ctx, typedReq) + return s.Egress.StartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1553,7 +2111,7 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) return } @@ -1579,9 +2137,9 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1593,22 +2151,22 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ParticipantEgressRequest) + reqContent := new(RoomCompositeEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartParticipantEgress + handler := s.Egress.StartRoomCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return s.Egress.StartParticipantEgress(ctx, typedReq) + return s.Egress.StartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1634,7 +2192,7 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) return } @@ -1658,7 +2216,7 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1666,9 +2224,9 @@ func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartTrackCompositeEgressJSON(ctx, resp, req) + s.serveStartWebEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartTrackCompositeEgressProtobuf(ctx, resp, req) + s.serveStartWebEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1676,9 +2234,9 @@ func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp } } -func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1691,23 +2249,23 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(TrackCompositeEgressRequest) + reqContent := new(WebEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartTrackCompositeEgress + handler := s.Egress.StartWebEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return s.Egress.StartTrackCompositeEgress(ctx, typedReq) + return s.Egress.StartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1733,7 +2291,7 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) return } @@ -1759,9 +2317,9 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1773,22 +2331,22 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(TrackCompositeEgressRequest) + reqContent := new(WebEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartTrackCompositeEgress + handler := s.Egress.StartWebEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return s.Egress.StartTrackCompositeEgress(ctx, typedReq) + return s.Egress.StartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1814,7 +2372,7 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) return } @@ -1838,7 +2396,7 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1846,9 +2404,9 @@ func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.Resp } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartTrackEgressJSON(ctx, resp, req) + s.serveStartParticipantEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartTrackEgressProtobuf(ctx, resp, req) + s.serveStartParticipantEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1856,9 +2414,9 @@ func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.Resp } } -func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1871,23 +2429,23 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(TrackEgressRequest) + reqContent := new(ParticipantEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartTrackEgress + handler := s.Egress.StartParticipantEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return s.Egress.StartTrackEgress(ctx, typedReq) + return s.Egress.StartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1913,7 +2471,7 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) return } @@ -1939,9 +2497,9 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1953,22 +2511,22 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(TrackEgressRequest) + reqContent := new(ParticipantEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartTrackEgress + handler := s.Egress.StartParticipantEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return s.Egress.StartTrackEgress(ctx, typedReq) + return s.Egress.StartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1994,7 +2552,7 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) return } @@ -2018,7 +2576,7 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2026,9 +2584,9 @@ func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveUpdateLayoutJSON(ctx, resp, req) + s.serveStartTrackCompositeEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveUpdateLayoutProtobuf(ctx, resp, req) + s.serveStartTrackCompositeEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2036,9 +2594,9 @@ func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.Response } } -func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2051,23 +2609,23 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(UpdateLayoutRequest) + reqContent := new(TrackCompositeEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.UpdateLayout + handler := s.Egress.StartTrackCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return s.Egress.UpdateLayout(ctx, typedReq) + return s.Egress.StartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2093,7 +2651,7 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) return } @@ -2119,9 +2677,9 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2133,22 +2691,22 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(UpdateLayoutRequest) + reqContent := new(TrackCompositeEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.UpdateLayout + handler := s.Egress.StartTrackCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return s.Egress.UpdateLayout(ctx, typedReq) + return s.Egress.StartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2174,7 +2732,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) return } @@ -2198,7 +2756,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2206,9 +2764,9 @@ func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveUpdateStreamJSON(ctx, resp, req) + s.serveStartTrackEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveUpdateStreamProtobuf(ctx, resp, req) + s.serveStartTrackEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2216,9 +2774,9 @@ func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.Response } } -func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2231,23 +2789,23 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(UpdateStreamRequest) + reqContent := new(TrackEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.UpdateStream + handler := s.Egress.StartTrackEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return s.Egress.UpdateStream(ctx, typedReq) + return s.Egress.StartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2273,7 +2831,7 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) return } @@ -2299,9 +2857,9 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2313,22 +2871,22 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(UpdateStreamRequest) + reqContent := new(TrackEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.UpdateStream + handler := s.Egress.StartTrackEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return s.Egress.UpdateStream(ctx, typedReq) + return s.Egress.StartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2354,7 +2912,7 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) return } @@ -2378,7 +2936,7 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2386,9 +2944,9 @@ func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWr } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveListEgressJSON(ctx, resp, req) + s.serveUpdateLayoutJSON(ctx, resp, req) case "application/protobuf": - s.serveListEgressProtobuf(ctx, resp, req) + s.serveUpdateLayoutProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2396,9 +2954,9 @@ func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWr } } -func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2411,29 +2969,29 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ListEgressRequest) + reqContent := new(UpdateLayoutRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.ListEgress + handler := s.Egress.UpdateLayout if s.interceptor != nil { - handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return s.Egress.ListEgress(ctx, typedReq) + return s.Egress.UpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -2442,7 +3000,7 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon } // Call service method - var respContent *ListEgressResponse + var respContent *EgressInfo func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -2453,7 +3011,7 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) return } @@ -2479,9 +3037,9 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2493,28 +3051,28 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ListEgressRequest) + reqContent := new(UpdateLayoutRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.ListEgress + handler := s.Egress.UpdateLayout if s.interceptor != nil { - handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return s.Egress.ListEgress(ctx, typedReq) + return s.Egress.UpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -2523,7 +3081,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re } // Call service method - var respContent *ListEgressResponse + var respContent *EgressInfo func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -2534,7 +3092,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) return } @@ -2558,7 +3116,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2566,9 +3124,9 @@ func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWr } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStopEgressJSON(ctx, resp, req) + s.serveUpdateStreamJSON(ctx, resp, req) case "application/protobuf": - s.serveStopEgressProtobuf(ctx, resp, req) + s.serveUpdateStreamProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2576,9 +3134,9 @@ func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWr } } -func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2591,23 +3149,23 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(StopEgressRequest) + reqContent := new(UpdateStreamRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StopEgress + handler := s.Egress.UpdateStream if s.interceptor != nil { - handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return s.Egress.StopEgress(ctx, typedReq) + return s.Egress.UpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2633,7 +3191,7 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) return } @@ -2659,9 +3217,9 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2673,22 +3231,22 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(StopEgressRequest) + reqContent := new(UpdateStreamRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StopEgress + handler := s.Egress.UpdateStream if s.interceptor != nil { - handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return s.Egress.StopEgress(ctx, typedReq) + return s.Egress.UpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2714,7 +3272,7 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) return } @@ -2754,218 +3312,279 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 3407 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x1b, 0xd7, - 0xf5, 0xd7, 0xf0, 0xcd, 0xc3, 0x87, 0x46, 0x57, 0xb2, 0x42, 0xcb, 0x4e, 0xec, 0x50, 0xff, 0x38, - 0xb6, 0xa2, 0xc8, 0xfa, 0x5b, 0x8e, 0xe3, 0x38, 0x4d, 0x5a, 0x4a, 0x1c, 0x49, 0x6c, 0xf4, 0x60, - 0x2f, 0x29, 0xdb, 0xed, 0x66, 0x30, 0x22, 0xaf, 0xa8, 0x81, 0xc8, 0x19, 0x66, 0xe6, 0x52, 0x32, - 0xf3, 0x09, 0xb2, 0x6b, 0xd1, 0x02, 0x5d, 0x18, 0x2d, 0xba, 0x29, 0xba, 0x28, 0xf2, 0x49, 0xda, - 0x45, 0x17, 0x45, 0xbf, 0x40, 0x97, 0x85, 0x8b, 0x02, 0x05, 0xba, 0x2f, 0xee, 0x63, 0x1e, 0xa4, - 0x46, 0xb2, 0x64, 0x19, 0xe8, 0xa2, 0x5d, 0x69, 0xee, 0x79, 0xf1, 0xcc, 0x9d, 0xdf, 0x39, 0xe7, - 0x9e, 0x73, 0x05, 0x33, 0x5d, 0xf3, 0x98, 0x1c, 0x99, 0x54, 0x27, 0x1d, 0x87, 0xb8, 0xee, 0x52, - 0xdf, 0xb1, 0xa9, 0x8d, 0xd2, 0x92, 0x3a, 0xe7, 0xb3, 0x7b, 0x76, 0x9b, 0x74, 0x25, 0x7b, 0x6e, - 0xa6, 0x6b, 0x77, 0x3a, 0xc4, 0xb9, 0x6f, 0xf7, 0xa9, 0x69, 0x5b, 0x92, 0x5a, 0xfe, 0x4b, 0x0a, - 0xe6, 0xb0, 0x6d, 0xf7, 0xd6, 0xec, 0x5e, 0xdf, 0x76, 0x4d, 0x4a, 0x34, 0x6e, 0x12, 0x93, 0xaf, - 0x07, 0xc4, 0xa5, 0xe8, 0x06, 0x64, 0x1d, 0xdb, 0xee, 0xe9, 0x96, 0xd1, 0x23, 0x25, 0xe5, 0xb6, - 0x72, 0x37, 0x8b, 0x33, 0x8c, 0xb0, 0x63, 0xf4, 0x08, 0x9a, 0x85, 0x54, 0xd7, 0x18, 0xda, 0x03, - 0x5a, 0x8a, 0x71, 0x8e, 0x5c, 0xa1, 0x77, 0x01, 0x8c, 0x41, 0xdb, 0xb4, 0x75, 0xdb, 0xea, 0x0e, - 0x4b, 0xf1, 0xdb, 0xca, 0xdd, 0x0c, 0xce, 0x72, 0xca, 0xae, 0xd5, 0x1d, 0xa2, 0x4f, 0x21, 0x2f, - 0xd8, 0x3d, 0xf3, 0x85, 0x69, 0x75, 0x4a, 0x93, 0xb7, 0x95, 0xbb, 0xc5, 0x07, 0x33, 0x4b, 0xd2, - 0xeb, 0xa5, 0x0a, 0x63, 0x6e, 0x73, 0x1e, 0xce, 0x19, 0xc1, 0x82, 0xd9, 0x3d, 0x36, 0xdb, 0x44, - 0xda, 0x4d, 0x08, 0xbb, 0x9c, 0xc2, 0xed, 0xde, 0x81, 0xc9, 0xd6, 0xc0, 0xa5, 0x76, 0x4f, 0xdf, - 0x37, 0x5c, 0xa2, 0x0f, 0x9c, 0x6e, 0x29, 0xc9, 0xfd, 0x2a, 0x08, 0xf2, 0xaa, 0xe1, 0x92, 0x3d, - 0xa7, 0x8b, 0x1e, 0x42, 0xe2, 0xc0, 0xec, 0x92, 0x52, 0xea, 0xb6, 0x72, 0x37, 0xf7, 0x60, 0xce, - 0xff, 0x5d, 0xcd, 0x6a, 0xd9, 0x6d, 0xd2, 0x5e, 0x37, 0xbb, 0x64, 0x77, 0x40, 0xfb, 0x03, 0xba, - 0x1a, 0x2b, 0x29, 0x9b, 0x13, 0x98, 0x4b, 0xa3, 0x15, 0x48, 0xb9, 0xd4, 0x21, 0x46, 0xaf, 0x94, - 0xe6, 0x7a, 0xd7, 0x7c, 0xbd, 0x06, 0x27, 0x8f, 0xa8, 0x48, 0x51, 0xf4, 0x25, 0x64, 0x5c, 0xd2, - 0xe9, 0x11, 0x8b, 0xba, 0x25, 0xe0, 0x6a, 0x37, 0x03, 0x35, 0xc1, 0x88, 0xf8, 0x41, 0x5f, 0x07, - 0x3d, 0x86, 0x54, 0xdf, 0x21, 0x2e, 0xa1, 0xa5, 0x0c, 0xdf, 0xa4, 0xf7, 0x46, 0x9d, 0x35, 0xad, - 0xce, 0xae, 0xf8, 0x9a, 0x75, 0x2e, 0xb5, 0xa9, 0x60, 0x29, 0x8f, 0x1e, 0x41, 0xc6, 0x68, 0x1f, - 0x1b, 0x56, 0x8b, 0xb4, 0x4b, 0x59, 0xfe, 0xcb, 0xa5, 0xb3, 0x74, 0x37, 0x15, 0xec, 0xcb, 0xa2, - 0x2f, 0x20, 0xcf, 0x5e, 0x57, 0xb7, 0xb9, 0x43, 0x6e, 0x29, 0x77, 0x3b, 0x7e, 0xfe, 0x26, 0xe1, - 0xdc, 0x81, 0xff, 0xec, 0xa2, 0xef, 0x41, 0x51, 0xbc, 0xba, 0x6f, 0x20, 0xcf, 0x0d, 0x44, 0xef, - 0x16, 0x2e, 0xb8, 0xa1, 0x95, 0x8b, 0x34, 0x98, 0x94, 0xaf, 0xee, 0xab, 0x17, 0xb8, 0xfa, 0xb9, - 0xbb, 0x86, 0x8b, 0x52, 0xc9, 0x33, 0xf3, 0x19, 0x14, 0xcc, 0x9e, 0xd1, 0x09, 0x5e, 0xa2, 0xc8, - 0x8d, 0x04, 0x08, 0xab, 0x31, 0xae, 0x54, 0xce, 0x9b, 0xc1, 0xc2, 0x45, 0x0f, 0x20, 0x73, 0x42, - 0xf6, 0x0f, 0x6d, 0xfb, 0xc8, 0x2d, 0xa9, 0x5c, 0x6b, 0xd6, 0xd7, 0x7a, 0x26, 0x18, 0x6b, 0xb6, - 0x75, 0x60, 0x76, 0xb0, 0x2f, 0xb7, 0x9a, 0x81, 0x94, 0xf8, 0xa1, 0xd5, 0x2c, 0xa4, 0x65, 0x74, - 0x95, 0xff, 0x95, 0x04, 0xf5, 0x19, 0xd9, 0x1f, 0x8d, 0x26, 0x15, 0xe2, 0x0c, 0x95, 0x22, 0x8e, - 0xd8, 0xe3, 0x58, 0xa8, 0xc4, 0xc6, 0x43, 0x65, 0x14, 0xf1, 0xf1, 0x71, 0xc4, 0x2f, 0x02, 0x32, - 0x4e, 0x0c, 0x93, 0xea, 0x2e, 0x35, 0x1c, 0xaa, 0xbb, 0x66, 0xc7, 0x32, 0xba, 0xa5, 0x3c, 0x17, - 0x53, 0x39, 0xa7, 0xc1, 0x18, 0x0d, 0x4e, 0xf7, 0x71, 0x9f, 0x78, 0x43, 0xdc, 0x27, 0xdf, 0x0c, - 0xf7, 0xa9, 0x2b, 0xe1, 0x3e, 0x7d, 0x05, 0xdc, 0x67, 0xae, 0x80, 0xfb, 0xec, 0x55, 0x71, 0x0f, - 0x57, 0xc3, 0x7d, 0xee, 0x6d, 0xe0, 0xbe, 0xf0, 0x46, 0xb8, 0x2f, 0x5e, 0x05, 0xf7, 0xbf, 0x4b, - 0x40, 0xa9, 0x6e, 0x38, 0xd4, 0x6c, 0x99, 0x7d, 0xc3, 0xa2, 0x97, 0xa8, 0x26, 0x73, 0x90, 0x31, - 0xdb, 0xc4, 0xa2, 0x26, 0x1d, 0xca, 0x7a, 0xe2, 0xaf, 0xd1, 0xfb, 0x90, 0x77, 0x5b, 0x0e, 0x21, - 0x96, 0xee, 0x1e, 0x1a, 0x0e, 0x91, 0x91, 0x90, 0x13, 0xb4, 0x06, 0x23, 0x85, 0x20, 0x93, 0xb8, - 0x10, 0x64, 0x26, 0x22, 0x21, 0x93, 0x7c, 0x0d, 0x64, 0x26, 0xce, 0x81, 0x4c, 0xea, 0xaa, 0x90, - 0x49, 0x5f, 0x0d, 0x32, 0x99, 0xb7, 0x01, 0x99, 0xec, 0x1b, 0x41, 0x06, 0x2e, 0x08, 0x99, 0x10, - 0x50, 0x7e, 0x9a, 0x82, 0x1b, 0x4d, 0xc7, 0x68, 0x1d, 0xbd, 0xc9, 0xc9, 0xe3, 0x11, 0x14, 0x45, - 0xda, 0xa4, 0xcc, 0x82, 0x6e, 0xb6, 0x05, 0x62, 0x56, 0xd5, 0x97, 0xaf, 0x16, 0xc5, 0xe1, 0x82, - 0x9b, 0xae, 0x55, 0x71, 0x78, 0xd5, 0x66, 0x7a, 0x22, 0x9f, 0xfa, 0x7a, 0xf1, 0x40, 0x8f, 0x73, - 0x7c, 0xbd, 0xd0, 0xaa, 0xfd, 0x9f, 0x4a, 0x9d, 0x99, 0x2b, 0xa5, 0xce, 0xd4, 0x15, 0x52, 0x67, - 0xfa, 0x7f, 0x47, 0x86, 0x37, 0x89, 0x83, 0xc9, 0xab, 0xa4, 0xce, 0x7f, 0x28, 0x80, 0x38, 0xe0, - 0x2e, 0x11, 0x08, 0x77, 0x20, 0x33, 0x16, 0x02, 0xb9, 0x97, 0xaf, 0x16, 0xd3, 0x54, 0xa2, 0x58, - 0x3e, 0xb4, 0xd1, 0x7d, 0x09, 0xe0, 0x38, 0xff, 0xae, 0xd7, 0x7d, 0x07, 0xab, 0xa6, 0x43, 0x5a, - 0x34, 0xd8, 0x18, 0x1f, 0xbb, 0x1f, 0x40, 0xe1, 0x84, 0xec, 0xbb, 0x76, 0xeb, 0x88, 0x50, 0x7e, - 0x94, 0x66, 0xd0, 0xcf, 0x6e, 0x4e, 0xe0, 0xbc, 0x4f, 0x66, 0x67, 0xe9, 0xf0, 0xcb, 0x27, 0x2f, - 0xfb, 0xf2, 0xe5, 0x3f, 0xc6, 0x60, 0xea, 0x14, 0x3a, 0xd0, 0x27, 0x90, 0xe5, 0x78, 0xa2, 0xc3, - 0xbe, 0x78, 0xe1, 0xe2, 0x38, 0x10, 0x85, 0x78, 0x73, 0xd8, 0x27, 0x38, 0x73, 0x20, 0x9f, 0x58, - 0xfd, 0x60, 0xcf, 0x7d, 0x83, 0x1e, 0x7a, 0xf5, 0xc3, 0x5b, 0xa3, 0x7b, 0xa0, 0xb6, 0x4d, 0xd7, - 0xd8, 0xef, 0x12, 0xbd, 0x67, 0x58, 0xe6, 0x01, 0x71, 0x45, 0x78, 0x64, 0xf0, 0xa4, 0xa4, 0x6f, - 0x4b, 0x32, 0x9a, 0x87, 0x98, 0xbb, 0x22, 0xf7, 0x69, 0x2a, 0xc0, 0xd0, 0xca, 0x5e, 0xbf, 0x6b, - 0x1b, 0xed, 0xcd, 0x09, 0x1c, 0x73, 0x57, 0xd0, 0x1d, 0x88, 0x77, 0x5a, 0x7d, 0x99, 0x0e, 0x90, - 0x2f, 0xb5, 0xb1, 0x56, 0xf7, 0xc5, 0x98, 0x00, 0x5a, 0x86, 0xa4, 0xf1, 0xcd, 0xc0, 0x21, 0xa7, - 0xea, 0x4a, 0x85, 0x51, 0x57, 0xbb, 0xf6, 0xbe, 0x2f, 0x2f, 0x04, 0xd1, 0x7d, 0x48, 0x19, 0x5d, - 0x73, 0xb7, 0xd1, 0x38, 0xd5, 0x66, 0x54, 0x38, 0xd9, 0x97, 0x97, 0x62, 0xa1, 0xdd, 0xfc, 0x6d, - 0x02, 0xa6, 0x23, 0xb0, 0x8e, 0x9e, 0x40, 0x86, 0xf7, 0x7a, 0x2d, 0xbb, 0x2b, 0xb7, 0xf3, 0xbd, - 0xe8, 0xd8, 0xa8, 0x4b, 0x29, 0xec, 0xcb, 0xa3, 0x0f, 0x61, 0x92, 0x6d, 0x22, 0xc3, 0x9e, 0xde, - 0x77, 0xc8, 0x81, 0xf9, 0x42, 0xee, 0x6d, 0xd1, 0x23, 0xd7, 0x39, 0x15, 0xcd, 0x43, 0xa1, 0xdf, - 0x35, 0x86, 0x5d, 0xd3, 0xa5, 0x02, 0xa9, 0x3c, 0xb1, 0xe2, 0xbc, 0x47, 0xe4, 0x68, 0x5d, 0x04, - 0xc4, 0x7e, 0x58, 0x1f, 0x95, 0xcc, 0x71, 0x49, 0x95, 0x71, 0xea, 0x61, 0xe9, 0x7b, 0xa0, 0x7a, - 0xa1, 0xdd, 0x1e, 0x38, 0x06, 0x0b, 0x12, 0xbe, 0xe3, 0x05, 0xec, 0x85, 0x7c, 0x55, 0x92, 0x59, - 0x16, 0xf0, 0xdd, 0x74, 0x07, 0x07, 0xcc, 0x4d, 0xe0, 0x6f, 0x7a, 0x46, 0x16, 0x68, 0x70, 0x99, - 0xe0, 0x25, 0xc4, 0x3a, 0x12, 0x26, 0x99, 0xf3, 0x60, 0x92, 0xbc, 0x10, 0x4c, 0x52, 0x17, 0x86, - 0x49, 0xfa, 0xf2, 0x30, 0xc9, 0x5e, 0x16, 0x26, 0xbf, 0x88, 0x81, 0x3a, 0x1e, 0xf6, 0x23, 0xc1, - 0xa3, 0x5c, 0x20, 0x78, 0x92, 0xe7, 0xed, 0x4a, 0xec, 0x42, 0xbb, 0x12, 0xbf, 0xf0, 0xae, 0x24, - 0x2e, 0xbf, 0x2b, 0xa9, 0xcb, 0xee, 0xca, 0xdf, 0xe3, 0x90, 0x0b, 0xe5, 0x78, 0xf6, 0xd2, 0x2d, - 0xa3, 0x4f, 0x07, 0x0e, 0xd1, 0x4d, 0x8b, 0x12, 0xe7, 0xd8, 0x10, 0xc1, 0x53, 0xc0, 0x93, 0x92, - 0x5e, 0x93, 0x64, 0x34, 0x03, 0xc9, 0x13, 0xb3, 0x2d, 0xb3, 0x4e, 0x12, 0x8b, 0x05, 0x9a, 0x85, - 0xd4, 0x21, 0x31, 0x3b, 0x87, 0x94, 0xbf, 0x68, 0x12, 0xcb, 0x55, 0x54, 0x44, 0x25, 0x22, 0x23, - 0xaa, 0x72, 0x1a, 0xd3, 0xc9, 0xb1, 0x64, 0xc8, 0x1d, 0x3e, 0x07, 0xcf, 0x0f, 0x21, 0x27, 0xaa, - 0x1a, 0xcb, 0x99, 0x2d, 0x79, 0x20, 0x98, 0x1e, 0x55, 0x5f, 0x63, 0x2c, 0x0c, 0xa6, 0xff, 0x1c, - 0xf9, 0xbd, 0xd3, 0xe7, 0x7d, 0xef, 0xcc, 0x85, 0xbe, 0x77, 0xf6, 0xc2, 0xdf, 0x1b, 0x2e, 0xff, - 0xbd, 0x73, 0x97, 0xfd, 0xde, 0x7f, 0x4d, 0x40, 0xc6, 0xf3, 0x13, 0xcd, 0x03, 0x18, 0xad, 0x16, - 0x71, 0x5d, 0xfd, 0x88, 0x0c, 0x05, 0xfe, 0x57, 0x13, 0xdf, 0xbe, 0x5a, 0x54, 0x70, 0x56, 0xd0, - 0xbf, 0x22, 0x43, 0x74, 0x13, 0x52, 0x2e, 0x69, 0x39, 0x44, 0x4e, 0xbb, 0xa4, 0x80, 0xa4, 0xa1, - 0x7b, 0x50, 0x70, 0x89, 0xeb, 0x9a, 0xb6, 0xa5, 0x53, 0xfb, 0x88, 0x58, 0x22, 0xab, 0x49, 0xa1, - 0xbc, 0x64, 0x35, 0x19, 0x07, 0x2d, 0xc2, 0xa4, 0xe1, 0xba, 0x83, 0x1e, 0xd1, 0x1d, 0xbb, 0x4b, - 0x74, 0xc3, 0xb1, 0x78, 0xcb, 0xee, 0x09, 0x17, 0x04, 0x13, 0xdb, 0x5d, 0x52, 0x71, 0x2c, 0xd4, - 0x80, 0x77, 0xc2, 0xd2, 0xe4, 0x05, 0x25, 0x8e, 0x65, 0x74, 0x59, 0xc1, 0x2f, 0x70, 0xad, 0x9b, - 0x4c, 0xeb, 0xe5, 0xab, 0xc5, 0x99, 0x40, 0x4f, 0x93, 0x42, 0xb5, 0x2a, 0x8e, 0xa2, 0xb6, 0x19, - 0x38, 0x1d, 0xd2, 0x61, 0x09, 0x55, 0xa4, 0x69, 0xb9, 0x62, 0x69, 0x80, 0x58, 0xed, 0xbe, 0x6d, - 0x5a, 0x54, 0xa2, 0xd2, 0x5f, 0x33, 0x9d, 0xfd, 0x01, 0xab, 0xfb, 0x72, 0xaa, 0x26, 0x57, 0xe8, - 0x2e, 0xa8, 0x07, 0xb6, 0xd3, 0x22, 0x3a, 0x4b, 0x16, 0xba, 0x4b, 0x87, 0x72, 0xb4, 0x96, 0xc1, - 0x45, 0x4e, 0xaf, 0x1b, 0xf4, 0xb0, 0xc1, 0xa8, 0xe8, 0x73, 0xc8, 0xf4, 0x08, 0x35, 0xda, 0x06, - 0x35, 0x64, 0xaf, 0x73, 0xeb, 0x14, 0x66, 0x96, 0xb6, 0xa5, 0x84, 0x66, 0x51, 0x67, 0x88, 0x7d, - 0x05, 0x54, 0x82, 0x34, 0x35, 0x3a, 0x1d, 0xd3, 0xea, 0x70, 0xbc, 0x65, 0xb1, 0xb7, 0x44, 0xf7, - 0x61, 0xba, 0x65, 0x5b, 0x94, 0xd7, 0x09, 0xd3, 0xe5, 0xbd, 0x04, 0x7b, 0xb3, 0x2c, 0x97, 0x42, - 0x92, 0x55, 0x0d, 0x38, 0x68, 0x01, 0x92, 0x7d, 0xc7, 0x7e, 0x31, 0x94, 0x40, 0x0b, 0x0e, 0x79, - 0x75, 0x46, 0x95, 0xe7, 0x15, 0x21, 0x32, 0xf7, 0x39, 0x14, 0x46, 0x3c, 0x42, 0x2a, 0xc4, 0x7d, - 0x90, 0x60, 0xf6, 0xc8, 0xe2, 0xff, 0xd8, 0xe8, 0x0e, 0x88, 0xac, 0x8c, 0x62, 0xf1, 0x24, 0xf6, - 0x58, 0x29, 0x9f, 0x40, 0xd6, 0x47, 0x39, 0xba, 0x03, 0xb9, 0x96, 0x43, 0x78, 0x47, 0x6b, 0x74, - 0xdd, 0x11, 0x94, 0x85, 0x19, 0xa1, 0x7d, 0x8e, 0x8d, 0xec, 0xb3, 0xef, 0x75, 0xfc, 0xb5, 0x5e, - 0x97, 0xbf, 0x55, 0x60, 0x72, 0x2c, 0x6a, 0xd0, 0x87, 0x90, 0x37, 0x5a, 0x2d, 0x7b, 0x60, 0xd1, - 0xd0, 0x51, 0xd2, 0x73, 0x40, 0x72, 0x78, 0xdd, 0xfd, 0x00, 0xbc, 0x25, 0x0f, 0x87, 0x30, 0xda, - 0x41, 0x32, 0x58, 0x3c, 0x7c, 0x00, 0x45, 0xb6, 0xb7, 0x86, 0x69, 0x11, 0x27, 0x5c, 0xf2, 0x0b, - 0x3e, 0x95, 0x59, 0x2b, 0xff, 0x5a, 0x81, 0x7c, 0x38, 0x1a, 0xdf, 0x46, 0xb0, 0xbd, 0x45, 0xf8, - 0x96, 0x9f, 0x41, 0x2e, 0xb4, 0x81, 0x11, 0x23, 0xba, 0x39, 0xc8, 0x0c, 0x5c, 0x16, 0x38, 0x3d, - 0xef, 0x0b, 0xfb, 0x6b, 0xc6, 0xeb, 0x1b, 0xae, 0x7b, 0x62, 0x3b, 0xb2, 0x93, 0xc4, 0xfe, 0xba, - 0xfc, 0x0c, 0xf2, 0xe1, 0xc6, 0x05, 0xad, 0x9c, 0x3a, 0x86, 0xbd, 0x33, 0xd6, 0xe1, 0x44, 0x9c, - 0xbf, 0x10, 0x24, 0x06, 0x4e, 0xd7, 0x2d, 0xc5, 0x6e, 0xc7, 0xef, 0x66, 0x31, 0x7f, 0x2e, 0xff, - 0x21, 0x0e, 0x93, 0x63, 0xfd, 0x58, 0x50, 0x83, 0x94, 0xe8, 0x1a, 0x14, 0x1b, 0xa9, 0x41, 0x33, - 0x90, 0x6c, 0x93, 0x3e, 0x3d, 0x94, 0xa5, 0x49, 0x2c, 0xd0, 0x4d, 0xc8, 0x1e, 0x38, 0x46, 0x8f, - 0x38, 0x06, 0x15, 0x35, 0x37, 0x89, 0x03, 0x02, 0xab, 0x25, 0xa2, 0xe5, 0x16, 0xb5, 0x24, 0x39, - 0x56, 0x4b, 0xf8, 0xd0, 0x5e, 0xd6, 0x12, 0xc3, 0x7f, 0x66, 0xc7, 0x42, 0xa1, 0xb5, 0x6f, 0x52, - 0x6e, 0x37, 0xc5, 0xed, 0x8a, 0xae, 0x7c, 0x55, 0xd0, 0x02, 0xa1, 0xaf, 0x07, 0x46, 0xd7, 0xa4, - 0x43, 0x9e, 0x3b, 0x3d, 0xa1, 0x1f, 0x09, 0x1a, 0xab, 0x9b, 0x42, 0xe8, 0xc0, 0x61, 0x8d, 0x91, - 0xd5, 0x1a, 0xf2, 0xa2, 0x94, 0xc4, 0x62, 0x12, 0xb0, 0xee, 0x51, 0x99, 0xa3, 0xa2, 0xc7, 0x17, - 0x8e, 0x66, 0xc6, 0x1c, 0x7d, 0xca, 0x78, 0xd2, 0xd1, 0x63, 0xff, 0x99, 0xf9, 0x20, 0xb4, 0x3c, - 0x47, 0xb3, 0xc2, 0x07, 0x4e, 0x0c, 0x39, 0x2a, 0x84, 0x3c, 0x47, 0xf3, 0x21, 0x21, 0xcf, 0xd1, - 0x45, 0x40, 0x47, 0x64, 0xa8, 0xf3, 0x9d, 0x0b, 0xce, 0x0e, 0x2c, 0xd5, 0x28, 0x58, 0x3d, 0x22, - 0xc3, 0x75, 0xc6, 0xf0, 0x0e, 0x0f, 0xe5, 0xe7, 0x30, 0xbd, 0xd7, 0x6f, 0x1b, 0x94, 0x6c, 0xf1, - 0xbb, 0x13, 0xaf, 0xe9, 0xbb, 0x07, 0x59, 0x71, 0xb7, 0xc3, 0xf2, 0xbc, 0x88, 0x91, 0xfc, 0xcb, - 0x57, 0x8b, 0x19, 0x41, 0xac, 0x55, 0xb1, 0xf7, 0xd4, 0x3e, 0xeb, 0x16, 0xa6, 0xfc, 0x4b, 0xc5, - 0x33, 0x2d, 0xd0, 0xf5, 0x06, 0xa6, 0xef, 0xc0, 0xa4, 0xd1, 0x6e, 0xcb, 0x9e, 0x58, 0x0f, 0x01, - 0xb1, 0x60, 0xb4, 0xdb, 0x02, 0xd6, 0x7b, 0x4e, 0xd7, 0x65, 0xaf, 0xec, 0x90, 0x9e, 0x7d, 0x4c, - 0x46, 0x44, 0xe3, 0x5c, 0x54, 0x15, 0x9c, 0x40, 0xba, 0xec, 0xc2, 0xd4, 0x96, 0xe9, 0x5e, 0x66, - 0x34, 0x38, 0xe2, 0x72, 0xec, 0x75, 0xbb, 0x61, 0xb4, 0xa8, 0x79, 0xec, 0xcd, 0x08, 0xe5, 0xaa, - 0xfc, 0x7d, 0x40, 0xe1, 0x1f, 0x75, 0xfb, 0xb6, 0xe5, 0x32, 0xc3, 0x49, 0x93, 0x92, 0x1e, 0xcb, - 0xc6, 0xac, 0x1c, 0x05, 0x28, 0x11, 0x72, 0x35, 0xeb, 0xc0, 0xc6, 0x42, 0xa2, 0xfc, 0x25, 0x4c, - 0x35, 0xa8, 0xdd, 0x1f, 0xf5, 0xfa, 0xe2, 0x7b, 0x59, 0xfe, 0x67, 0x16, 0x20, 0xb0, 0x7a, 0x99, - 0xaf, 0x30, 0x0f, 0x69, 0xbe, 0x35, 0xfe, 0xbb, 0xc3, 0xcb, 0x57, 0x8b, 0x29, 0x46, 0xaa, 0x55, - 0xb1, 0xf8, 0xdb, 0x1e, 0xdd, 0xbf, 0xc2, 0xd8, 0xfe, 0x3d, 0x81, 0x9c, 0x6b, 0x0f, 0x58, 0x8d, - 0xe6, 0x3d, 0xf5, 0x1c, 0x0f, 0x89, 0xeb, 0x63, 0x2f, 0xdb, 0xe0, 0x12, 0xbc, 0xa9, 0x06, 0xd7, - 0x7f, 0x46, 0x1f, 0x43, 0xca, 0xa5, 0x06, 0x1d, 0xb8, 0x7c, 0x43, 0x8b, 0xa1, 0x33, 0x96, 0x54, - 0xe3, 0x4c, 0x2c, 0x85, 0xd0, 0xbb, 0x00, 0xfc, 0x32, 0x82, 0xb4, 0x75, 0x83, 0x72, 0xd4, 0xc7, - 0x71, 0x56, 0x52, 0x2a, 0x14, 0x5d, 0xe7, 0x19, 0x5a, 0x30, 0x73, 0x9c, 0x99, 0xe6, 0xeb, 0x0a, - 0xbf, 0x35, 0x1c, 0x70, 0xb8, 0x72, 0x26, 0x12, 0x9a, 0x92, 0x52, 0xa1, 0xac, 0xfe, 0xb7, 0x09, - 0x35, 0xcc, 0xae, 0x5b, 0xba, 0x26, 0xea, 0xbf, 0x5c, 0xb2, 0x6c, 0x46, 0x1c, 0xc7, 0x76, 0x64, - 0xc5, 0x17, 0x0b, 0x66, 0x8e, 0x3f, 0xf0, 0x34, 0x50, 0x9a, 0x15, 0xe9, 0x8c, 0x53, 0x58, 0xc0, - 0xa3, 0x2d, 0x28, 0xf2, 0xfd, 0x6a, 0x79, 0xd3, 0x47, 0xd9, 0x65, 0xcc, 0xfb, 0xaf, 0x77, 0xf6, - 0xad, 0xe8, 0xe6, 0x04, 0x2e, 0x38, 0x61, 0x2e, 0xfa, 0x18, 0xe2, 0x27, 0x64, 0xbf, 0x54, 0x1c, - 0x9b, 0xae, 0x8c, 0x5f, 0x00, 0xb1, 0x93, 0xee, 0x09, 0xd9, 0x47, 0x1a, 0xe4, 0xfa, 0xc1, 0x8c, - 0xbc, 0x34, 0xcd, 0xd5, 0xde, 0x0f, 0x0a, 0xfa, 0x19, 0xf3, 0xf3, 0xcd, 0x09, 0x1c, 0xd6, 0x43, - 0xbb, 0x30, 0x29, 0x86, 0x3f, 0xc1, 0x4b, 0x88, 0x86, 0xf4, 0xff, 0x7c, 0x53, 0xe7, 0x4c, 0x58, - 0x37, 0x27, 0x70, 0x91, 0x8e, 0xb0, 0xd1, 0x0a, 0x24, 0x39, 0x45, 0xb6, 0x4f, 0x37, 0x46, 0xcd, - 0x8c, 0x6b, 0x0b, 0x59, 0xf4, 0xc9, 0xd8, 0xc5, 0xe8, 0x78, 0x55, 0x63, 0x70, 0x67, 0xa1, 0xc7, - 0x27, 0x95, 0x8a, 0x3f, 0xe7, 0xfc, 0x48, 0x4e, 0xa4, 0xc6, 0x9b, 0x07, 0xd6, 0xce, 0x30, 0x15, - 0x29, 0x2e, 0xa6, 0x51, 0x9f, 0x86, 0x86, 0xa2, 0xf9, 0xf1, 0x59, 0xaa, 0x64, 0x84, 0x94, 0x82, - 0x69, 0xe8, 0x13, 0x7f, 0xb8, 0xe8, 0x10, 0x77, 0xd0, 0xa5, 0xde, 0x88, 0x6e, 0x3a, 0xc2, 0x49, - 0x6f, 0xb4, 0x88, 0x85, 0x24, 0x7a, 0x28, 0xe7, 0x9a, 0x9e, 0xa6, 0xb8, 0x0f, 0x3c, 0xed, 0xa9, - 0x18, 0x67, 0x7a, 0x5a, 0x5f, 0x06, 0x03, 0x49, 0x4f, 0x71, 0x6a, 0x7c, 0x9e, 0x19, 0xf2, 0xd8, - 0x9f, 0x44, 0x7a, 0xfa, 0x8f, 0xbd, 0x49, 0xa4, 0xa7, 0x3d, 0x33, 0xe6, 0x30, 0xef, 0xda, 0x84, - 0xae, 0x18, 0x44, 0x7a, 0x9a, 0x1f, 0xc1, 0x94, 0xd7, 0xaf, 0xe9, 0x5d, 0xbb, 0x25, 0x06, 0x26, - 0xef, 0x88, 0xe1, 0x8a, 0xc7, 0xd8, 0x92, 0x74, 0xb4, 0x04, 0xd3, 0xfb, 0x46, 0xeb, 0x68, 0xd0, - 0xd7, 0x5d, 0x6a, 0x3b, 0xec, 0xf7, 0x06, 0x2e, 0x69, 0x97, 0xae, 0xf3, 0xa4, 0x39, 0x25, 0x58, - 0x0d, 0xc1, 0xd9, 0x73, 0x49, 0x1b, 0xdd, 0x82, 0x9c, 0x43, 0xa8, 0x33, 0xd4, 0xf9, 0xf9, 0xaf, - 0x74, 0x83, 0xc7, 0x13, 0x70, 0xd2, 0x1a, 0xa3, 0xac, 0x66, 0x21, 0xed, 0x08, 0x68, 0xb0, 0x2e, - 0x4b, 0x38, 0x5f, 0xfe, 0x02, 0x8a, 0xa3, 0x20, 0x40, 0x1f, 0x42, 0xc2, 0xb4, 0x0e, 0xec, 0x53, - 0x09, 0x37, 0xf4, 0x19, 0xb8, 0xc0, 0x93, 0x58, 0x49, 0x29, 0x7f, 0x17, 0x03, 0x08, 0x18, 0xd1, - 0xd7, 0xa7, 0xa1, 0x6c, 0x13, 0x3b, 0x2f, 0xdb, 0xc4, 0x47, 0xb3, 0xcd, 0x1c, 0x64, 0x46, 0x86, - 0x4a, 0x71, 0xec, 0xaf, 0xd1, 0x03, 0x3f, 0xe5, 0x89, 0x53, 0xce, 0x5c, 0x84, 0x97, 0x4b, 0x63, - 0x79, 0xcf, 0x4f, 0x42, 0xa9, 0x70, 0x12, 0x2a, 0x43, 0xa1, 0x6b, 0xb8, 0x0c, 0x09, 0x6c, 0xeb, - 0x0c, 0xd1, 0x47, 0xc7, 0x71, 0x8e, 0x11, 0x31, 0xa3, 0x89, 0xc4, 0xc6, 0xd8, 0x26, 0x11, 0xf3, - 0xfe, 0x02, 0xf6, 0x96, 0xe5, 0x25, 0x48, 0x89, 0x5f, 0x41, 0x00, 0xa9, 0xca, 0x5a, 0xb3, 0xf6, - 0x54, 0x53, 0x27, 0x50, 0x1e, 0x32, 0xeb, 0xb5, 0x9d, 0x5a, 0x63, 0x53, 0xab, 0xaa, 0x0a, 0xe3, - 0xac, 0x57, 0x6a, 0x5b, 0x5a, 0x55, 0x8d, 0x95, 0xbf, 0x53, 0x20, 0xe3, 0x81, 0xd2, 0x9b, 0xe8, - 0x84, 0xeb, 0xa9, 0xb7, 0x7e, 0x4b, 0xdb, 0x96, 0x1a, 0xdb, 0x36, 0x04, 0x09, 0xd7, 0xfc, 0x86, - 0xc8, 0xed, 0xe4, 0xcf, 0x4c, 0xde, 0x87, 0xa2, 0x38, 0x77, 0xfb, 0xeb, 0xf2, 0x9f, 0x63, 0x90, - 0x0f, 0x87, 0xc2, 0xe9, 0x19, 0xa2, 0x72, 0xe1, 0x19, 0x62, 0xe6, 0x8c, 0x19, 0x62, 0xd8, 0xdf, - 0xd8, 0x19, 0xfe, 0xc6, 0x43, 0xfe, 0x7e, 0x04, 0x53, 0xbe, 0x61, 0xdf, 0x71, 0xd1, 0x4a, 0xa8, - 0x1e, 0xc3, 0x8f, 0xa1, 0x87, 0x30, 0x3b, 0xea, 0x8a, 0xaf, 0x21, 0x2a, 0xd1, 0x4c, 0xd8, 0x1d, - 0x5f, 0x6b, 0x1e, 0x0a, 0x5e, 0x82, 0x10, 0xb1, 0x94, 0xe4, 0xbf, 0x9f, 0x97, 0x44, 0x1e, 0x4d, - 0x63, 0x5f, 0x28, 0x75, 0xde, 0x17, 0x4a, 0x8f, 0x7c, 0xa1, 0xf2, 0xcf, 0x14, 0x80, 0x20, 0x45, - 0x5c, 0x7c, 0xdc, 0x74, 0x2b, 0x98, 0x15, 0x31, 0xa7, 0x14, 0x6e, 0xd5, 0x1b, 0x0b, 0x9d, 0x76, - 0xe9, 0x12, 0xa0, 0x29, 0xbf, 0x8c, 0xc1, 0xb5, 0xca, 0x80, 0xda, 0xa7, 0xea, 0x5a, 0xe8, 0xb2, - 0x4a, 0xb9, 0xc2, 0xa5, 0x6d, 0xec, 0x0a, 0x97, 0xb6, 0xf1, 0xcb, 0x5d, 0x56, 0x45, 0x5c, 0x37, - 0x25, 0x2e, 0x7f, 0xdd, 0x14, 0xbe, 0xf5, 0xf9, 0x79, 0x0c, 0x26, 0xd9, 0xe6, 0x84, 0x4a, 0xec, - 0x7f, 0xfd, 0x34, 0x76, 0x61, 0x55, 0x76, 0xb8, 0xc1, 0x45, 0x0f, 0x9a, 0x01, 0xb5, 0xaa, 0xad, - 0x57, 0xf6, 0xb6, 0x9a, 0xfa, 0x7a, 0x6d, 0x4b, 0x6b, 0xfe, 0xb8, 0xce, 0x92, 0x61, 0x1a, 0xe2, - 0xdb, 0xf5, 0x87, 0xaa, 0xc2, 0x1e, 0x76, 0x37, 0x36, 0xd4, 0x98, 0xa0, 0xac, 0xa8, 0xf1, 0x85, - 0x1d, 0xb8, 0x16, 0x79, 0xbb, 0x81, 0xe6, 0xe1, 0x96, 0x67, 0xa9, 0xa1, 0x6d, 0x6c, 0x6b, 0x3b, - 0x4d, 0xad, 0xca, 0x6d, 0xea, 0x75, 0xbc, 0xdb, 0xdc, 0x5d, 0xdb, 0xdd, 0x52, 0x27, 0x90, 0x0a, - 0xf9, 0xcd, 0xad, 0x46, 0x40, 0x51, 0x16, 0xee, 0x8f, 0xdd, 0xae, 0xc8, 0x19, 0x6b, 0x16, 0x92, - 0xb5, 0x9d, 0xaa, 0xf6, 0x5c, 0x9d, 0x40, 0x05, 0xc8, 0x36, 0x6b, 0xdb, 0x5a, 0xa3, 0x59, 0xd9, - 0xae, 0xab, 0xca, 0xc2, 0x01, 0x4c, 0x8e, 0x0d, 0x68, 0xd1, 0x2c, 0xa0, 0xda, 0x76, 0x65, 0x43, - 0xd3, 0x1b, 0x7b, 0xeb, 0xeb, 0xb5, 0xe7, 0xba, 0xa7, 0x39, 0x07, 0xb3, 0x23, 0xf4, 0x90, 0x19, - 0x74, 0x0b, 0x6e, 0x8c, 0xf0, 0x76, 0x76, 0x77, 0x34, 0x7d, 0xf7, 0xa9, 0x86, 0x9f, 0xe1, 0x5a, - 0x53, 0x53, 0x63, 0x0b, 0x9f, 0x79, 0x45, 0xd6, 0x7f, 0xc3, 0xd0, 0x5e, 0x85, 0x5e, 0x29, 0x03, - 0x09, 0xdc, 0xe4, 0x26, 0xd3, 0x10, 0x6f, 0xe0, 0xa6, 0x1a, 0x5b, 0xd8, 0x83, 0x5c, 0xe8, 0xbf, - 0xed, 0x10, 0x82, 0xa2, 0xa7, 0xb7, 0x5d, 0x7b, 0x5e, 0xdb, 0xd9, 0x50, 0x27, 0x98, 0xcb, 0xd5, - 0xbd, 0xca, 0x96, 0xbe, 0xb6, 0x59, 0xd9, 0xd9, 0xd1, 0xb6, 0xf4, 0xca, 0x86, 0xb6, 0xd3, 0x54, - 0x15, 0xe6, 0xf2, 0x28, 0x7d, 0xab, 0xa9, 0xe1, 0x9d, 0x0a, 0xf7, 0xe8, 0x4f, 0x0a, 0x5c, 0x8b, - 0x0c, 0x60, 0xbe, 0xad, 0x0f, 0x1e, 0x3d, 0xd4, 0x3f, 0x7d, 0xb0, 0x5c, 0xd7, 0x57, 0x96, 0xe5, - 0x46, 0xfb, 0x94, 0x47, 0xcb, 0xaa, 0x82, 0xa6, 0xa0, 0xc0, 0x29, 0xff, 0xbf, 0xfc, 0x58, 0x08, - 0xc5, 0xc6, 0x48, 0x8f, 0x96, 0xd5, 0x38, 0xba, 0x0e, 0xd7, 0xea, 0xbb, 0xb8, 0x89, 0x2b, 0xb5, - 0xa6, 0x3e, 0x62, 0x32, 0x71, 0x06, 0xeb, 0xd1, 0xb2, 0x9a, 0x64, 0x5e, 0x8f, 0xb2, 0xfc, 0x1f, - 0x49, 0x9d, 0xc5, 0x7b, 0xb4, 0xac, 0xa6, 0x17, 0x7e, 0xa3, 0x40, 0x3e, 0xdc, 0xef, 0xa0, 0x69, - 0x98, 0xd4, 0x36, 0xb0, 0xd6, 0x68, 0xe8, 0x8d, 0x66, 0x05, 0x37, 0xc5, 0x5e, 0x4d, 0x41, 0x41, - 0x12, 0x65, 0xb5, 0x56, 0x42, 0x24, 0x6d, 0xa7, 0xca, 0xa4, 0x62, 0x21, 0xd5, 0xb5, 0xdd, 0xed, - 0xfa, 0x96, 0xd6, 0xd4, 0xd4, 0x78, 0x48, 0x4e, 0x96, 0xf3, 0x04, 0xfb, 0x1a, 0x9e, 0xb5, 0xd5, - 0x5d, 0xdc, 0xd4, 0xaa, 0x6a, 0x12, 0x95, 0x60, 0x46, 0xd2, 0xb6, 0x6a, 0xdb, 0xb5, 0xa6, 0x8e, - 0xb5, 0xca, 0x1a, 0x3b, 0x08, 0xa4, 0x16, 0x7e, 0x08, 0xea, 0x78, 0x1f, 0xc7, 0xde, 0xc8, 0x73, - 0x72, 0x77, 0x0f, 0xaf, 0x69, 0x3a, 0x8b, 0x1a, 0xfd, 0x99, 0xb6, 0x2a, 0x20, 0x17, 0xc1, 0x6b, - 0x54, 0xbf, 0x52, 0x95, 0x07, 0xbf, 0x4a, 0x42, 0x4a, 0xa6, 0xa2, 0x26, 0x94, 0xf8, 0xff, 0x90, - 0x45, 0x74, 0x43, 0xe8, 0x22, 0xbd, 0xd2, 0x5c, 0x54, 0x4f, 0x8d, 0x7e, 0xc0, 0x20, 0x6b, 0x38, - 0xd4, 0x6f, 0x90, 0xd0, 0xd9, 0x4d, 0x53, 0xb4, 0x85, 0x3a, 0xcc, 0x72, 0x0b, 0xa7, 0x6b, 0xca, - 0xeb, 0xfb, 0xa8, 0x68, 0x8b, 0x4f, 0xe1, 0x3a, 0xb7, 0x18, 0xd5, 0x32, 0xa1, 0x0b, 0x75, 0x54, - 0xd1, 0x76, 0xab, 0xa0, 0x06, 0x76, 0xa5, 0xb9, 0xf3, 0x3a, 0xab, 0x68, 0x2b, 0x15, 0xc8, 0x87, - 0xe7, 0x44, 0x28, 0xa8, 0x37, 0x11, 0xe3, 0xa3, 0xd7, 0x98, 0x10, 0xd9, 0xe2, 0x94, 0x89, 0x91, - 0x31, 0x51, 0xb4, 0x09, 0x0d, 0x20, 0x98, 0xa2, 0xa0, 0xa0, 0x6a, 0x9e, 0x9a, 0xe7, 0xcc, 0xdd, - 0x88, 0xe4, 0xc9, 0xb1, 0xcb, 0x17, 0xec, 0x58, 0xef, 0xcd, 0x52, 0x50, 0xf8, 0x78, 0x3d, 0x36, - 0x60, 0x89, 0xf4, 0x62, 0x75, 0xfd, 0x27, 0xf3, 0x1d, 0x93, 0x1e, 0x0e, 0xf6, 0x97, 0x5a, 0x76, - 0xef, 0xbe, 0x14, 0xb8, 0xef, 0xcd, 0x4c, 0x3d, 0xc2, 0xef, 0x63, 0x85, 0x2d, 0xf3, 0x98, 0x7c, - 0x25, 0x26, 0xe4, 0xd4, 0xfe, 0x5b, 0xac, 0x28, 0xd7, 0x4f, 0x9e, 0x70, 0xc2, 0x7e, 0x8a, 0xab, - 0xac, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xed, 0x05, 0x5a, 0x3a, 0x4f, 0x2d, 0x00, 0x00, + // 4371 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0xdc, 0x58, + 0x72, 0x62, 0x7f, 0x77, 0xf5, 0x87, 0xa8, 0x27, 0x59, 0xd3, 0x96, 0x3d, 0x63, 0x6f, 0x3b, 0xe3, + 0x0f, 0x8d, 0x22, 0x6b, 0x25, 0xaf, 0xc7, 0xf1, 0x66, 0x66, 0xd1, 0x92, 0x28, 0xab, 0xd7, 0x92, + 0x5a, 0x61, 0xb7, 0xc6, 0xb3, 0xf9, 0x22, 0x28, 0xf2, 0x49, 0x22, 0xd4, 0x4d, 0xf6, 0x92, 0x6c, + 0xdb, 0xda, 0x5f, 0x30, 0xc9, 0x21, 0x08, 0x92, 0x43, 0x00, 0x03, 0x41, 0xee, 0x9b, 0x3d, 0x05, + 0x01, 0x72, 0x0d, 0x90, 0x5b, 0x90, 0x60, 0x0f, 0x39, 0x04, 0xb9, 0xe6, 0x18, 0x18, 0x08, 0x82, + 0x9c, 0x72, 0x08, 0x10, 0xbc, 0x0f, 0x92, 0x8f, 0x14, 0xd5, 0xd3, 0x92, 0x9c, 0xc9, 0x21, 0x7b, + 0x52, 0xbf, 0xaa, 0x7a, 0x8f, 0xf5, 0xea, 0x55, 0xd5, 0xab, 0xaa, 0x57, 0x82, 0xb9, 0xbe, 0xf5, + 0x1a, 0x9f, 0x5a, 0xbe, 0x86, 0x8f, 0x5d, 0xec, 0x79, 0xcb, 0x43, 0xd7, 0xf1, 0x1d, 0x54, 0xe4, + 0xd0, 0x85, 0x10, 0x3d, 0x70, 0x4c, 0xdc, 0xe7, 0xe8, 0x85, 0xb9, 0xbe, 0x73, 0x7c, 0x8c, 0xdd, + 0xc7, 0xce, 0xd0, 0xb7, 0x1c, 0x9b, 0x43, 0x9b, 0xff, 0x9c, 0x05, 0xd4, 0xf5, 0x75, 0xd7, 0x57, + 0xe8, 0x52, 0x2a, 0xfe, 0xe9, 0x08, 0x7b, 0x3e, 0xba, 0x05, 0x65, 0xd7, 0x71, 0x06, 0x9a, 0xad, + 0x0f, 0x70, 0x43, 0xba, 0x2b, 0x3d, 0x2c, 0xab, 0x25, 0x02, 0xd8, 0xd3, 0x07, 0x18, 0xfd, 0x00, + 0x4a, 0x3e, 0x1e, 0x0c, 0xfb, 0xba, 0x8f, 0x1b, 0x99, 0xbb, 0xd2, 0xc3, 0xca, 0xea, 0x47, 0xcb, + 0xfc, 0x93, 0xcb, 0x3d, 0x8e, 0xe8, 0x3a, 0x23, 0xd7, 0xc0, 0xdb, 0x53, 0x6a, 0x48, 0x8a, 0xee, + 0x43, 0xf6, 0x0d, 0x3e, 0x6c, 0x64, 0xe9, 0x0c, 0x14, 0xce, 0x78, 0x85, 0x0f, 0x43, 0x62, 0x42, + 0x80, 0x96, 0x20, 0x3f, 0xc0, 0xa6, 0xa5, 0x37, 0x72, 0x94, 0x72, 0x2e, 0xa4, 0xdc, 0x25, 0xd0, + 0x90, 0x96, 0x11, 0xa1, 0x67, 0x50, 0x18, 0xba, 0xd8, 0xc3, 0x7e, 0x23, 0x7f, 0x57, 0x7a, 0x58, + 0x5f, 0xfd, 0x24, 0x24, 0x57, 0x6c, 0xc3, 0x31, 0x2d, 0xfb, 0xb8, 0xc3, 0x36, 0xbc, 0x4f, 0xa9, + 0xb6, 0x25, 0x95, 0xd3, 0xa3, 0xa7, 0x50, 0xd2, 0xcd, 0xd7, 0xba, 0x6d, 0x60, 0xb3, 0x51, 0xa0, + 0x9f, 0x6a, 0x5c, 0x34, 0x77, 0x5b, 0x52, 0x43, 0x5a, 0xf4, 0x08, 0x8a, 0xce, 0xc8, 0x1f, 0x8e, + 0x7c, 0xaf, 0x51, 0xbc, 0x9b, 0x7d, 0x58, 0x59, 0x9d, 0x0e, 0xa7, 0x75, 0x28, 0x5c, 0x0d, 0xf0, + 0x68, 0x05, 0x8a, 0x9e, 0xef, 0xb8, 0xfa, 0x31, 0x6e, 0x94, 0xe8, 0x17, 0xe6, 0x43, 0xd2, 0x2e, + 0x83, 0x6f, 0x38, 0xf6, 0x91, 0x75, 0xac, 0x06, 0x64, 0x68, 0x15, 0x4a, 0x6f, 0xf0, 0xe1, 0x89, + 0xe3, 0x9c, 0x7a, 0x8d, 0x32, 0x5d, 0x7d, 0x5e, 0x94, 0x14, 0x41, 0xf0, 0x29, 0x21, 0xdd, 0x7a, + 0x09, 0x0a, 0x1e, 0x95, 0xca, 0x3a, 0x40, 0x09, 0x73, 0xce, 0x9b, 0x7f, 0x24, 0x41, 0x3d, 0x7e, + 0x1a, 0x68, 0x1e, 0x0a, 0x7d, 0xfd, 0xcc, 0x19, 0xf9, 0xfc, 0x48, 0xf9, 0x08, 0x7d, 0x0c, 0xa0, + 0x8f, 0x4c, 0xcb, 0xd1, 0x1c, 0xbb, 0x7f, 0x46, 0x8f, 0xb4, 0xa4, 0x96, 0x29, 0xa4, 0x63, 0xf7, + 0xcf, 0x08, 0xfa, 0xb5, 0x65, 0x62, 0x8e, 0xce, 0x32, 0x34, 0x85, 0x50, 0xf4, 0x7d, 0x98, 0x36, + 0x46, 0x9e, 0xef, 0x0c, 0xb4, 0x43, 0xdd, 0xc3, 0xda, 0xc8, 0xed, 0xd3, 0x93, 0x2b, 0xab, 0x35, + 0x06, 0x5e, 0xd7, 0x3d, 0x7c, 0xe0, 0xf6, 0x9b, 0x7f, 0x20, 0x41, 0x39, 0x3c, 0x6c, 0x24, 0x43, + 0x96, 0x50, 0x32, 0x46, 0xc8, 0xcf, 0x6b, 0x72, 0xb1, 0x04, 0x48, 0x7f, 0xa3, 0x5b, 0xbe, 0xe6, + 0x11, 0x6d, 0xd6, 0x3c, 0xeb, 0xd8, 0xd6, 0x19, 0x23, 0x25, 0x55, 0xa6, 0x18, 0xaa, 0xe6, 0x5d, + 0x0a, 0x6f, 0xfe, 0xbb, 0x04, 0x15, 0x41, 0x9d, 0xd0, 0x33, 0xa8, 0xb3, 0xc5, 0x7d, 0x57, 0x37, + 0x4e, 0x35, 0xcb, 0x64, 0x8c, 0xad, 0xcb, 0xef, 0xde, 0x2f, 0x55, 0x29, 0xa6, 0x47, 0x10, 0xed, + 0xcd, 0xed, 0x29, 0x55, 0x1c, 0x9b, 0x68, 0x1b, 0x66, 0x86, 0xba, 0xeb, 0x5b, 0x86, 0x35, 0xd4, + 0x6d, 0x5f, 0xa3, 0x38, 0x6e, 0x15, 0x37, 0xc3, 0x93, 0xdb, 0x8f, 0x28, 0xbe, 0x22, 0x04, 0xdb, + 0x53, 0xaa, 0x3c, 0x4c, 0xc0, 0xd0, 0x22, 0xe4, 0xe9, 0x6e, 0xb9, 0x85, 0x44, 0x7a, 0xdf, 0x22, + 0x50, 0x7e, 0xea, 0x8c, 0x04, 0x3d, 0x80, 0x9c, 0xa9, 0xfb, 0x81, 0x89, 0xcc, 0x86, 0xa4, 0x9b, + 0xba, 0xaf, 0x73, 0x4a, 0x4a, 0xb0, 0x5e, 0x84, 0x3c, 0x65, 0xa9, 0xf9, 0xfb, 0x20, 0x27, 0xb9, + 0x40, 0x0b, 0x50, 0xb2, 0x4c, 0x6c, 0xfb, 0x96, 0x7f, 0x16, 0x18, 0x79, 0x30, 0x46, 0xcb, 0x30, + 0x3b, 0x74, 0xf1, 0x11, 0x76, 0x35, 0xcf, 0x70, 0x31, 0xb6, 0x35, 0xef, 0x44, 0x77, 0x31, 0x3f, + 0x96, 0x19, 0x86, 0xea, 0x52, 0x4c, 0x97, 0x20, 0x9a, 0xcf, 0xa1, 0x22, 0xf0, 0x89, 0x3e, 0x83, + 0x82, 0xeb, 0x8c, 0x7c, 0xec, 0x35, 0x24, 0xaa, 0xc5, 0xb3, 0xf1, 0xdd, 0xa8, 0x04, 0xa7, 0x72, + 0x92, 0xe6, 0x7f, 0x48, 0x00, 0x11, 0x18, 0x3d, 0x84, 0x52, 0xe2, 0x18, 0x2a, 0xef, 0xde, 0x2f, + 0x15, 0xfd, 0xf0, 0x04, 0xf8, 0x4f, 0x13, 0xad, 0xc1, 0x9c, 0x28, 0xfc, 0x70, 0x33, 0x84, 0xcb, + 0xf2, 0xf6, 0x94, 0x3a, 0x2b, 0x60, 0xdb, 0xc1, 0xce, 0x7e, 0x0c, 0xa2, 0xec, 0xb5, 0x53, 0xcb, + 0x36, 0xa9, 0xc8, 0xeb, 0xab, 0x1f, 0xa7, 0x1d, 0x58, 0xdb, 0x3e, 0x72, 0x96, 0x5f, 0x5a, 0xb6, + 0xb9, 0x3d, 0xa5, 0x4e, 0x0b, 0x13, 0x09, 0x08, 0x3d, 0x86, 0xa2, 0x71, 0xa2, 0xdb, 0x36, 0x66, + 0xaa, 0x56, 0x5f, 0xbd, 0x91, 0x38, 0x35, 0x86, 0x54, 0x03, 0x2a, 0x72, 0x1e, 0x03, 0xdd, 0x37, + 0x4e, 0x9a, 0x2d, 0x80, 0xe8, 0xb0, 0xd0, 0x1a, 0x94, 0x3d, 0xdc, 0xc7, 0x86, 0xef, 0xb8, 0x81, + 0xc4, 0x6e, 0xc4, 0x0e, 0xb5, 0xcb, 0xb1, 0x6a, 0x44, 0x47, 0x2c, 0xbc, 0x2a, 0xe2, 0xfe, 0xb7, + 0x05, 0x37, 0x0f, 0x79, 0xdf, 0x19, 0x5a, 0x06, 0x95, 0x16, 0xa1, 0x62, 0xc3, 0x68, 0x4f, 0x7f, + 0x9f, 0x85, 0xe9, 0x84, 0xe7, 0x44, 0x73, 0x90, 0x7f, 0x63, 0x99, 0xfe, 0x09, 0x65, 0x28, 0xaf, + 0xb2, 0x01, 0xf1, 0x44, 0x27, 0xd8, 0x3a, 0x3e, 0xf1, 0xe9, 0x17, 0xf3, 0x2a, 0x1f, 0x11, 0x6a, + 0x13, 0x0f, 0xfd, 0x13, 0xfa, 0x89, 0xbc, 0xca, 0x06, 0xe8, 0x36, 0x94, 0x8f, 0x5c, 0x7d, 0x80, + 0x5d, 0x72, 0xe3, 0xe4, 0x28, 0x26, 0x02, 0xa0, 0x27, 0x50, 0x61, 0x7e, 0xc3, 0x70, 0x4c, 0x6c, + 0xf0, 0x6b, 0x60, 0x36, 0x69, 0x3d, 0x26, 0x36, 0x54, 0xe6, 0x5f, 0xe8, 0x6f, 0x74, 0x0f, 0x6a, + 0x6c, 0xd6, 0xa1, 0xe5, 0xd3, 0x75, 0x0b, 0x74, 0xdd, 0x2a, 0x05, 0xae, 0x33, 0x58, 0x44, 0xf4, + 0xd3, 0x91, 0xde, 0x27, 0xf2, 0xa9, 0x08, 0x44, 0xbf, 0xc5, 0x60, 0xe8, 0x01, 0x4c, 0x33, 0xa2, + 0x23, 0x97, 0xdc, 0x9e, 0xb6, 0x71, 0xd6, 0x28, 0x52, 0xb2, 0x3a, 0x05, 0x6f, 0x05, 0x50, 0xc2, + 0x28, 0x73, 0x32, 0x8c, 0xd1, 0x52, 0x82, 0x51, 0x6a, 0x93, 0x9c, 0xd1, 0xd7, 0xe1, 0x6f, 0xc2, + 0x03, 0x9b, 0x15, 0x30, 0x5a, 0x66, 0x3c, 0x50, 0xa0, 0xc0, 0x28, 0x23, 0x0a, 0x18, 0xad, 0x0a, + 0x44, 0x01, 0xa3, 0x4b, 0x80, 0x4e, 0xf1, 0x99, 0x46, 0x25, 0xa7, 0x59, 0xb6, 0x8f, 0xdd, 0xd7, + 0x7a, 0xbf, 0x01, 0x77, 0xa5, 0x87, 0x92, 0x2a, 0x9f, 0xe2, 0xb3, 0x2d, 0x82, 0x68, 0x73, 0x78, + 0xf3, 0x6f, 0x32, 0x50, 0x60, 0xf7, 0x19, 0x7a, 0x04, 0xb9, 0x23, 0xab, 0xcf, 0x02, 0x01, 0xd1, + 0x94, 0xb7, 0xac, 0x3e, 0x66, 0x24, 0xdb, 0x53, 0x2a, 0x25, 0x41, 0x8f, 0xa1, 0xe0, 0xf9, 0x2e, + 0xd6, 0x07, 0xdc, 0x07, 0xde, 0x10, 0x2e, 0x3c, 0x02, 0x0e, 0xc9, 0x39, 0x19, 0x7a, 0x0e, 0x25, + 0x0f, 0x1f, 0x0f, 0xb0, 0xed, 0x7b, 0xdc, 0xf1, 0xdd, 0x8e, 0xa6, 0x30, 0x04, 0x36, 0x63, 0x1f, + 0x0a, 0xe9, 0xd1, 0x32, 0x14, 0xac, 0x81, 0x7e, 0x8c, 0xbd, 0x73, 0xa1, 0x42, 0x9b, 0x80, 0xa3, + 0x6f, 0x31, 0x2a, 0xb2, 0x8f, 0x81, 0xa1, 0x0f, 0xa9, 0x8a, 0x88, 0xfb, 0xd8, 0x35, 0xf4, 0x61, + 0xb4, 0x0f, 0x42, 0x22, 0xde, 0xdc, 0x85, 0x89, 0x6e, 0x6e, 0x72, 0x0b, 0x1b, 0x14, 0xd4, 0xfc, + 0x43, 0x09, 0x20, 0xe2, 0x18, 0xfd, 0x00, 0xca, 0x44, 0x34, 0x9a, 0x7f, 0x36, 0x64, 0x22, 0xac, + 0x27, 0x03, 0x0d, 0xb6, 0xc1, 0xde, 0xd9, 0x10, 0xab, 0xa5, 0x23, 0xfe, 0x8b, 0x38, 0x67, 0xf2, + 0x7b, 0xa8, 0xfb, 0x27, 0xcc, 0x2c, 0xd5, 0x70, 0x8c, 0x1e, 0x81, 0x6c, 0x5a, 0x9e, 0x7e, 0xd8, + 0xc7, 0xda, 0x40, 0xb7, 0xad, 0x23, 0xec, 0xf9, 0xfc, 0x46, 0x9c, 0xe6, 0xf0, 0x5d, 0x0e, 0x6e, + 0xbe, 0x82, 0xaa, 0x28, 0x79, 0xb4, 0x06, 0x25, 0x1a, 0xf9, 0x19, 0x4e, 0x9f, 0x33, 0xf3, 0x51, + 0xe2, 0x88, 0xf6, 0x39, 0x5a, 0x0d, 0x09, 0x11, 0x82, 0xdc, 0xc8, 0xed, 0x7b, 0x8d, 0xcc, 0xdd, + 0xec, 0xc3, 0xb2, 0x4a, 0x7f, 0x37, 0xff, 0x3a, 0x07, 0xb3, 0x29, 0x07, 0x44, 0x0e, 0x34, 0xf1, + 0x81, 0x4f, 0xd2, 0x0f, 0x34, 0xe5, 0x3b, 0x0f, 0x60, 0x9a, 0xec, 0x91, 0x44, 0x9d, 0x1a, 0xb9, + 0x62, 0xac, 0xb7, 0x7c, 0xeb, 0xf5, 0x00, 0xbc, 0x4f, 0xa1, 0x44, 0xdf, 0x87, 0x7d, 0xfd, 0xac, + 0x6f, 0x79, 0x3e, 0x8b, 0x51, 0xa9, 0x4b, 0x52, 0xab, 0x01, 0x90, 0xc6, 0xa9, 0x4b, 0x80, 0xc8, + 0x87, 0xb5, 0x38, 0x65, 0x85, 0x52, 0xca, 0x04, 0xb3, 0x2f, 0x52, 0x3f, 0x02, 0x99, 0x2b, 0x96, + 0x66, 0x8e, 0x5c, 0x9d, 0x78, 0x2f, 0xaa, 0x56, 0x35, 0x75, 0x9a, 0xc3, 0x37, 0x39, 0x18, 0x29, + 0x02, 0x9b, 0xde, 0xe8, 0x88, 0xb0, 0x09, 0x74, 0xa7, 0x17, 0xa8, 0x6e, 0x97, 0xd2, 0x44, 0x9b, + 0x60, 0xe3, 0xd4, 0x53, 0x2c, 0xa5, 0x9e, 0x22, 0x7a, 0x00, 0x19, 0x6f, 0x8d, 0xeb, 0xed, 0x4c, + 0xf4, 0x91, 0xb5, 0x83, 0x61, 0xdf, 0xd1, 0xcd, 0xf5, 0x4c, 0x43, 0xda, 0x9e, 0x52, 0x33, 0xde, + 0x1a, 0x5a, 0x84, 0xec, 0xb1, 0x31, 0xe4, 0x3a, 0x1b, 0x05, 0xd9, 0x2f, 0x36, 0xf6, 0x63, 0xa4, + 0x84, 0x08, 0x3d, 0x81, 0xbc, 0xfe, 0xb3, 0x91, 0x8b, 0xa9, 0xbb, 0x12, 0xa3, 0xdf, 0x16, 0x81, + 0xae, 0xf7, 0x9d, 0xc3, 0xd8, 0x1c, 0x46, 0x8c, 0xd6, 0xa0, 0xa0, 0xf7, 0xad, 0x4e, 0xb7, 0x4b, + 0x1d, 0x91, 0x68, 0xe1, 0x2d, 0x0a, 0x8e, 0xcd, 0xe1, 0xa4, 0xc4, 0x38, 0x58, 0x4c, 0xdc, 0xfc, + 0xef, 0x2c, 0x54, 0x04, 0xeb, 0x24, 0x42, 0x30, 0xf4, 0xa1, 0x3f, 0x72, 0x05, 0x97, 0x24, 0x31, + 0xb1, 0x73, 0x78, 0xe0, 0x91, 0xa2, 0xab, 0x24, 0x93, 0x7e, 0x95, 0x64, 0x63, 0x57, 0x49, 0x8a, + 0x2e, 0xe5, 0x52, 0x75, 0xa9, 0x75, 0xfe, 0x34, 0xf3, 0x09, 0x2b, 0xa5, 0x0c, 0x8f, 0x39, 0xc9, + 0x27, 0x50, 0xa1, 0x2e, 0x86, 0x7b, 0xf6, 0x42, 0xc2, 0xb3, 0xd3, 0xe9, 0xdc, 0xb3, 0x5b, 0xe1, + 0xef, 0xd4, 0xf3, 0x2f, 0x8e, 0x3b, 0xff, 0xd2, 0xc4, 0xe7, 0x5f, 0xbe, 0xd4, 0xf9, 0xc3, 0xd5, + 0xce, 0xbf, 0x72, 0x95, 0xf3, 0xef, 0x02, 0x44, 0xee, 0x36, 0xe6, 0xe4, 0xa4, 0x09, 0x9c, 0x5c, + 0x26, 0xdd, 0xc9, 0xfd, 0x83, 0x04, 0xb5, 0x98, 0x5b, 0x46, 0xf7, 0xa8, 0xc0, 0xa4, 0x0b, 0x04, + 0xc6, 0x85, 0x75, 0x9f, 0x09, 0x2b, 0x73, 0x91, 0xb0, 0x02, 0x41, 0xad, 0x04, 0x82, 0xca, 0x8e, + 0x17, 0x54, 0x24, 0xa4, 0x15, 0x28, 0xea, 0x7d, 0x4b, 0x73, 0xbc, 0xe0, 0x6a, 0x4a, 0x97, 0x52, + 0x20, 0x21, 0xcf, 0x23, 0xa9, 0xdb, 0xd0, 0x75, 0xc8, 0x7d, 0xed, 0x36, 0xff, 0x35, 0x07, 0xa5, + 0x80, 0x55, 0x74, 0x0f, 0x40, 0x37, 0x0c, 0xec, 0x79, 0xda, 0x29, 0xe6, 0x61, 0xfa, 0x7a, 0xee, + 0x9b, 0xf7, 0x4b, 0x92, 0x5a, 0x66, 0xf0, 0x97, 0xf8, 0x0c, 0xdd, 0x86, 0x82, 0x87, 0x0d, 0x17, + 0x33, 0x09, 0x05, 0x04, 0x1c, 0x86, 0x1e, 0x41, 0xcd, 0xc3, 0x9e, 0x67, 0x39, 0xb6, 0xe6, 0x3b, + 0xa7, 0xd8, 0x66, 0x3e, 0x90, 0x13, 0x55, 0x39, 0xaa, 0x47, 0x30, 0x68, 0x09, 0xa6, 0x75, 0xcf, + 0x1b, 0x0d, 0xb0, 0xe6, 0x3a, 0x7d, 0xac, 0xe9, 0xae, 0x4d, 0x43, 0x89, 0x80, 0xb8, 0xc6, 0x90, + 0xaa, 0xd3, 0xc7, 0x2d, 0xd7, 0x46, 0x5d, 0xf8, 0x48, 0xa4, 0xc6, 0x6f, 0x7d, 0xec, 0xda, 0x7a, + 0x9f, 0xc4, 0x9f, 0x35, 0x3a, 0xeb, 0x36, 0x99, 0xf5, 0xee, 0xfd, 0xd2, 0x5c, 0x34, 0x4f, 0xe1, + 0x44, 0xed, 0x4d, 0x35, 0x0d, 0x6a, 0x12, 0x83, 0x76, 0xf1, 0x31, 0x71, 0xbf, 0xcc, 0xa9, 0xf3, + 0x11, 0xd1, 0x15, 0x6c, 0x9b, 0x43, 0xc7, 0xb2, 0x7d, 0x6e, 0xc9, 0xe1, 0x98, 0xcc, 0x39, 0x1c, + 0x19, 0xa7, 0xbc, 0x0a, 0x50, 0x56, 0xf9, 0x08, 0x3d, 0x04, 0xf9, 0xc8, 0x71, 0x0d, 0xac, 0x11, + 0x8d, 0xd2, 0x3c, 0xff, 0xac, 0xcf, 0xee, 0xf3, 0x92, 0x5a, 0xa7, 0xf0, 0x7d, 0xdd, 0x3f, 0xe9, + 0x12, 0x28, 0xfa, 0x21, 0x94, 0x06, 0xd8, 0xd7, 0x69, 0x56, 0xc5, 0xd2, 0xfa, 0x3b, 0xe7, 0xd4, + 0x66, 0x79, 0x97, 0x53, 0x28, 0xb6, 0xef, 0x9e, 0xa9, 0xe1, 0x04, 0xd4, 0x80, 0xa2, 0xaf, 0x1f, + 0x1f, 0x5b, 0xf6, 0x31, 0xb5, 0xd1, 0xb2, 0x1a, 0x0c, 0xd1, 0x63, 0x98, 0x35, 0x1c, 0xdb, 0xa7, + 0xb7, 0x8a, 0xe5, 0x0d, 0x1d, 0xcf, 0xa2, 0x17, 0x4b, 0x99, 0x52, 0x21, 0x8e, 0xda, 0x8c, 0x30, + 0x24, 0x0b, 0x1c, 0xba, 0xce, 0xdb, 0x33, 0x6e, 0x94, 0x51, 0x48, 0xb3, 0x4f, 0xa0, 0x41, 0x16, + 0x48, 0x49, 0x16, 0x7e, 0x08, 0xb5, 0x18, 0x47, 0x24, 0xa9, 0x0e, 0x95, 0x44, 0x25, 0x3f, 0x89, + 0xcf, 0x7c, 0xad, 0xf7, 0x47, 0x98, 0xdf, 0xa3, 0x6c, 0xf0, 0x3c, 0xf3, 0x4c, 0x6a, 0xbe, 0x81, + 0x72, 0xa8, 0xe8, 0xe8, 0x3e, 0x54, 0x0c, 0x17, 0xd3, 0x40, 0x5f, 0xef, 0x7b, 0x31, 0x2d, 0x13, + 0x11, 0x82, 0x9c, 0x33, 0x31, 0x39, 0x87, 0x5c, 0x67, 0xbf, 0x95, 0xeb, 0xe6, 0x37, 0x12, 0x4c, + 0x27, 0x0c, 0x07, 0x3d, 0x80, 0xaa, 0x6e, 0x18, 0xce, 0xc8, 0xf6, 0x85, 0x92, 0x53, 0xc0, 0x00, + 0xc7, 0xd0, 0x5b, 0xfa, 0x53, 0x08, 0x86, 0xd4, 0x1c, 0x44, 0x6d, 0x07, 0x8e, 0x20, 0xf6, 0xf0, + 0x29, 0xd4, 0x89, 0x6c, 0x75, 0xcb, 0xc6, 0xae, 0x18, 0x20, 0xd4, 0x42, 0x28, 0x59, 0xad, 0xf9, + 0xe7, 0x12, 0x54, 0x45, 0x7b, 0xfc, 0x10, 0xc6, 0xf6, 0x01, 0xd5, 0xb7, 0xf9, 0x7b, 0x50, 0x11, + 0x04, 0x98, 0x52, 0x33, 0x59, 0x80, 0xd2, 0xc8, 0x23, 0x86, 0x33, 0x08, 0x4e, 0x38, 0x1c, 0xa3, + 0xbb, 0x50, 0x1a, 0xea, 0x9e, 0xf7, 0xc6, 0x71, 0x59, 0x7e, 0x1b, 0x30, 0x1a, 0x42, 0x9b, 0x1e, + 0xcc, 0xec, 0x58, 0xde, 0x65, 0x4a, 0x7f, 0x8f, 0xa0, 0xcc, 0x6a, 0x8e, 0xc4, 0xc4, 0xd9, 0xee, + 0xab, 0xef, 0xde, 0x2f, 0x95, 0x18, 0xb0, 0xbd, 0xa9, 0x06, 0xbf, 0xa8, 0x19, 0xeb, 0x86, 0x6f, + 0xbd, 0xc6, 0x3c, 0x32, 0xe5, 0xa3, 0xe6, 0x8f, 0x00, 0x89, 0x1f, 0xf5, 0x86, 0x8e, 0xed, 0x91, + 0x85, 0xf3, 0x96, 0x8f, 0x07, 0xe7, 0xcb, 0x05, 0x8c, 0x8e, 0x24, 0xe1, 0x2a, 0xa3, 0x68, 0xfe, + 0xad, 0x04, 0xb3, 0x07, 0x43, 0x53, 0xf7, 0x71, 0x9c, 0xf1, 0x18, 0x6f, 0xd2, 0x58, 0xde, 0xb8, + 0x20, 0x33, 0x91, 0x20, 0xa3, 0xd2, 0x58, 0x36, 0x56, 0x1a, 0xbb, 0x0f, 0xd3, 0xba, 0x69, 0x6a, + 0x2c, 0x59, 0xd1, 0x68, 0x10, 0x9c, 0xa3, 0x41, 0x70, 0x4d, 0x37, 0x4d, 0x16, 0x2f, 0x1f, 0xb8, + 0x7d, 0x8f, 0xc4, 0x9a, 0x2e, 0x1e, 0x38, 0xaf, 0x71, 0x8c, 0x34, 0x4f, 0x49, 0x65, 0x86, 0x89, + 0xa8, 0x9b, 0x5f, 0xc2, 0x4c, 0xd7, 0x77, 0x86, 0x57, 0xe5, 0xbf, 0xf9, 0x97, 0x15, 0x80, 0x48, + 0x30, 0x97, 0xd9, 0xf9, 0x3d, 0x28, 0xd2, 0xd3, 0x0d, 0x8f, 0x0f, 0xde, 0xbd, 0x5f, 0x2a, 0x10, + 0x50, 0x7b, 0x53, 0x65, 0x7f, 0xcd, 0xb8, 0x0a, 0xd4, 0x12, 0x2a, 0xf0, 0x1c, 0x2a, 0xac, 0xda, + 0xc8, 0x12, 0x9a, 0x05, 0x1a, 0xeb, 0xdc, 0x4c, 0x9c, 0x17, 0x2b, 0xab, 0xd1, 0x8c, 0x06, 0xbc, + 0xf0, 0x37, 0xfa, 0x75, 0x92, 0x1d, 0xea, 0xfe, 0xc8, 0xe3, 0x05, 0x97, 0x1b, 0xc9, 0x69, 0x14, + 0xa9, 0x72, 0x22, 0xf4, 0x31, 0x00, 0xad, 0xe6, 0x61, 0x53, 0xd3, 0x7d, 0xea, 0x10, 0xb3, 0x6a, + 0x99, 0x43, 0x5a, 0x3e, 0xba, 0x49, 0x2d, 0x8a, 0x21, 0x2b, 0x14, 0x59, 0xa4, 0xe3, 0x16, 0xad, + 0x68, 0x8e, 0xa8, 0x8a, 0x50, 0x24, 0x62, 0x33, 0x39, 0xa4, 0x45, 0x52, 0xb2, 0x02, 0x93, 0x48, + 0xe3, 0x63, 0xea, 0xaf, 0x6e, 0x09, 0x29, 0x50, 0xb2, 0x16, 0x4e, 0xee, 0x68, 0x46, 0x8c, 0x9e, + 0x12, 0xd3, 0x26, 0xd9, 0x44, 0xe3, 0x93, 0x44, 0xa6, 0xaa, 0xbc, 0x1d, 0x3a, 0xae, 0xaf, 0x52, + 0xa4, 0x30, 0x8f, 0x51, 0xa3, 0x7d, 0xa8, 0x53, 0x79, 0x1a, 0xce, 0x80, 0xfa, 0x79, 0xcc, 0x83, + 0x82, 0x7b, 0xe1, 0x7c, 0xd5, 0x71, 0x06, 0x1b, 0x01, 0x36, 0xf6, 0x79, 0x1e, 0x48, 0xd5, 0x5c, + 0x91, 0x02, 0x7d, 0x9f, 0xd5, 0xd2, 0xeb, 0x89, 0x3a, 0xe3, 0x2b, 0x7c, 0x98, 0x36, 0x99, 0x96, + 0xd5, 0xdb, 0x50, 0x11, 0x8a, 0x3a, 0x8d, 0x59, 0x3a, 0xf5, 0x7b, 0x69, 0x15, 0xaf, 0xb4, 0x25, + 0xc4, 0xb9, 0xa8, 0x0b, 0xd3, 0xac, 0xce, 0x14, 0x6d, 0x88, 0xa5, 0x26, 0xbf, 0x16, 0xbd, 0x03, + 0x10, 0xfc, 0xd8, 0x1d, 0xd5, 0xfd, 0x18, 0x09, 0xfa, 0x1c, 0xf2, 0x14, 0xc2, 0x73, 0x97, 0x5b, + 0xf1, 0xa5, 0xd2, 0x56, 0x60, 0xf4, 0xe8, 0x39, 0xd4, 0xb9, 0xcd, 0xb9, 0xd8, 0x1b, 0xf5, 0x7d, + 0xaf, 0x31, 0x9d, 0xf0, 0x21, 0xcc, 0xf2, 0xa8, 0x0f, 0xa9, 0x31, 0x52, 0x95, 0x51, 0xa2, 0x27, + 0x50, 0xa5, 0xb9, 0x79, 0x30, 0x53, 0xa6, 0x33, 0x67, 0x62, 0x15, 0x0e, 0x3a, 0xaf, 0x42, 0xc8, + 0x82, 0x59, 0x5f, 0x42, 0x90, 0x12, 0x86, 0x13, 0x67, 0x12, 0x35, 0x3b, 0x9e, 0xff, 0x31, 0xc7, + 0x55, 0xe7, 0xd4, 0xc1, 0xfc, 0x67, 0x50, 0x63, 0xe9, 0x42, 0x30, 0x7b, 0x2e, 0xc1, 0x30, 0x4d, + 0x18, 0xd8, 0xdc, 0x2a, 0xa5, 0x14, 0xf8, 0x1d, 0x18, 0xfa, 0x30, 0x9c, 0x78, 0x3b, 0xc1, 0x2f, + 0x09, 0xad, 0x19, 0xbf, 0x84, 0x2c, 0x98, 0x35, 0x07, 0x79, 0xec, 0xba, 0x8e, 0xcb, 0xc3, 0x0e, + 0x36, 0x20, 0x36, 0x42, 0x7f, 0xd0, 0xa4, 0xa5, 0x31, 0xcf, 0xca, 0x6a, 0x14, 0x42, 0xd2, 0x13, + 0x12, 0xd3, 0x98, 0xd8, 0xd7, 0xad, 0xbe, 0xd7, 0xb8, 0xc1, 0x62, 0x1a, 0x3e, 0x44, 0x9f, 0xc1, + 0x4c, 0x10, 0x90, 0x6b, 0x7d, 0xc7, 0x60, 0xa9, 0xf2, 0x47, 0x2c, 0xad, 0x0e, 0x10, 0x3b, 0x1c, + 0x8e, 0x96, 0x61, 0xf6, 0x50, 0x37, 0x4e, 0x47, 0x43, 0x8d, 0x17, 0x4a, 0xb4, 0x91, 0x87, 0xcd, + 0xc6, 0x4d, 0x56, 0x47, 0x66, 0x28, 0x1e, 0xba, 0x1f, 0x78, 0xd8, 0x44, 0x77, 0xa0, 0xe2, 0x62, + 0xdf, 0x3d, 0xd3, 0xe8, 0x5d, 0xde, 0xb8, 0x45, 0xd9, 0x02, 0x0a, 0xda, 0x20, 0x10, 0x62, 0xbb, + 0xbc, 0xc2, 0x54, 0x4c, 0xbc, 0x3d, 0x45, 0xc7, 0x4c, 0x2e, 0x18, 0xaa, 0x24, 0x52, 0x58, 0x67, + 0xfa, 0x8c, 0xd7, 0xb0, 0x92, 0x39, 0x54, 0x70, 0xc2, 0x9c, 0x9c, 0x55, 0xb1, 0x3e, 0x17, 0x8a, + 0x52, 0xd5, 0x64, 0x1d, 0x4b, 0x38, 0x59, 0x3e, 0x29, 0x24, 0x5e, 0x2f, 0x43, 0xd1, 0xe5, 0x3a, + 0x5a, 0x22, 0xce, 0x82, 0xc8, 0xbf, 0xf9, 0x8b, 0x0c, 0x40, 0xc4, 0x5b, 0xfa, 0xcb, 0x87, 0xe0, + 0xe7, 0x32, 0xe3, 0xfc, 0x5c, 0x36, 0xee, 0xe7, 0x16, 0xa0, 0x14, 0x2b, 0x56, 0x64, 0xd5, 0x70, + 0x8c, 0x56, 0x43, 0x67, 0xcb, 0xd2, 0xd9, 0x85, 0x14, 0x41, 0x2d, 0x27, 0x3c, 0x6e, 0xa8, 0x29, + 0x05, 0x51, 0x53, 0x9a, 0x50, 0xeb, 0xeb, 0x1e, 0x51, 0x76, 0x72, 0x30, 0x3a, 0xcb, 0x52, 0xb3, + 0x6a, 0x85, 0x00, 0x55, 0x02, 0x6b, 0xf9, 0x44, 0x5d, 0x08, 0xda, 0xc2, 0x1e, 0x15, 0x71, 0x4d, + 0x0d, 0x86, 0xcd, 0x65, 0x28, 0xb0, 0xaf, 0x20, 0x80, 0x42, 0x6b, 0xa3, 0xd7, 0xfe, 0x4a, 0x91, + 0xa7, 0x50, 0x15, 0x4a, 0x5b, 0xed, 0xbd, 0x76, 0x77, 0x5b, 0xd9, 0x94, 0x25, 0x82, 0xd9, 0x6a, + 0xb5, 0x77, 0x94, 0x4d, 0x39, 0xd3, 0xfc, 0x85, 0x04, 0xa5, 0xe0, 0x54, 0x82, 0x04, 0x51, 0x0c, + 0x46, 0x82, 0xf1, 0x07, 0x12, 0x5b, 0x21, 0x21, 0x36, 0x04, 0x39, 0xcf, 0xfa, 0x19, 0xe6, 0xe2, + 0xa4, 0xbf, 0x09, 0x7d, 0xa8, 0xe8, 0x2c, 0x42, 0x0b, 0xc7, 0xcd, 0x7f, 0xca, 0x40, 0x55, 0xd4, + 0x89, 0xf3, 0xb5, 0x29, 0x69, 0xe2, 0xda, 0x54, 0xe9, 0x82, 0xda, 0x94, 0xc8, 0x6f, 0xe6, 0x02, + 0x7e, 0xb3, 0x02, 0xbf, 0x9f, 0xc1, 0x4c, 0xb8, 0x70, 0xc8, 0x38, 0x0b, 0x3a, 0xe5, 0x00, 0x11, + 0x5a, 0xe8, 0x13, 0x98, 0x8f, 0xb3, 0x12, 0xce, 0x60, 0xee, 0x62, 0x4e, 0x64, 0x27, 0x9c, 0x75, + 0x8f, 0xe4, 0x94, 0xcc, 0x07, 0x32, 0x4b, 0xcd, 0xd3, 0xef, 0x57, 0x39, 0x90, 0xd9, 0x6a, 0xfc, + 0x84, 0x0a, 0xe3, 0x4e, 0xa8, 0x18, 0x3b, 0xa1, 0xe6, 0x1f, 0x4b, 0x00, 0x91, 0x17, 0x9c, 0xbc, + 0x98, 0x73, 0x27, 0xaa, 0xc4, 0x10, 0xa6, 0x24, 0xba, 0x6a, 0x50, 0x74, 0x39, 0xcf, 0xd2, 0x25, + 0x94, 0xa6, 0xf9, 0x8f, 0x12, 0x94, 0x02, 0xff, 0xfa, 0x1d, 0xe8, 0x65, 0xee, 0x82, 0x73, 0xce, + 0x5f, 0xa0, 0x97, 0x85, 0xb8, 0x5e, 0x12, 0x49, 0x04, 0x97, 0x34, 0x91, 0x04, 0x93, 0x2f, 0xf0, + 0x4b, 0x77, 0x64, 0xfb, 0xcd, 0x77, 0x19, 0xb8, 0xd1, 0x1a, 0xf9, 0xce, 0xb9, 0x9b, 0x5f, 0x78, + 0x53, 0x97, 0x26, 0x7a, 0x53, 0x9f, 0x4a, 0x7d, 0x53, 0xcf, 0x7c, 0xcb, 0x9b, 0xfa, 0x94, 0xf0, + 0xa6, 0xfe, 0x05, 0xbf, 0x87, 0x83, 0x87, 0xf5, 0x2c, 0xbd, 0xd7, 0x16, 0xd2, 0xca, 0xe4, 0xfc, + 0x8d, 0x9d, 0x5e, 0xc8, 0x1d, 0xfe, 0xce, 0xae, 0x44, 0x17, 0x72, 0xb0, 0x42, 0x8e, 0xae, 0x30, + 0xf6, 0x2d, 0x21, 0xbc, 0x97, 0xf9, 0x32, 0xc4, 0x7b, 0xf3, 0xee, 0x88, 0xe6, 0x9f, 0x64, 0x60, + 0x9a, 0x08, 0x47, 0x08, 0x3e, 0x2e, 0x5d, 0xac, 0xca, 0xa7, 0xd7, 0xf2, 0x58, 0x69, 0x2a, 0x33, + 0x51, 0x69, 0x2a, 0x3b, 0x71, 0x69, 0x2a, 0x37, 0x69, 0x69, 0xea, 0x71, 0x58, 0xbf, 0x2b, 0x4c, + 0x50, 0x99, 0x8a, 0xd5, 0xee, 0xfe, 0x2a, 0x07, 0xb3, 0x29, 0x91, 0x2e, 0xc9, 0x3f, 0x58, 0xa4, + 0x9b, 0xc8, 0x3f, 0x18, 0x90, 0xe4, 0x1f, 0xfc, 0x97, 0x49, 0xf2, 0x29, 0xf6, 0x40, 0xef, 0x1c, + 0x1d, 0x79, 0xd8, 0xd7, 0x06, 0x1e, 0x37, 0x90, 0x1a, 0x05, 0x77, 0x28, 0x74, 0xd7, 0x23, 0x57, + 0x0e, 0xb6, 0x4d, 0x81, 0x8a, 0x59, 0x4a, 0x05, 0xdb, 0x66, 0x48, 0x23, 0xf6, 0xa1, 0xe4, 0x2e, + 0xdd, 0x87, 0x92, 0x9f, 0xb8, 0x0f, 0xa5, 0x70, 0xb9, 0x3e, 0x94, 0xe2, 0x35, 0xfa, 0x50, 0x4a, + 0x57, 0xeb, 0x43, 0x29, 0x4f, 0xde, 0x87, 0x02, 0x97, 0xef, 0x43, 0xa9, 0x5c, 0xab, 0x0f, 0xe5, + 0x5f, 0x0a, 0xb0, 0x70, 0x71, 0x7a, 0x33, 0xbe, 0xdc, 0x10, 0x65, 0xe5, 0x99, 0x31, 0x0d, 0x2b, + 0xd9, 0x64, 0xab, 0xc8, 0xe7, 0xc0, 0x5e, 0x68, 0xb5, 0x81, 0xf5, 0xd6, 0xb2, 0x8f, 0x1b, 0xd3, + 0xf4, 0x44, 0x12, 0x0d, 0x15, 0xbb, 0x14, 0xa7, 0xb2, 0xb7, 0x63, 0x36, 0x48, 0xf4, 0x98, 0xe4, + 0x26, 0xe8, 0x74, 0xc9, 0xa7, 0x74, 0xba, 0xa0, 0x27, 0x3c, 0xd6, 0x64, 0x8a, 0x33, 0xc6, 0x8b, + 0xf1, 0x44, 0x86, 0x05, 0x9d, 0x6b, 0x89, 0xc0, 0x36, 0xfd, 0xe9, 0x34, 0x28, 0xac, 0xf3, 0xb0, + 0xf6, 0x4b, 0x21, 0x52, 0x85, 0x6f, 0x7f, 0x3e, 0xe5, 0xb3, 0xa3, 0x27, 0xd4, 0x48, 0x6d, 0x4b, + 0xd7, 0x50, 0xdb, 0xf2, 0x25, 0xd4, 0x36, 0xe9, 0xea, 0x2b, 0x97, 0x73, 0xf5, 0xbf, 0x19, 0x66, + 0x7b, 0xc1, 0x02, 0xd5, 0x64, 0xea, 0x25, 0x48, 0x2b, 0xc8, 0xf7, 0xc6, 0x5c, 0x14, 0xb5, 0xcb, + 0x5f, 0x14, 0xe8, 0x37, 0x82, 0x04, 0x2e, 0x58, 0xa4, 0x4e, 0x17, 0x49, 0x7d, 0x7f, 0xe6, 0x19, + 0x5c, 0x30, 0x55, 0x34, 0x2c, 0x79, 0x32, 0xc3, 0x7a, 0x9e, 0x69, 0x48, 0x91, 0x17, 0x16, 0x6f, + 0xa9, 0xff, 0xca, 0x83, 0x9c, 0xcc, 0xf9, 0xbf, 0xa3, 0xce, 0xaa, 0x6a, 0x7a, 0x67, 0x55, 0xa8, + 0xfb, 0xb9, 0x2b, 0xea, 0x7e, 0xfe, 0x6a, 0xba, 0x5f, 0xb8, 0x96, 0xee, 0x7f, 0x57, 0x2e, 0x3b, + 0xa9, 0xfb, 0xe5, 0xeb, 0xea, 0x3e, 0x5c, 0x4f, 0xf7, 0x2b, 0x1f, 0x42, 0xf7, 0x6b, 0x57, 0xd2, + 0xfd, 0xfa, 0x75, 0x75, 0xff, 0xe7, 0x39, 0x68, 0x5c, 0x54, 0xb4, 0x1a, 0x7f, 0xab, 0x88, 0x6d, + 0x6f, 0x99, 0x44, 0xdb, 0xdb, 0xf7, 0xa0, 0x1a, 0xeb, 0x77, 0x63, 0xd6, 0x50, 0xf1, 0xa2, 0x4e, + 0x37, 0x41, 0x6d, 0x72, 0xd7, 0x88, 0x8e, 0xf3, 0xd7, 0x88, 0x8e, 0x0b, 0xd7, 0x55, 0x9b, 0xe2, + 0xf5, 0xd4, 0xa6, 0xf4, 0x21, 0xd4, 0xa6, 0x7c, 0x25, 0xb5, 0x81, 0x4b, 0xa8, 0x8d, 0xa0, 0x2c, + 0x7f, 0x5a, 0x80, 0x5b, 0x63, 0x4a, 0x92, 0xe3, 0xf5, 0xe5, 0x29, 0xb0, 0x4e, 0xae, 0xa8, 0x39, + 0x34, 0x13, 0x35, 0x87, 0x52, 0x0c, 0x6f, 0x0e, 0x55, 0xc5, 0x91, 0x49, 0xe6, 0x25, 0x9a, 0x4a, + 0xb3, 0xe9, 0x4d, 0xa5, 0x89, 0x96, 0xd2, 0xff, 0x23, 0x17, 0x5a, 0xba, 0x96, 0x0b, 0x2d, 0x5c, + 0xc3, 0x85, 0x16, 0x7f, 0x15, 0x3e, 0x5c, 0xc5, 0x16, 0xa6, 0xaf, 0xeb, 0x42, 0xff, 0x53, 0x02, + 0x74, 0xbe, 0xba, 0x3e, 0xde, 0x18, 0xee, 0x0b, 0x3d, 0xa6, 0x99, 0x73, 0x3d, 0xa6, 0x51, 0x87, + 0xe9, 0x63, 0xae, 0xc4, 0xd9, 0xc4, 0x13, 0xc5, 0xa6, 0xe5, 0x62, 0xc3, 0x4f, 0xe9, 0x1c, 0xfc, + 0x14, 0x6a, 0x6f, 0xf0, 0xa1, 0xe7, 0x18, 0xa7, 0xd8, 0x8f, 0x9a, 0xc8, 0xb7, 0xa7, 0xd4, 0x6a, + 0x08, 0x26, 0xb1, 0xb5, 0x28, 0x80, 0xfc, 0x55, 0x04, 0xd0, 0xfc, 0xb3, 0x0c, 0xc8, 0x49, 0x2e, + 0xfe, 0x9f, 0xe6, 0xf6, 0x09, 0xc9, 0xfc, 0x32, 0x03, 0x33, 0xe7, 0xec, 0xe7, 0xbb, 0xea, 0x5f, + 0x2c, 0x8c, 0x93, 0x68, 0x76, 0x22, 0x89, 0xe6, 0x26, 0x96, 0x68, 0xfe, 0xf2, 0x12, 0x2d, 0x5e, + 0x45, 0xa2, 0xbf, 0x1b, 0x3c, 0x55, 0xef, 0xd0, 0xc4, 0xf5, 0x0a, 0x4f, 0xd5, 0x17, 0xa4, 0xc0, + 0xe4, 0x3b, 0xcd, 0x77, 0xe1, 0x4b, 0x78, 0x97, 0xbf, 0x6a, 0x5d, 0x7a, 0x79, 0xfe, 0xbe, 0xcd, + 0xd8, 0xd5, 0x84, 0x26, 0xcf, 0x9a, 0x6e, 0x9a, 0x4c, 0x01, 0x12, 0xef, 0xdb, 0x22, 0x69, 0x56, + 0x7c, 0xdf, 0x8e, 0xa8, 0x29, 0x73, 0x5f, 0x40, 0x3d, 0xfe, 0x20, 0x83, 0x1e, 0x40, 0xce, 0xb2, + 0x8f, 0x9c, 0x73, 0x4f, 0xfc, 0xc2, 0xf3, 0x1c, 0x25, 0x20, 0xd3, 0x17, 0x5f, 0x41, 0x55, 0xec, + 0xa0, 0x47, 0xf3, 0x80, 0x5a, 0x07, 0x9b, 0xed, 0x8e, 0xb6, 0xb1, 0xdd, 0xda, 0xdb, 0x53, 0x76, + 0xb4, 0xf5, 0x4e, 0x6f, 0x5b, 0x9e, 0x3a, 0x0f, 0xdf, 0x51, 0xb6, 0x7a, 0xb2, 0x84, 0x3e, 0x82, + 0xd9, 0x38, 0x5c, 0x6d, 0xbf, 0xd8, 0xee, 0xc9, 0x99, 0xc5, 0x5f, 0x4a, 0x70, 0x23, 0xf5, 0x72, + 0x42, 0x32, 0x54, 0xb7, 0x57, 0x9f, 0x3e, 0xd1, 0x3e, 0x5f, 0x5d, 0xd9, 0xd7, 0xd6, 0x56, 0xe4, + 0xa9, 0x38, 0xe4, 0xe9, 0x8a, 0x2c, 0xa1, 0x19, 0xa8, 0x51, 0xc8, 0xf7, 0x57, 0x9e, 0x31, 0xa2, + 0x4c, 0x02, 0xf4, 0x74, 0x45, 0xce, 0xa2, 0x9b, 0x70, 0x63, 0xbf, 0xa3, 0xf6, 0xd4, 0x56, 0xbb, + 0xa7, 0xc5, 0x96, 0xcc, 0x5d, 0x80, 0x7a, 0xba, 0x22, 0xe7, 0xd1, 0x02, 0xcc, 0xc7, 0x51, 0xe1, + 0x47, 0x0a, 0x17, 0xe1, 0x9e, 0xae, 0xc8, 0xc5, 0xc5, 0x75, 0xde, 0x75, 0x1f, 0x99, 0x21, 0x9a, + 0x03, 0x79, 0x53, 0xd9, 0x6a, 0x1d, 0xec, 0xf4, 0xb4, 0xad, 0xf6, 0x8e, 0xd2, 0xfb, 0xc9, 0xbe, + 0x22, 0x4f, 0xa1, 0x22, 0x64, 0x77, 0xf7, 0x9f, 0xc8, 0x12, 0xf9, 0xd1, 0x79, 0xf1, 0x42, 0xce, + 0x30, 0xc8, 0x9a, 0x9c, 0x5d, 0xdc, 0x0e, 0x4e, 0x2b, 0xe8, 0xca, 0x15, 0x97, 0xd8, 0x57, 0x3b, + 0xbd, 0xce, 0x46, 0x67, 0x47, 0x9e, 0x42, 0x25, 0xc8, 0xa9, 0xbd, 0xdd, 0x7d, 0xb6, 0x46, 0x57, + 0xed, 0xc9, 0x19, 0x54, 0x83, 0xf2, 0x2b, 0x65, 0xbd, 0xdb, 0xd9, 0x78, 0xa9, 0xf4, 0xe4, 0xec, + 0xe2, 0x1e, 0xdc, 0x48, 0x6d, 0xf3, 0x45, 0xf7, 0xe0, 0x4e, 0xb0, 0x60, 0x57, 0x79, 0xb1, 0xab, + 0xec, 0xf5, 0x94, 0x4d, 0xca, 0x9d, 0xb8, 0x3e, 0x91, 0xf8, 0x4e, 0x37, 0x82, 0x48, 0x8b, 0x8f, + 0x13, 0x6d, 0xc6, 0xbc, 0xe5, 0xb2, 0x0c, 0xf9, 0xf6, 0xde, 0xa6, 0xf2, 0xb5, 0x3c, 0x45, 0x18, + 0xe8, 0xb5, 0x77, 0x95, 0x6e, 0xaf, 0x45, 0x18, 0x5b, 0x3c, 0x82, 0xe9, 0x44, 0xbf, 0x26, 0x51, + 0x92, 0xf6, 0x6e, 0xeb, 0x85, 0xa2, 0x75, 0x0f, 0xb6, 0xb6, 0xda, 0x5f, 0x6b, 0xc1, 0xcc, 0x05, + 0x98, 0x8f, 0xc1, 0x85, 0x65, 0xd0, 0x1d, 0xb8, 0x15, 0xc3, 0xed, 0x75, 0xf6, 0x14, 0xad, 0xf3, + 0x95, 0xa2, 0xbe, 0x52, 0xdb, 0x3d, 0x45, 0xce, 0x2c, 0xfe, 0x18, 0xe4, 0x64, 0xb3, 0x03, 0x59, + 0x50, 0x79, 0xa1, 0x2a, 0xdd, 0xae, 0xd6, 0xed, 0x1c, 0xa8, 0x1b, 0x8a, 0x46, 0x24, 0xaf, 0xbd, + 0x52, 0xd6, 0xd9, 0xc7, 0x52, 0x70, 0xdd, 0xcd, 0x97, 0xb2, 0xb4, 0xf8, 0x17, 0x12, 0x54, 0xc5, + 0x16, 0x08, 0x34, 0x0b, 0xd3, 0x01, 0x71, 0xaf, 0xa5, 0xf6, 0xda, 0x7b, 0x2f, 0xe4, 0x29, 0xa2, + 0x69, 0x1c, 0xc8, 0x9f, 0xd1, 0x24, 0x01, 0xa4, 0xec, 0x6d, 0x12, 0xaa, 0x8c, 0x30, 0x75, 0xa3, + 0xb3, 0xbb, 0xbf, 0xa3, 0xf4, 0x14, 0x39, 0x2b, 0xd0, 0xf1, 0x77, 0xb6, 0x1c, 0x42, 0x50, 0x0f, + 0x56, 0x5b, 0xef, 0xa8, 0x3d, 0x65, 0x53, 0xce, 0xa3, 0x06, 0xcc, 0x71, 0xd8, 0x4e, 0x7b, 0xb7, + 0xdd, 0xd3, 0x54, 0xa5, 0xb5, 0xb1, 0xad, 0x6c, 0xca, 0x85, 0xc5, 0x03, 0xfe, 0xff, 0x3d, 0xbc, + 0x52, 0x86, 0xa0, 0x1e, 0x1c, 0xe6, 0x6e, 0xfb, 0x6b, 0xc6, 0xde, 0x3c, 0xa0, 0xcd, 0x83, 0xd6, + 0x4e, 0x68, 0x71, 0xad, 0x17, 0xca, 0x1e, 0x31, 0xc5, 0x05, 0x98, 0x8f, 0xc3, 0x77, 0x7a, 0x8a, + 0xba, 0xd7, 0x22, 0x42, 0x5c, 0xfd, 0xbb, 0x02, 0x14, 0x78, 0x79, 0xfd, 0x47, 0x50, 0x11, 0xba, + 0x2f, 0xd0, 0xb8, 0x9e, 0x8c, 0x85, 0xb4, 0xfe, 0x20, 0xd4, 0x82, 0xaa, 0xd8, 0x17, 0x84, 0xa2, + 0xa0, 0x2c, 0xa5, 0x5d, 0x28, 0x7d, 0x09, 0x05, 0x20, 0x6a, 0x4e, 0x42, 0x51, 0x54, 0x79, 0xae, + 0x4d, 0x6a, 0xe1, 0x56, 0x2a, 0x8e, 0x77, 0x33, 0x7d, 0x01, 0x10, 0xf5, 0xf7, 0x20, 0xf1, 0xe1, + 0x35, 0xd1, 0xf4, 0x93, 0xce, 0xc5, 0x4f, 0xa0, 0x41, 0xf7, 0x9c, 0x52, 0x36, 0x45, 0x93, 0xf4, + 0x8c, 0xa4, 0xae, 0xda, 0xcc, 0x7e, 0x93, 0x91, 0x90, 0x42, 0xec, 0x5c, 0x77, 0xfd, 0xb0, 0x6a, + 0x84, 0x2e, 0xee, 0x1e, 0x19, 0xb3, 0xcc, 0x01, 0xcc, 0xd3, 0x65, 0xce, 0xbf, 0x1d, 0x7d, 0x7b, + 0x47, 0xc9, 0x98, 0x65, 0x7f, 0x07, 0x6e, 0xd2, 0x65, 0xd3, 0x52, 0x35, 0x34, 0x51, 0x73, 0xc9, + 0x98, 0xc5, 0xdb, 0x20, 0x47, 0x8b, 0x9f, 0x53, 0xb2, 0xf3, 0x71, 0xf0, 0x98, 0xa5, 0xb6, 0x02, + 0x4d, 0x63, 0xd7, 0xfa, 0x39, 0x4d, 0x8b, 0xdd, 0xf6, 0x93, 0xac, 0xc3, 0x7c, 0xef, 0xb9, 0x75, + 0x62, 0xd7, 0xfa, 0xc5, 0xeb, 0xac, 0x6f, 0xfd, 0xf6, 0xbd, 0x63, 0xcb, 0x3f, 0x19, 0x1d, 0x2e, + 0x1b, 0xce, 0xe0, 0x31, 0xa7, 0x7a, 0x1c, 0xfc, 0x5b, 0x45, 0x00, 0xf8, 0x79, 0xa6, 0xb6, 0x63, + 0xbd, 0xc6, 0x2f, 0x59, 0x5b, 0xa6, 0xef, 0xfc, 0x5b, 0xa6, 0xce, 0xc7, 0xcf, 0x9f, 0x53, 0xc0, + 0x61, 0x81, 0x4e, 0x59, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x28, 0x7d, 0x69, 0x61, + 0x3c, 0x00, 0x00, } diff --git a/replay/cloud_replay.pb.go b/replay/cloud_replay.pb.go index 6bec570d5..524493318 100644 --- a/replay/cloud_replay.pb.go +++ b/replay/cloud_replay.pb.go @@ -1,3 +1,17 @@ +// Copyright 2026 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 @@ -133,7 +147,7 @@ type ReplayInfo struct { ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` RoomName string `protobuf:"bytes,2,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` StartTime int64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - Duration int64 `protobuf:"varint,4,opt,name=duration,proto3" json:"duration,omitempty"` + DurationMs int64 `protobuf:"varint,4,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -189,69 +203,25 @@ func (x *ReplayInfo) GetStartTime() int64 { return 0 } -func (x *ReplayInfo) GetDuration() int64 { +func (x *ReplayInfo) GetDurationMs() int64 { if x != nil { - return x.Duration + return x.DurationMs } return 0 } -type DeleteReplayRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *DeleteReplayRequest) Reset() { - *x = DeleteReplayRequest{} - mi := &file_cloud_replay_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeleteReplayRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteReplayRequest) ProtoMessage() {} - -func (x *DeleteReplayRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_replay_proto_msgTypes[3] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteReplayRequest.ProtoReflect.Descriptor instead. -func (*DeleteReplayRequest) Descriptor() ([]byte, []int) { - return file_cloud_replay_proto_rawDescGZIP(), []int{3} -} - -func (x *DeleteReplayRequest) GetReplayId() string { - if x != nil { - return x.ReplayId - } - return "" -} - type PlaybackRequest struct { state protoimpl.MessageState `protogen:"open.v1"` ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` - PlaybackRoom string `protobuf:"bytes,2,opt,name=playback_room,json=playbackRoom,proto3" json:"playback_room,omitempty"` // name of room to play into - SeekOffset int64 `protobuf:"varint,3,opt,name=seek_offset,json=seekOffset,proto3" json:"seek_offset,omitempty"` // initial timestamp (ms) + PlaybackRoom string `protobuf:"bytes,2,opt,name=playback_room,json=playbackRoom,proto3" json:"playback_room,omitempty"` // name of room to play into + SeekOffsetMs int64 `protobuf:"varint,3,opt,name=seek_offset_ms,json=seekOffsetMs,proto3" json:"seek_offset_ms,omitempty"` // initial timestamp (ms) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *PlaybackRequest) Reset() { *x = PlaybackRequest{} - mi := &file_cloud_replay_proto_msgTypes[4] + mi := &file_cloud_replay_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -263,7 +233,7 @@ func (x *PlaybackRequest) String() string { func (*PlaybackRequest) ProtoMessage() {} func (x *PlaybackRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_replay_proto_msgTypes[4] + mi := &file_cloud_replay_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -276,7 +246,7 @@ func (x *PlaybackRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PlaybackRequest.ProtoReflect.Descriptor instead. func (*PlaybackRequest) Descriptor() ([]byte, []int) { - return file_cloud_replay_proto_rawDescGZIP(), []int{4} + return file_cloud_replay_proto_rawDescGZIP(), []int{3} } func (x *PlaybackRequest) GetReplayId() string { @@ -293,9 +263,9 @@ func (x *PlaybackRequest) GetPlaybackRoom() string { return "" } -func (x *PlaybackRequest) GetSeekOffset() int64 { +func (x *PlaybackRequest) GetSeekOffsetMs() int64 { if x != nil { - return x.SeekOffset + return x.SeekOffsetMs } return 0 } @@ -309,7 +279,7 @@ type PlaybackResponse struct { func (x *PlaybackResponse) Reset() { *x = PlaybackResponse{} - mi := &file_cloud_replay_proto_msgTypes[5] + mi := &file_cloud_replay_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -321,7 +291,7 @@ func (x *PlaybackResponse) String() string { func (*PlaybackResponse) ProtoMessage() {} func (x *PlaybackResponse) ProtoReflect() protoreflect.Message { - mi := &file_cloud_replay_proto_msgTypes[5] + mi := &file_cloud_replay_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -334,7 +304,7 @@ func (x *PlaybackResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlaybackResponse.ProtoReflect.Descriptor instead. func (*PlaybackResponse) Descriptor() ([]byte, []int) { - return file_cloud_replay_proto_rawDescGZIP(), []int{5} + return file_cloud_replay_proto_rawDescGZIP(), []int{4} } func (x *PlaybackResponse) GetPlaybackId() string { @@ -347,14 +317,14 @@ func (x *PlaybackResponse) GetPlaybackId() string { type SeekRequest struct { state protoimpl.MessageState `protogen:"open.v1"` PlaybackId string `protobuf:"bytes,1,opt,name=playback_id,json=playbackId,proto3" json:"playback_id,omitempty"` - SeekOffset int64 `protobuf:"varint,2,opt,name=seek_offset,json=seekOffset,proto3" json:"seek_offset,omitempty"` // timestamp (ms) + SeekOffsetMs int64 `protobuf:"varint,2,opt,name=seek_offset_ms,json=seekOffsetMs,proto3" json:"seek_offset_ms,omitempty"` // timestamp (ms) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *SeekRequest) Reset() { *x = SeekRequest{} - mi := &file_cloud_replay_proto_msgTypes[6] + mi := &file_cloud_replay_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +336,7 @@ func (x *SeekRequest) String() string { func (*SeekRequest) ProtoMessage() {} func (x *SeekRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_replay_proto_msgTypes[6] + mi := &file_cloud_replay_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -379,7 +349,7 @@ func (x *SeekRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SeekRequest.ProtoReflect.Descriptor instead. func (*SeekRequest) Descriptor() ([]byte, []int) { - return file_cloud_replay_proto_rawDescGZIP(), []int{6} + return file_cloud_replay_proto_rawDescGZIP(), []int{5} } func (x *SeekRequest) GetPlaybackId() string { @@ -389,9 +359,9 @@ func (x *SeekRequest) GetPlaybackId() string { return "" } -func (x *SeekRequest) GetSeekOffset() int64 { +func (x *SeekRequest) GetSeekOffsetMs() int64 { if x != nil { - return x.SeekOffset + return x.SeekOffsetMs } return 0 } @@ -405,7 +375,7 @@ type ClosePlaybackRequest struct { func (x *ClosePlaybackRequest) Reset() { *x = ClosePlaybackRequest{} - mi := &file_cloud_replay_proto_msgTypes[7] + mi := &file_cloud_replay_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -417,7 +387,7 @@ func (x *ClosePlaybackRequest) String() string { func (*ClosePlaybackRequest) ProtoMessage() {} func (x *ClosePlaybackRequest) ProtoReflect() protoreflect.Message { - mi := &file_cloud_replay_proto_msgTypes[7] + mi := &file_cloud_replay_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -430,7 +400,7 @@ func (x *ClosePlaybackRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ClosePlaybackRequest.ProtoReflect.Descriptor instead. func (*ClosePlaybackRequest) Descriptor() ([]byte, []int) { - return file_cloud_replay_proto_rawDescGZIP(), []int{7} + return file_cloud_replay_proto_rawDescGZIP(), []int{6} } func (x *ClosePlaybackRequest) GetPlaybackId() string { @@ -440,52 +410,96 @@ func (x *ClosePlaybackRequest) GetPlaybackId() string { return "" } +type DeleteReplayRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteReplayRequest) Reset() { + *x = DeleteReplayRequest{} + mi := &file_cloud_replay_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteReplayRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteReplayRequest) ProtoMessage() {} + +func (x *DeleteReplayRequest) ProtoReflect() protoreflect.Message { + mi := &file_cloud_replay_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteReplayRequest.ProtoReflect.Descriptor instead. +func (*DeleteReplayRequest) Descriptor() ([]byte, []int) { + return file_cloud_replay_proto_rawDescGZIP(), []int{7} +} + +func (x *DeleteReplayRequest) GetReplayId() string { + if x != nil { + return x.ReplayId + } + return "" +} + var File_cloud_replay_proto protoreflect.FileDescriptor const file_cloud_replay_proto_rawDesc = "" + "\n" + - "\x12cloud_replay.proto\x12\x06replay\x1a\x1bgoogle/protobuf/empty.proto\x1a\x14livekit_models.proto\x1a\x14logger/options.proto\"j\n" + + "\x12cloud_replay.proto\x12\x06replay\x1a\x1bgoogle/protobuf/empty.proto\x1a\x14livekit_egress.proto\x1a\x14livekit_models.proto\x1a\x14logger/options.proto\"j\n" + "\x12ListReplaysRequest\x12\x1b\n" + "\troom_name\x18\x01 \x01(\tR\broomName\x127\n" + "\n" + "page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\tpageToken\"\x85\x01\n" + "\x13ListReplaysResponse\x12,\n" + "\areplays\x18\x01 \x03(\v2\x12.replay.ReplayInfoR\areplays\x12@\n" + - "\x0fnext_page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\rnextPageToken\"\x8f\x01\n" + + "\x0fnext_page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\rnextPageToken\"\x94\x01\n" + "\n" + "ReplayInfo\x12)\n" + "\treplay_id\x18\x01 \x01(\tB\f\x9a\xec,\breplayIDR\breplayId\x12\x1b\n" + "\troom_name\x18\x02 \x01(\tR\broomName\x12\x1d\n" + "\n" + - "start_time\x18\x03 \x01(\x03R\tstartTime\x12\x1a\n" + - "\bduration\x18\x04 \x01(\x03R\bduration\"@\n" + - "\x13DeleteReplayRequest\x12)\n" + - "\treplay_id\x18\x01 \x01(\tB\f\x9a\xec,\breplayIDR\breplayId\"\x82\x01\n" + + "start_time\x18\x03 \x01(\x03R\tstartTime\x12\x1f\n" + + "\vduration_ms\x18\x04 \x01(\x03R\n" + + "durationMs\"\x87\x01\n" + "\x0fPlaybackRequest\x12)\n" + "\treplay_id\x18\x01 \x01(\tB\f\x9a\xec,\breplayIDR\breplayId\x12#\n" + - "\rplayback_room\x18\x02 \x01(\tR\fplaybackRoom\x12\x1f\n" + - "\vseek_offset\x18\x03 \x01(\x03R\n" + - "seekOffset\"C\n" + + "\rplayback_room\x18\x02 \x01(\tR\fplaybackRoom\x12$\n" + + "\x0eseek_offset_ms\x18\x03 \x01(\x03R\fseekOffsetMs\"C\n" + "\x10PlaybackResponse\x12/\n" + "\vplayback_id\x18\x01 \x01(\tB\x0e\x9a\xec,\n" + "playbackIDR\n" + - "playbackId\"_\n" + + "playbackId\"d\n" + "\vSeekRequest\x12/\n" + "\vplayback_id\x18\x01 \x01(\tB\x0e\x9a\xec,\n" + "playbackIDR\n" + - "playbackId\x12\x1f\n" + - "\vseek_offset\x18\x02 \x01(\x03R\n" + - "seekOffset\"G\n" + + "playbackId\x12$\n" + + "\x0eseek_offset_ms\x18\x02 \x01(\x03R\fseekOffsetMs\"G\n" + "\x14ClosePlaybackRequest\x12/\n" + "\vplayback_id\x18\x01 \x01(\tB\x0e\x9a\xec,\n" + "playbackIDR\n" + - "playbackId2\xc8\x02\n" + + "playbackId\"@\n" + + "\x13DeleteReplayRequest\x12)\n" + + "\treplay_id\x18\x01 \x01(\tB\f\x9a\xec,\breplayIDR\breplayId2\x85\x03\n" + "\x06Replay\x12F\n" + - "\vListReplays\x12\x1a.replay.ListReplaysRequest\x1a\x1b.replay.ListReplaysResponse\x12C\n" + - "\fDeleteReplay\x12\x1b.replay.DeleteReplayRequest\x1a\x16.google.protobuf.Empty\x12=\n" + + "\vListReplays\x12\x1a.replay.ListReplaysRequest\x1a\x1b.replay.ListReplaysResponse\x12=\n" + "\bPlayback\x12\x17.replay.PlaybackRequest\x1a\x18.replay.PlaybackResponse\x123\n" + "\x04Seek\x12\x13.replay.SeekRequest\x1a\x16.google.protobuf.Empty\x12=\n" + - "\x05Close\x12\x1c.replay.ClosePlaybackRequest\x1a\x16.google.protobuf.EmptyBEZ\"github.com/livekit/protocol/replay\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "\x05Close\x12\x1c.replay.ClosePlaybackRequest\x1a\x16.google.protobuf.Empty\x12;\n" + + "\x06Export\x12\x1c.livekit.ExportReplayRequest\x1a\x13.livekit.EgressInfo\x12C\n" + + "\fDeleteReplay\x12\x1b.replay.DeleteReplayRequest\x1a\x16.google.protobuf.EmptyBEZ\"github.com/livekit/protocol/replay\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_cloud_replay_proto_rawDescOnce sync.Once @@ -501,36 +515,40 @@ func file_cloud_replay_proto_rawDescGZIP() []byte { var file_cloud_replay_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_cloud_replay_proto_goTypes = []any{ - (*ListReplaysRequest)(nil), // 0: replay.ListReplaysRequest - (*ListReplaysResponse)(nil), // 1: replay.ListReplaysResponse - (*ReplayInfo)(nil), // 2: replay.ReplayInfo - (*DeleteReplayRequest)(nil), // 3: replay.DeleteReplayRequest - (*PlaybackRequest)(nil), // 4: replay.PlaybackRequest - (*PlaybackResponse)(nil), // 5: replay.PlaybackResponse - (*SeekRequest)(nil), // 6: replay.SeekRequest - (*ClosePlaybackRequest)(nil), // 7: replay.ClosePlaybackRequest - (*livekit.TokenPagination)(nil), // 8: livekit.TokenPagination - (*emptypb.Empty)(nil), // 9: google.protobuf.Empty + (*ListReplaysRequest)(nil), // 0: replay.ListReplaysRequest + (*ListReplaysResponse)(nil), // 1: replay.ListReplaysResponse + (*ReplayInfo)(nil), // 2: replay.ReplayInfo + (*PlaybackRequest)(nil), // 3: replay.PlaybackRequest + (*PlaybackResponse)(nil), // 4: replay.PlaybackResponse + (*SeekRequest)(nil), // 5: replay.SeekRequest + (*ClosePlaybackRequest)(nil), // 6: replay.ClosePlaybackRequest + (*DeleteReplayRequest)(nil), // 7: replay.DeleteReplayRequest + (*livekit.TokenPagination)(nil), // 8: livekit.TokenPagination + (*livekit.ExportReplayRequest)(nil), // 9: livekit.ExportReplayRequest + (*emptypb.Empty)(nil), // 10: google.protobuf.Empty + (*livekit.EgressInfo)(nil), // 11: livekit.EgressInfo } var file_cloud_replay_proto_depIdxs = []int32{ - 8, // 0: replay.ListReplaysRequest.page_token:type_name -> livekit.TokenPagination - 2, // 1: replay.ListReplaysResponse.replays:type_name -> replay.ReplayInfo - 8, // 2: replay.ListReplaysResponse.next_page_token:type_name -> livekit.TokenPagination - 0, // 3: replay.Replay.ListReplays:input_type -> replay.ListReplaysRequest - 3, // 4: replay.Replay.DeleteReplay:input_type -> replay.DeleteReplayRequest - 4, // 5: replay.Replay.Playback:input_type -> replay.PlaybackRequest - 6, // 6: replay.Replay.Seek:input_type -> replay.SeekRequest - 7, // 7: replay.Replay.Close:input_type -> replay.ClosePlaybackRequest - 1, // 8: replay.Replay.ListReplays:output_type -> replay.ListReplaysResponse - 9, // 9: replay.Replay.DeleteReplay:output_type -> google.protobuf.Empty - 5, // 10: replay.Replay.Playback:output_type -> replay.PlaybackResponse - 9, // 11: replay.Replay.Seek:output_type -> google.protobuf.Empty - 9, // 12: replay.Replay.Close:output_type -> google.protobuf.Empty - 8, // [8:13] is the sub-list for method output_type - 3, // [3:8] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 8, // 0: replay.ListReplaysRequest.page_token:type_name -> livekit.TokenPagination + 2, // 1: replay.ListReplaysResponse.replays:type_name -> replay.ReplayInfo + 8, // 2: replay.ListReplaysResponse.next_page_token:type_name -> livekit.TokenPagination + 0, // 3: replay.Replay.ListReplays:input_type -> replay.ListReplaysRequest + 3, // 4: replay.Replay.Playback:input_type -> replay.PlaybackRequest + 5, // 5: replay.Replay.Seek:input_type -> replay.SeekRequest + 6, // 6: replay.Replay.Close:input_type -> replay.ClosePlaybackRequest + 9, // 7: replay.Replay.Export:input_type -> livekit.ExportReplayRequest + 7, // 8: replay.Replay.DeleteReplay:input_type -> replay.DeleteReplayRequest + 1, // 9: replay.Replay.ListReplays:output_type -> replay.ListReplaysResponse + 4, // 10: replay.Replay.Playback:output_type -> replay.PlaybackResponse + 10, // 11: replay.Replay.Seek:output_type -> google.protobuf.Empty + 10, // 12: replay.Replay.Close:output_type -> google.protobuf.Empty + 11, // 13: replay.Replay.Export:output_type -> livekit.EgressInfo + 10, // 14: replay.Replay.DeleteReplay:output_type -> google.protobuf.Empty + 9, // [9:15] is the sub-list for method output_type + 3, // [3:9] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_cloud_replay_proto_init() } diff --git a/replay/cloud_replay.twirp.go b/replay/cloud_replay.twirp.go index 2500234c5..f9ed64b36 100644 --- a/replay/cloud_replay.twirp.go +++ b/replay/cloud_replay.twirp.go @@ -17,6 +17,7 @@ import twirp "github.com/twitchtv/twirp" import ctxsetters "github.com/twitchtv/twirp/ctxsetters" import google_protobuf "google.golang.org/protobuf/types/known/emptypb" +import livekit2 "github.com/livekit/protocol/livekit" import bytes "bytes" import errors "errors" @@ -35,15 +36,21 @@ const _ = twirp.TwirpPackageMinVersion_8_1_0 // Experimental (not currently available) type Replay interface { + // List replays ListReplays(context.Context, *ListReplaysRequest) (*ListReplaysResponse, error) - DeleteReplay(context.Context, *DeleteReplayRequest) (*google_protobuf.Empty, error) - + // Playback controls Playback(context.Context, *PlaybackRequest) (*PlaybackResponse, error) Seek(context.Context, *SeekRequest) (*google_protobuf.Empty, error) Close(context.Context, *ClosePlaybackRequest) (*google_protobuf.Empty, error) + + // Export a stored replay using egress + Export(context.Context, *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) + + // Delete all stored data + DeleteReplay(context.Context, *DeleteReplayRequest) (*google_protobuf.Empty, error) } // ====================== @@ -52,7 +59,7 @@ type Replay interface { type replayProtobufClient struct { client HTTPClient - urls [5]string + urls [6]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -80,12 +87,13 @@ func NewReplayProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "replay", "Replay") - urls := [5]string{ + urls := [6]string{ serviceURL + "ListReplays", - serviceURL + "DeleteReplay", serviceURL + "Playback", serviceURL + "Seek", serviceURL + "Close", + serviceURL + "Export", + serviceURL + "DeleteReplay", } return &replayProtobufClient{ @@ -142,26 +150,26 @@ func (c *replayProtobufClient) callListReplays(ctx context.Context, in *ListRepl return out, nil } -func (c *replayProtobufClient) DeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { +func (c *replayProtobufClient) Playback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") - caller := c.callDeleteReplay + ctx = ctxsetters.WithMethodName(ctx, "Playback") + caller := c.callPlayback if c.interceptor != nil { - caller = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + caller = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*DeleteReplayRequest) + typedReq, ok := req.(*PlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") } - return c.callDeleteReplay(ctx, typedReq) + return c.callPlayback(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*google_protobuf.Empty) + typedResp, ok := resp.(*PlaybackResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") } return typedResp, err } @@ -171,8 +179,8 @@ func (c *replayProtobufClient) DeleteReplay(ctx context.Context, in *DeleteRepla return caller(ctx, in) } -func (c *replayProtobufClient) callDeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { - out := new(google_protobuf.Empty) +func (c *replayProtobufClient) callPlayback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { + out := new(PlaybackResponse) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -188,26 +196,26 @@ func (c *replayProtobufClient) callDeleteReplay(ctx context.Context, in *DeleteR return out, nil } -func (c *replayProtobufClient) Playback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { +func (c *replayProtobufClient) Seek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "Playback") - caller := c.callPlayback + ctx = ctxsetters.WithMethodName(ctx, "Seek") + caller := c.callSeek if c.interceptor != nil { - caller = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { + caller = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*PlaybackRequest) + typedReq, ok := req.(*SeekRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") } - return c.callPlayback(ctx, typedReq) + return c.callSeek(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*PlaybackResponse) + typedResp, ok := resp.(*google_protobuf.Empty) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") } return typedResp, err } @@ -217,8 +225,8 @@ func (c *replayProtobufClient) Playback(ctx context.Context, in *PlaybackRequest return caller(ctx, in) } -func (c *replayProtobufClient) callPlayback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { - out := new(PlaybackResponse) +func (c *replayProtobufClient) callSeek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { + out := new(google_protobuf.Empty) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -234,20 +242,20 @@ func (c *replayProtobufClient) callPlayback(ctx context.Context, in *PlaybackReq return out, nil } -func (c *replayProtobufClient) Seek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { +func (c *replayProtobufClient) Close(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "Seek") - caller := c.callSeek + ctx = ctxsetters.WithMethodName(ctx, "Close") + caller := c.callClose if c.interceptor != nil { - caller = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { + caller = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*SeekRequest) + typedReq, ok := req.(*ClosePlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") } - return c.callSeek(ctx, typedReq) + return c.callClose(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -263,7 +271,7 @@ func (c *replayProtobufClient) Seek(ctx context.Context, in *SeekRequest) (*goog return caller(ctx, in) } -func (c *replayProtobufClient) callSeek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { +func (c *replayProtobufClient) callClose(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { out := new(google_protobuf.Empty) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { @@ -280,20 +288,66 @@ func (c *replayProtobufClient) callSeek(ctx context.Context, in *SeekRequest) (* return out, nil } -func (c *replayProtobufClient) Close(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { +func (c *replayProtobufClient) Export(ctx context.Context, in *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "Close") - caller := c.callClose + ctx = ctxsetters.WithMethodName(ctx, "Export") + caller := c.callExport if c.interceptor != nil { - caller = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { + caller = func(ctx context.Context, req *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ClosePlaybackRequest) + typedReq, ok := req.(*livekit2.ExportReplayRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*livekit2.ExportReplayRequest) when calling interceptor") } - return c.callClose(ctx, typedReq) + return c.callExport(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*livekit2.EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*livekit2.EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *replayProtobufClient) callExport(ctx context.Context, in *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { + out := new(livekit2.EgressInfo) + ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + +func (c *replayProtobufClient) DeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { + ctx = ctxsetters.WithPackageName(ctx, "replay") + ctx = ctxsetters.WithServiceName(ctx, "Replay") + ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") + caller := c.callDeleteReplay + if c.interceptor != nil { + caller = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DeleteReplayRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + } + return c.callDeleteReplay(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -309,9 +363,9 @@ func (c *replayProtobufClient) Close(ctx context.Context, in *ClosePlaybackReque return caller(ctx, in) } -func (c *replayProtobufClient) callClose(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { +func (c *replayProtobufClient) callDeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { out := new(google_protobuf.Empty) - ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) + ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { twerr, ok := err.(twirp.Error) if !ok { @@ -332,7 +386,7 @@ func (c *replayProtobufClient) callClose(ctx context.Context, in *ClosePlaybackR type replayJSONClient struct { client HTTPClient - urls [5]string + urls [6]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -360,12 +414,13 @@ func NewReplayJSONClient(baseURL string, client HTTPClient, opts ...twirp.Client // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "replay", "Replay") - urls := [5]string{ + urls := [6]string{ serviceURL + "ListReplays", - serviceURL + "DeleteReplay", serviceURL + "Playback", serviceURL + "Seek", serviceURL + "Close", + serviceURL + "Export", + serviceURL + "DeleteReplay", } return &replayJSONClient{ @@ -422,26 +477,26 @@ func (c *replayJSONClient) callListReplays(ctx context.Context, in *ListReplaysR return out, nil } -func (c *replayJSONClient) DeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { +func (c *replayJSONClient) Playback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") - caller := c.callDeleteReplay + ctx = ctxsetters.WithMethodName(ctx, "Playback") + caller := c.callPlayback if c.interceptor != nil { - caller = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + caller = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*DeleteReplayRequest) + typedReq, ok := req.(*PlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") } - return c.callDeleteReplay(ctx, typedReq) + return c.callPlayback(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*google_protobuf.Empty) + typedResp, ok := resp.(*PlaybackResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") } return typedResp, err } @@ -451,8 +506,8 @@ func (c *replayJSONClient) DeleteReplay(ctx context.Context, in *DeleteReplayReq return caller(ctx, in) } -func (c *replayJSONClient) callDeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { - out := new(google_protobuf.Empty) +func (c *replayJSONClient) callPlayback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { + out := new(PlaybackResponse) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -468,26 +523,26 @@ func (c *replayJSONClient) callDeleteReplay(ctx context.Context, in *DeleteRepla return out, nil } -func (c *replayJSONClient) Playback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { +func (c *replayJSONClient) Seek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "Playback") - caller := c.callPlayback + ctx = ctxsetters.WithMethodName(ctx, "Seek") + caller := c.callSeek if c.interceptor != nil { - caller = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { + caller = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*PlaybackRequest) + typedReq, ok := req.(*SeekRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") } - return c.callPlayback(ctx, typedReq) + return c.callSeek(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*PlaybackResponse) + typedResp, ok := resp.(*google_protobuf.Empty) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") } return typedResp, err } @@ -497,8 +552,8 @@ func (c *replayJSONClient) Playback(ctx context.Context, in *PlaybackRequest) (* return caller(ctx, in) } -func (c *replayJSONClient) callPlayback(ctx context.Context, in *PlaybackRequest) (*PlaybackResponse, error) { - out := new(PlaybackResponse) +func (c *replayJSONClient) callSeek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { + out := new(google_protobuf.Empty) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -514,20 +569,20 @@ func (c *replayJSONClient) callPlayback(ctx context.Context, in *PlaybackRequest return out, nil } -func (c *replayJSONClient) Seek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { +func (c *replayJSONClient) Close(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "Seek") - caller := c.callSeek + ctx = ctxsetters.WithMethodName(ctx, "Close") + caller := c.callClose if c.interceptor != nil { - caller = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { + caller = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*SeekRequest) + typedReq, ok := req.(*ClosePlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") } - return c.callSeek(ctx, typedReq) + return c.callClose(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -543,7 +598,7 @@ func (c *replayJSONClient) Seek(ctx context.Context, in *SeekRequest) (*google_p return caller(ctx, in) } -func (c *replayJSONClient) callSeek(ctx context.Context, in *SeekRequest) (*google_protobuf.Empty, error) { +func (c *replayJSONClient) callClose(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { out := new(google_protobuf.Empty) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { @@ -560,20 +615,66 @@ func (c *replayJSONClient) callSeek(ctx context.Context, in *SeekRequest) (*goog return out, nil } -func (c *replayJSONClient) Close(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { +func (c *replayJSONClient) Export(ctx context.Context, in *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "replay") ctx = ctxsetters.WithServiceName(ctx, "Replay") - ctx = ctxsetters.WithMethodName(ctx, "Close") - caller := c.callClose + ctx = ctxsetters.WithMethodName(ctx, "Export") + caller := c.callExport if c.interceptor != nil { - caller = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { + caller = func(ctx context.Context, req *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ClosePlaybackRequest) + typedReq, ok := req.(*livekit2.ExportReplayRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*livekit2.ExportReplayRequest) when calling interceptor") } - return c.callClose(ctx, typedReq) + return c.callExport(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*livekit2.EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*livekit2.EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *replayJSONClient) callExport(ctx context.Context, in *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { + out := new(livekit2.EgressInfo) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + +func (c *replayJSONClient) DeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { + ctx = ctxsetters.WithPackageName(ctx, "replay") + ctx = ctxsetters.WithServiceName(ctx, "Replay") + ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") + caller := c.callDeleteReplay + if c.interceptor != nil { + caller = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DeleteReplayRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + } + return c.callDeleteReplay(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -589,9 +690,9 @@ func (c *replayJSONClient) Close(ctx context.Context, in *ClosePlaybackRequest) return caller(ctx, in) } -func (c *replayJSONClient) callClose(ctx context.Context, in *ClosePlaybackRequest) (*google_protobuf.Empty, error) { +func (c *replayJSONClient) callDeleteReplay(ctx context.Context, in *DeleteReplayRequest) (*google_protobuf.Empty, error) { out := new(google_protobuf.Empty) - ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { twerr, ok := err.(twirp.Error) if !ok { @@ -706,9 +807,6 @@ func (s *replayServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { case "ListReplays": s.serveListReplays(ctx, resp, req) return - case "DeleteReplay": - s.serveDeleteReplay(ctx, resp, req) - return case "Playback": s.servePlayback(ctx, resp, req) return @@ -718,6 +816,12 @@ func (s *replayServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { case "Close": s.serveClose(ctx, resp, req) return + case "Export": + s.serveExport(ctx, resp, req) + return + case "DeleteReplay": + s.serveDeleteReplay(ctx, resp, req) + return default: msg := fmt.Sprintf("no handler for path %q", req.URL.Path) s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) @@ -905,7 +1009,7 @@ func (s *replayServer) serveListReplaysProtobuf(ctx context.Context, resp http.R callResponseSent(ctx, s.hooks) } -func (s *replayServer) serveDeleteReplay(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) servePlayback(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -913,9 +1017,9 @@ func (s *replayServer) serveDeleteReplay(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveDeleteReplayJSON(ctx, resp, req) + s.servePlaybackJSON(ctx, resp, req) case "application/protobuf": - s.serveDeleteReplayProtobuf(ctx, resp, req) + s.servePlaybackProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -923,9 +1027,9 @@ func (s *replayServer) serveDeleteReplay(ctx context.Context, resp http.Response } } -func (s *replayServer) serveDeleteReplayJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) servePlaybackJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") + ctx = ctxsetters.WithMethodName(ctx, "Playback") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -938,29 +1042,29 @@ func (s *replayServer) serveDeleteReplayJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(DeleteReplayRequest) + reqContent := new(PlaybackRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Replay.DeleteReplay + handler := s.Replay.Playback if s.interceptor != nil { - handler = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + handler = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*DeleteReplayRequest) + typedReq, ok := req.(*PlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") } - return s.Replay.DeleteReplay(ctx, typedReq) + return s.Replay.Playback(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*google_protobuf.Empty) + typedResp, ok := resp.(*PlaybackResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") } return typedResp, err } @@ -969,7 +1073,7 @@ func (s *replayServer) serveDeleteReplayJSON(ctx context.Context, resp http.Resp } // Call service method - var respContent *google_protobuf.Empty + var respContent *PlaybackResponse func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -980,7 +1084,7 @@ func (s *replayServer) serveDeleteReplayJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling DeleteReplay. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *PlaybackResponse and nil error while calling Playback. nil responses are not supported")) return } @@ -1006,9 +1110,9 @@ func (s *replayServer) serveDeleteReplayJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *replayServer) serveDeleteReplayProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) servePlaybackProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") + ctx = ctxsetters.WithMethodName(ctx, "Playback") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1020,28 +1124,28 @@ func (s *replayServer) serveDeleteReplayProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(DeleteReplayRequest) + reqContent := new(PlaybackRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Replay.DeleteReplay + handler := s.Replay.Playback if s.interceptor != nil { - handler = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + handler = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*DeleteReplayRequest) + typedReq, ok := req.(*PlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") } - return s.Replay.DeleteReplay(ctx, typedReq) + return s.Replay.Playback(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*google_protobuf.Empty) + typedResp, ok := resp.(*PlaybackResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") } return typedResp, err } @@ -1050,7 +1154,7 @@ func (s *replayServer) serveDeleteReplayProtobuf(ctx context.Context, resp http. } // Call service method - var respContent *google_protobuf.Empty + var respContent *PlaybackResponse func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1061,7 +1165,7 @@ func (s *replayServer) serveDeleteReplayProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling DeleteReplay. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *PlaybackResponse and nil error while calling Playback. nil responses are not supported")) return } @@ -1085,7 +1189,7 @@ func (s *replayServer) serveDeleteReplayProtobuf(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *replayServer) servePlayback(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveSeek(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1093,9 +1197,9 @@ func (s *replayServer) servePlayback(ctx context.Context, resp http.ResponseWrit } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.servePlaybackJSON(ctx, resp, req) + s.serveSeekJSON(ctx, resp, req) case "application/protobuf": - s.servePlaybackProtobuf(ctx, resp, req) + s.serveSeekProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1103,9 +1207,9 @@ func (s *replayServer) servePlayback(ctx context.Context, resp http.ResponseWrit } } -func (s *replayServer) servePlaybackJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveSeekJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "Playback") + ctx = ctxsetters.WithMethodName(ctx, "Seek") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1118,29 +1222,29 @@ func (s *replayServer) servePlaybackJSON(ctx context.Context, resp http.Response s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(PlaybackRequest) + reqContent := new(SeekRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Replay.Playback + handler := s.Replay.Seek if s.interceptor != nil { - handler = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { + handler = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*PlaybackRequest) + typedReq, ok := req.(*SeekRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") } - return s.Replay.Playback(ctx, typedReq) + return s.Replay.Seek(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*PlaybackResponse) + typedResp, ok := resp.(*google_protobuf.Empty) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") } return typedResp, err } @@ -1149,7 +1253,7 @@ func (s *replayServer) servePlaybackJSON(ctx context.Context, resp http.Response } // Call service method - var respContent *PlaybackResponse + var respContent *google_protobuf.Empty func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1160,7 +1264,7 @@ func (s *replayServer) servePlaybackJSON(ctx context.Context, resp http.Response return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *PlaybackResponse and nil error while calling Playback. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Seek. nil responses are not supported")) return } @@ -1186,9 +1290,9 @@ func (s *replayServer) servePlaybackJSON(ctx context.Context, resp http.Response callResponseSent(ctx, s.hooks) } -func (s *replayServer) servePlaybackProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveSeekProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "Playback") + ctx = ctxsetters.WithMethodName(ctx, "Seek") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1200,28 +1304,28 @@ func (s *replayServer) servePlaybackProtobuf(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(PlaybackRequest) + reqContent := new(SeekRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Replay.Playback + handler := s.Replay.Seek if s.interceptor != nil { - handler = func(ctx context.Context, req *PlaybackRequest) (*PlaybackResponse, error) { + handler = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*PlaybackRequest) + typedReq, ok := req.(*SeekRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*PlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") } - return s.Replay.Playback(ctx, typedReq) + return s.Replay.Seek(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*PlaybackResponse) + typedResp, ok := resp.(*google_protobuf.Empty) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*PlaybackResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*google_protobuf.Empty) when calling interceptor") } return typedResp, err } @@ -1230,7 +1334,7 @@ func (s *replayServer) servePlaybackProtobuf(ctx context.Context, resp http.Resp } // Call service method - var respContent *PlaybackResponse + var respContent *google_protobuf.Empty func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1241,7 +1345,7 @@ func (s *replayServer) servePlaybackProtobuf(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *PlaybackResponse and nil error while calling Playback. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Seek. nil responses are not supported")) return } @@ -1265,7 +1369,7 @@ func (s *replayServer) servePlaybackProtobuf(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *replayServer) serveSeek(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveClose(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1273,9 +1377,9 @@ func (s *replayServer) serveSeek(ctx context.Context, resp http.ResponseWriter, } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveSeekJSON(ctx, resp, req) + s.serveCloseJSON(ctx, resp, req) case "application/protobuf": - s.serveSeekProtobuf(ctx, resp, req) + s.serveCloseProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1283,9 +1387,9 @@ func (s *replayServer) serveSeek(ctx context.Context, resp http.ResponseWriter, } } -func (s *replayServer) serveSeekJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveCloseJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "Seek") + ctx = ctxsetters.WithMethodName(ctx, "Close") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1298,23 +1402,23 @@ func (s *replayServer) serveSeekJSON(ctx context.Context, resp http.ResponseWrit s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(SeekRequest) + reqContent := new(ClosePlaybackRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Replay.Seek + handler := s.Replay.Close if s.interceptor != nil { - handler = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { + handler = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*SeekRequest) + typedReq, ok := req.(*ClosePlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") } - return s.Replay.Seek(ctx, typedReq) + return s.Replay.Close(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1340,7 +1444,7 @@ func (s *replayServer) serveSeekJSON(ctx context.Context, resp http.ResponseWrit return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Seek. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Close. nil responses are not supported")) return } @@ -1366,9 +1470,9 @@ func (s *replayServer) serveSeekJSON(ctx context.Context, resp http.ResponseWrit callResponseSent(ctx, s.hooks) } -func (s *replayServer) serveSeekProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveCloseProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "Seek") + ctx = ctxsetters.WithMethodName(ctx, "Close") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1380,22 +1484,22 @@ func (s *replayServer) serveSeekProtobuf(ctx context.Context, resp http.Response s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(SeekRequest) + reqContent := new(ClosePlaybackRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Replay.Seek + handler := s.Replay.Close if s.interceptor != nil { - handler = func(ctx context.Context, req *SeekRequest) (*google_protobuf.Empty, error) { + handler = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*SeekRequest) + typedReq, ok := req.(*ClosePlaybackRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*SeekRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") } - return s.Replay.Seek(ctx, typedReq) + return s.Replay.Close(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1421,7 +1525,7 @@ func (s *replayServer) serveSeekProtobuf(ctx context.Context, resp http.Response return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Seek. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Close. nil responses are not supported")) return } @@ -1445,7 +1549,7 @@ func (s *replayServer) serveSeekProtobuf(ctx context.Context, resp http.Response callResponseSent(ctx, s.hooks) } -func (s *replayServer) serveClose(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveExport(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1453,9 +1557,9 @@ func (s *replayServer) serveClose(ctx context.Context, resp http.ResponseWriter, } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveCloseJSON(ctx, resp, req) + s.serveExportJSON(ctx, resp, req) case "application/protobuf": - s.serveCloseProtobuf(ctx, resp, req) + s.serveExportProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1463,9 +1567,9 @@ func (s *replayServer) serveClose(ctx context.Context, resp http.ResponseWriter, } } -func (s *replayServer) serveCloseJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveExportJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "Close") + ctx = ctxsetters.WithMethodName(ctx, "Export") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1478,23 +1582,203 @@ func (s *replayServer) serveCloseJSON(ctx context.Context, resp http.ResponseWri s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ClosePlaybackRequest) + reqContent := new(livekit2.ExportReplayRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Replay.Close + handler := s.Replay.Export if s.interceptor != nil { - handler = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { + handler = func(ctx context.Context, req *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ClosePlaybackRequest) + typedReq, ok := req.(*livekit2.ExportReplayRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*livekit2.ExportReplayRequest) when calling interceptor") } - return s.Replay.Close(ctx, typedReq) + return s.Replay.Export(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*livekit2.EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*livekit2.EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *livekit2.EgressInfo + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *livekit2.EgressInfo and nil error while calling Export. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + marshaler := &protojson.MarshalOptions{UseProtoNames: !s.jsonCamelCase, EmitUnpopulated: !s.jsonSkipDefaults} + respBytes, err := marshaler.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/json") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *replayServer) serveExportProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "Export") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + buf, err := io.ReadAll(req.Body) + if err != nil { + s.handleRequestBodyError(ctx, resp, "failed to read request body", err) + return + } + reqContent := new(livekit2.ExportReplayRequest) + if err = proto.Unmarshal(buf, reqContent); err != nil { + s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) + return + } + + handler := s.Replay.Export + if s.interceptor != nil { + handler = func(ctx context.Context, req *livekit2.ExportReplayRequest) (*livekit2.EgressInfo, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*livekit2.ExportReplayRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*livekit2.ExportReplayRequest) when calling interceptor") + } + return s.Replay.Export(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*livekit2.EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*livekit2.EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *livekit2.EgressInfo + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *livekit2.EgressInfo and nil error while calling Export. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + respBytes, err := proto.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/protobuf") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *replayServer) serveDeleteReplay(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + header := req.Header.Get("Content-Type") + i := strings.Index(header, ";") + if i == -1 { + i = len(header) + } + switch strings.TrimSpace(strings.ToLower(header[:i])) { + case "application/json": + s.serveDeleteReplayJSON(ctx, resp, req) + case "application/protobuf": + s.serveDeleteReplayProtobuf(ctx, resp, req) + default: + msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) + twerr := badRouteError(msg, req.Method, req.URL.Path) + s.writeError(ctx, resp, twerr) + } +} + +func (s *replayServer) serveDeleteReplayJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + d := json.NewDecoder(req.Body) + rawReqBody := json.RawMessage{} + if err := d.Decode(&rawReqBody); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + reqContent := new(DeleteReplayRequest) + unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} + if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + + handler := s.Replay.DeleteReplay + if s.interceptor != nil { + handler = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DeleteReplayRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") + } + return s.Replay.DeleteReplay(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1520,7 +1804,7 @@ func (s *replayServer) serveCloseJSON(ctx context.Context, resp http.ResponseWri return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Close. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling DeleteReplay. nil responses are not supported")) return } @@ -1546,9 +1830,9 @@ func (s *replayServer) serveCloseJSON(ctx context.Context, resp http.ResponseWri callResponseSent(ctx, s.hooks) } -func (s *replayServer) serveCloseProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *replayServer) serveDeleteReplayProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "Close") + ctx = ctxsetters.WithMethodName(ctx, "DeleteReplay") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1560,22 +1844,22 @@ func (s *replayServer) serveCloseProtobuf(ctx context.Context, resp http.Respons s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ClosePlaybackRequest) + reqContent := new(DeleteReplayRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Replay.Close + handler := s.Replay.DeleteReplay if s.interceptor != nil { - handler = func(ctx context.Context, req *ClosePlaybackRequest) (*google_protobuf.Empty, error) { + handler = func(ctx context.Context, req *DeleteReplayRequest) (*google_protobuf.Empty, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ClosePlaybackRequest) + typedReq, ok := req.(*DeleteReplayRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ClosePlaybackRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*DeleteReplayRequest) when calling interceptor") } - return s.Replay.Close(ctx, typedReq) + return s.Replay.DeleteReplay(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1601,7 +1885,7 @@ func (s *replayServer) serveCloseProtobuf(ctx context.Context, resp http.Respons return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling Close. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *google_protobuf.Empty and nil error while calling DeleteReplay. nil responses are not supported")) return } @@ -2206,41 +2490,44 @@ func callClientError(ctx context.Context, h *twirp.ClientHooks, err twirp.Error) } var twirpFileDescriptor0 = []byte{ - // 574 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcf, 0x6e, 0xd3, 0x4e, - 0x10, 0x96, 0xdd, 0xfe, 0xfa, 0x4b, 0xc6, 0x49, 0x8b, 0x36, 0x15, 0x58, 0x0e, 0x88, 0xc8, 0x5c, - 0x82, 0x14, 0xd9, 0x52, 0x7a, 0x40, 0xaa, 0x84, 0x54, 0x35, 0x29, 0x28, 0xa2, 0x82, 0xc8, 0xf4, - 0xc4, 0xc5, 0x72, 0xe2, 0x89, 0x31, 0xb1, 0xbd, 0xc6, 0xde, 0x54, 0xf4, 0x8a, 0xc4, 0x99, 0x7b, - 0x1f, 0x81, 0x27, 0xe1, 0x59, 0x50, 0x1f, 0x02, 0xd9, 0xbb, 0xeb, 0xa4, 0x49, 0x40, 0xe4, 0xe6, - 0xfd, 0xe6, 0xdf, 0xf7, 0xcd, 0x8c, 0x07, 0xc8, 0x34, 0xa2, 0x0b, 0xdf, 0xcd, 0x30, 0x8d, 0xbc, - 0x1b, 0x2b, 0xcd, 0x28, 0xa3, 0xe4, 0x80, 0xbf, 0x8c, 0x76, 0x40, 0x69, 0x10, 0xa1, 0x5d, 0xa2, - 0x93, 0xc5, 0xcc, 0xc6, 0x38, 0x65, 0xc2, 0xc9, 0x38, 0x8e, 0xc2, 0x6b, 0x9c, 0x87, 0xcc, 0x8d, - 0xa9, 0x8f, 0x51, 0x5e, 0xa1, 0x34, 0x08, 0x30, 0xb3, 0x69, 0xca, 0x42, 0x9a, 0x08, 0xd4, 0xfc, - 0x04, 0xe4, 0x32, 0xcc, 0x99, 0x53, 0xa6, 0xcd, 0x1d, 0xfc, 0xbc, 0xc0, 0x9c, 0x91, 0x36, 0xd4, - 0x33, 0x4a, 0x63, 0x37, 0xf1, 0x62, 0xd4, 0x95, 0x8e, 0xd2, 0xad, 0x3b, 0xb5, 0x02, 0x78, 0xeb, - 0xc5, 0x48, 0x5e, 0x00, 0xa4, 0x5e, 0x80, 0x2e, 0xa3, 0x73, 0x4c, 0x74, 0xb5, 0xa3, 0x74, 0xb5, - 0xbe, 0x6e, 0x89, 0x9a, 0xd6, 0x55, 0x81, 0x8e, 0xbd, 0x20, 0x4c, 0xbc, 0xa2, 0x8e, 0x53, 0x2f, - 0x7c, 0x4b, 0xd0, 0xfc, 0xa6, 0x40, 0xeb, 0x5e, 0xb1, 0x3c, 0xa5, 0x49, 0x8e, 0xa4, 0x07, 0xff, - 0x73, 0x59, 0xb9, 0xae, 0x74, 0xf6, 0xba, 0x5a, 0x9f, 0x58, 0x42, 0x34, 0xf7, 0x1c, 0x25, 0x33, - 0xea, 0x48, 0x17, 0x72, 0x06, 0x47, 0x09, 0x7e, 0x61, 0xee, 0x0e, 0x1c, 0x9a, 0x45, 0xc0, 0xb8, - 0xe2, 0xf1, 0x5d, 0x01, 0x58, 0x66, 0x26, 0xcf, 0xa1, 0xce, 0x73, 0xbb, 0xa1, 0xcf, 0xc5, 0x9e, - 0x37, 0x6e, 0xef, 0x7a, 0x35, 0x0e, 0x8e, 0x86, 0x8e, 0xfc, 0xf2, 0xef, 0xf7, 0x45, 0x5d, 0xeb, - 0xcb, 0x13, 0x80, 0x9c, 0x79, 0x19, 0x73, 0x59, 0x18, 0xa3, 0xbe, 0xd7, 0x51, 0xba, 0x7b, 0x4e, - 0xbd, 0x44, 0xae, 0xc2, 0x18, 0x89, 0x01, 0x35, 0x7f, 0x91, 0x95, 0x84, 0xf4, 0xfd, 0xd2, 0x58, - 0xbd, 0xcd, 0x33, 0x68, 0x0d, 0x31, 0x42, 0x86, 0x9c, 0x96, 0x1c, 0xc3, 0xbf, 0x33, 0x33, 0xbf, - 0x2a, 0x70, 0x34, 0x8e, 0xbc, 0x9b, 0x89, 0x37, 0x9d, 0xef, 0x1e, 0x4e, 0x9e, 0x41, 0x33, 0x15, - 0xd1, 0x6e, 0x21, 0x48, 0x88, 0x6b, 0x48, 0xd0, 0xa1, 0x34, 0x26, 0x4f, 0x41, 0xcb, 0x11, 0xe7, - 0x2e, 0x9d, 0xcd, 0x72, 0x64, 0x42, 0x21, 0x14, 0xd0, 0xbb, 0x12, 0x31, 0x07, 0xf0, 0x60, 0xc9, - 0x41, 0x0c, 0xd7, 0x06, 0xad, 0xca, 0x5c, 0xd1, 0x38, 0xbc, 0xbd, 0xeb, 0x81, 0x84, 0x47, 0x43, - 0x67, 0xf9, 0xed, 0x9b, 0x2e, 0x68, 0xef, 0x11, 0x2b, 0x11, 0xbb, 0xc6, 0xaf, 0xb3, 0x54, 0x37, - 0x58, 0xbe, 0x86, 0xe3, 0x41, 0x44, 0x73, 0x5c, 0x6f, 0xd7, 0xae, 0x95, 0xfa, 0x3f, 0x55, 0x38, - 0xe0, 0x03, 0x23, 0xaf, 0x40, 0x5b, 0xd9, 0x6c, 0x62, 0xc8, 0x05, 0xde, 0xfc, 0xb7, 0x8c, 0xf6, - 0x56, 0x9b, 0xe8, 0xd6, 0x00, 0x1a, 0xab, 0x8b, 0x40, 0x2a, 0xe7, 0x2d, 0xeb, 0x61, 0x3c, 0xb4, - 0xf8, 0x15, 0xb0, 0xe4, 0x15, 0xb0, 0x2e, 0x8a, 0x2b, 0x40, 0x5e, 0x42, 0x4d, 0x6a, 0x23, 0x8f, - 0x64, 0x82, 0x35, 0xb5, 0x86, 0xbe, 0x69, 0x10, 0x1c, 0x4e, 0x60, 0xbf, 0x18, 0x00, 0x69, 0x49, - 0x8f, 0x95, 0x71, 0xfc, 0xa5, 0xe6, 0x7f, 0x65, 0x53, 0xc9, 0x63, 0x19, 0xb5, 0xad, 0xc7, 0x7f, - 0x0a, 0x3f, 0xbf, 0xf8, 0x60, 0x06, 0x21, 0xfb, 0xb8, 0x98, 0x58, 0x53, 0x1a, 0xdb, 0xe2, 0x3f, - 0xe6, 0xd7, 0x6d, 0x4a, 0x23, 0x9b, 0xa7, 0xfc, 0xa1, 0x36, 0x2f, 0xc3, 0x6b, 0x7c, 0x13, 0x32, - 0x6b, 0x5c, 0x58, 0x7e, 0xa9, 0x87, 0xe2, 0x7d, 0x7a, 0x5a, 0x02, 0x93, 0x83, 0x32, 0xe2, 0xe4, - 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x8a, 0x6d, 0xf2, 0x3b, 0x05, 0x00, 0x00, + // 611 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdd, 0x4e, 0xdb, 0x4c, + 0x10, 0x95, 0x13, 0xbe, 0x7c, 0x64, 0x1c, 0xa0, 0xda, 0xa0, 0xd6, 0x32, 0x54, 0x8d, 0xdc, 0x5e, + 0xa4, 0x12, 0xb2, 0x25, 0xb8, 0xa8, 0x44, 0x85, 0x84, 0xf8, 0x69, 0x15, 0x15, 0xda, 0xc8, 0xe5, + 0xaa, 0x37, 0x96, 0x13, 0x4f, 0x5c, 0x37, 0xb6, 0xd7, 0xf5, 0x6e, 0x10, 0x3c, 0x00, 0xea, 0x0b, + 0xf4, 0x8a, 0x47, 0xe8, 0xa3, 0x55, 0x3c, 0x44, 0xe5, 0x5d, 0xaf, 0xf3, 0x43, 0xb8, 0xc8, 0x9d, + 0x7d, 0x66, 0xce, 0xce, 0x99, 0x33, 0xbb, 0x03, 0x64, 0x18, 0xd3, 0x49, 0xe0, 0xe5, 0x98, 0xc5, + 0xfe, 0xad, 0x9d, 0xe5, 0x94, 0x53, 0xd2, 0x90, 0x7f, 0xe6, 0x4e, 0x48, 0x69, 0x18, 0xa3, 0x23, + 0xd0, 0xc1, 0x64, 0xe4, 0x60, 0x92, 0xf1, 0x32, 0xc9, 0xdc, 0x8e, 0xa3, 0x6b, 0x1c, 0x47, 0xdc, + 0xc3, 0x30, 0x47, 0xc6, 0x16, 0xd1, 0x84, 0x06, 0x18, 0x4f, 0x51, 0x1a, 0x86, 0x98, 0x3b, 0x34, + 0xe3, 0x11, 0x4d, 0x4b, 0xd4, 0xfa, 0x01, 0xe4, 0x22, 0x62, 0xdc, 0x15, 0xc5, 0x98, 0x8b, 0x3f, + 0x27, 0xc8, 0x38, 0xd9, 0x81, 0x66, 0x4e, 0x69, 0xe2, 0xa5, 0x7e, 0x82, 0x86, 0xd6, 0xd1, 0xba, + 0x4d, 0x77, 0xbd, 0x00, 0x3e, 0xfb, 0x09, 0x92, 0x77, 0x00, 0x99, 0x1f, 0xa2, 0xc7, 0xe9, 0x18, + 0x53, 0xa3, 0xd6, 0xd1, 0xba, 0xfa, 0xbe, 0x61, 0x97, 0x35, 0xed, 0xab, 0x02, 0xed, 0xfb, 0x61, + 0x94, 0xfa, 0x45, 0x1d, 0xb7, 0x59, 0xe4, 0x0a, 0xd0, 0xba, 0xd3, 0xa0, 0x3d, 0x57, 0x8c, 0x65, + 0x34, 0x65, 0x48, 0xf6, 0xe0, 0x7f, 0xd9, 0x2c, 0x33, 0xb4, 0x4e, 0xbd, 0xab, 0xef, 0x13, 0xbb, + 0xb4, 0x42, 0x66, 0xf6, 0xd2, 0x11, 0x75, 0x55, 0x0a, 0x39, 0x86, 0xad, 0x14, 0x6f, 0xb8, 0xb7, + 0x82, 0x86, 0x8d, 0x82, 0xd0, 0xaf, 0x74, 0xfc, 0xd6, 0x00, 0xa6, 0x27, 0x93, 0xb7, 0xd0, 0x94, + 0x67, 0x7b, 0x51, 0x20, 0x9b, 0x3d, 0x69, 0xdd, 0x3f, 0xec, 0xad, 0x4b, 0xb0, 0x77, 0xe6, 0xaa, + 0xaf, 0x60, 0xde, 0x97, 0xda, 0x82, 0x2f, 0x2f, 0x01, 0x18, 0xf7, 0x73, 0xee, 0xf1, 0x28, 0x41, + 0xa3, 0xde, 0xd1, 0xba, 0x75, 0xb7, 0x29, 0x90, 0xab, 0x28, 0x41, 0xf2, 0x0a, 0xf4, 0x60, 0x92, + 0x0b, 0x41, 0x5e, 0xc2, 0x8c, 0x35, 0x11, 0x07, 0x05, 0x5d, 0x32, 0xeb, 0x97, 0x06, 0x5b, 0xfd, + 0xd8, 0xbf, 0x1d, 0xf8, 0xc3, 0xb1, 0x1a, 0xc4, 0x0a, 0xda, 0x5e, 0xc3, 0x46, 0x56, 0xb2, 0xbd, + 0x42, 0x53, 0xa9, 0xaf, 0xa5, 0x40, 0x97, 0xd2, 0x84, 0xbc, 0x81, 0x4d, 0x86, 0x38, 0xf6, 0xe8, + 0x68, 0xc4, 0x90, 0x17, 0x3a, 0xa4, 0xce, 0x56, 0x81, 0x7e, 0x11, 0xe0, 0x25, 0xb3, 0x4e, 0xe1, + 0xd9, 0x54, 0x48, 0x39, 0x24, 0x07, 0xf4, 0xea, 0xf8, 0x4a, 0xcb, 0xe6, 0xfd, 0xc3, 0x1e, 0x28, + 0xb8, 0x77, 0xe6, 0x4e, 0xbf, 0x03, 0x2b, 0x00, 0xfd, 0x2b, 0x62, 0xd5, 0xc9, 0xaa, 0xfc, 0x25, + 0x52, 0x6b, 0x4b, 0xa4, 0x7e, 0x84, 0xed, 0xd3, 0x98, 0x32, 0x5c, 0x34, 0x6e, 0x65, 0xb9, 0xc7, + 0xd0, 0x3e, 0xc3, 0x18, 0x39, 0xca, 0x9b, 0xb1, 0xfa, 0x00, 0xf6, 0xef, 0xea, 0xd0, 0x90, 0x64, + 0xf2, 0x01, 0xf4, 0x99, 0x8b, 0x4e, 0x4c, 0x75, 0x9f, 0x1f, 0x3f, 0x35, 0x73, 0x67, 0x69, 0xac, + 0x34, 0xfd, 0x08, 0xd6, 0x55, 0x63, 0xe4, 0x85, 0x4a, 0x5c, 0x68, 0xd5, 0x34, 0x1e, 0x07, 0x4a, + 0xfa, 0x01, 0xac, 0x15, 0x23, 0x20, 0x6d, 0x95, 0x31, 0x33, 0x10, 0xf3, 0xb9, 0x2d, 0x37, 0x8b, + 0xad, 0x36, 0x8b, 0x7d, 0x5e, 0x6c, 0x16, 0x72, 0x04, 0xff, 0x09, 0x47, 0xc9, 0xae, 0x62, 0x2d, + 0x33, 0xf8, 0x49, 0xfa, 0x7b, 0x68, 0x9c, 0xdf, 0x64, 0x34, 0xe7, 0x64, 0xb7, 0x7a, 0x8f, 0x12, + 0x98, 0x33, 0xd6, 0x6c, 0x4f, 0xa3, 0x62, 0x77, 0x89, 0xa7, 0x78, 0x0a, 0xad, 0xd9, 0x21, 0x90, + 0xca, 0x9c, 0x25, 0xa3, 0x79, 0x4a, 0xc1, 0xc9, 0xf9, 0x37, 0x2b, 0x8c, 0xf8, 0xf7, 0xc9, 0xc0, + 0x1e, 0xd2, 0xc4, 0x29, 0xab, 0xc8, 0xfd, 0x39, 0xa4, 0xb1, 0x23, 0x4f, 0xfc, 0x53, 0xdb, 0xb8, + 0x88, 0xae, 0xf1, 0x53, 0xc4, 0xed, 0x7e, 0x11, 0xf9, 0x5b, 0xdb, 0x2c, 0xff, 0x0f, 0x0f, 0x05, + 0x30, 0x68, 0x08, 0xc6, 0xc1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x5e, 0xa3, 0x2b, 0x9d, + 0x05, 0x00, 0x00, } diff --git a/rpc/egress.pb.go b/rpc/egress.pb.go index c9f9225ca..9eac155f9 100644 --- a/rpc/egress.pb.go +++ b/rpc/egress.pb.go @@ -46,6 +46,8 @@ type StartEgressRequest struct { // // Types that are valid to be assigned to Request: // + // *StartEgressRequest_Egress + // *StartEgressRequest_Replay // *StartEgressRequest_RoomComposite // *StartEgressRequest_Web // *StartEgressRequest_Participant @@ -108,6 +110,25 @@ func (x *StartEgressRequest) GetRequest() isStartEgressRequest_Request { return nil } +func (x *StartEgressRequest) GetEgress() *livekit.StartEgressRequest { + if x != nil { + if x, ok := x.Request.(*StartEgressRequest_Egress); ok { + return x.Egress + } + } + return nil +} + +func (x *StartEgressRequest) GetReplay() *livekit.ExportReplayRequest { + if x != nil { + if x, ok := x.Request.(*StartEgressRequest_Replay); ok { + return x.Replay + } + } + return nil +} + +// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetRoomComposite() *livekit.RoomCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_RoomComposite); ok { @@ -117,6 +138,7 @@ func (x *StartEgressRequest) GetRoomComposite() *livekit.RoomCompositeEgressRequ return nil } +// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetWeb() *livekit.WebEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_Web); ok { @@ -126,6 +148,7 @@ func (x *StartEgressRequest) GetWeb() *livekit.WebEgressRequest { return nil } +// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetParticipant() *livekit.ParticipantEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_Participant); ok { @@ -135,6 +158,7 @@ func (x *StartEgressRequest) GetParticipant() *livekit.ParticipantEgressRequest return nil } +// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetTrackComposite() *livekit.TrackCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_TrackComposite); ok { @@ -144,6 +168,7 @@ func (x *StartEgressRequest) GetTrackComposite() *livekit.TrackCompositeEgressRe return nil } +// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetTrack() *livekit.TrackEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_Track); ok { @@ -199,26 +224,45 @@ type isStartEgressRequest_Request interface { isStartEgressRequest_Request() } +type StartEgressRequest_Egress struct { + Egress *livekit.StartEgressRequest `protobuf:"bytes,16,opt,name=egress,proto3,oneof"` +} + +type StartEgressRequest_Replay struct { + Replay *livekit.ExportReplayRequest `protobuf:"bytes,17,opt,name=replay,proto3,oneof"` +} + type StartEgressRequest_RoomComposite struct { + // --- deprecated --- + // + // Deprecated: Marked as deprecated in rpc/egress.proto. RoomComposite *livekit.RoomCompositeEgressRequest `protobuf:"bytes,5,opt,name=room_composite,json=roomComposite,proto3,oneof"` } type StartEgressRequest_Web struct { + // Deprecated: Marked as deprecated in rpc/egress.proto. Web *livekit.WebEgressRequest `protobuf:"bytes,11,opt,name=web,proto3,oneof"` } type StartEgressRequest_Participant struct { + // Deprecated: Marked as deprecated in rpc/egress.proto. Participant *livekit.ParticipantEgressRequest `protobuf:"bytes,13,opt,name=participant,proto3,oneof"` } type StartEgressRequest_TrackComposite struct { + // Deprecated: Marked as deprecated in rpc/egress.proto. TrackComposite *livekit.TrackCompositeEgressRequest `protobuf:"bytes,6,opt,name=track_composite,json=trackComposite,proto3,oneof"` } type StartEgressRequest_Track struct { + // Deprecated: Marked as deprecated in rpc/egress.proto. Track *livekit.TrackEgressRequest `protobuf:"bytes,7,opt,name=track,proto3,oneof"` } +func (*StartEgressRequest_Egress) isStartEgressRequest_Request() {} + +func (*StartEgressRequest_Replay) isStartEgressRequest_Request() {} + func (*StartEgressRequest_RoomComposite) isStartEgressRequest_Request() {} func (*StartEgressRequest_Web) isStartEgressRequest_Request() {} @@ -313,14 +357,16 @@ var File_rpc_egress_proto protoreflect.FileDescriptor const file_rpc_egress_proto_rawDesc = "" + "\n" + - "\x10rpc/egress.proto\x12\x03rpc\x1a\roptions.proto\x1a\x14logger/options.proto\x1a\x14livekit_egress.proto\"\xe4\x04\n" + + "\x10rpc/egress.proto\x12\x03rpc\x1a\roptions.proto\x1a\x14logger/options.proto\x1a\x14livekit_egress.proto\"\xe7\x05\n" + "\x12StartEgressRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12L\n" + - "\x0eroom_composite\x18\x05 \x01(\v2#.livekit.RoomCompositeEgressRequestH\x00R\rroomComposite\x12-\n" + - "\x03web\x18\v \x01(\v2\x19.livekit.WebEgressRequestH\x00R\x03web\x12E\n" + - "\vparticipant\x18\r \x01(\v2!.livekit.ParticipantEgressRequestH\x00R\vparticipant\x12O\n" + - "\x0ftrack_composite\x18\x06 \x01(\v2$.livekit.TrackCompositeEgressRequestH\x00R\x0etrackComposite\x123\n" + - "\x05track\x18\a \x01(\v2\x1b.livekit.TrackEgressRequestH\x00R\x05track\x12#\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x125\n" + + "\x06egress\x18\x10 \x01(\v2\x1b.livekit.StartEgressRequestH\x00R\x06egress\x126\n" + + "\x06replay\x18\x11 \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12P\n" + + "\x0eroom_composite\x18\x05 \x01(\v2#.livekit.RoomCompositeEgressRequestB\x02\x18\x01H\x00R\rroomComposite\x121\n" + + "\x03web\x18\v \x01(\v2\x19.livekit.WebEgressRequestB\x02\x18\x01H\x00R\x03web\x12I\n" + + "\vparticipant\x18\r \x01(\v2!.livekit.ParticipantEgressRequestB\x02\x18\x01H\x00R\vparticipant\x12S\n" + + "\x0ftrack_composite\x18\x06 \x01(\v2$.livekit.TrackCompositeEgressRequestB\x02\x18\x01H\x00R\x0etrackComposite\x127\n" + + "\x05track\x18\a \x01(\v2\x1b.livekit.TrackEgressRequestB\x02\x18\x01H\x00R\x05track\x12#\n" + "\aroom_id\x18\x03 \x01(\tB\n" + "\x9a\xec,\x06roomIDR\x06roomId\x12\x1a\n" + "\x05token\x18\b \x01(\tB\x04\x88\xec,\x01R\x05token\x12\x15\n" + @@ -360,34 +406,38 @@ var file_rpc_egress_proto_goTypes = []any{ (*StartEgressRequest)(nil), // 0: rpc.StartEgressRequest (*ListActiveEgressRequest)(nil), // 1: rpc.ListActiveEgressRequest (*ListActiveEgressResponse)(nil), // 2: rpc.ListActiveEgressResponse - (*livekit.RoomCompositeEgressRequest)(nil), // 3: livekit.RoomCompositeEgressRequest - (*livekit.WebEgressRequest)(nil), // 4: livekit.WebEgressRequest - (*livekit.ParticipantEgressRequest)(nil), // 5: livekit.ParticipantEgressRequest - (*livekit.TrackCompositeEgressRequest)(nil), // 6: livekit.TrackCompositeEgressRequest - (*livekit.TrackEgressRequest)(nil), // 7: livekit.TrackEgressRequest - (*livekit.UpdateStreamRequest)(nil), // 8: livekit.UpdateStreamRequest - (*livekit.StopEgressRequest)(nil), // 9: livekit.StopEgressRequest - (*livekit.EgressInfo)(nil), // 10: livekit.EgressInfo + (*livekit.StartEgressRequest)(nil), // 3: livekit.StartEgressRequest + (*livekit.ExportReplayRequest)(nil), // 4: livekit.ExportReplayRequest + (*livekit.RoomCompositeEgressRequest)(nil), // 5: livekit.RoomCompositeEgressRequest + (*livekit.WebEgressRequest)(nil), // 6: livekit.WebEgressRequest + (*livekit.ParticipantEgressRequest)(nil), // 7: livekit.ParticipantEgressRequest + (*livekit.TrackCompositeEgressRequest)(nil), // 8: livekit.TrackCompositeEgressRequest + (*livekit.TrackEgressRequest)(nil), // 9: livekit.TrackEgressRequest + (*livekit.UpdateStreamRequest)(nil), // 10: livekit.UpdateStreamRequest + (*livekit.StopEgressRequest)(nil), // 11: livekit.StopEgressRequest + (*livekit.EgressInfo)(nil), // 12: livekit.EgressInfo } var file_rpc_egress_proto_depIdxs = []int32{ - 3, // 0: rpc.StartEgressRequest.room_composite:type_name -> livekit.RoomCompositeEgressRequest - 4, // 1: rpc.StartEgressRequest.web:type_name -> livekit.WebEgressRequest - 5, // 2: rpc.StartEgressRequest.participant:type_name -> livekit.ParticipantEgressRequest - 6, // 3: rpc.StartEgressRequest.track_composite:type_name -> livekit.TrackCompositeEgressRequest - 7, // 4: rpc.StartEgressRequest.track:type_name -> livekit.TrackEgressRequest - 0, // 5: rpc.EgressInternal.StartEgress:input_type -> rpc.StartEgressRequest - 1, // 6: rpc.EgressInternal.ListActiveEgress:input_type -> rpc.ListActiveEgressRequest - 8, // 7: rpc.EgressHandler.UpdateStream:input_type -> livekit.UpdateStreamRequest - 9, // 8: rpc.EgressHandler.StopEgress:input_type -> livekit.StopEgressRequest - 10, // 9: rpc.EgressInternal.StartEgress:output_type -> livekit.EgressInfo - 2, // 10: rpc.EgressInternal.ListActiveEgress:output_type -> rpc.ListActiveEgressResponse - 10, // 11: rpc.EgressHandler.UpdateStream:output_type -> livekit.EgressInfo - 10, // 12: rpc.EgressHandler.StopEgress:output_type -> livekit.EgressInfo - 9, // [9:13] is the sub-list for method output_type - 5, // [5:9] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 3, // 0: rpc.StartEgressRequest.egress:type_name -> livekit.StartEgressRequest + 4, // 1: rpc.StartEgressRequest.replay:type_name -> livekit.ExportReplayRequest + 5, // 2: rpc.StartEgressRequest.room_composite:type_name -> livekit.RoomCompositeEgressRequest + 6, // 3: rpc.StartEgressRequest.web:type_name -> livekit.WebEgressRequest + 7, // 4: rpc.StartEgressRequest.participant:type_name -> livekit.ParticipantEgressRequest + 8, // 5: rpc.StartEgressRequest.track_composite:type_name -> livekit.TrackCompositeEgressRequest + 9, // 6: rpc.StartEgressRequest.track:type_name -> livekit.TrackEgressRequest + 0, // 7: rpc.EgressInternal.StartEgress:input_type -> rpc.StartEgressRequest + 1, // 8: rpc.EgressInternal.ListActiveEgress:input_type -> rpc.ListActiveEgressRequest + 10, // 9: rpc.EgressHandler.UpdateStream:input_type -> livekit.UpdateStreamRequest + 11, // 10: rpc.EgressHandler.StopEgress:input_type -> livekit.StopEgressRequest + 12, // 11: rpc.EgressInternal.StartEgress:output_type -> livekit.EgressInfo + 2, // 12: rpc.EgressInternal.ListActiveEgress:output_type -> rpc.ListActiveEgressResponse + 12, // 13: rpc.EgressHandler.UpdateStream:output_type -> livekit.EgressInfo + 12, // 14: rpc.EgressHandler.StopEgress:output_type -> livekit.EgressInfo + 11, // [11:15] is the sub-list for method output_type + 7, // [7:11] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_rpc_egress_proto_init() } @@ -396,6 +446,8 @@ func file_rpc_egress_proto_init() { return } file_rpc_egress_proto_msgTypes[0].OneofWrappers = []any{ + (*StartEgressRequest_Egress)(nil), + (*StartEgressRequest_Replay)(nil), (*StartEgressRequest_RoomComposite)(nil), (*StartEgressRequest_Web)(nil), (*StartEgressRequest_Participant)(nil), diff --git a/rpc/egress.psrpc.go b/rpc/egress.psrpc.go index 582e894f5..67275f9a3 100644 --- a/rpc/egress.psrpc.go +++ b/rpc/egress.psrpc.go @@ -312,43 +312,46 @@ func (UnimplementedEgressHandlerServer) StopEgress(context.Context, *livekit4.St } var psrpcFileDescriptor2 = []byte{ - // 601 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xd1, 0x4e, 0xdb, 0x30, - 0x14, 0x86, 0x67, 0x4a, 0x0b, 0x3d, 0xa5, 0xa5, 0xf2, 0x98, 0x30, 0x1d, 0x88, 0x52, 0x76, 0x91, - 0x49, 0xac, 0x45, 0x70, 0xb5, 0xbb, 0xad, 0x50, 0x8d, 0x4a, 0x48, 0x9b, 0xc2, 0xd0, 0xa4, 0xed, - 0x22, 0x4a, 0x1d, 0xaf, 0xb3, 0x9a, 0xc4, 0x9e, 0xed, 0x80, 0xf6, 0x06, 0xe3, 0x15, 0xb8, 0xdb, - 0x2b, 0x70, 0xb1, 0x27, 0xda, 0x25, 0x0f, 0x31, 0xd5, 0x69, 0x43, 0x5a, 0xd4, 0x69, 0x57, 0x6d, - 0xfe, 0xef, 0xfc, 0xbf, 0xcf, 0x71, 0x8e, 0x02, 0x75, 0x25, 0x69, 0x87, 0x0d, 0x15, 0xd3, 0xba, - 0x2d, 0x95, 0x30, 0x02, 0x17, 0x94, 0xa4, 0x8d, 0xaa, 0x90, 0x86, 0x8b, 0x78, 0xa2, 0x35, 0x36, - 0x42, 0x31, 0x1c, 0x32, 0xd5, 0x99, 0x57, 0xf9, 0x15, 0x1b, 0x71, 0xe3, 0xe5, 0xfd, 0xad, 0x3f, - 0xcb, 0x80, 0x2f, 0x8c, 0xaf, 0x4c, 0xcf, 0xaa, 0x2e, 0xfb, 0x9e, 0x30, 0x6d, 0xf0, 0x4b, 0x28, - 0xa7, 0x65, 0x1e, 0x0f, 0x08, 0x6a, 0x22, 0xa7, 0xdc, 0x5d, 0xbb, 0xbd, 0x3f, 0x58, 0x4d, 0xc5, - 0xfe, 0xa9, 0x3b, 0xfd, 0x17, 0xe0, 0x73, 0xa8, 0x29, 0x21, 0x22, 0x8f, 0x8a, 0x48, 0x0a, 0xcd, - 0x0d, 0x23, 0xc5, 0x26, 0x72, 0x2a, 0x47, 0xfb, 0xed, 0xc9, 0x81, 0x6d, 0x57, 0x88, 0xe8, 0x64, - 0x4a, 0x67, 0xce, 0x39, 0x7b, 0xe2, 0x56, 0x55, 0x9e, 0xe2, 0x57, 0x50, 0xb8, 0x66, 0x03, 0x52, - 0xb1, 0x11, 0x5b, 0x59, 0xc4, 0x27, 0x36, 0x98, 0x37, 0x8e, 0xeb, 0x70, 0x0f, 0x2a, 0xd2, 0x57, - 0x86, 0x53, 0x2e, 0xfd, 0xd8, 0x90, 0xaa, 0xb5, 0xed, 0x65, 0xb6, 0x0f, 0x0f, 0x6c, 0xde, 0x9e, - 0xf7, 0xe1, 0xf7, 0xb0, 0x6e, 0x94, 0x4f, 0x47, 0xb9, 0x21, 0x4a, 0x36, 0xea, 0x45, 0x16, 0xf5, - 0x71, 0xcc, 0x17, 0x4e, 0x51, 0x33, 0x33, 0x18, 0x1f, 0x43, 0xd1, 0x2a, 0x64, 0xc5, 0xc6, 0x3c, - 0x9f, 0x8d, 0x99, 0x77, 0xa7, 0xb5, 0x78, 0x1f, 0x56, 0xec, 0x4d, 0xf2, 0x80, 0x14, 0xec, 0x95, - 0xc3, 0xed, 0xfd, 0x41, 0x69, 0x2c, 0xf5, 0x4f, 0xdd, 0xf4, 0x37, 0xc0, 0x0d, 0x28, 0x1a, 0x31, - 0x62, 0x31, 0x59, 0xb5, 0x25, 0xcb, 0x3f, 0xef, 0x0f, 0x90, 0x9b, 0x4a, 0xf8, 0x19, 0x94, 0xae, - 0xb5, 0x97, 0xa8, 0x90, 0x94, 0xc7, 0xd0, 0x2d, 0x5e, 0xeb, 0x4b, 0x15, 0xe2, 0x43, 0xd8, 0xa0, - 0xa1, 0x48, 0x02, 0x6f, 0xe0, 0xd3, 0x51, 0x22, 0x3d, 0x16, 0xfb, 0x83, 0x90, 0x05, 0x04, 0x9a, - 0xc8, 0x59, 0x75, 0xb1, 0x65, 0x5d, 0x8b, 0x7a, 0x29, 0xc1, 0xfb, 0x50, 0x65, 0xda, 0xf0, 0xc8, - 0x37, 0x2c, 0xf0, 0xa8, 0x4c, 0x48, 0xad, 0x89, 0x1c, 0xe4, 0xae, 0x65, 0xe2, 0x89, 0x4c, 0xf0, - 0x2e, 0x54, 0x14, 0x33, 0xea, 0x87, 0x47, 0x45, 0x12, 0x1b, 0xb2, 0xde, 0x44, 0x4e, 0xd1, 0x05, - 0x2b, 0x9d, 0x8c, 0x95, 0x6e, 0x19, 0x56, 0x54, 0x3a, 0x63, 0x6b, 0x0b, 0x36, 0xcf, 0xb9, 0x36, - 0x6f, 0xa9, 0xe1, 0x57, 0xb3, 0x97, 0xd7, 0x7a, 0x0d, 0xe4, 0x31, 0xd2, 0x52, 0xc4, 0x9a, 0xe1, - 0x1d, 0x80, 0x6c, 0x0d, 0x35, 0x41, 0xcd, 0x82, 0x53, 0x76, 0xcb, 0xd3, 0xcd, 0xd3, 0x47, 0xbf, - 0x11, 0xd4, 0x52, 0x47, 0x3f, 0x36, 0x4c, 0xc5, 0x7e, 0x88, 0xdf, 0x41, 0x25, 0xb7, 0xce, 0x78, - 0xb3, 0xad, 0x24, 0x6d, 0x3f, 0x5e, 0xf0, 0xc6, 0xd3, 0xec, 0x8d, 0x4c, 0x03, 0xbe, 0x8a, 0x16, - 0xdc, 0xdd, 0xa0, 0x52, 0x1d, 0xbd, 0x41, 0x87, 0x08, 0x7f, 0x81, 0xfa, 0x7c, 0x5b, 0x78, 0xdb, - 0xa6, 0x2d, 0x18, 0xa4, 0xb1, 0xb3, 0x80, 0xa6, 0xb3, 0x64, 0xe1, 0x4b, 0x0e, 0x3a, 0xfa, 0x85, - 0xa0, 0x9a, 0xe2, 0x33, 0x3f, 0x0e, 0x42, 0xa6, 0x70, 0x1f, 0xd6, 0x2e, 0x65, 0xe0, 0x1b, 0x76, - 0x61, 0x14, 0xf3, 0x23, 0xbc, 0x9d, 0xf5, 0x97, 0x97, 0xff, 0xd9, 0x7d, 0xe9, 0xee, 0x06, 0x2d, - 0xd5, 0x11, 0xee, 0x01, 0x5c, 0x18, 0x21, 0x27, 0x3d, 0x37, 0xb2, 0xd2, 0x07, 0xf1, 0x7f, 0x62, - 0xba, 0x7b, 0x9f, 0x77, 0x87, 0xdc, 0x7c, 0x4b, 0x06, 0x6d, 0x2a, 0xa2, 0xce, 0xa4, 0xb0, 0x63, - 0xbf, 0x1a, 0x54, 0x84, 0x1d, 0x25, 0xe9, 0xa0, 0x64, 0x9f, 0x8e, 0xff, 0x06, 0x00, 0x00, 0xff, - 0xff, 0x86, 0x81, 0x14, 0x7a, 0x97, 0x04, 0x00, 0x00, + // 645 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcf, 0x4e, 0xdb, 0x3e, + 0x1c, 0xc7, 0xf4, 0xd7, 0x40, 0xbf, 0xa5, 0xa5, 0x3f, 0x8f, 0x09, 0xd3, 0x81, 0x28, 0x65, 0x87, + 0x4c, 0x42, 0x2d, 0x63, 0xda, 0xa6, 0xdd, 0xb6, 0x42, 0x35, 0x2a, 0xed, 0x80, 0xdc, 0xa1, 0x49, + 0xdb, 0x21, 0x4a, 0x1d, 0xaf, 0x8b, 0x9a, 0xc6, 0x9e, 0xe3, 0xc0, 0x78, 0x83, 0xf1, 0x0a, 0xdc, + 0xf6, 0x0a, 0x1c, 0xf6, 0x4a, 0xbb, 0xf0, 0x10, 0x53, 0x9d, 0x34, 0x04, 0x28, 0x68, 0xa7, 0x38, + 0x9f, 0x7f, 0xf6, 0xd7, 0xf6, 0xd7, 0x50, 0x53, 0x92, 0xb5, 0xf9, 0x50, 0xf1, 0x28, 0x6a, 0x49, + 0x25, 0xb4, 0xc0, 0x05, 0x25, 0x59, 0xbd, 0x22, 0xa4, 0xf6, 0x45, 0x98, 0x62, 0xf5, 0x95, 0x40, + 0x0c, 0x87, 0x5c, 0xb5, 0x6f, 0xa3, 0xfe, 0x09, 0x1f, 0xf9, 0xda, 0xc9, 0xfb, 0x9b, 0x7f, 0x8a, + 0x80, 0xfb, 0xda, 0x55, 0xba, 0x6b, 0x50, 0xca, 0xbf, 0xc7, 0x3c, 0xd2, 0xf8, 0x19, 0x94, 0x12, + 0x99, 0xe3, 0x7b, 0x04, 0x35, 0x90, 0x5d, 0xea, 0x2c, 0x5d, 0x5c, 0xed, 0x2c, 0x26, 0x60, 0xef, + 0x80, 0x4e, 0x47, 0x1e, 0x7e, 0x09, 0x56, 0x32, 0x26, 0xb5, 0x06, 0xb2, 0xcb, 0x7b, 0x4f, 0x5a, + 0xe9, 0x44, 0xad, 0xbb, 0xb9, 0x87, 0x73, 0x34, 0x15, 0xe3, 0x57, 0x60, 0x29, 0x2e, 0x03, 0xf7, + 0x8c, 0xfc, 0x6f, 0x6c, 0xeb, 0x99, 0xad, 0xfb, 0x43, 0x0a, 0xa5, 0xa9, 0x21, 0x73, 0xbe, 0x44, + 0x8d, 0x8f, 0xa0, 0xaa, 0x84, 0x18, 0x3b, 0x4c, 0x8c, 0xa5, 0x88, 0x7c, 0xcd, 0x49, 0xd1, 0xf8, + 0xb7, 0x33, 0x3f, 0x15, 0x62, 0xbc, 0x3f, 0x65, 0x6f, 0x4c, 0xdf, 0x99, 0x27, 0xe8, 0x70, 0x8e, + 0x56, 0x54, 0x5e, 0x81, 0x9f, 0x43, 0xe1, 0x94, 0x0f, 0x48, 0xd9, 0xc4, 0xac, 0x65, 0x31, 0x9f, + 0xf8, 0x60, 0x96, 0x79, 0xa2, 0xc5, 0x3d, 0x28, 0x4b, 0x57, 0x69, 0x9f, 0xf9, 0xd2, 0x0d, 0x35, + 0xa9, 0x18, 0xeb, 0x56, 0x66, 0x3d, 0xba, 0xe6, 0x66, 0x45, 0xe4, 0xbd, 0xb8, 0x0f, 0xcb, 0x5a, + 0xb9, 0x6c, 0x94, 0x2b, 0xc8, 0x32, 0x71, 0x4f, 0xb3, 0xb8, 0x8f, 0x13, 0xfe, 0xc1, 0x8a, 0xaa, + 0xfa, 0x86, 0x04, 0xbf, 0x86, 0xa2, 0x41, 0xc8, 0xc2, 0xad, 0x23, 0x31, 0x51, 0xb3, 0x12, 0x12, + 0x3d, 0xde, 0x86, 0x05, 0xb3, 0xbb, 0xbe, 0x47, 0x0a, 0xe6, 0xd4, 0xe1, 0xe2, 0x6a, 0xc7, 0x9a, + 0x40, 0xbd, 0x03, 0x9a, 0x7c, 0x3d, 0x5c, 0x87, 0xa2, 0x16, 0x23, 0x1e, 0x92, 0x45, 0x23, 0xf9, + 0xef, 0xe7, 0xd5, 0x0e, 0xa2, 0x09, 0x84, 0x1f, 0x83, 0x75, 0x1a, 0x39, 0xb1, 0x0a, 0x48, 0x69, + 0x42, 0xd2, 0xe2, 0x69, 0x74, 0xac, 0x02, 0xbc, 0x0b, 0x2b, 0x2c, 0x10, 0xb1, 0xe7, 0x0c, 0x5c, + 0x36, 0x8a, 0xa5, 0xc3, 0x43, 0x77, 0x10, 0x70, 0x8f, 0x40, 0x03, 0xd9, 0x8b, 0x14, 0x1b, 0xae, + 0x63, 0xa8, 0x6e, 0xc2, 0xe0, 0x6d, 0xa8, 0xf0, 0x48, 0xfb, 0x63, 0x57, 0x73, 0xcf, 0x61, 0x32, + 0x26, 0xd5, 0x06, 0xb2, 0x11, 0x5d, 0xca, 0xc0, 0x7d, 0x19, 0xe3, 0x4d, 0x28, 0x2b, 0xae, 0xd5, + 0x99, 0xc3, 0x44, 0x1c, 0x6a, 0xb2, 0xdc, 0x40, 0x76, 0x91, 0x82, 0x81, 0xf6, 0x27, 0x48, 0xa7, + 0x04, 0x0b, 0x2a, 0xa9, 0xb3, 0xb9, 0x06, 0xab, 0x1f, 0xfc, 0x48, 0xbf, 0x63, 0xda, 0x3f, 0xb9, + 0xb9, 0x89, 0xcd, 0x37, 0x40, 0xee, 0x52, 0x91, 0x14, 0x61, 0xc4, 0xf1, 0x06, 0x40, 0xd6, 0x09, + 0x11, 0x41, 0x8d, 0x82, 0x5d, 0xa2, 0xa5, 0xe9, 0xe5, 0x8f, 0xf6, 0x7e, 0x23, 0xa8, 0x26, 0x8e, + 0x5e, 0xa8, 0xb9, 0x0a, 0xdd, 0x00, 0xbf, 0x87, 0x72, 0xee, 0xe6, 0xe3, 0xd5, 0x96, 0x92, 0x6c, + 0x46, 0x2f, 0xd4, 0x1f, 0x5d, 0xdf, 0xf8, 0x34, 0xe0, 0xab, 0x68, 0xc2, 0xe5, 0x39, 0xb2, 0x6a, + 0xe8, 0x2d, 0xda, 0x45, 0xf8, 0x0b, 0xd4, 0x6e, 0x2f, 0x0b, 0xaf, 0x9b, 0xb4, 0x7b, 0x0a, 0xa9, + 0x6f, 0xdc, 0xc3, 0x26, 0xb5, 0x64, 0xe1, 0xf3, 0x36, 0xda, 0xfb, 0x85, 0xa0, 0x92, 0xd0, 0x87, + 0x6e, 0xe8, 0x05, 0x5c, 0xe1, 0x1e, 0x2c, 0x1d, 0x4b, 0xcf, 0xd5, 0xbc, 0xaf, 0x15, 0x77, 0xc7, + 0xf8, 0xba, 0x23, 0xf3, 0xf0, 0x83, 0xab, 0xb7, 0x2e, 0xcf, 0xd1, 0x7c, 0x0d, 0xe1, 0x2e, 0x40, + 0x5f, 0x0b, 0x99, 0xae, 0xb9, 0x9e, 0x7b, 0x11, 0xa6, 0xe0, 0xbf, 0xc4, 0x74, 0xb6, 0x3e, 0x6f, + 0x0e, 0x7d, 0xfd, 0x2d, 0x1e, 0xb4, 0x98, 0x18, 0xb7, 0x53, 0x61, 0xdb, 0x3c, 0x5c, 0x4c, 0x04, + 0x6d, 0x25, 0xd9, 0xc0, 0x32, 0x7f, 0x2f, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x74, 0x13, 0x5f, + 0x66, 0x1a, 0x05, 0x00, 0x00, } From 10803f36a740093d55fc42f9e4f9598b54992204 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Mon, 16 Mar 2026 23:30:23 +0800 Subject: [PATCH 03/15] undo deprecations --- protobufs/livekit_egress.proto | 61 +++++++++++----------------------- protobufs/rpc/egress.proto | 10 +++--- 2 files changed, 25 insertions(+), 46 deletions(-) diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index ab09c289b..93f023b6a 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -37,13 +37,13 @@ service Egress { rpc StopEgress(StopEgressRequest) returns (EgressInfo); // --- Deprecated --- - rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo) { option deprecated = true; }; - rpc StartWebEgress(WebEgressRequest) returns (EgressInfo) { option deprecated = true; }; - rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo) { option deprecated = true; }; - rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo) { option deprecated = true; }; - rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo) { option deprecated = true; }; - rpc UpdateLayout(UpdateLayoutRequest) returns (EgressInfo) { option deprecated = true; }; - rpc UpdateStream(UpdateStreamRequest) returns (EgressInfo) { option deprecated = true; }; + rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo); + rpc StartWebEgress(WebEgressRequest) returns (EgressInfo); + rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo); + rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo); + rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo); + rpc UpdateLayout(UpdateLayoutRequest) returns (EgressInfo); + rpc UpdateStream(UpdateStreamRequest) returns (EgressInfo); } // --- Core Request --- @@ -232,10 +232,10 @@ message SegmentedFileOutput { // --- Deprecated --- oneof output { - S3Upload s3 = 5 [deprecated = true]; - GCPUpload gcp = 6 [deprecated = true]; - AzureBlobUpload azure = 7 [deprecated = true]; - AliOSSUpload aliOSS = 9 [deprecated = true]; + S3Upload s3 = 5; + GCPUpload gcp = 6; + AzureBlobUpload azure = 7; + AliOSSUpload aliOSS = 9; } } @@ -261,10 +261,10 @@ message ImageOutput { // --- Deprecated --- oneof output { - S3Upload s3 = 8 [deprecated = true]; - GCPUpload gcp = 9 [deprecated = true]; - AzureBlobUpload azure = 10 [deprecated = true]; - AliOSSUpload aliOSS = 11 [deprecated = true]; + S3Upload s3 = 8; + GCPUpload gcp = 9; + AzureBlobUpload azure = 10; + AliOSSUpload aliOSS = 11; } } @@ -378,11 +378,11 @@ message EgressInfo { StartEgressRequest egress = 29; ExportReplayRequest replay = 30; - RoomCompositeEgressRequest room_composite = 4 [deprecated = true]; - WebEgressRequest web = 14 [deprecated = true]; - ParticipantEgressRequest participant = 19 [deprecated = true]; - TrackCompositeEgressRequest track_composite = 5 [deprecated = true]; - TrackEgressRequest track = 6 [deprecated = true]; + RoomCompositeEgressRequest room_composite = 4; + WebEgressRequest web = 14; + ParticipantEgressRequest participant = 19; + TrackCompositeEgressRequest track_composite = 5; + TrackEgressRequest track = 6; } repeated StreamInfo stream_results = 15; @@ -527,8 +527,6 @@ message ExportReplayRequest { // --- Deprecated --- message RoomCompositeEgressRequest { - option deprecated = true; - string room_name = 1; string layout = 2; bool audio_only = 3; @@ -558,8 +556,6 @@ enum AudioMixing { } message WebEgressRequest { - option deprecated = true; - string url = 1; bool audio_only = 2; bool video_only = 3; @@ -580,10 +576,7 @@ message WebEgressRequest { repeated WebhookConfig webhooks = 14; } -// record audio and video from a single participant message ParticipantEgressRequest { - option deprecated = true; - string room_name = 1; string identity = 2; bool screen_share = 3; @@ -599,8 +592,6 @@ message ParticipantEgressRequest { } message TrackCompositeEgressRequest { - option deprecated = true; - string room_name = 1; string audio_track_id = 2 [(logger.name) = "audioTrackID"]; string video_track_id = 3 [(logger.name) = "videoTrackID"]; @@ -621,8 +612,6 @@ message TrackCompositeEgressRequest { } message TrackEgressRequest { - option deprecated = true; - string room_name = 1; string track_id = 2 [(logger.name) = "trackID"]; oneof output { @@ -633,8 +622,6 @@ message TrackEgressRequest { } message DirectFileOutput { - option deprecated = true; - string filepath = 1; bool disable_manifest = 5; oneof output { @@ -646,8 +633,6 @@ message DirectFileOutput { } message EncodedFileOutput { - option deprecated = true; - EncodedFileType file_type = 1; string filepath = 2; bool disable_manifest = 6; @@ -660,22 +645,16 @@ message EncodedFileOutput { } message UpdateLayoutRequest { - option deprecated = true; - string egress_id = 1 [(logger.name) = "egressID"]; string layout = 2; } message UpdateStreamRequest { - option deprecated = true; - string egress_id = 1 [(logger.name) = "egressID"]; repeated string add_output_urls = 2; repeated string remove_output_urls = 3; } message StreamInfoList { - option deprecated = true; - repeated StreamInfo info = 1; } diff --git a/protobufs/rpc/egress.proto b/protobufs/rpc/egress.proto index 8eabe7ee3..587d7497d 100644 --- a/protobufs/rpc/egress.proto +++ b/protobufs/rpc/egress.proto @@ -52,11 +52,11 @@ message StartEgressRequest { livekit.ExportReplayRequest replay = 17; // --- deprecated --- - livekit.RoomCompositeEgressRequest room_composite = 5 [deprecated = true]; - livekit.WebEgressRequest web = 11 [deprecated = true]; - livekit.ParticipantEgressRequest participant = 13 [deprecated = true]; - livekit.TrackCompositeEgressRequest track_composite = 6 [deprecated = true]; - livekit.TrackEgressRequest track = 7 [deprecated = true]; + livekit.RoomCompositeEgressRequest room_composite = 5; + livekit.WebEgressRequest web = 11; + livekit.ParticipantEgressRequest participant = 13; + livekit.TrackCompositeEgressRequest track_composite = 6; + livekit.TrackEgressRequest track = 7; } // connection info From ebda97e1ebae52181a6f0dc207588ac376c8295f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:31:16 +0000 Subject: [PATCH 04/15] generated protobuf --- livekit/livekit_egress.pb.go | 130 +++----- livekit/livekit_egress.twirp.go | 546 ++++++++++++++++---------------- rpc/egress.pb.go | 25 +- rpc/egress.psrpc.go | 83 +++-- 4 files changed, 365 insertions(+), 419 deletions(-) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index ddab641d6..37f9a6554 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -1863,7 +1863,6 @@ func (x *SegmentedFileOutput) GetOutput() isSegmentedFileOutput_Output { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *SegmentedFileOutput) GetS3() *S3Upload { if x != nil { if x, ok := x.Output.(*SegmentedFileOutput_S3); ok { @@ -1873,7 +1872,6 @@ func (x *SegmentedFileOutput) GetS3() *S3Upload { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *SegmentedFileOutput) GetGcp() *GCPUpload { if x != nil { if x, ok := x.Output.(*SegmentedFileOutput_Gcp); ok { @@ -1883,7 +1881,6 @@ func (x *SegmentedFileOutput) GetGcp() *GCPUpload { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *SegmentedFileOutput) GetAzure() *AzureBlobUpload { if x != nil { if x, ok := x.Output.(*SegmentedFileOutput_Azure); ok { @@ -1893,7 +1890,6 @@ func (x *SegmentedFileOutput) GetAzure() *AzureBlobUpload { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *SegmentedFileOutput) GetAliOSS() *AliOSSUpload { if x != nil { if x, ok := x.Output.(*SegmentedFileOutput_AliOSS); ok { @@ -1908,22 +1904,18 @@ type isSegmentedFileOutput_Output interface { } type SegmentedFileOutput_S3 struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. S3 *S3Upload `protobuf:"bytes,5,opt,name=s3,proto3,oneof"` } type SegmentedFileOutput_Gcp struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Gcp *GCPUpload `protobuf:"bytes,6,opt,name=gcp,proto3,oneof"` } type SegmentedFileOutput_Azure struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Azure *AzureBlobUpload `protobuf:"bytes,7,opt,name=azure,proto3,oneof"` } type SegmentedFileOutput_AliOSS struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. AliOSS *AliOSSUpload `protobuf:"bytes,9,opt,name=aliOSS,proto3,oneof"` } @@ -2044,7 +2036,6 @@ func (x *ImageOutput) GetOutput() isImageOutput_Output { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetS3() *S3Upload { if x != nil { if x, ok := x.Output.(*ImageOutput_S3); ok { @@ -2054,7 +2045,6 @@ func (x *ImageOutput) GetS3() *S3Upload { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetGcp() *GCPUpload { if x != nil { if x, ok := x.Output.(*ImageOutput_Gcp); ok { @@ -2064,7 +2054,6 @@ func (x *ImageOutput) GetGcp() *GCPUpload { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetAzure() *AzureBlobUpload { if x != nil { if x, ok := x.Output.(*ImageOutput_Azure); ok { @@ -2074,7 +2063,6 @@ func (x *ImageOutput) GetAzure() *AzureBlobUpload { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *ImageOutput) GetAliOSS() *AliOSSUpload { if x != nil { if x, ok := x.Output.(*ImageOutput_AliOSS); ok { @@ -2089,22 +2077,18 @@ type isImageOutput_Output interface { } type ImageOutput_S3 struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. S3 *S3Upload `protobuf:"bytes,8,opt,name=s3,proto3,oneof"` } type ImageOutput_Gcp struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Gcp *GCPUpload `protobuf:"bytes,9,opt,name=gcp,proto3,oneof"` } type ImageOutput_Azure struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Azure *AzureBlobUpload `protobuf:"bytes,10,opt,name=azure,proto3,oneof"` } type ImageOutput_AliOSS struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. AliOSS *AliOSSUpload `protobuf:"bytes,11,opt,name=aliOSS,proto3,oneof"` } @@ -3058,7 +3042,6 @@ func (x *EgressInfo) GetReplay() *ExportReplayRequest { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetRoomComposite() *RoomCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_RoomComposite); ok { @@ -3068,7 +3051,6 @@ func (x *EgressInfo) GetRoomComposite() *RoomCompositeEgressRequest { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetWeb() *WebEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Web); ok { @@ -3078,7 +3060,6 @@ func (x *EgressInfo) GetWeb() *WebEgressRequest { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetParticipant() *ParticipantEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Participant); ok { @@ -3088,7 +3069,6 @@ func (x *EgressInfo) GetParticipant() *ParticipantEgressRequest { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetTrackComposite() *TrackCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_TrackComposite); ok { @@ -3098,7 +3078,6 @@ func (x *EgressInfo) GetTrackComposite() *TrackCompositeEgressRequest { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. func (x *EgressInfo) GetTrack() *TrackEgressRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Track); ok { @@ -3235,27 +3214,22 @@ type EgressInfo_Replay struct { } type EgressInfo_RoomComposite struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. RoomComposite *RoomCompositeEgressRequest `protobuf:"bytes,4,opt,name=room_composite,json=roomComposite,proto3,oneof"` } type EgressInfo_Web struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Web *WebEgressRequest `protobuf:"bytes,14,opt,name=web,proto3,oneof"` } type EgressInfo_Participant struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Participant *ParticipantEgressRequest `protobuf:"bytes,19,opt,name=participant,proto3,oneof"` } type EgressInfo_TrackComposite struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. TrackComposite *TrackCompositeEgressRequest `protobuf:"bytes,5,opt,name=track_composite,json=trackComposite,proto3,oneof"` } type EgressInfo_Track struct { - // Deprecated: Marked as deprecated in livekit_egress.proto. Track *TrackEgressRequest `protobuf:"bytes,6,opt,name=track,proto3,oneof"` } @@ -4170,7 +4144,6 @@ func (*ExportReplayRequest_Preset) isExportReplayRequest_Encoding() {} func (*ExportReplayRequest_Advanced) isExportReplayRequest_Encoding() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type RoomCompositeEgressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` @@ -4409,7 +4382,6 @@ func (*RoomCompositeEgressRequest_Preset) isRoomCompositeEgressRequest_Options() func (*RoomCompositeEgressRequest_Advanced) isRoomCompositeEgressRequest_Options() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type WebEgressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` @@ -4632,9 +4604,6 @@ func (*WebEgressRequest_Preset) isWebEgressRequest_Options() {} func (*WebEgressRequest_Advanced) isWebEgressRequest_Options() {} -// record audio and video from a single participant -// -// Deprecated: Marked as deprecated in livekit_egress.proto. type ParticipantEgressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` @@ -4781,7 +4750,6 @@ func (*ParticipantEgressRequest_Preset) isParticipantEgressRequest_Options() {} func (*ParticipantEgressRequest_Advanced) isParticipantEgressRequest_Options() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type TrackCompositeEgressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` @@ -4996,7 +4964,6 @@ func (*TrackCompositeEgressRequest_Preset) isTrackCompositeEgressRequest_Options func (*TrackCompositeEgressRequest_Advanced) isTrackCompositeEgressRequest_Options() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type TrackEgressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` @@ -5103,7 +5070,6 @@ func (*TrackEgressRequest_File) isTrackEgressRequest_Output() {} func (*TrackEgressRequest_WebsocketUrl) isTrackEgressRequest_Output() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type DirectFileOutput struct { state protoimpl.MessageState `protogen:"open.v1"` Filepath string `protobuf:"bytes,1,opt,name=filepath,proto3" json:"filepath,omitempty"` @@ -5234,7 +5200,6 @@ func (*DirectFileOutput_Azure) isDirectFileOutput_Output() {} func (*DirectFileOutput_AliOSS) isDirectFileOutput_Output() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type EncodedFileOutput struct { state protoimpl.MessageState `protogen:"open.v1"` FileType EncodedFileType `protobuf:"varint,1,opt,name=file_type,json=fileType,proto3,enum=livekit.EncodedFileType" json:"file_type,omitempty"` @@ -5373,7 +5338,6 @@ func (*EncodedFileOutput_Azure) isEncodedFileOutput_Output() {} func (*EncodedFileOutput_AliOSS) isEncodedFileOutput_Output() {} -// Deprecated: Marked as deprecated in livekit_egress.proto. type UpdateLayoutRequest struct { state protoimpl.MessageState `protogen:"open.v1"` EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` @@ -5426,7 +5390,6 @@ func (x *UpdateLayoutRequest) GetLayout() string { return "" } -// Deprecated: Marked as deprecated in livekit_egress.proto. type UpdateStreamRequest struct { state protoimpl.MessageState `protogen:"open.v1"` EgressId string `protobuf:"bytes,1,opt,name=egress_id,json=egressId,proto3" json:"egress_id,omitempty"` @@ -5487,7 +5450,6 @@ func (x *UpdateStreamRequest) GetRemoveOutputUrls() []string { return nil } -// Deprecated: Marked as deprecated in livekit_egress.proto. type StreamInfoList struct { state protoimpl.MessageState `protogen:"open.v1"` Info []*StreamInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` @@ -5621,7 +5583,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\x10disable_manifest\x18\x03 \x01(\bR\x0fdisableManifest\"W\n" + "\fStreamOutput\x123\n" + "\bprotocol\x18\x01 \x01(\x0e2\x17.livekit.StreamProtocolR\bprotocol\x12\x12\n" + - "\x04urls\x18\x02 \x03(\tR\x04urls\"\xb4\x04\n" + + "\x04urls\x18\x02 \x03(\tR\x04urls\"\xa4\x04\n" + "\x13SegmentedFileOutput\x12:\n" + "\bprotocol\x18\x01 \x01(\x0e2\x1e.livekit.SegmentedFileProtocolR\bprotocol\x12'\n" + "\x0ffilename_prefix\x18\x02 \x01(\tR\x0efilenamePrefix\x12#\n" + @@ -5630,12 +5592,12 @@ const file_livekit_egress_proto_rawDesc = "" + "\x10segment_duration\x18\x04 \x01(\rR\x0fsegmentDuration\x12E\n" + "\x0ffilename_suffix\x18\n" + " \x01(\x0e2\x1c.livekit.SegmentedFileSuffixR\x0efilenameSuffix\x12)\n" + - "\x10disable_manifest\x18\b \x01(\bR\x0fdisableManifest\x12'\n" + - "\x02s3\x18\x05 \x01(\v2\x11.livekit.S3UploadB\x02\x18\x01H\x00R\x02s3\x12*\n" + - "\x03gcp\x18\x06 \x01(\v2\x12.livekit.GCPUploadB\x02\x18\x01H\x00R\x03gcp\x124\n" + - "\x05azure\x18\a \x01(\v2\x18.livekit.AzureBlobUploadB\x02\x18\x01H\x00R\x05azure\x123\n" + - "\x06aliOSS\x18\t \x01(\v2\x15.livekit.AliOSSUploadB\x02\x18\x01H\x00R\x06aliOSSB\b\n" + - "\x06output\"\xfd\x03\n" + + "\x10disable_manifest\x18\b \x01(\bR\x0fdisableManifest\x12#\n" + + "\x02s3\x18\x05 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + + "\x03gcp\x18\x06 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + + "\x05azure\x18\a \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + + "\x06aliOSS\x18\t \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + + "\x06output\"\xed\x03\n" + "\vImageOutput\x12)\n" + "\x10capture_interval\x18\x01 \x01(\rR\x0fcaptureInterval\x12\x14\n" + "\x05width\x18\x02 \x01(\x05R\x05width\x12\x16\n" + @@ -5644,12 +5606,12 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0ffilename_suffix\x18\x05 \x01(\x0e2\x18.livekit.ImageFileSuffixR\x0efilenameSuffix\x124\n" + "\vimage_codec\x18\x06 \x01(\x0e2\x13.livekit.ImageCodecR\n" + "imageCodec\x12)\n" + - "\x10disable_manifest\x18\a \x01(\bR\x0fdisableManifest\x12'\n" + - "\x02s3\x18\b \x01(\v2\x11.livekit.S3UploadB\x02\x18\x01H\x00R\x02s3\x12*\n" + - "\x03gcp\x18\t \x01(\v2\x12.livekit.GCPUploadB\x02\x18\x01H\x00R\x03gcp\x124\n" + + "\x10disable_manifest\x18\a \x01(\bR\x0fdisableManifest\x12#\n" + + "\x02s3\x18\b \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + + "\x03gcp\x18\t \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + "\x05azure\x18\n" + - " \x01(\v2\x18.livekit.AzureBlobUploadB\x02\x18\x01H\x00R\x05azure\x123\n" + - "\x06aliOSS\x18\v \x01(\v2\x15.livekit.AliOSSUploadB\x02\x18\x01H\x00R\x06aliOSSB\b\n" + + " \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + + "\x06aliOSS\x18\v \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + "\x06output\"S\n" + "\n" + "McapOutput\x12\x1a\n" + @@ -5714,7 +5676,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fadd_stream_urls\x18\x04 \x03(\tR\raddStreamUrls\x12,\n" + "\x12remove_stream_urls\x18\x05 \x03(\tR\x10removeStreamUrls\">\n" + "\x11StopEgressRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\xab\v\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\x97\v\n" + "\n" + "EgressInfo\x12)\n" + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12#\n" + @@ -5731,12 +5693,12 @@ const file_livekit_egress_proto_rawDesc = "" + "\n" + "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x125\n" + "\x06egress\x18\x1d \x01(\v2\x1b.livekit.StartEgressRequestH\x00R\x06egress\x126\n" + - "\x06replay\x18\x1e \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12P\n" + - "\x0eroom_composite\x18\x04 \x01(\v2#.livekit.RoomCompositeEgressRequestB\x02\x18\x01H\x00R\rroomComposite\x121\n" + - "\x03web\x18\x0e \x01(\v2\x19.livekit.WebEgressRequestB\x02\x18\x01H\x00R\x03web\x12I\n" + - "\vparticipant\x18\x13 \x01(\v2!.livekit.ParticipantEgressRequestB\x02\x18\x01H\x00R\vparticipant\x12S\n" + - "\x0ftrack_composite\x18\x05 \x01(\v2$.livekit.TrackCompositeEgressRequestB\x02\x18\x01H\x00R\x0etrackComposite\x127\n" + - "\x05track\x18\x06 \x01(\v2\x1b.livekit.TrackEgressRequestB\x02\x18\x01H\x00R\x05track\x12:\n" + + "\x06replay\x18\x1e \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12L\n" + + "\x0eroom_composite\x18\x04 \x01(\v2#.livekit.RoomCompositeEgressRequestH\x00R\rroomComposite\x12-\n" + + "\x03web\x18\x0e \x01(\v2\x19.livekit.WebEgressRequestH\x00R\x03web\x12E\n" + + "\vparticipant\x18\x13 \x01(\v2!.livekit.ParticipantEgressRequestH\x00R\vparticipant\x12O\n" + + "\x0ftrack_composite\x18\x05 \x01(\v2$.livekit.TrackCompositeEgressRequestH\x00R\x0etrackComposite\x123\n" + + "\x05track\x18\x06 \x01(\v2\x1b.livekit.TrackEgressRequestH\x00R\x05track\x12:\n" + "\x0estream_results\x18\x0f \x03(\v2\x13.livekit.StreamInfoR\rstreamResults\x124\n" + "\ffile_results\x18\x10 \x03(\v2\x11.livekit.FileInfoR\vfileResults\x12>\n" + "\x0fsegment_results\x18\x11 \x03(\v2\x15.livekit.SegmentsInfoR\x0esegmentResults\x128\n" + @@ -5838,7 +5800,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\bwebhooks\x18\v \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + "\x06sourceB\n" + "\n" + - "\bencoding\"\xd9\x06\n" + + "\bencoding\"\xd5\x06\n" + "\x1aRoomCompositeEgressRequest\x12\x1b\n" + "\troom_name\x18\x01 \x01(\tR\broomName\x12\x16\n" + "\x06layout\x18\x02 \x01(\tR\x06layout\x12\x1d\n" + @@ -5858,9 +5820,9 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0estream_outputs\x18\f \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + "\x0fsegment_outputs\x18\r \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + "\rimage_outputs\x18\x0e \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\x10 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\bwebhooks\x18\x10 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + "\x06outputB\t\n" + - "\aoptions\"\xf9\x05\n" + + "\aoptions\"\xf5\x05\n" + "\x10WebEgressRequest\x12\x10\n" + "\x03url\x18\x01 \x01(\tR\x03url\x12\x1d\n" + "\n" + @@ -5878,9 +5840,9 @@ const file_livekit_egress_proto_rawDesc = "" + " \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + "\x0fsegment_outputs\x18\v \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + "\rimage_outputs\x18\r \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\x0e \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\bwebhooks\x18\x0e \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + "\x06outputB\t\n" + - "\aoptions\"\xaa\x04\n" + + "\aoptions\"\xa6\x04\n" + "\x18ParticipantEgressRequest\x12\x1b\n" + "\troom_name\x18\x01 \x01(\tR\broomName\x12\x1a\n" + "\bidentity\x18\x02 \x01(\tR\bidentity\x12!\n" + @@ -5892,8 +5854,8 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fsegment_outputs\x18\b \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + "\rimage_outputs\x18\t \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + "\bwebhooks\x18\n" + - " \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\t\n" + - "\aoptions\"\x93\x06\n" + + " \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\t\n" + + "\aoptions\"\x8f\x06\n" + "\x1bTrackCompositeEgressRequest\x12\x1b\n" + "\troom_name\x18\x01 \x01(\tR\broomName\x126\n" + "\x0eaudio_track_id\x18\x02 \x01(\tB\x10\x9a\xec,\faudioTrackIDR\faudioTrackId\x126\n" + @@ -5907,24 +5869,24 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0estream_outputs\x18\f \x03(\v2\x15.livekit.StreamOutputR\rstreamOutputs\x12E\n" + "\x0fsegment_outputs\x18\r \x03(\v2\x1c.livekit.SegmentedFileOutputR\x0esegmentOutputs\x129\n" + "\rimage_outputs\x18\x0e \x03(\v2\x14.livekit.ImageOutputR\fimageOutputs\x122\n" + - "\bwebhooks\x18\x0f \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + + "\bwebhooks\x18\x0f \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + "\x06outputB\t\n" + - "\aoptions\"\xf3\x01\n" + + "\aoptions\"\xef\x01\n" + "\x12TrackEgressRequest\x12\x1b\n" + "\troom_name\x18\x01 \x01(\tR\broomName\x12&\n" + "\btrack_id\x18\x02 \x01(\tB\v\x9a\xec,\atrackIDR\atrackId\x12/\n" + "\x04file\x18\x03 \x01(\v2\x19.livekit.DirectFileOutputH\x00R\x04file\x12%\n" + "\rwebsocket_url\x18\x04 \x01(\tH\x00R\fwebsocketUrl\x122\n" + - "\bwebhooks\x18\x05 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooks:\x02\x18\x01B\b\n" + - "\x06output\"\x97\x02\n" + + "\bwebhooks\x18\x05 \x03(\v2\x16.livekit.WebhookConfigR\bwebhooksB\b\n" + + "\x06output\"\x93\x02\n" + "\x10DirectFileOutput\x12\x1a\n" + "\bfilepath\x18\x01 \x01(\tR\bfilepath\x12)\n" + "\x10disable_manifest\x18\x05 \x01(\bR\x0fdisableManifest\x12#\n" + "\x02s3\x18\x02 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + "\x03gcp\x18\x03 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + "\x05azure\x18\x04 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + - "\x06aliOSS\x18\x06 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSS:\x02\x18\x01B\b\n" + - "\x06output\"\xcf\x02\n" + + "\x06aliOSS\x18\x06 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + + "\x06output\"\xcb\x02\n" + "\x11EncodedFileOutput\x125\n" + "\tfile_type\x18\x01 \x01(\x0e2\x18.livekit.EncodedFileTypeR\bfileType\x12\x1a\n" + "\bfilepath\x18\x02 \x01(\tR\bfilepath\x12)\n" + @@ -5932,17 +5894,17 @@ const file_livekit_egress_proto_rawDesc = "" + "\x02s3\x18\x03 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + "\x03gcp\x18\x04 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + "\x05azure\x18\x05 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + - "\x06aliOSS\x18\a \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSS:\x02\x18\x01B\b\n" + - "\x06output\"\\\n" + + "\x06aliOSS\x18\a \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + + "\x06output\"X\n" + "\x13UpdateLayoutRequest\x12)\n" + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12\x16\n" + - "\x06layout\x18\x02 \x01(\tR\x06layout:\x02\x18\x01\"\x9a\x01\n" + + "\x06layout\x18\x02 \x01(\tR\x06layout\"\x96\x01\n" + "\x13UpdateStreamRequest\x12)\n" + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12&\n" + "\x0fadd_output_urls\x18\x02 \x03(\tR\raddOutputUrls\x12,\n" + - "\x12remove_output_urls\x18\x03 \x03(\tR\x10removeOutputUrls:\x02\x18\x01\"=\n" + + "\x12remove_output_urls\x18\x03 \x03(\tR\x10removeOutputUrls\"9\n" + "\x0eStreamInfoList\x12'\n" + - "\x04info\x18\x01 \x03(\v2\x13.livekit.StreamInfoR\x04info:\x02\x18\x01*W\n" + + "\x04info\x18\x01 \x03(\v2\x13.livekit.StreamInfoR\x04info*W\n" + "\fAudioChannel\x12\x16\n" + "\x12AUDIO_CHANNEL_BOTH\x10\x00\x12\x16\n" + "\x12AUDIO_CHANNEL_LEFT\x10\x01\x12\x17\n" + @@ -5990,21 +5952,21 @@ const file_livekit_egress_proto_rawDesc = "" + "\vAudioMixing\x12\x12\n" + "\x0eDEFAULT_MIXING\x10\x00\x12\x16\n" + "\x12DUAL_CHANNEL_AGENT\x10\x01\x12\x1a\n" + - "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\xc3\x06\n" + + "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\xa0\x06\n" + "\x06Egress\x12?\n" + "\vStartEgress\x12\x1b.livekit.StartEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + "\fUpdateEgress\x12\x1c.livekit.UpdateEgressRequest\x1a\x13.livekit.EgressInfo\x12E\n" + "\n" + "ListEgress\x12\x1a.livekit.ListEgressRequest\x1a\x1b.livekit.ListEgressResponse\x12=\n" + "\n" + - "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\x12Y\n" + - "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12E\n" + - "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12U\n" + - "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12[\n" + - "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12I\n" + - "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12F\n" + - "\fUpdateLayout\x12\x1c.livekit.UpdateLayoutRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01\x12F\n" + - "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\"\x03\x88\x02\x01BFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\x12T\n" + + "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12@\n" + + "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\x12P\n" + + "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\x12V\n" + + "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12D\n" + + "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + + "\fUpdateLayout\x12\x1c.livekit.UpdateLayoutRequest\x1a\x13.livekit.EgressInfo\x12A\n" + + "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfoBFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_livekit_egress_proto_rawDescOnce sync.Once diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index 41d9607be..d343b8284 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -3312,279 +3312,275 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 4371 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0xdc, 0x58, - 0x72, 0x62, 0x7f, 0x77, 0xf5, 0x87, 0xa8, 0x27, 0x59, 0xd3, 0x96, 0x3d, 0x63, 0x6f, 0x3b, 0xe3, - 0x0f, 0x8d, 0x22, 0x6b, 0x25, 0xaf, 0xc7, 0xf1, 0x66, 0x66, 0xd1, 0x92, 0x28, 0xab, 0xd7, 0x92, - 0x5a, 0x61, 0xb7, 0xc6, 0xb3, 0xf9, 0x22, 0x28, 0xf2, 0x49, 0x22, 0xd4, 0x4d, 0xf6, 0x92, 0x6c, - 0xdb, 0xda, 0x5f, 0x30, 0xc9, 0x21, 0x08, 0x92, 0x43, 0x00, 0x03, 0x41, 0xee, 0x9b, 0x3d, 0x05, - 0x01, 0x72, 0x0d, 0x90, 0x5b, 0x90, 0x60, 0x0f, 0x39, 0x04, 0xb9, 0xe6, 0x18, 0x18, 0x08, 0x82, - 0x9c, 0x72, 0x08, 0x10, 0xbc, 0x0f, 0x92, 0x8f, 0x14, 0xd5, 0xd3, 0x92, 0x9c, 0xc9, 0x21, 0x7b, - 0x52, 0xbf, 0xaa, 0x7a, 0x8f, 0xf5, 0xea, 0x55, 0xd5, 0xab, 0xaa, 0x57, 0x82, 0xb9, 0xbe, 0xf5, - 0x1a, 0x9f, 0x5a, 0xbe, 0x86, 0x8f, 0x5d, 0xec, 0x79, 0xcb, 0x43, 0xd7, 0xf1, 0x1d, 0x54, 0xe4, - 0xd0, 0x85, 0x10, 0x3d, 0x70, 0x4c, 0xdc, 0xe7, 0xe8, 0x85, 0xb9, 0xbe, 0x73, 0x7c, 0x8c, 0xdd, - 0xc7, 0xce, 0xd0, 0xb7, 0x1c, 0x9b, 0x43, 0x9b, 0xff, 0x9c, 0x05, 0xd4, 0xf5, 0x75, 0xd7, 0x57, - 0xe8, 0x52, 0x2a, 0xfe, 0xe9, 0x08, 0x7b, 0x3e, 0xba, 0x05, 0x65, 0xd7, 0x71, 0x06, 0x9a, 0xad, - 0x0f, 0x70, 0x43, 0xba, 0x2b, 0x3d, 0x2c, 0xab, 0x25, 0x02, 0xd8, 0xd3, 0x07, 0x18, 0xfd, 0x00, - 0x4a, 0x3e, 0x1e, 0x0c, 0xfb, 0xba, 0x8f, 0x1b, 0x99, 0xbb, 0xd2, 0xc3, 0xca, 0xea, 0x47, 0xcb, - 0xfc, 0x93, 0xcb, 0x3d, 0x8e, 0xe8, 0x3a, 0x23, 0xd7, 0xc0, 0xdb, 0x53, 0x6a, 0x48, 0x8a, 0xee, - 0x43, 0xf6, 0x0d, 0x3e, 0x6c, 0x64, 0xe9, 0x0c, 0x14, 0xce, 0x78, 0x85, 0x0f, 0x43, 0x62, 0x42, - 0x80, 0x96, 0x20, 0x3f, 0xc0, 0xa6, 0xa5, 0x37, 0x72, 0x94, 0x72, 0x2e, 0xa4, 0xdc, 0x25, 0xd0, - 0x90, 0x96, 0x11, 0xa1, 0x67, 0x50, 0x18, 0xba, 0xd8, 0xc3, 0x7e, 0x23, 0x7f, 0x57, 0x7a, 0x58, - 0x5f, 0xfd, 0x24, 0x24, 0x57, 0x6c, 0xc3, 0x31, 0x2d, 0xfb, 0xb8, 0xc3, 0x36, 0xbc, 0x4f, 0xa9, - 0xb6, 0x25, 0x95, 0xd3, 0xa3, 0xa7, 0x50, 0xd2, 0xcd, 0xd7, 0xba, 0x6d, 0x60, 0xb3, 0x51, 0xa0, - 0x9f, 0x6a, 0x5c, 0x34, 0x77, 0x5b, 0x52, 0x43, 0x5a, 0xf4, 0x08, 0x8a, 0xce, 0xc8, 0x1f, 0x8e, - 0x7c, 0xaf, 0x51, 0xbc, 0x9b, 0x7d, 0x58, 0x59, 0x9d, 0x0e, 0xa7, 0x75, 0x28, 0x5c, 0x0d, 0xf0, - 0x68, 0x05, 0x8a, 0x9e, 0xef, 0xb8, 0xfa, 0x31, 0x6e, 0x94, 0xe8, 0x17, 0xe6, 0x43, 0xd2, 0x2e, - 0x83, 0x6f, 0x38, 0xf6, 0x91, 0x75, 0xac, 0x06, 0x64, 0x68, 0x15, 0x4a, 0x6f, 0xf0, 0xe1, 0x89, - 0xe3, 0x9c, 0x7a, 0x8d, 0x32, 0x5d, 0x7d, 0x5e, 0x94, 0x14, 0x41, 0xf0, 0x29, 0x21, 0xdd, 0x7a, - 0x09, 0x0a, 0x1e, 0x95, 0xca, 0x3a, 0x40, 0x09, 0x73, 0xce, 0x9b, 0x7f, 0x24, 0x41, 0x3d, 0x7e, - 0x1a, 0x68, 0x1e, 0x0a, 0x7d, 0xfd, 0xcc, 0x19, 0xf9, 0xfc, 0x48, 0xf9, 0x08, 0x7d, 0x0c, 0xa0, - 0x8f, 0x4c, 0xcb, 0xd1, 0x1c, 0xbb, 0x7f, 0x46, 0x8f, 0xb4, 0xa4, 0x96, 0x29, 0xa4, 0x63, 0xf7, - 0xcf, 0x08, 0xfa, 0xb5, 0x65, 0x62, 0x8e, 0xce, 0x32, 0x34, 0x85, 0x50, 0xf4, 0x7d, 0x98, 0x36, - 0x46, 0x9e, 0xef, 0x0c, 0xb4, 0x43, 0xdd, 0xc3, 0xda, 0xc8, 0xed, 0xd3, 0x93, 0x2b, 0xab, 0x35, - 0x06, 0x5e, 0xd7, 0x3d, 0x7c, 0xe0, 0xf6, 0x9b, 0x7f, 0x20, 0x41, 0x39, 0x3c, 0x6c, 0x24, 0x43, - 0x96, 0x50, 0x32, 0x46, 0xc8, 0xcf, 0x6b, 0x72, 0xb1, 0x04, 0x48, 0x7f, 0xa3, 0x5b, 0xbe, 0xe6, - 0x11, 0x6d, 0xd6, 0x3c, 0xeb, 0xd8, 0xd6, 0x19, 0x23, 0x25, 0x55, 0xa6, 0x18, 0xaa, 0xe6, 0x5d, - 0x0a, 0x6f, 0xfe, 0xbb, 0x04, 0x15, 0x41, 0x9d, 0xd0, 0x33, 0xa8, 0xb3, 0xc5, 0x7d, 0x57, 0x37, - 0x4e, 0x35, 0xcb, 0x64, 0x8c, 0xad, 0xcb, 0xef, 0xde, 0x2f, 0x55, 0x29, 0xa6, 0x47, 0x10, 0xed, - 0xcd, 0xed, 0x29, 0x55, 0x1c, 0x9b, 0x68, 0x1b, 0x66, 0x86, 0xba, 0xeb, 0x5b, 0x86, 0x35, 0xd4, - 0x6d, 0x5f, 0xa3, 0x38, 0x6e, 0x15, 0x37, 0xc3, 0x93, 0xdb, 0x8f, 0x28, 0xbe, 0x22, 0x04, 0xdb, - 0x53, 0xaa, 0x3c, 0x4c, 0xc0, 0xd0, 0x22, 0xe4, 0xe9, 0x6e, 0xb9, 0x85, 0x44, 0x7a, 0xdf, 0x22, - 0x50, 0x7e, 0xea, 0x8c, 0x04, 0x3d, 0x80, 0x9c, 0xa9, 0xfb, 0x81, 0x89, 0xcc, 0x86, 0xa4, 0x9b, - 0xba, 0xaf, 0x73, 0x4a, 0x4a, 0xb0, 0x5e, 0x84, 0x3c, 0x65, 0xa9, 0xf9, 0xfb, 0x20, 0x27, 0xb9, - 0x40, 0x0b, 0x50, 0xb2, 0x4c, 0x6c, 0xfb, 0x96, 0x7f, 0x16, 0x18, 0x79, 0x30, 0x46, 0xcb, 0x30, - 0x3b, 0x74, 0xf1, 0x11, 0x76, 0x35, 0xcf, 0x70, 0x31, 0xb6, 0x35, 0xef, 0x44, 0x77, 0x31, 0x3f, - 0x96, 0x19, 0x86, 0xea, 0x52, 0x4c, 0x97, 0x20, 0x9a, 0xcf, 0xa1, 0x22, 0xf0, 0x89, 0x3e, 0x83, - 0x82, 0xeb, 0x8c, 0x7c, 0xec, 0x35, 0x24, 0xaa, 0xc5, 0xb3, 0xf1, 0xdd, 0xa8, 0x04, 0xa7, 0x72, - 0x92, 0xe6, 0x7f, 0x48, 0x00, 0x11, 0x18, 0x3d, 0x84, 0x52, 0xe2, 0x18, 0x2a, 0xef, 0xde, 0x2f, - 0x15, 0xfd, 0xf0, 0x04, 0xf8, 0x4f, 0x13, 0xad, 0xc1, 0x9c, 0x28, 0xfc, 0x70, 0x33, 0x84, 0xcb, - 0xf2, 0xf6, 0x94, 0x3a, 0x2b, 0x60, 0xdb, 0xc1, 0xce, 0x7e, 0x0c, 0xa2, 0xec, 0xb5, 0x53, 0xcb, - 0x36, 0xa9, 0xc8, 0xeb, 0xab, 0x1f, 0xa7, 0x1d, 0x58, 0xdb, 0x3e, 0x72, 0x96, 0x5f, 0x5a, 0xb6, - 0xb9, 0x3d, 0xa5, 0x4e, 0x0b, 0x13, 0x09, 0x08, 0x3d, 0x86, 0xa2, 0x71, 0xa2, 0xdb, 0x36, 0x66, - 0xaa, 0x56, 0x5f, 0xbd, 0x91, 0x38, 0x35, 0x86, 0x54, 0x03, 0x2a, 0x72, 0x1e, 0x03, 0xdd, 0x37, - 0x4e, 0x9a, 0x2d, 0x80, 0xe8, 0xb0, 0xd0, 0x1a, 0x94, 0x3d, 0xdc, 0xc7, 0x86, 0xef, 0xb8, 0x81, - 0xc4, 0x6e, 0xc4, 0x0e, 0xb5, 0xcb, 0xb1, 0x6a, 0x44, 0x47, 0x2c, 0xbc, 0x2a, 0xe2, 0xfe, 0xb7, - 0x05, 0x37, 0x0f, 0x79, 0xdf, 0x19, 0x5a, 0x06, 0x95, 0x16, 0xa1, 0x62, 0xc3, 0x68, 0x4f, 0x7f, - 0x9f, 0x85, 0xe9, 0x84, 0xe7, 0x44, 0x73, 0x90, 0x7f, 0x63, 0x99, 0xfe, 0x09, 0x65, 0x28, 0xaf, - 0xb2, 0x01, 0xf1, 0x44, 0x27, 0xd8, 0x3a, 0x3e, 0xf1, 0xe9, 0x17, 0xf3, 0x2a, 0x1f, 0x11, 0x6a, - 0x13, 0x0f, 0xfd, 0x13, 0xfa, 0x89, 0xbc, 0xca, 0x06, 0xe8, 0x36, 0x94, 0x8f, 0x5c, 0x7d, 0x80, - 0x5d, 0x72, 0xe3, 0xe4, 0x28, 0x26, 0x02, 0xa0, 0x27, 0x50, 0x61, 0x7e, 0xc3, 0x70, 0x4c, 0x6c, - 0xf0, 0x6b, 0x60, 0x36, 0x69, 0x3d, 0x26, 0x36, 0x54, 0xe6, 0x5f, 0xe8, 0x6f, 0x74, 0x0f, 0x6a, - 0x6c, 0xd6, 0xa1, 0xe5, 0xd3, 0x75, 0x0b, 0x74, 0xdd, 0x2a, 0x05, 0xae, 0x33, 0x58, 0x44, 0xf4, - 0xd3, 0x91, 0xde, 0x27, 0xf2, 0xa9, 0x08, 0x44, 0xbf, 0xc5, 0x60, 0xe8, 0x01, 0x4c, 0x33, 0xa2, - 0x23, 0x97, 0xdc, 0x9e, 0xb6, 0x71, 0xd6, 0x28, 0x52, 0xb2, 0x3a, 0x05, 0x6f, 0x05, 0x50, 0xc2, - 0x28, 0x73, 0x32, 0x8c, 0xd1, 0x52, 0x82, 0x51, 0x6a, 0x93, 0x9c, 0xd1, 0xd7, 0xe1, 0x6f, 0xc2, - 0x03, 0x9b, 0x15, 0x30, 0x5a, 0x66, 0x3c, 0x50, 0xa0, 0xc0, 0x28, 0x23, 0x0a, 0x18, 0xad, 0x0a, - 0x44, 0x01, 0xa3, 0x4b, 0x80, 0x4e, 0xf1, 0x99, 0x46, 0x25, 0xa7, 0x59, 0xb6, 0x8f, 0xdd, 0xd7, - 0x7a, 0xbf, 0x01, 0x77, 0xa5, 0x87, 0x92, 0x2a, 0x9f, 0xe2, 0xb3, 0x2d, 0x82, 0x68, 0x73, 0x78, - 0xf3, 0x6f, 0x32, 0x50, 0x60, 0xf7, 0x19, 0x7a, 0x04, 0xb9, 0x23, 0xab, 0xcf, 0x02, 0x01, 0xd1, - 0x94, 0xb7, 0xac, 0x3e, 0x66, 0x24, 0xdb, 0x53, 0x2a, 0x25, 0x41, 0x8f, 0xa1, 0xe0, 0xf9, 0x2e, - 0xd6, 0x07, 0xdc, 0x07, 0xde, 0x10, 0x2e, 0x3c, 0x02, 0x0e, 0xc9, 0x39, 0x19, 0x7a, 0x0e, 0x25, - 0x0f, 0x1f, 0x0f, 0xb0, 0xed, 0x7b, 0xdc, 0xf1, 0xdd, 0x8e, 0xa6, 0x30, 0x04, 0x36, 0x63, 0x1f, - 0x0a, 0xe9, 0xd1, 0x32, 0x14, 0xac, 0x81, 0x7e, 0x8c, 0xbd, 0x73, 0xa1, 0x42, 0x9b, 0x80, 0xa3, - 0x6f, 0x31, 0x2a, 0xb2, 0x8f, 0x81, 0xa1, 0x0f, 0xa9, 0x8a, 0x88, 0xfb, 0xd8, 0x35, 0xf4, 0x61, - 0xb4, 0x0f, 0x42, 0x22, 0xde, 0xdc, 0x85, 0x89, 0x6e, 0x6e, 0x72, 0x0b, 0x1b, 0x14, 0xd4, 0xfc, - 0x43, 0x09, 0x20, 0xe2, 0x18, 0xfd, 0x00, 0xca, 0x44, 0x34, 0x9a, 0x7f, 0x36, 0x64, 0x22, 0xac, - 0x27, 0x03, 0x0d, 0xb6, 0xc1, 0xde, 0xd9, 0x10, 0xab, 0xa5, 0x23, 0xfe, 0x8b, 0x38, 0x67, 0xf2, - 0x7b, 0xa8, 0xfb, 0x27, 0xcc, 0x2c, 0xd5, 0x70, 0x8c, 0x1e, 0x81, 0x6c, 0x5a, 0x9e, 0x7e, 0xd8, - 0xc7, 0xda, 0x40, 0xb7, 0xad, 0x23, 0xec, 0xf9, 0xfc, 0x46, 0x9c, 0xe6, 0xf0, 0x5d, 0x0e, 0x6e, - 0xbe, 0x82, 0xaa, 0x28, 0x79, 0xb4, 0x06, 0x25, 0x1a, 0xf9, 0x19, 0x4e, 0x9f, 0x33, 0xf3, 0x51, - 0xe2, 0x88, 0xf6, 0x39, 0x5a, 0x0d, 0x09, 0x11, 0x82, 0xdc, 0xc8, 0xed, 0x7b, 0x8d, 0xcc, 0xdd, - 0xec, 0xc3, 0xb2, 0x4a, 0x7f, 0x37, 0xff, 0x3a, 0x07, 0xb3, 0x29, 0x07, 0x44, 0x0e, 0x34, 0xf1, - 0x81, 0x4f, 0xd2, 0x0f, 0x34, 0xe5, 0x3b, 0x0f, 0x60, 0x9a, 0xec, 0x91, 0x44, 0x9d, 0x1a, 0xb9, - 0x62, 0xac, 0xb7, 0x7c, 0xeb, 0xf5, 0x00, 0xbc, 0x4f, 0xa1, 0x44, 0xdf, 0x87, 0x7d, 0xfd, 0xac, - 0x6f, 0x79, 0x3e, 0x8b, 0x51, 0xa9, 0x4b, 0x52, 0xab, 0x01, 0x90, 0xc6, 0xa9, 0x4b, 0x80, 0xc8, - 0x87, 0xb5, 0x38, 0x65, 0x85, 0x52, 0xca, 0x04, 0xb3, 0x2f, 0x52, 0x3f, 0x02, 0x99, 0x2b, 0x96, - 0x66, 0x8e, 0x5c, 0x9d, 0x78, 0x2f, 0xaa, 0x56, 0x35, 0x75, 0x9a, 0xc3, 0x37, 0x39, 0x18, 0x29, - 0x02, 0x9b, 0xde, 0xe8, 0x88, 0xb0, 0x09, 0x74, 0xa7, 0x17, 0xa8, 0x6e, 0x97, 0xd2, 0x44, 0x9b, - 0x60, 0xe3, 0xd4, 0x53, 0x2c, 0xa5, 0x9e, 0x22, 0x7a, 0x00, 0x19, 0x6f, 0x8d, 0xeb, 0xed, 0x4c, - 0xf4, 0x91, 0xb5, 0x83, 0x61, 0xdf, 0xd1, 0xcd, 0xf5, 0x4c, 0x43, 0xda, 0x9e, 0x52, 0x33, 0xde, - 0x1a, 0x5a, 0x84, 0xec, 0xb1, 0x31, 0xe4, 0x3a, 0x1b, 0x05, 0xd9, 0x2f, 0x36, 0xf6, 0x63, 0xa4, - 0x84, 0x08, 0x3d, 0x81, 0xbc, 0xfe, 0xb3, 0x91, 0x8b, 0xa9, 0xbb, 0x12, 0xa3, 0xdf, 0x16, 0x81, - 0xae, 0xf7, 0x9d, 0xc3, 0xd8, 0x1c, 0x46, 0x8c, 0xd6, 0xa0, 0xa0, 0xf7, 0xad, 0x4e, 0xb7, 0x4b, - 0x1d, 0x91, 0x68, 0xe1, 0x2d, 0x0a, 0x8e, 0xcd, 0xe1, 0xa4, 0xc4, 0x38, 0x58, 0x4c, 0xdc, 0xfc, - 0xef, 0x2c, 0x54, 0x04, 0xeb, 0x24, 0x42, 0x30, 0xf4, 0xa1, 0x3f, 0x72, 0x05, 0x97, 0x24, 0x31, - 0xb1, 0x73, 0x78, 0xe0, 0x91, 0xa2, 0xab, 0x24, 0x93, 0x7e, 0x95, 0x64, 0x63, 0x57, 0x49, 0x8a, - 0x2e, 0xe5, 0x52, 0x75, 0xa9, 0x75, 0xfe, 0x34, 0xf3, 0x09, 0x2b, 0xa5, 0x0c, 0x8f, 0x39, 0xc9, - 0x27, 0x50, 0xa1, 0x2e, 0x86, 0x7b, 0xf6, 0x42, 0xc2, 0xb3, 0xd3, 0xe9, 0xdc, 0xb3, 0x5b, 0xe1, - 0xef, 0xd4, 0xf3, 0x2f, 0x8e, 0x3b, 0xff, 0xd2, 0xc4, 0xe7, 0x5f, 0xbe, 0xd4, 0xf9, 0xc3, 0xd5, - 0xce, 0xbf, 0x72, 0x95, 0xf3, 0xef, 0x02, 0x44, 0xee, 0x36, 0xe6, 0xe4, 0xa4, 0x09, 0x9c, 0x5c, - 0x26, 0xdd, 0xc9, 0xfd, 0x83, 0x04, 0xb5, 0x98, 0x5b, 0x46, 0xf7, 0xa8, 0xc0, 0xa4, 0x0b, 0x04, - 0xc6, 0x85, 0x75, 0x9f, 0x09, 0x2b, 0x73, 0x91, 0xb0, 0x02, 0x41, 0xad, 0x04, 0x82, 0xca, 0x8e, - 0x17, 0x54, 0x24, 0xa4, 0x15, 0x28, 0xea, 0x7d, 0x4b, 0x73, 0xbc, 0xe0, 0x6a, 0x4a, 0x97, 0x52, - 0x20, 0x21, 0xcf, 0x23, 0xa9, 0xdb, 0xd0, 0x75, 0xc8, 0x7d, 0xed, 0x36, 0xff, 0x35, 0x07, 0xa5, - 0x80, 0x55, 0x74, 0x0f, 0x40, 0x37, 0x0c, 0xec, 0x79, 0xda, 0x29, 0xe6, 0x61, 0xfa, 0x7a, 0xee, - 0x9b, 0xf7, 0x4b, 0x92, 0x5a, 0x66, 0xf0, 0x97, 0xf8, 0x0c, 0xdd, 0x86, 0x82, 0x87, 0x0d, 0x17, - 0x33, 0x09, 0x05, 0x04, 0x1c, 0x86, 0x1e, 0x41, 0xcd, 0xc3, 0x9e, 0x67, 0x39, 0xb6, 0xe6, 0x3b, - 0xa7, 0xd8, 0x66, 0x3e, 0x90, 0x13, 0x55, 0x39, 0xaa, 0x47, 0x30, 0x68, 0x09, 0xa6, 0x75, 0xcf, - 0x1b, 0x0d, 0xb0, 0xe6, 0x3a, 0x7d, 0xac, 0xe9, 0xae, 0x4d, 0x43, 0x89, 0x80, 0xb8, 0xc6, 0x90, - 0xaa, 0xd3, 0xc7, 0x2d, 0xd7, 0x46, 0x5d, 0xf8, 0x48, 0xa4, 0xc6, 0x6f, 0x7d, 0xec, 0xda, 0x7a, - 0x9f, 0xc4, 0x9f, 0x35, 0x3a, 0xeb, 0x36, 0x99, 0xf5, 0xee, 0xfd, 0xd2, 0x5c, 0x34, 0x4f, 0xe1, - 0x44, 0xed, 0x4d, 0x35, 0x0d, 0x6a, 0x12, 0x83, 0x76, 0xf1, 0x31, 0x71, 0xbf, 0xcc, 0xa9, 0xf3, - 0x11, 0xd1, 0x15, 0x6c, 0x9b, 0x43, 0xc7, 0xb2, 0x7d, 0x6e, 0xc9, 0xe1, 0x98, 0xcc, 0x39, 0x1c, - 0x19, 0xa7, 0xbc, 0x0a, 0x50, 0x56, 0xf9, 0x08, 0x3d, 0x04, 0xf9, 0xc8, 0x71, 0x0d, 0xac, 0x11, - 0x8d, 0xd2, 0x3c, 0xff, 0xac, 0xcf, 0xee, 0xf3, 0x92, 0x5a, 0xa7, 0xf0, 0x7d, 0xdd, 0x3f, 0xe9, - 0x12, 0x28, 0xfa, 0x21, 0x94, 0x06, 0xd8, 0xd7, 0x69, 0x56, 0xc5, 0xd2, 0xfa, 0x3b, 0xe7, 0xd4, - 0x66, 0x79, 0x97, 0x53, 0x28, 0xb6, 0xef, 0x9e, 0xa9, 0xe1, 0x04, 0xd4, 0x80, 0xa2, 0xaf, 0x1f, - 0x1f, 0x5b, 0xf6, 0x31, 0xb5, 0xd1, 0xb2, 0x1a, 0x0c, 0xd1, 0x63, 0x98, 0x35, 0x1c, 0xdb, 0xa7, - 0xb7, 0x8a, 0xe5, 0x0d, 0x1d, 0xcf, 0xa2, 0x17, 0x4b, 0x99, 0x52, 0x21, 0x8e, 0xda, 0x8c, 0x30, - 0x24, 0x0b, 0x1c, 0xba, 0xce, 0xdb, 0x33, 0x6e, 0x94, 0x51, 0x48, 0xb3, 0x4f, 0xa0, 0x41, 0x16, - 0x48, 0x49, 0x16, 0x7e, 0x08, 0xb5, 0x18, 0x47, 0x24, 0xa9, 0x0e, 0x95, 0x44, 0x25, 0x3f, 0x89, - 0xcf, 0x7c, 0xad, 0xf7, 0x47, 0x98, 0xdf, 0xa3, 0x6c, 0xf0, 0x3c, 0xf3, 0x4c, 0x6a, 0xbe, 0x81, - 0x72, 0xa8, 0xe8, 0xe8, 0x3e, 0x54, 0x0c, 0x17, 0xd3, 0x40, 0x5f, 0xef, 0x7b, 0x31, 0x2d, 0x13, - 0x11, 0x82, 0x9c, 0x33, 0x31, 0x39, 0x87, 0x5c, 0x67, 0xbf, 0x95, 0xeb, 0xe6, 0x37, 0x12, 0x4c, - 0x27, 0x0c, 0x07, 0x3d, 0x80, 0xaa, 0x6e, 0x18, 0xce, 0xc8, 0xf6, 0x85, 0x92, 0x53, 0xc0, 0x00, - 0xc7, 0xd0, 0x5b, 0xfa, 0x53, 0x08, 0x86, 0xd4, 0x1c, 0x44, 0x6d, 0x07, 0x8e, 0x20, 0xf6, 0xf0, - 0x29, 0xd4, 0x89, 0x6c, 0x75, 0xcb, 0xc6, 0xae, 0x18, 0x20, 0xd4, 0x42, 0x28, 0x59, 0xad, 0xf9, - 0xe7, 0x12, 0x54, 0x45, 0x7b, 0xfc, 0x10, 0xc6, 0xf6, 0x01, 0xd5, 0xb7, 0xf9, 0x7b, 0x50, 0x11, - 0x04, 0x98, 0x52, 0x33, 0x59, 0x80, 0xd2, 0xc8, 0x23, 0x86, 0x33, 0x08, 0x4e, 0x38, 0x1c, 0xa3, - 0xbb, 0x50, 0x1a, 0xea, 0x9e, 0xf7, 0xc6, 0x71, 0x59, 0x7e, 0x1b, 0x30, 0x1a, 0x42, 0x9b, 0x1e, - 0xcc, 0xec, 0x58, 0xde, 0x65, 0x4a, 0x7f, 0x8f, 0xa0, 0xcc, 0x6a, 0x8e, 0xc4, 0xc4, 0xd9, 0xee, - 0xab, 0xef, 0xde, 0x2f, 0x95, 0x18, 0xb0, 0xbd, 0xa9, 0x06, 0xbf, 0xa8, 0x19, 0xeb, 0x86, 0x6f, - 0xbd, 0xc6, 0x3c, 0x32, 0xe5, 0xa3, 0xe6, 0x8f, 0x00, 0x89, 0x1f, 0xf5, 0x86, 0x8e, 0xed, 0x91, - 0x85, 0xf3, 0x96, 0x8f, 0x07, 0xe7, 0xcb, 0x05, 0x8c, 0x8e, 0x24, 0xe1, 0x2a, 0xa3, 0x68, 0xfe, - 0xad, 0x04, 0xb3, 0x07, 0x43, 0x53, 0xf7, 0x71, 0x9c, 0xf1, 0x18, 0x6f, 0xd2, 0x58, 0xde, 0xb8, - 0x20, 0x33, 0x91, 0x20, 0xa3, 0xd2, 0x58, 0x36, 0x56, 0x1a, 0xbb, 0x0f, 0xd3, 0xba, 0x69, 0x6a, - 0x2c, 0x59, 0xd1, 0x68, 0x10, 0x9c, 0xa3, 0x41, 0x70, 0x4d, 0x37, 0x4d, 0x16, 0x2f, 0x1f, 0xb8, - 0x7d, 0x8f, 0xc4, 0x9a, 0x2e, 0x1e, 0x38, 0xaf, 0x71, 0x8c, 0x34, 0x4f, 0x49, 0x65, 0x86, 0x89, - 0xa8, 0x9b, 0x5f, 0xc2, 0x4c, 0xd7, 0x77, 0x86, 0x57, 0xe5, 0xbf, 0xf9, 0x97, 0x15, 0x80, 0x48, - 0x30, 0x97, 0xd9, 0xf9, 0x3d, 0x28, 0xd2, 0xd3, 0x0d, 0x8f, 0x0f, 0xde, 0xbd, 0x5f, 0x2a, 0x10, - 0x50, 0x7b, 0x53, 0x65, 0x7f, 0xcd, 0xb8, 0x0a, 0xd4, 0x12, 0x2a, 0xf0, 0x1c, 0x2a, 0xac, 0xda, - 0xc8, 0x12, 0x9a, 0x05, 0x1a, 0xeb, 0xdc, 0x4c, 0x9c, 0x17, 0x2b, 0xab, 0xd1, 0x8c, 0x06, 0xbc, - 0xf0, 0x37, 0xfa, 0x75, 0x92, 0x1d, 0xea, 0xfe, 0xc8, 0xe3, 0x05, 0x97, 0x1b, 0xc9, 0x69, 0x14, - 0xa9, 0x72, 0x22, 0xf4, 0x31, 0x00, 0xad, 0xe6, 0x61, 0x53, 0xd3, 0x7d, 0xea, 0x10, 0xb3, 0x6a, - 0x99, 0x43, 0x5a, 0x3e, 0xba, 0x49, 0x2d, 0x8a, 0x21, 0x2b, 0x14, 0x59, 0xa4, 0xe3, 0x16, 0xad, - 0x68, 0x8e, 0xa8, 0x8a, 0x50, 0x24, 0x62, 0x33, 0x39, 0xa4, 0x45, 0x52, 0xb2, 0x02, 0x93, 0x48, - 0xe3, 0x63, 0xea, 0xaf, 0x6e, 0x09, 0x29, 0x50, 0xb2, 0x16, 0x4e, 0xee, 0x68, 0x46, 0x8c, 0x9e, - 0x12, 0xd3, 0x26, 0xd9, 0x44, 0xe3, 0x93, 0x44, 0xa6, 0xaa, 0xbc, 0x1d, 0x3a, 0xae, 0xaf, 0x52, - 0xa4, 0x30, 0x8f, 0x51, 0xa3, 0x7d, 0xa8, 0x53, 0x79, 0x1a, 0xce, 0x80, 0xfa, 0x79, 0xcc, 0x83, - 0x82, 0x7b, 0xe1, 0x7c, 0xd5, 0x71, 0x06, 0x1b, 0x01, 0x36, 0xf6, 0x79, 0x1e, 0x48, 0xd5, 0x5c, - 0x91, 0x02, 0x7d, 0x9f, 0xd5, 0xd2, 0xeb, 0x89, 0x3a, 0xe3, 0x2b, 0x7c, 0x98, 0x36, 0x99, 0x96, - 0xd5, 0xdb, 0x50, 0x11, 0x8a, 0x3a, 0x8d, 0x59, 0x3a, 0xf5, 0x7b, 0x69, 0x15, 0xaf, 0xb4, 0x25, - 0xc4, 0xb9, 0xa8, 0x0b, 0xd3, 0xac, 0xce, 0x14, 0x6d, 0x88, 0xa5, 0x26, 0xbf, 0x16, 0xbd, 0x03, - 0x10, 0xfc, 0xd8, 0x1d, 0xd5, 0xfd, 0x18, 0x09, 0xfa, 0x1c, 0xf2, 0x14, 0xc2, 0x73, 0x97, 0x5b, - 0xf1, 0xa5, 0xd2, 0x56, 0x60, 0xf4, 0xe8, 0x39, 0xd4, 0xb9, 0xcd, 0xb9, 0xd8, 0x1b, 0xf5, 0x7d, - 0xaf, 0x31, 0x9d, 0xf0, 0x21, 0xcc, 0xf2, 0xa8, 0x0f, 0xa9, 0x31, 0x52, 0x95, 0x51, 0xa2, 0x27, - 0x50, 0xa5, 0xb9, 0x79, 0x30, 0x53, 0xa6, 0x33, 0x67, 0x62, 0x15, 0x0e, 0x3a, 0xaf, 0x42, 0xc8, - 0x82, 0x59, 0x5f, 0x42, 0x90, 0x12, 0x86, 0x13, 0x67, 0x12, 0x35, 0x3b, 0x9e, 0xff, 0x31, 0xc7, - 0x55, 0xe7, 0xd4, 0xc1, 0xfc, 0x67, 0x50, 0x63, 0xe9, 0x42, 0x30, 0x7b, 0x2e, 0xc1, 0x30, 0x4d, - 0x18, 0xd8, 0xdc, 0x2a, 0xa5, 0x14, 0xf8, 0x1d, 0x18, 0xfa, 0x30, 0x9c, 0x78, 0x3b, 0xc1, 0x2f, - 0x09, 0xad, 0x19, 0xbf, 0x84, 0x2c, 0x98, 0x35, 0x07, 0x79, 0xec, 0xba, 0x8e, 0xcb, 0xc3, 0x0e, - 0x36, 0x20, 0x36, 0x42, 0x7f, 0xd0, 0xa4, 0xa5, 0x31, 0xcf, 0xca, 0x6a, 0x14, 0x42, 0xd2, 0x13, - 0x12, 0xd3, 0x98, 0xd8, 0xd7, 0xad, 0xbe, 0xd7, 0xb8, 0xc1, 0x62, 0x1a, 0x3e, 0x44, 0x9f, 0xc1, - 0x4c, 0x10, 0x90, 0x6b, 0x7d, 0xc7, 0x60, 0xa9, 0xf2, 0x47, 0x2c, 0xad, 0x0e, 0x10, 0x3b, 0x1c, - 0x8e, 0x96, 0x61, 0xf6, 0x50, 0x37, 0x4e, 0x47, 0x43, 0x8d, 0x17, 0x4a, 0xb4, 0x91, 0x87, 0xcd, - 0xc6, 0x4d, 0x56, 0x47, 0x66, 0x28, 0x1e, 0xba, 0x1f, 0x78, 0xd8, 0x44, 0x77, 0xa0, 0xe2, 0x62, - 0xdf, 0x3d, 0xd3, 0xe8, 0x5d, 0xde, 0xb8, 0x45, 0xd9, 0x02, 0x0a, 0xda, 0x20, 0x10, 0x62, 0xbb, - 0xbc, 0xc2, 0x54, 0x4c, 0xbc, 0x3d, 0x45, 0xc7, 0x4c, 0x2e, 0x18, 0xaa, 0x24, 0x52, 0x58, 0x67, - 0xfa, 0x8c, 0xd7, 0xb0, 0x92, 0x39, 0x54, 0x70, 0xc2, 0x9c, 0x9c, 0x55, 0xb1, 0x3e, 0x17, 0x8a, - 0x52, 0xd5, 0x64, 0x1d, 0x4b, 0x38, 0x59, 0x3e, 0x29, 0x24, 0x5e, 0x2f, 0x43, 0xd1, 0xe5, 0x3a, - 0x5a, 0x22, 0xce, 0x82, 0xc8, 0xbf, 0xf9, 0x8b, 0x0c, 0x40, 0xc4, 0x5b, 0xfa, 0xcb, 0x87, 0xe0, - 0xe7, 0x32, 0xe3, 0xfc, 0x5c, 0x36, 0xee, 0xe7, 0x16, 0xa0, 0x14, 0x2b, 0x56, 0x64, 0xd5, 0x70, - 0x8c, 0x56, 0x43, 0x67, 0xcb, 0xd2, 0xd9, 0x85, 0x14, 0x41, 0x2d, 0x27, 0x3c, 0x6e, 0xa8, 0x29, - 0x05, 0x51, 0x53, 0x9a, 0x50, 0xeb, 0xeb, 0x1e, 0x51, 0x76, 0x72, 0x30, 0x3a, 0xcb, 0x52, 0xb3, - 0x6a, 0x85, 0x00, 0x55, 0x02, 0x6b, 0xf9, 0x44, 0x5d, 0x08, 0xda, 0xc2, 0x1e, 0x15, 0x71, 0x4d, - 0x0d, 0x86, 0xcd, 0x65, 0x28, 0xb0, 0xaf, 0x20, 0x80, 0x42, 0x6b, 0xa3, 0xd7, 0xfe, 0x4a, 0x91, - 0xa7, 0x50, 0x15, 0x4a, 0x5b, 0xed, 0xbd, 0x76, 0x77, 0x5b, 0xd9, 0x94, 0x25, 0x82, 0xd9, 0x6a, - 0xb5, 0x77, 0x94, 0x4d, 0x39, 0xd3, 0xfc, 0x85, 0x04, 0xa5, 0xe0, 0x54, 0x82, 0x04, 0x51, 0x0c, - 0x46, 0x82, 0xf1, 0x07, 0x12, 0x5b, 0x21, 0x21, 0x36, 0x04, 0x39, 0xcf, 0xfa, 0x19, 0xe6, 0xe2, - 0xa4, 0xbf, 0x09, 0x7d, 0xa8, 0xe8, 0x2c, 0x42, 0x0b, 0xc7, 0xcd, 0x7f, 0xca, 0x40, 0x55, 0xd4, - 0x89, 0xf3, 0xb5, 0x29, 0x69, 0xe2, 0xda, 0x54, 0xe9, 0x82, 0xda, 0x94, 0xc8, 0x6f, 0xe6, 0x02, - 0x7e, 0xb3, 0x02, 0xbf, 0x9f, 0xc1, 0x4c, 0xb8, 0x70, 0xc8, 0x38, 0x0b, 0x3a, 0xe5, 0x00, 0x11, - 0x5a, 0xe8, 0x13, 0x98, 0x8f, 0xb3, 0x12, 0xce, 0x60, 0xee, 0x62, 0x4e, 0x64, 0x27, 0x9c, 0x75, - 0x8f, 0xe4, 0x94, 0xcc, 0x07, 0x32, 0x4b, 0xcd, 0xd3, 0xef, 0x57, 0x39, 0x90, 0xd9, 0x6a, 0xfc, - 0x84, 0x0a, 0xe3, 0x4e, 0xa8, 0x18, 0x3b, 0xa1, 0xe6, 0x1f, 0x4b, 0x00, 0x91, 0x17, 0x9c, 0xbc, - 0x98, 0x73, 0x27, 0xaa, 0xc4, 0x10, 0xa6, 0x24, 0xba, 0x6a, 0x50, 0x74, 0x39, 0xcf, 0xd2, 0x25, - 0x94, 0xa6, 0xf9, 0x8f, 0x12, 0x94, 0x02, 0xff, 0xfa, 0x1d, 0xe8, 0x65, 0xee, 0x82, 0x73, 0xce, - 0x5f, 0xa0, 0x97, 0x85, 0xb8, 0x5e, 0x12, 0x49, 0x04, 0x97, 0x34, 0x91, 0x04, 0x93, 0x2f, 0xf0, - 0x4b, 0x77, 0x64, 0xfb, 0xcd, 0x77, 0x19, 0xb8, 0xd1, 0x1a, 0xf9, 0xce, 0xb9, 0x9b, 0x5f, 0x78, - 0x53, 0x97, 0x26, 0x7a, 0x53, 0x9f, 0x4a, 0x7d, 0x53, 0xcf, 0x7c, 0xcb, 0x9b, 0xfa, 0x94, 0xf0, - 0xa6, 0xfe, 0x05, 0xbf, 0x87, 0x83, 0x87, 0xf5, 0x2c, 0xbd, 0xd7, 0x16, 0xd2, 0xca, 0xe4, 0xfc, - 0x8d, 0x9d, 0x5e, 0xc8, 0x1d, 0xfe, 0xce, 0xae, 0x44, 0x17, 0x72, 0xb0, 0x42, 0x8e, 0xae, 0x30, - 0xf6, 0x2d, 0x21, 0xbc, 0x97, 0xf9, 0x32, 0xc4, 0x7b, 0xf3, 0xee, 0x88, 0xe6, 0x9f, 0x64, 0x60, - 0x9a, 0x08, 0x47, 0x08, 0x3e, 0x2e, 0x5d, 0xac, 0xca, 0xa7, 0xd7, 0xf2, 0x58, 0x69, 0x2a, 0x33, - 0x51, 0x69, 0x2a, 0x3b, 0x71, 0x69, 0x2a, 0x37, 0x69, 0x69, 0xea, 0x71, 0x58, 0xbf, 0x2b, 0x4c, - 0x50, 0x99, 0x8a, 0xd5, 0xee, 0xfe, 0x2a, 0x07, 0xb3, 0x29, 0x91, 0x2e, 0xc9, 0x3f, 0x58, 0xa4, - 0x9b, 0xc8, 0x3f, 0x18, 0x90, 0xe4, 0x1f, 0xfc, 0x97, 0x49, 0xf2, 0x29, 0xf6, 0x40, 0xef, 0x1c, - 0x1d, 0x79, 0xd8, 0xd7, 0x06, 0x1e, 0x37, 0x90, 0x1a, 0x05, 0x77, 0x28, 0x74, 0xd7, 0x23, 0x57, - 0x0e, 0xb6, 0x4d, 0x81, 0x8a, 0x59, 0x4a, 0x05, 0xdb, 0x66, 0x48, 0x23, 0xf6, 0xa1, 0xe4, 0x2e, - 0xdd, 0x87, 0x92, 0x9f, 0xb8, 0x0f, 0xa5, 0x70, 0xb9, 0x3e, 0x94, 0xe2, 0x35, 0xfa, 0x50, 0x4a, - 0x57, 0xeb, 0x43, 0x29, 0x4f, 0xde, 0x87, 0x02, 0x97, 0xef, 0x43, 0xa9, 0x5c, 0xab, 0x0f, 0xe5, - 0x5f, 0x0a, 0xb0, 0x70, 0x71, 0x7a, 0x33, 0xbe, 0xdc, 0x10, 0x65, 0xe5, 0x99, 0x31, 0x0d, 0x2b, - 0xd9, 0x64, 0xab, 0xc8, 0xe7, 0xc0, 0x5e, 0x68, 0xb5, 0x81, 0xf5, 0xd6, 0xb2, 0x8f, 0x1b, 0xd3, - 0xf4, 0x44, 0x12, 0x0d, 0x15, 0xbb, 0x14, 0xa7, 0xb2, 0xb7, 0x63, 0x36, 0x48, 0xf4, 0x98, 0xe4, - 0x26, 0xe8, 0x74, 0xc9, 0xa7, 0x74, 0xba, 0xa0, 0x27, 0x3c, 0xd6, 0x64, 0x8a, 0x33, 0xc6, 0x8b, - 0xf1, 0x44, 0x86, 0x05, 0x9d, 0x6b, 0x89, 0xc0, 0x36, 0xfd, 0xe9, 0x34, 0x28, 0xac, 0xf3, 0xb0, - 0xf6, 0x4b, 0x21, 0x52, 0x85, 0x6f, 0x7f, 0x3e, 0xe5, 0xb3, 0xa3, 0x27, 0xd4, 0x48, 0x6d, 0x4b, - 0xd7, 0x50, 0xdb, 0xf2, 0x25, 0xd4, 0x36, 0xe9, 0xea, 0x2b, 0x97, 0x73, 0xf5, 0xbf, 0x19, 0x66, - 0x7b, 0xc1, 0x02, 0xd5, 0x64, 0xea, 0x25, 0x48, 0x2b, 0xc8, 0xf7, 0xc6, 0x5c, 0x14, 0xb5, 0xcb, - 0x5f, 0x14, 0xe8, 0x37, 0x82, 0x04, 0x2e, 0x58, 0xa4, 0x4e, 0x17, 0x49, 0x7d, 0x7f, 0xe6, 0x19, - 0x5c, 0x30, 0x55, 0x34, 0x2c, 0x79, 0x32, 0xc3, 0x7a, 0x9e, 0x69, 0x48, 0x91, 0x17, 0x16, 0x6f, - 0xa9, 0xff, 0xca, 0x83, 0x9c, 0xcc, 0xf9, 0xbf, 0xa3, 0xce, 0xaa, 0x6a, 0x7a, 0x67, 0x55, 0xa8, - 0xfb, 0xb9, 0x2b, 0xea, 0x7e, 0xfe, 0x6a, 0xba, 0x5f, 0xb8, 0x96, 0xee, 0x7f, 0x57, 0x2e, 0x3b, - 0xa9, 0xfb, 0xe5, 0xeb, 0xea, 0x3e, 0x5c, 0x4f, 0xf7, 0x2b, 0x1f, 0x42, 0xf7, 0x6b, 0x57, 0xd2, - 0xfd, 0xfa, 0x75, 0x75, 0xff, 0xe7, 0x39, 0x68, 0x5c, 0x54, 0xb4, 0x1a, 0x7f, 0xab, 0x88, 0x6d, - 0x6f, 0x99, 0x44, 0xdb, 0xdb, 0xf7, 0xa0, 0x1a, 0xeb, 0x77, 0x63, 0xd6, 0x50, 0xf1, 0xa2, 0x4e, - 0x37, 0x41, 0x6d, 0x72, 0xd7, 0x88, 0x8e, 0xf3, 0xd7, 0x88, 0x8e, 0x0b, 0xd7, 0x55, 0x9b, 0xe2, - 0xf5, 0xd4, 0xa6, 0xf4, 0x21, 0xd4, 0xa6, 0x7c, 0x25, 0xb5, 0x81, 0x4b, 0xa8, 0x8d, 0xa0, 0x2c, - 0x7f, 0x5a, 0x80, 0x5b, 0x63, 0x4a, 0x92, 0xe3, 0xf5, 0xe5, 0x29, 0xb0, 0x4e, 0xae, 0xa8, 0x39, - 0x34, 0x13, 0x35, 0x87, 0x52, 0x0c, 0x6f, 0x0e, 0x55, 0xc5, 0x91, 0x49, 0xe6, 0x25, 0x9a, 0x4a, - 0xb3, 0xe9, 0x4d, 0xa5, 0x89, 0x96, 0xd2, 0xff, 0x23, 0x17, 0x5a, 0xba, 0x96, 0x0b, 0x2d, 0x5c, - 0xc3, 0x85, 0x16, 0x7f, 0x15, 0x3e, 0x5c, 0xc5, 0x16, 0xa6, 0xaf, 0xeb, 0x42, 0xff, 0x53, 0x02, - 0x74, 0xbe, 0xba, 0x3e, 0xde, 0x18, 0xee, 0x0b, 0x3d, 0xa6, 0x99, 0x73, 0x3d, 0xa6, 0x51, 0x87, - 0xe9, 0x63, 0xae, 0xc4, 0xd9, 0xc4, 0x13, 0xc5, 0xa6, 0xe5, 0x62, 0xc3, 0x4f, 0xe9, 0x1c, 0xfc, - 0x14, 0x6a, 0x6f, 0xf0, 0xa1, 0xe7, 0x18, 0xa7, 0xd8, 0x8f, 0x9a, 0xc8, 0xb7, 0xa7, 0xd4, 0x6a, - 0x08, 0x26, 0xb1, 0xb5, 0x28, 0x80, 0xfc, 0x55, 0x04, 0xd0, 0xfc, 0xb3, 0x0c, 0xc8, 0x49, 0x2e, - 0xfe, 0x9f, 0xe6, 0xf6, 0x09, 0xc9, 0xfc, 0x32, 0x03, 0x33, 0xe7, 0xec, 0xe7, 0xbb, 0xea, 0x5f, - 0x2c, 0x8c, 0x93, 0x68, 0x76, 0x22, 0x89, 0xe6, 0x26, 0x96, 0x68, 0xfe, 0xf2, 0x12, 0x2d, 0x5e, - 0x45, 0xa2, 0xbf, 0x1b, 0x3c, 0x55, 0xef, 0xd0, 0xc4, 0xf5, 0x0a, 0x4f, 0xd5, 0x17, 0xa4, 0xc0, - 0xe4, 0x3b, 0xcd, 0x77, 0xe1, 0x4b, 0x78, 0x97, 0xbf, 0x6a, 0x5d, 0x7a, 0x79, 0xfe, 0xbe, 0xcd, - 0xd8, 0xd5, 0x84, 0x26, 0xcf, 0x9a, 0x6e, 0x9a, 0x4c, 0x01, 0x12, 0xef, 0xdb, 0x22, 0x69, 0x56, - 0x7c, 0xdf, 0x8e, 0xa8, 0x29, 0x73, 0x5f, 0x40, 0x3d, 0xfe, 0x20, 0x83, 0x1e, 0x40, 0xce, 0xb2, - 0x8f, 0x9c, 0x73, 0x4f, 0xfc, 0xc2, 0xf3, 0x1c, 0x25, 0x20, 0xd3, 0x17, 0x5f, 0x41, 0x55, 0xec, - 0xa0, 0x47, 0xf3, 0x80, 0x5a, 0x07, 0x9b, 0xed, 0x8e, 0xb6, 0xb1, 0xdd, 0xda, 0xdb, 0x53, 0x76, - 0xb4, 0xf5, 0x4e, 0x6f, 0x5b, 0x9e, 0x3a, 0x0f, 0xdf, 0x51, 0xb6, 0x7a, 0xb2, 0x84, 0x3e, 0x82, - 0xd9, 0x38, 0x5c, 0x6d, 0xbf, 0xd8, 0xee, 0xc9, 0x99, 0xc5, 0x5f, 0x4a, 0x70, 0x23, 0xf5, 0x72, - 0x42, 0x32, 0x54, 0xb7, 0x57, 0x9f, 0x3e, 0xd1, 0x3e, 0x5f, 0x5d, 0xd9, 0xd7, 0xd6, 0x56, 0xe4, - 0xa9, 0x38, 0xe4, 0xe9, 0x8a, 0x2c, 0xa1, 0x19, 0xa8, 0x51, 0xc8, 0xf7, 0x57, 0x9e, 0x31, 0xa2, - 0x4c, 0x02, 0xf4, 0x74, 0x45, 0xce, 0xa2, 0x9b, 0x70, 0x63, 0xbf, 0xa3, 0xf6, 0xd4, 0x56, 0xbb, - 0xa7, 0xc5, 0x96, 0xcc, 0x5d, 0x80, 0x7a, 0xba, 0x22, 0xe7, 0xd1, 0x02, 0xcc, 0xc7, 0x51, 0xe1, - 0x47, 0x0a, 0x17, 0xe1, 0x9e, 0xae, 0xc8, 0xc5, 0xc5, 0x75, 0xde, 0x75, 0x1f, 0x99, 0x21, 0x9a, - 0x03, 0x79, 0x53, 0xd9, 0x6a, 0x1d, 0xec, 0xf4, 0xb4, 0xad, 0xf6, 0x8e, 0xd2, 0xfb, 0xc9, 0xbe, - 0x22, 0x4f, 0xa1, 0x22, 0x64, 0x77, 0xf7, 0x9f, 0xc8, 0x12, 0xf9, 0xd1, 0x79, 0xf1, 0x42, 0xce, - 0x30, 0xc8, 0x9a, 0x9c, 0x5d, 0xdc, 0x0e, 0x4e, 0x2b, 0xe8, 0xca, 0x15, 0x97, 0xd8, 0x57, 0x3b, - 0xbd, 0xce, 0x46, 0x67, 0x47, 0x9e, 0x42, 0x25, 0xc8, 0xa9, 0xbd, 0xdd, 0x7d, 0xb6, 0x46, 0x57, - 0xed, 0xc9, 0x19, 0x54, 0x83, 0xf2, 0x2b, 0x65, 0xbd, 0xdb, 0xd9, 0x78, 0xa9, 0xf4, 0xe4, 0xec, - 0xe2, 0x1e, 0xdc, 0x48, 0x6d, 0xf3, 0x45, 0xf7, 0xe0, 0x4e, 0xb0, 0x60, 0x57, 0x79, 0xb1, 0xab, - 0xec, 0xf5, 0x94, 0x4d, 0xca, 0x9d, 0xb8, 0x3e, 0x91, 0xf8, 0x4e, 0x37, 0x82, 0x48, 0x8b, 0x8f, - 0x13, 0x6d, 0xc6, 0xbc, 0xe5, 0xb2, 0x0c, 0xf9, 0xf6, 0xde, 0xa6, 0xf2, 0xb5, 0x3c, 0x45, 0x18, - 0xe8, 0xb5, 0x77, 0x95, 0x6e, 0xaf, 0x45, 0x18, 0x5b, 0x3c, 0x82, 0xe9, 0x44, 0xbf, 0x26, 0x51, - 0x92, 0xf6, 0x6e, 0xeb, 0x85, 0xa2, 0x75, 0x0f, 0xb6, 0xb6, 0xda, 0x5f, 0x6b, 0xc1, 0xcc, 0x05, - 0x98, 0x8f, 0xc1, 0x85, 0x65, 0xd0, 0x1d, 0xb8, 0x15, 0xc3, 0xed, 0x75, 0xf6, 0x14, 0xad, 0xf3, - 0x95, 0xa2, 0xbe, 0x52, 0xdb, 0x3d, 0x45, 0xce, 0x2c, 0xfe, 0x18, 0xe4, 0x64, 0xb3, 0x03, 0x59, - 0x50, 0x79, 0xa1, 0x2a, 0xdd, 0xae, 0xd6, 0xed, 0x1c, 0xa8, 0x1b, 0x8a, 0x46, 0x24, 0xaf, 0xbd, - 0x52, 0xd6, 0xd9, 0xc7, 0x52, 0x70, 0xdd, 0xcd, 0x97, 0xb2, 0xb4, 0xf8, 0x17, 0x12, 0x54, 0xc5, - 0x16, 0x08, 0x34, 0x0b, 0xd3, 0x01, 0x71, 0xaf, 0xa5, 0xf6, 0xda, 0x7b, 0x2f, 0xe4, 0x29, 0xa2, - 0x69, 0x1c, 0xc8, 0x9f, 0xd1, 0x24, 0x01, 0xa4, 0xec, 0x6d, 0x12, 0xaa, 0x8c, 0x30, 0x75, 0xa3, - 0xb3, 0xbb, 0xbf, 0xa3, 0xf4, 0x14, 0x39, 0x2b, 0xd0, 0xf1, 0x77, 0xb6, 0x1c, 0x42, 0x50, 0x0f, - 0x56, 0x5b, 0xef, 0xa8, 0x3d, 0x65, 0x53, 0xce, 0xa3, 0x06, 0xcc, 0x71, 0xd8, 0x4e, 0x7b, 0xb7, - 0xdd, 0xd3, 0x54, 0xa5, 0xb5, 0xb1, 0xad, 0x6c, 0xca, 0x85, 0xc5, 0x03, 0xfe, 0xff, 0x3d, 0xbc, - 0x52, 0x86, 0xa0, 0x1e, 0x1c, 0xe6, 0x6e, 0xfb, 0x6b, 0xc6, 0xde, 0x3c, 0xa0, 0xcd, 0x83, 0xd6, - 0x4e, 0x68, 0x71, 0xad, 0x17, 0xca, 0x1e, 0x31, 0xc5, 0x05, 0x98, 0x8f, 0xc3, 0x77, 0x7a, 0x8a, - 0xba, 0xd7, 0x22, 0x42, 0x5c, 0xfd, 0xbb, 0x02, 0x14, 0x78, 0x79, 0xfd, 0x47, 0x50, 0x11, 0xba, - 0x2f, 0xd0, 0xb8, 0x9e, 0x8c, 0x85, 0xb4, 0xfe, 0x20, 0xd4, 0x82, 0xaa, 0xd8, 0x17, 0x84, 0xa2, - 0xa0, 0x2c, 0xa5, 0x5d, 0x28, 0x7d, 0x09, 0x05, 0x20, 0x6a, 0x4e, 0x42, 0x51, 0x54, 0x79, 0xae, - 0x4d, 0x6a, 0xe1, 0x56, 0x2a, 0x8e, 0x77, 0x33, 0x7d, 0x01, 0x10, 0xf5, 0xf7, 0x20, 0xf1, 0xe1, - 0x35, 0xd1, 0xf4, 0x93, 0xce, 0xc5, 0x4f, 0xa0, 0x41, 0xf7, 0x9c, 0x52, 0x36, 0x45, 0x93, 0xf4, - 0x8c, 0xa4, 0xae, 0xda, 0xcc, 0x7e, 0x93, 0x91, 0x90, 0x42, 0xec, 0x5c, 0x77, 0xfd, 0xb0, 0x6a, - 0x84, 0x2e, 0xee, 0x1e, 0x19, 0xb3, 0xcc, 0x01, 0xcc, 0xd3, 0x65, 0xce, 0xbf, 0x1d, 0x7d, 0x7b, - 0x47, 0xc9, 0x98, 0x65, 0x7f, 0x07, 0x6e, 0xd2, 0x65, 0xd3, 0x52, 0x35, 0x34, 0x51, 0x73, 0xc9, - 0x98, 0xc5, 0xdb, 0x20, 0x47, 0x8b, 0x9f, 0x53, 0xb2, 0xf3, 0x71, 0xf0, 0x98, 0xa5, 0xb6, 0x02, - 0x4d, 0x63, 0xd7, 0xfa, 0x39, 0x4d, 0x8b, 0xdd, 0xf6, 0x93, 0xac, 0xc3, 0x7c, 0xef, 0xb9, 0x75, - 0x62, 0xd7, 0xfa, 0xc5, 0xeb, 0xac, 0x6f, 0xfd, 0xf6, 0xbd, 0x63, 0xcb, 0x3f, 0x19, 0x1d, 0x2e, - 0x1b, 0xce, 0xe0, 0x31, 0xa7, 0x7a, 0x1c, 0xfc, 0x5b, 0x45, 0x00, 0xf8, 0x79, 0xa6, 0xb6, 0x63, - 0xbd, 0xc6, 0x2f, 0x59, 0x5b, 0xa6, 0xef, 0xfc, 0x5b, 0xa6, 0xce, 0xc7, 0xcf, 0x9f, 0x53, 0xc0, - 0x61, 0x81, 0x4e, 0x59, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x28, 0x7d, 0x69, 0x61, - 0x3c, 0x00, 0x00, + // 4314 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0xdc, 0x48, + 0x76, 0x62, 0x7f, 0xf7, 0xeb, 0x0f, 0x51, 0x25, 0x59, 0xd3, 0x96, 0x3d, 0x63, 0x6f, 0x3b, 0xe3, + 0x0f, 0x8d, 0x56, 0x56, 0x24, 0xaf, 0xc7, 0xeb, 0xcd, 0xce, 0xa6, 0xa5, 0xa6, 0xac, 0x5e, 0x4b, + 0x6a, 0x85, 0xdd, 0x1a, 0x4f, 0x02, 0x24, 0x04, 0x45, 0x96, 0x24, 0x42, 0xdd, 0x64, 0x2f, 0xc9, + 0x96, 0xad, 0xfd, 0x05, 0x9b, 0x1c, 0x92, 0x20, 0x01, 0x12, 0xc0, 0x40, 0x90, 0x1c, 0x82, 0x1c, + 0x82, 0x3d, 0xe5, 0x92, 0x6b, 0xce, 0xf9, 0x40, 0x0e, 0x41, 0x90, 0x7b, 0x8e, 0x81, 0x83, 0x45, + 0x0e, 0xb9, 0x07, 0xf5, 0x41, 0xb2, 0x48, 0x51, 0x72, 0xcb, 0x72, 0x66, 0x2f, 0x7b, 0x52, 0xd7, + 0x7b, 0xaf, 0x8a, 0xaf, 0xea, 0x7d, 0xd4, 0x7b, 0xaf, 0x9e, 0x60, 0x6e, 0x60, 0x9d, 0xe2, 0x13, + 0xcb, 0xd7, 0xf0, 0x91, 0x8b, 0x3d, 0x6f, 0x79, 0xe4, 0x3a, 0xbe, 0x83, 0x8a, 0x1c, 0xba, 0x10, + 0xa2, 0x87, 0x8e, 0x89, 0x07, 0x1c, 0xbd, 0x30, 0x37, 0x70, 0x8e, 0x8e, 0xb0, 0xfb, 0xd8, 0x19, + 0xf9, 0x96, 0x63, 0x73, 0x68, 0xf3, 0x3f, 0xb2, 0x80, 0x7a, 0xbe, 0xee, 0xfa, 0x0a, 0x5d, 0x4a, + 0xc5, 0x3f, 0x19, 0x63, 0xcf, 0x47, 0xb7, 0xa0, 0xec, 0x3a, 0xce, 0x50, 0xb3, 0xf5, 0x21, 0x6e, + 0x48, 0x77, 0xa5, 0x87, 0x65, 0xb5, 0x44, 0x00, 0xbb, 0xfa, 0x10, 0xa3, 0xef, 0x41, 0xc9, 0xc7, + 0xc3, 0xd1, 0x40, 0xf7, 0x71, 0x23, 0x73, 0x57, 0x7a, 0x58, 0x59, 0xfd, 0x64, 0x99, 0x7f, 0x72, + 0xb9, 0xcf, 0x11, 0x3d, 0x67, 0xec, 0x1a, 0x78, 0x6b, 0x4a, 0x0d, 0x49, 0xd1, 0x7d, 0xc8, 0xbe, + 0xc6, 0x07, 0x8d, 0x2c, 0x9d, 0x81, 0xc2, 0x19, 0xaf, 0xf0, 0x41, 0x48, 0x4c, 0x08, 0xd0, 0x12, + 0xe4, 0x87, 0xd8, 0xb4, 0xf4, 0x46, 0x8e, 0x52, 0xce, 0x85, 0x94, 0x3b, 0x04, 0x1a, 0xd2, 0x32, + 0x22, 0xf4, 0x0c, 0x0a, 0x23, 0x17, 0x7b, 0xd8, 0x6f, 0xe4, 0xef, 0x4a, 0x0f, 0xeb, 0xab, 0x9f, + 0x85, 0xe4, 0x8a, 0x6d, 0x38, 0xa6, 0x65, 0x1f, 0x75, 0xd9, 0x86, 0xf7, 0x28, 0xd5, 0x96, 0xa4, + 0x72, 0x7a, 0xf4, 0x14, 0x4a, 0xba, 0x79, 0xaa, 0xdb, 0x06, 0x36, 0x1b, 0x05, 0xfa, 0xa9, 0xc6, + 0x45, 0x73, 0xb7, 0x24, 0x35, 0xa4, 0x45, 0x8f, 0xa0, 0xe8, 0x8c, 0xfd, 0xd1, 0xd8, 0xf7, 0x1a, + 0xc5, 0xbb, 0xd9, 0x87, 0x95, 0xd5, 0xe9, 0x70, 0x5a, 0x97, 0xc2, 0xd5, 0x00, 0x8f, 0x56, 0xa0, + 0xe8, 0xf9, 0x8e, 0xab, 0x1f, 0xe1, 0x46, 0x89, 0x7e, 0x61, 0x3e, 0x24, 0xed, 0x31, 0xf8, 0x86, + 0x63, 0x1f, 0x5a, 0x47, 0x6a, 0x40, 0x86, 0x56, 0xa1, 0xf4, 0x1a, 0x1f, 0x1c, 0x3b, 0xce, 0x89, + 0xd7, 0x28, 0xd3, 0xd5, 0xe7, 0xc5, 0x93, 0x22, 0x08, 0x3e, 0x25, 0xa4, 0x5b, 0x2f, 0x41, 0xc1, + 0xa3, 0xa7, 0xb2, 0x0e, 0x50, 0xc2, 0x9c, 0xf3, 0xe6, 0x1f, 0x4a, 0x50, 0x8f, 0x4b, 0x03, 0xcd, + 0x43, 0x61, 0xa0, 0x9f, 0x39, 0x63, 0x9f, 0x8b, 0x94, 0x8f, 0xd0, 0xa7, 0x00, 0xfa, 0xd8, 0xb4, + 0x1c, 0xcd, 0xb1, 0x07, 0x67, 0x54, 0xa4, 0x25, 0xb5, 0x4c, 0x21, 0x5d, 0x7b, 0x70, 0x46, 0xd0, + 0xa7, 0x96, 0x89, 0x39, 0x3a, 0xcb, 0xd0, 0x14, 0x42, 0xd1, 0xf7, 0x61, 0xda, 0x18, 0x7b, 0xbe, + 0x33, 0xd4, 0x0e, 0x74, 0x0f, 0x6b, 0x63, 0x77, 0x40, 0x25, 0x57, 0x56, 0x6b, 0x0c, 0xbc, 0xae, + 0x7b, 0x78, 0xdf, 0x1d, 0x34, 0x7f, 0x5f, 0x82, 0x72, 0x28, 0x6c, 0x24, 0x43, 0x96, 0x50, 0x32, + 0x46, 0xc8, 0xcf, 0x6b, 0x72, 0xb1, 0x04, 0x48, 0x7f, 0xad, 0x5b, 0xbe, 0xe6, 0x11, 0x6d, 0xd6, + 0x3c, 0xeb, 0xc8, 0xd6, 0x19, 0x23, 0x25, 0x55, 0xa6, 0x18, 0xaa, 0xe6, 0x3d, 0x0a, 0x6f, 0xfe, + 0x42, 0x82, 0x8a, 0xa0, 0x4e, 0xe8, 0x19, 0xd4, 0xd9, 0xe2, 0xbe, 0xab, 0x1b, 0x27, 0x9a, 0x65, + 0x32, 0xc6, 0xd6, 0xe5, 0xb7, 0xef, 0x96, 0xaa, 0x14, 0xd3, 0x27, 0x88, 0x4e, 0x7b, 0x6b, 0x4a, + 0x15, 0xc7, 0x26, 0xda, 0x82, 0x99, 0x91, 0xee, 0xfa, 0x96, 0x61, 0x8d, 0x74, 0xdb, 0xd7, 0x28, + 0x8e, 0x5b, 0xc5, 0xcd, 0x50, 0x72, 0x7b, 0x11, 0xc5, 0xd7, 0x84, 0x60, 0x6b, 0x4a, 0x95, 0x47, + 0x09, 0x18, 0x5a, 0x84, 0x3c, 0xdd, 0x2d, 0xb7, 0x90, 0x48, 0xef, 0x5b, 0x04, 0xca, 0xa5, 0xce, + 0x48, 0xd0, 0x03, 0xc8, 0x99, 0xba, 0x1f, 0x98, 0xc8, 0x6c, 0x48, 0xda, 0xd6, 0x7d, 0x9d, 0x53, + 0x52, 0x82, 0xf5, 0x22, 0xe4, 0x29, 0x4b, 0xcd, 0xdf, 0x03, 0x39, 0xc9, 0x05, 0x5a, 0x80, 0x92, + 0x65, 0x62, 0xdb, 0xb7, 0xfc, 0xb3, 0xc0, 0xc8, 0x83, 0x31, 0x5a, 0x86, 0xd9, 0x91, 0x8b, 0x0f, + 0xb1, 0xab, 0x79, 0x86, 0x8b, 0xb1, 0xad, 0x79, 0xc7, 0xba, 0x8b, 0xb9, 0x58, 0x66, 0x18, 0xaa, + 0x47, 0x31, 0x3d, 0x82, 0x68, 0x3e, 0x87, 0x8a, 0xc0, 0x27, 0xfa, 0x02, 0x0a, 0xae, 0x33, 0xf6, + 0xb1, 0xd7, 0x90, 0xa8, 0x16, 0xcf, 0xc6, 0x77, 0xa3, 0x12, 0x9c, 0xca, 0x49, 0x9a, 0xff, 0x23, + 0x01, 0x44, 0x60, 0xf4, 0x10, 0x4a, 0x09, 0x31, 0x54, 0xde, 0xbe, 0x5b, 0x2a, 0xfa, 0xa1, 0x04, + 0xf8, 0x4f, 0x13, 0xad, 0xc1, 0x9c, 0x78, 0xf8, 0xe1, 0x66, 0x08, 0x97, 0xe5, 0xad, 0x29, 0x75, + 0x56, 0xc0, 0x76, 0x82, 0x9d, 0xfd, 0x18, 0xc4, 0xb3, 0xd7, 0x4e, 0x2c, 0xdb, 0xa4, 0x47, 0x5e, + 0x5f, 0xfd, 0x34, 0x4d, 0x60, 0x1d, 0xfb, 0xd0, 0x59, 0x7e, 0x69, 0xd9, 0xe6, 0xd6, 0x94, 0x3a, + 0x2d, 0x4c, 0x24, 0x20, 0xf4, 0x18, 0x8a, 0xc6, 0xb1, 0x6e, 0xdb, 0x98, 0xa9, 0x5a, 0x7d, 0xf5, + 0x46, 0x42, 0x6a, 0x0c, 0xa9, 0x06, 0x54, 0x44, 0x1e, 0x43, 0xdd, 0x37, 0x8e, 0x9b, 0x2d, 0x80, + 0x48, 0x58, 0x68, 0x0d, 0xca, 0x1e, 0x1e, 0x60, 0xc3, 0x77, 0xdc, 0xe0, 0xc4, 0x6e, 0xc4, 0x84, + 0xda, 0xe3, 0x58, 0x35, 0xa2, 0x23, 0x16, 0x5e, 0x15, 0x71, 0xff, 0xdf, 0x07, 0x37, 0x0f, 0x79, + 0xdf, 0x19, 0x59, 0x06, 0x3d, 0x2d, 0x42, 0xc5, 0x86, 0xd1, 0x9e, 0xfe, 0x31, 0x0b, 0xd3, 0x09, + 0xcf, 0x89, 0xe6, 0x20, 0xff, 0xda, 0x32, 0xfd, 0x63, 0xca, 0x50, 0x5e, 0x65, 0x03, 0xe2, 0x89, + 0x8e, 0xb1, 0x75, 0x74, 0xec, 0xd3, 0x2f, 0xe6, 0x55, 0x3e, 0x22, 0xd4, 0x26, 0x1e, 0xf9, 0xc7, + 0xf4, 0x13, 0x79, 0x95, 0x0d, 0xd0, 0x6d, 0x28, 0x1f, 0xba, 0xfa, 0x10, 0xbb, 0xe4, 0xc6, 0xc9, + 0x51, 0x4c, 0x04, 0x40, 0x4f, 0xa0, 0xc2, 0xfc, 0x86, 0xe1, 0x98, 0xd8, 0xe0, 0xd7, 0xc0, 0x6c, + 0xd2, 0x7a, 0x4c, 0x6c, 0xa8, 0xcc, 0xbf, 0xd0, 0xdf, 0xe8, 0x1e, 0xd4, 0xd8, 0xac, 0x03, 0xcb, + 0xa7, 0xeb, 0x16, 0xe8, 0xba, 0x55, 0x0a, 0x5c, 0x67, 0xb0, 0x88, 0xe8, 0x27, 0x63, 0x7d, 0x40, + 0xce, 0xa7, 0x22, 0x10, 0xfd, 0x16, 0x83, 0xa1, 0x07, 0x30, 0xcd, 0x88, 0x0e, 0x5d, 0x72, 0x7b, + 0xda, 0xc6, 0x59, 0xa3, 0x48, 0xc9, 0xea, 0x14, 0xbc, 0x19, 0x40, 0x09, 0xa3, 0xcc, 0xc9, 0x30, + 0x46, 0x4b, 0x09, 0x46, 0xa9, 0x4d, 0x72, 0x46, 0x4f, 0xc3, 0xdf, 0x84, 0x07, 0x36, 0x2b, 0x60, + 0xb4, 0xcc, 0x78, 0xa0, 0x40, 0x81, 0x51, 0x46, 0x14, 0x30, 0x5a, 0x15, 0x88, 0x02, 0x46, 0x97, + 0x00, 0x9d, 0xe0, 0x33, 0x8d, 0x9e, 0x9c, 0x66, 0xd9, 0x3e, 0x76, 0x4f, 0xf5, 0x41, 0x03, 0xee, + 0x4a, 0x0f, 0x25, 0x55, 0x3e, 0xc1, 0x67, 0x9b, 0x04, 0xd1, 0xe1, 0xf0, 0xe6, 0xdf, 0x67, 0xa0, + 0xc0, 0xee, 0x33, 0xf4, 0x08, 0x72, 0x87, 0xd6, 0x80, 0x05, 0x02, 0xa2, 0x29, 0x6f, 0x5a, 0x03, + 0xcc, 0x48, 0xb6, 0xa6, 0x54, 0x4a, 0x82, 0x1e, 0x43, 0xc1, 0xf3, 0x5d, 0xac, 0x0f, 0xb9, 0x0f, + 0xbc, 0x21, 0x5c, 0x78, 0x04, 0x1c, 0x92, 0x73, 0x32, 0xf4, 0x1c, 0x4a, 0x1e, 0x3e, 0x1a, 0x62, + 0xdb, 0xf7, 0xb8, 0xe3, 0xbb, 0x1d, 0x4d, 0x61, 0x08, 0x6c, 0xc6, 0x3e, 0x14, 0xd2, 0xa3, 0x65, + 0x28, 0x58, 0x43, 0xfd, 0x08, 0x7b, 0xe7, 0x42, 0x85, 0x0e, 0x01, 0x47, 0xdf, 0x62, 0x54, 0x64, + 0x1f, 0x43, 0x43, 0x1f, 0x51, 0x15, 0x11, 0xf7, 0xb1, 0x63, 0xe8, 0xa3, 0x68, 0x1f, 0x84, 0x44, + 0xbc, 0xb9, 0x0b, 0x13, 0xdd, 0xdc, 0xe4, 0x16, 0x36, 0x28, 0xa8, 0xf9, 0x07, 0x12, 0x40, 0xc4, + 0x31, 0xfa, 0x1e, 0x94, 0xc9, 0xd1, 0x68, 0xfe, 0xd9, 0x88, 0x1d, 0x61, 0x3d, 0x19, 0x68, 0xb0, + 0x0d, 0xf6, 0xcf, 0x46, 0x58, 0x2d, 0x1d, 0xf2, 0x5f, 0xc4, 0x39, 0x93, 0xdf, 0x23, 0xdd, 0x3f, + 0x66, 0x66, 0xa9, 0x86, 0x63, 0xf4, 0x08, 0x64, 0xd3, 0xf2, 0xf4, 0x83, 0x01, 0xd6, 0x86, 0xba, + 0x6d, 0x1d, 0x62, 0xcf, 0xe7, 0x37, 0xe2, 0x34, 0x87, 0xef, 0x70, 0x70, 0xf3, 0x15, 0x54, 0xc5, + 0x93, 0x47, 0x6b, 0x50, 0xa2, 0x91, 0x9f, 0xe1, 0x0c, 0x38, 0x33, 0x9f, 0x24, 0x44, 0xb4, 0xc7, + 0xd1, 0x6a, 0x48, 0x88, 0x10, 0xe4, 0xc6, 0xee, 0xc0, 0x6b, 0x64, 0xee, 0x66, 0x1f, 0x96, 0x55, + 0xfa, 0xbb, 0xf9, 0xd7, 0x39, 0x98, 0x4d, 0x11, 0x10, 0x11, 0x68, 0xe2, 0x03, 0x9f, 0xa5, 0x0b, + 0x34, 0xe5, 0x3b, 0x0f, 0x60, 0x9a, 0xec, 0x91, 0x44, 0x9d, 0x1a, 0xb9, 0x62, 0xac, 0x37, 0x7c, + 0xeb, 0xf5, 0x00, 0xbc, 0x47, 0xa1, 0x44, 0xdf, 0x47, 0x03, 0xfd, 0x6c, 0x60, 0x79, 0x3e, 0x8b, + 0x51, 0xa9, 0x4b, 0x52, 0xab, 0x01, 0x90, 0xc6, 0xa9, 0x4b, 0x80, 0xc8, 0x87, 0xb5, 0x38, 0x65, + 0x85, 0x52, 0xca, 0x04, 0xb3, 0x27, 0x52, 0x3f, 0x02, 0x99, 0x2b, 0x96, 0x66, 0x8e, 0x5d, 0x9d, + 0x78, 0x2f, 0xaa, 0x56, 0x35, 0x75, 0x9a, 0xc3, 0xdb, 0x1c, 0x8c, 0x14, 0x81, 0x4d, 0x6f, 0x7c, + 0x48, 0xd8, 0x04, 0xba, 0xd3, 0x0b, 0x54, 0xb7, 0x47, 0x69, 0xa2, 0x4d, 0xb0, 0x71, 0xaa, 0x14, + 0x4b, 0xa9, 0x52, 0x44, 0xf7, 0x20, 0xe3, 0xad, 0x71, 0xbd, 0x9d, 0x89, 0x3e, 0xb2, 0xb6, 0x3f, + 0x1a, 0x38, 0x3a, 0xb9, 0x99, 0x32, 0xde, 0x1a, 0x09, 0xb0, 0x8f, 0x8c, 0x11, 0xd7, 0xd7, 0x28, + 0xc0, 0x7e, 0xb1, 0xb1, 0x17, 0x92, 0x11, 0x02, 0xb4, 0x02, 0x79, 0xfd, 0xa7, 0x63, 0x17, 0x53, + 0x37, 0x25, 0x46, 0xbd, 0x2d, 0x02, 0x5d, 0x1f, 0x38, 0x07, 0x21, 0x3d, 0x23, 0x24, 0x56, 0xad, + 0x0f, 0xac, 0x6e, 0xaf, 0x47, 0x9d, 0x8f, 0x68, 0xd5, 0x2d, 0x0a, 0x0e, 0xe9, 0x39, 0x19, 0x31, + 0x06, 0x16, 0x03, 0x37, 0xff, 0x3b, 0x0b, 0x15, 0xc1, 0x1a, 0xc9, 0xa6, 0x0d, 0x7d, 0xe4, 0x8f, + 0x5d, 0xc1, 0x05, 0x49, 0xec, 0x98, 0x39, 0x3c, 0xf0, 0x40, 0xd1, 0xd5, 0x91, 0x49, 0xbf, 0x3a, + 0xb2, 0xb1, 0xab, 0x23, 0x45, 0x77, 0x72, 0xa9, 0xba, 0xd3, 0x3a, 0x2f, 0xbd, 0x7c, 0xc2, 0x2a, + 0x29, 0xc3, 0x97, 0x48, 0xee, 0x09, 0x54, 0xa8, 0x4b, 0xe1, 0x9e, 0xbc, 0x90, 0xf0, 0xe4, 0x74, + 0x3a, 0xf7, 0xe4, 0x56, 0xf8, 0x3b, 0x55, 0xde, 0xc5, 0xcb, 0xe4, 0x5d, 0x9a, 0x48, 0xde, 0xe5, + 0x89, 0xe5, 0x0d, 0x57, 0x97, 0x77, 0xe5, 0xaa, 0xf2, 0xee, 0x01, 0x44, 0xee, 0x34, 0xe6, 0xc4, + 0xa4, 0x09, 0x9c, 0x58, 0x26, 0xdd, 0x89, 0xfd, 0xb3, 0x04, 0xb5, 0x98, 0xdb, 0xe5, 0x07, 0x24, + 0x4d, 0x74, 0x40, 0x99, 0x89, 0x0f, 0x28, 0x3b, 0xe9, 0x01, 0xad, 0x40, 0x51, 0x1f, 0x58, 0x9a, + 0xe3, 0x05, 0x57, 0xcf, 0xe5, 0x27, 0xe4, 0x79, 0x24, 0x35, 0x1b, 0xb9, 0x0e, 0xb9, 0x8f, 0xdd, + 0xe6, 0x7f, 0xe6, 0xa0, 0x14, 0xb0, 0x8a, 0xee, 0x01, 0xe8, 0x86, 0x81, 0x3d, 0x4f, 0x3b, 0xc1, + 0x3c, 0x0c, 0x5f, 0xcf, 0xfd, 0xec, 0xdd, 0x92, 0xa4, 0x96, 0x19, 0xfc, 0x25, 0x3e, 0x43, 0xb7, + 0xa1, 0xe0, 0x61, 0xc3, 0xc5, 0xec, 0x84, 0x02, 0x02, 0x0e, 0x43, 0x8f, 0xa0, 0xe6, 0x61, 0xcf, + 0xb3, 0x1c, 0x5b, 0xf3, 0x9d, 0x13, 0x6c, 0x33, 0x1f, 0xc7, 0x89, 0xaa, 0x1c, 0xd5, 0x27, 0x18, + 0xb4, 0x04, 0xd3, 0xba, 0xe7, 0x8d, 0x87, 0x58, 0x73, 0x9d, 0x01, 0xd6, 0x74, 0xd7, 0xa6, 0xa1, + 0x42, 0x40, 0x5c, 0x63, 0x48, 0xd5, 0x19, 0xe0, 0x96, 0x6b, 0xa3, 0x1e, 0x7c, 0x22, 0x52, 0xe3, + 0x37, 0x3e, 0x76, 0x6d, 0x7d, 0x40, 0xe2, 0xcb, 0x1a, 0x9d, 0x75, 0x9b, 0xcc, 0x7a, 0xfb, 0x6e, + 0x69, 0x2e, 0x9a, 0xa7, 0x70, 0xa2, 0x4e, 0x5b, 0x4d, 0x83, 0x9a, 0xc4, 0x80, 0x5d, 0x7c, 0x44, + 0xdc, 0x2b, 0x73, 0xda, 0x7c, 0x44, 0x74, 0x05, 0xdb, 0xe6, 0xc8, 0xb1, 0x6c, 0x9f, 0x5b, 0x6e, + 0x38, 0x26, 0x73, 0x0e, 0xc6, 0xc6, 0x09, 0xcf, 0xf2, 0xcb, 0x2a, 0x1f, 0xa1, 0x87, 0x20, 0x1f, + 0x3a, 0xae, 0x81, 0x35, 0xa2, 0x51, 0x9a, 0xe7, 0x9f, 0x0d, 0xd8, 0x7d, 0x5d, 0x52, 0xeb, 0x14, + 0xbe, 0xa7, 0xfb, 0xc7, 0x3d, 0x02, 0x45, 0x3f, 0x80, 0xd2, 0x10, 0xfb, 0x3a, 0xcd, 0x9a, 0x58, + 0xda, 0x7e, 0xe7, 0x9c, 0xda, 0x2c, 0xef, 0x70, 0x0a, 0xc5, 0xf6, 0xdd, 0x33, 0x35, 0x9c, 0x80, + 0x1a, 0x50, 0xf4, 0xf5, 0xa3, 0x23, 0xcb, 0x3e, 0xa2, 0x36, 0x59, 0x56, 0x83, 0x21, 0x7a, 0x0c, + 0xb3, 0x86, 0x63, 0xfb, 0xf4, 0xd6, 0xb0, 0xbc, 0x91, 0xe3, 0x59, 0xf4, 0xe2, 0x28, 0x53, 0x2a, + 0xc4, 0x51, 0xed, 0x08, 0x43, 0xb2, 0xbc, 0x91, 0xeb, 0xbc, 0x39, 0xe3, 0xc6, 0x18, 0x85, 0x2c, + 0x7b, 0x04, 0x1a, 0x64, 0x79, 0x94, 0x64, 0xe1, 0x07, 0x50, 0x8b, 0x71, 0x44, 0x92, 0xe6, 0x50, + 0x49, 0x54, 0xf2, 0x93, 0xf8, 0xc8, 0x53, 0x7d, 0x30, 0xc6, 0xfc, 0x9e, 0x64, 0x83, 0xe7, 0x99, + 0x67, 0x52, 0xf3, 0x35, 0x94, 0x43, 0x45, 0x47, 0xf7, 0xa1, 0x62, 0xb8, 0x98, 0x06, 0xf2, 0xfa, + 0xc0, 0x8b, 0x69, 0x99, 0x88, 0x10, 0xce, 0x39, 0x13, 0x3b, 0xe7, 0x90, 0xeb, 0xec, 0x7b, 0xb9, + 0x6e, 0xfe, 0x4c, 0x82, 0xe9, 0x84, 0xe1, 0xa0, 0x07, 0x50, 0xd5, 0x0d, 0xc3, 0x19, 0xdb, 0xbe, + 0x50, 0x52, 0x0a, 0x18, 0xe0, 0x18, 0x7a, 0x0b, 0x7f, 0x0e, 0xc1, 0x90, 0x9a, 0x83, 0xa8, 0xed, + 0xc0, 0x11, 0xc4, 0x1e, 0x3e, 0x87, 0x3a, 0x39, 0x5b, 0xdd, 0xb2, 0xb1, 0x2b, 0x06, 0x00, 0xb5, + 0x10, 0x4a, 0x56, 0x6b, 0xfe, 0x85, 0x04, 0x55, 0xd1, 0x1e, 0x3f, 0x86, 0xb1, 0x7d, 0x44, 0xf5, + 0x6d, 0xfe, 0x2e, 0x54, 0x84, 0x03, 0x4c, 0xa9, 0x89, 0x2c, 0x40, 0x69, 0xec, 0x11, 0xc3, 0x19, + 0x06, 0x12, 0x0e, 0xc7, 0xe8, 0x2e, 0x94, 0x46, 0xba, 0xe7, 0xbd, 0x76, 0x5c, 0x96, 0xbf, 0x06, + 0x8c, 0x86, 0xd0, 0xa6, 0x07, 0x33, 0xdb, 0x96, 0x77, 0x95, 0xd2, 0xde, 0x23, 0x28, 0xb3, 0x9a, + 0x22, 0x31, 0x71, 0xb6, 0xfb, 0xea, 0xdb, 0x77, 0x4b, 0x25, 0x06, 0xec, 0xb4, 0xd5, 0xe0, 0x17, + 0x35, 0x63, 0xdd, 0xf0, 0xad, 0x53, 0xcc, 0x23, 0x4f, 0x3e, 0x6a, 0xfe, 0x08, 0x90, 0xf8, 0x51, + 0x6f, 0xe4, 0xd8, 0x1e, 0x59, 0x38, 0x6f, 0xf9, 0x78, 0x78, 0xbe, 0x1c, 0xc0, 0xe8, 0x48, 0x92, + 0xad, 0x32, 0x8a, 0xe6, 0x3f, 0x48, 0x30, 0xbb, 0x3f, 0x32, 0x75, 0x1f, 0xc7, 0x19, 0x8f, 0xf1, + 0x26, 0x5d, 0xca, 0x1b, 0x3f, 0xc8, 0x4c, 0x74, 0x90, 0x51, 0xe9, 0x2b, 0x1b, 0x2b, 0x7d, 0xdd, + 0x87, 0x69, 0xdd, 0x34, 0x35, 0x96, 0x8c, 0x68, 0x34, 0xc8, 0xcd, 0xd1, 0x20, 0xb7, 0xa6, 0x9b, + 0x26, 0x8b, 0x87, 0xf7, 0xdd, 0x81, 0x47, 0x62, 0x49, 0x17, 0x0f, 0x9d, 0x53, 0x1c, 0x23, 0xcd, + 0x53, 0x52, 0x99, 0x61, 0x22, 0xea, 0xe6, 0x57, 0x30, 0xd3, 0xf3, 0x9d, 0xd1, 0x87, 0xf2, 0xdf, + 0xfc, 0xf3, 0x0a, 0x40, 0x74, 0x30, 0x57, 0xd9, 0xf9, 0x3d, 0x28, 0x52, 0xe9, 0x86, 0xe2, 0x83, + 0xb7, 0xef, 0x96, 0x0a, 0x04, 0xd4, 0x69, 0xab, 0xec, 0xaf, 0x19, 0x57, 0x81, 0x5a, 0x42, 0x05, + 0x9e, 0x43, 0x85, 0x55, 0x13, 0x59, 0xc2, 0xb2, 0x40, 0x63, 0x9b, 0x9b, 0x09, 0x79, 0xb1, 0xb2, + 0x19, 0xcd, 0x58, 0xc0, 0x0b, 0x7f, 0xa3, 0xef, 0x92, 0xec, 0x4f, 0xf7, 0xc7, 0x1e, 0x2f, 0xa8, + 0xdc, 0x48, 0x4e, 0xa3, 0x48, 0x95, 0x13, 0xa1, 0x4f, 0x01, 0x68, 0xb5, 0x0e, 0x9b, 0x9a, 0xee, + 0x53, 0x87, 0x98, 0x55, 0xcb, 0x1c, 0xd2, 0xf2, 0xd1, 0x4d, 0x6a, 0x51, 0x0c, 0x59, 0xa1, 0xc8, + 0x22, 0x1d, 0xb7, 0x68, 0xc5, 0x72, 0x4c, 0x55, 0x84, 0x22, 0x11, 0x9b, 0xc9, 0x21, 0x2d, 0x92, + 0x72, 0x15, 0xd8, 0x89, 0x34, 0x3e, 0xa5, 0xfe, 0xea, 0x96, 0x90, 0xe2, 0x24, 0x6b, 0xdd, 0xe4, + 0x8e, 0x66, 0xc4, 0xe8, 0x29, 0x31, 0x6d, 0x92, 0x2d, 0x34, 0x3e, 0x4b, 0x64, 0xa2, 0xca, 0x9b, + 0x91, 0xe3, 0xfa, 0x2a, 0x45, 0x0a, 0xf3, 0x18, 0x35, 0xda, 0x86, 0x3a, 0x3d, 0x4f, 0xc3, 0x19, + 0x52, 0x3f, 0x8f, 0x79, 0x50, 0x70, 0x2f, 0x9c, 0xaf, 0x3a, 0xce, 0x70, 0x23, 0xc0, 0x26, 0x3f, + 0x5f, 0x73, 0x45, 0x2c, 0xfa, 0x2e, 0xab, 0x93, 0xd7, 0x13, 0x35, 0xc4, 0x57, 0xf8, 0x20, 0x39, + 0x91, 0x96, 0xcb, 0x15, 0xa8, 0x08, 0xc5, 0x9a, 0xc6, 0x2c, 0x9d, 0xf6, 0x9d, 0xb4, 0x4a, 0x56, + 0x72, 0xba, 0x38, 0x0f, 0x75, 0x61, 0x9a, 0xd5, 0x8e, 0xa2, 0x4d, 0xb0, 0x74, 0xe3, 0xd7, 0xa2, + 0xda, 0x3e, 0xc1, 0x5f, 0xb8, 0x8b, 0xba, 0x1f, 0x43, 0xa3, 0x35, 0xc8, 0x53, 0x08, 0xcf, 0x47, + 0x6e, 0xc5, 0x97, 0x49, 0xce, 0x66, 0xb4, 0xe8, 0x39, 0xd4, 0xb9, 0x7d, 0xb9, 0xd8, 0x1b, 0x0f, + 0x7c, 0xaf, 0x31, 0x9d, 0xf0, 0x17, 0xcc, 0xca, 0xa8, 0xbf, 0xa8, 0x31, 0x52, 0x95, 0x51, 0xa2, + 0x27, 0x50, 0xa5, 0x79, 0x76, 0x30, 0x53, 0xa6, 0x33, 0x67, 0x62, 0xd5, 0x0a, 0x3a, 0xaf, 0x42, + 0xc8, 0x82, 0x59, 0x5f, 0x41, 0x90, 0xde, 0x85, 0x13, 0x67, 0x12, 0xf5, 0x37, 0x9e, 0xcb, 0x31, + 0x27, 0x55, 0xe7, 0xd4, 0xc1, 0xfc, 0x67, 0x50, 0x63, 0xa9, 0x40, 0x30, 0x7b, 0x2e, 0xc1, 0x30, + 0x4d, 0x06, 0xd8, 0xdc, 0x2a, 0xa5, 0x14, 0xf8, 0x1d, 0x1a, 0xfa, 0x28, 0x9c, 0x78, 0x3b, 0xc1, + 0x2f, 0x09, 0xa3, 0x19, 0xbf, 0x84, 0x2c, 0x98, 0x35, 0x07, 0x79, 0xec, 0xba, 0x8e, 0xcb, 0x43, + 0x0c, 0x36, 0x20, 0xf6, 0x40, 0x7f, 0xd0, 0x84, 0xa4, 0x31, 0xcf, 0x4a, 0x64, 0x14, 0x42, 0x52, + 0x0f, 0x12, 0xbf, 0x98, 0xd8, 0xd7, 0xad, 0x81, 0xd7, 0xb8, 0xc1, 0xe2, 0x17, 0x3e, 0x44, 0x5f, + 0xc0, 0x4c, 0x10, 0x7c, 0x6b, 0x03, 0xc7, 0x60, 0x69, 0xef, 0x27, 0x2c, 0x45, 0x0e, 0x10, 0xdb, + 0x1c, 0x8e, 0x96, 0x61, 0xf6, 0x40, 0x37, 0x4e, 0xc6, 0x23, 0x8d, 0x17, 0x3d, 0xb4, 0xb1, 0x87, + 0xcd, 0xc6, 0x4d, 0x56, 0x13, 0x66, 0x28, 0x1e, 0xa6, 0xef, 0x7b, 0xd8, 0x44, 0x77, 0xa0, 0xe2, + 0x62, 0xdf, 0x3d, 0xd3, 0xe8, 0xbd, 0xdd, 0xb8, 0x45, 0xd9, 0x02, 0x0a, 0xda, 0x20, 0x10, 0x62, + 0xa7, 0xbc, 0x5a, 0x54, 0x4c, 0xbc, 0x23, 0x45, 0x62, 0x26, 0x97, 0xc9, 0x7a, 0xa6, 0x21, 0x6d, + 0x49, 0x61, 0xcd, 0xe8, 0x0b, 0x5e, 0x8f, 0x4a, 0xe6, 0x47, 0x81, 0x84, 0x39, 0x39, 0xab, 0x48, + 0x7d, 0x29, 0x14, 0x98, 0xaa, 0xc9, 0x9a, 0x94, 0x20, 0x59, 0x3e, 0x29, 0x24, 0x5e, 0x2f, 0x43, + 0xd1, 0x65, 0xfa, 0x49, 0xd2, 0x1b, 0x26, 0xa5, 0xe6, 0xcf, 0x33, 0x00, 0x11, 0x6f, 0xe9, 0xaf, + 0x18, 0x82, 0x4f, 0xcb, 0x5c, 0xe6, 0xd3, 0xb2, 0x71, 0x9f, 0xb6, 0x00, 0xa5, 0x58, 0xe1, 0x21, + 0xab, 0x86, 0x63, 0xb4, 0x1a, 0x3a, 0x56, 0x96, 0xaa, 0x2e, 0xa4, 0x1c, 0xd4, 0x72, 0xc2, 0xbb, + 0x86, 0x9a, 0x52, 0x10, 0x35, 0xa5, 0x09, 0xb5, 0x81, 0xee, 0x11, 0x65, 0x27, 0x82, 0xd1, 0x59, + 0x06, 0x9a, 0x55, 0x2b, 0x04, 0xa8, 0x12, 0x58, 0xcb, 0x27, 0xea, 0x42, 0xd0, 0x16, 0xf6, 0xe8, + 0x11, 0xd7, 0xd4, 0x60, 0xd8, 0x5c, 0x86, 0x02, 0xfb, 0x0a, 0x02, 0x28, 0xb4, 0x36, 0xfa, 0x9d, + 0xaf, 0x15, 0x79, 0x0a, 0x55, 0xa1, 0xb4, 0xd9, 0xd9, 0xed, 0xf4, 0xb6, 0x94, 0xb6, 0x2c, 0x11, + 0xcc, 0x66, 0xab, 0xb3, 0xad, 0xb4, 0xe5, 0x4c, 0xf3, 0xe7, 0x12, 0x94, 0x02, 0xa9, 0x04, 0xc9, + 0xa0, 0x18, 0x78, 0x04, 0xe3, 0x8f, 0x74, 0x6c, 0x85, 0xc4, 0xb1, 0x21, 0xc8, 0x79, 0xd6, 0x4f, + 0x31, 0x3f, 0x4e, 0xfa, 0x9b, 0xd0, 0x87, 0x8a, 0xce, 0xa2, 0xb1, 0x70, 0xdc, 0xfc, 0xb7, 0x0c, + 0x54, 0x45, 0x9d, 0x38, 0x5f, 0x67, 0x92, 0x26, 0xae, 0x33, 0x95, 0x2e, 0xa8, 0x33, 0x89, 0xfc, + 0x66, 0x2e, 0xe0, 0x37, 0x2b, 0xf0, 0xfb, 0x05, 0xcc, 0x84, 0x0b, 0x87, 0x8c, 0xb3, 0x00, 0x53, + 0x0e, 0x10, 0xa1, 0x85, 0x3e, 0x81, 0xf9, 0x38, 0x2b, 0xe1, 0x0c, 0xe6, 0x2e, 0xe6, 0x44, 0x76, + 0xc2, 0x59, 0xf7, 0x48, 0xfe, 0xc8, 0x7c, 0x20, 0xb3, 0xd4, 0x3c, 0xfd, 0x7e, 0x95, 0x03, 0x99, + 0xad, 0xc6, 0x25, 0x54, 0xb8, 0x4c, 0x42, 0xc5, 0x98, 0x84, 0x9a, 0x7f, 0x2c, 0x01, 0x44, 0x5e, + 0x70, 0xf2, 0x42, 0xcd, 0x9d, 0xa8, 0xca, 0x42, 0x98, 0x92, 0xe8, 0xaa, 0x41, 0x41, 0xe5, 0x3c, + 0x4b, 0x57, 0x50, 0x9a, 0xe6, 0xbf, 0x48, 0x50, 0x0a, 0xfc, 0xeb, 0xb7, 0xa0, 0x97, 0xb9, 0x0b, + 0xe4, 0x9c, 0xbf, 0x40, 0x2f, 0x0b, 0x71, 0xbd, 0x24, 0x27, 0x11, 0x5c, 0xce, 0xe4, 0x24, 0xd8, + 0xf9, 0x02, 0xbf, 0x70, 0xc7, 0xb6, 0xdf, 0x7c, 0x9b, 0x81, 0x1b, 0xad, 0xb1, 0xef, 0x9c, 0xbb, + 0xed, 0x85, 0xf7, 0x71, 0x69, 0xa2, 0xf7, 0xf1, 0xa9, 0xd4, 0xf7, 0xf1, 0xcc, 0x7b, 0xde, 0xc7, + 0xa7, 0x84, 0xf7, 0xf1, 0x1f, 0xf2, 0x7b, 0x38, 0x78, 0x24, 0xcf, 0xd2, 0x7b, 0x6d, 0x21, 0xad, + 0xe4, 0xcd, 0xdf, 0xcb, 0xe9, 0x85, 0xdc, 0xe5, 0x6f, 0xe6, 0x4a, 0x74, 0x21, 0x07, 0x2b, 0xe4, + 0xe8, 0x0a, 0x97, 0xbe, 0x0b, 0x84, 0xf7, 0x32, 0x5f, 0x86, 0x78, 0x6f, 0xde, 0xe9, 0xd0, 0xfc, + 0x93, 0x0c, 0x4c, 0x93, 0xc3, 0x11, 0x02, 0x8f, 0x2b, 0x17, 0xa6, 0xf2, 0x97, 0xd5, 0xe9, 0x32, + 0x13, 0x95, 0xa1, 0xb2, 0x13, 0x97, 0xa1, 0x72, 0x57, 0xaf, 0xd3, 0x15, 0xae, 0x5a, 0xa7, 0xfb, + 0xbb, 0x1c, 0xcc, 0xa6, 0x44, 0xb5, 0x24, 0xd7, 0x60, 0x51, 0x6d, 0x22, 0xd7, 0x60, 0x40, 0x92, + 0x6b, 0xf0, 0x5f, 0x26, 0xc9, 0x9d, 0xd8, 0x63, 0xbb, 0x73, 0x78, 0xe8, 0x61, 0x5f, 0x1b, 0x7a, + 0xdc, 0x40, 0x6a, 0x14, 0xdc, 0xa5, 0xd0, 0x1d, 0x8f, 0x5c, 0x39, 0xd8, 0x36, 0x05, 0x2a, 0x66, + 0x29, 0x15, 0x6c, 0x9b, 0x21, 0x8d, 0xd8, 0x53, 0x92, 0xbb, 0x72, 0x4f, 0x49, 0x7e, 0xe2, 0x9e, + 0x92, 0xc2, 0xd5, 0x7a, 0x4a, 0x8a, 0xd7, 0xe8, 0x29, 0x29, 0x7d, 0x58, 0x4f, 0x49, 0x79, 0xf2, + 0x9e, 0x12, 0xb8, 0x7a, 0x4f, 0x49, 0xe5, 0x5a, 0x3d, 0x25, 0xff, 0x5e, 0x80, 0x85, 0x8b, 0x53, + 0x99, 0xcb, 0x4b, 0x0b, 0x51, 0x06, 0x9e, 0xb9, 0xa4, 0xf9, 0x24, 0x9b, 0x6c, 0xfb, 0xf8, 0x12, + 0xd8, 0x6b, 0xab, 0x36, 0xb4, 0xde, 0x58, 0xf6, 0x51, 0x63, 0x9a, 0x4a, 0x24, 0xd1, 0x1c, 0xb1, + 0x43, 0x71, 0x2a, 0x7b, 0x07, 0x66, 0x83, 0x44, 0xbf, 0x48, 0x6e, 0x82, 0xae, 0x95, 0x7c, 0x4a, + 0xd7, 0x0a, 0x7a, 0xc2, 0x63, 0x4d, 0xa6, 0x38, 0x97, 0x78, 0x31, 0x1a, 0x3f, 0x06, 0xcf, 0xa0, + 0x6b, 0x89, 0xc0, 0x36, 0xfd, 0x19, 0x94, 0x4f, 0x09, 0xc2, 0xda, 0xaf, 0x84, 0x48, 0x15, 0xde, + 0xff, 0x14, 0xca, 0x67, 0x47, 0xcf, 0xa1, 0x91, 0xda, 0x96, 0xae, 0xa1, 0xb6, 0xe5, 0x2b, 0xa8, + 0x6d, 0xd2, 0xd5, 0x57, 0xae, 0xe6, 0xea, 0x7f, 0x23, 0xcc, 0xf6, 0x82, 0x05, 0xaa, 0xc9, 0xd4, + 0x4b, 0x38, 0xad, 0x20, 0xdf, 0xbb, 0xe4, 0xa2, 0xa8, 0x5d, 0xfd, 0xa2, 0x40, 0xdf, 0x0f, 0x12, + 0xb8, 0x60, 0x91, 0x3a, 0x5d, 0x24, 0xf5, 0x2d, 0x99, 0x67, 0x70, 0xc1, 0x54, 0xd1, 0xb0, 0xe4, + 0xc9, 0x0d, 0x8b, 0x7d, 0x48, 0xbc, 0xa1, 0xfe, 0x37, 0x0f, 0x72, 0x32, 0xbf, 0xff, 0x96, 0x3a, + 0xa4, 0xaa, 0xe9, 0x1d, 0x52, 0xa1, 0xde, 0xe7, 0x3e, 0x50, 0xef, 0xf3, 0x1f, 0xa6, 0xf7, 0x85, + 0x6b, 0xe9, 0xfd, 0xb7, 0xe5, 0xae, 0x93, 0x7a, 0x5f, 0xbe, 0xae, 0xde, 0xc3, 0xf5, 0xf4, 0xbe, + 0xf2, 0x31, 0xf4, 0xbe, 0xf6, 0x41, 0x7a, 0x5f, 0xbf, 0x8e, 0xde, 0xff, 0x4d, 0x0e, 0x1a, 0x17, + 0x15, 0xa8, 0x2e, 0xbf, 0x4d, 0xc4, 0xd6, 0xb5, 0x4c, 0xa2, 0x75, 0xed, 0x3b, 0x50, 0x8d, 0xf5, + 0xac, 0x31, 0x4b, 0xa8, 0x78, 0x51, 0xb7, 0x9a, 0xa0, 0x32, 0xb9, 0x6b, 0x44, 0xc5, 0xf9, 0x6b, + 0x44, 0xc5, 0x85, 0xeb, 0xaa, 0x4c, 0xf1, 0x7a, 0x2a, 0x53, 0xfa, 0x18, 0x2a, 0x53, 0xfe, 0x20, + 0x95, 0x81, 0x09, 0x55, 0x46, 0x50, 0x94, 0x3f, 0x2a, 0xc0, 0xad, 0x4b, 0xca, 0x8f, 0x97, 0xeb, + 0xca, 0x53, 0x60, 0x9d, 0x58, 0x51, 0x73, 0x67, 0x26, 0x6a, 0xee, 0xa4, 0x18, 0xde, 0xdc, 0xa9, + 0x8a, 0x23, 0x93, 0xcc, 0x4b, 0x34, 0x85, 0x66, 0xd3, 0x9b, 0x42, 0x13, 0x2d, 0xa1, 0xbf, 0x24, + 0xd7, 0x59, 0xba, 0x96, 0xeb, 0x2c, 0x5c, 0xc3, 0x75, 0x16, 0x7f, 0x15, 0x32, 0x7c, 0x88, 0x1d, + 0x4c, 0x5f, 0xc7, 0x75, 0xfe, 0x42, 0x02, 0x74, 0xbe, 0x92, 0x7e, 0xb9, 0x21, 0xdc, 0x17, 0xfa, + 0x43, 0x33, 0xe7, 0xfa, 0x43, 0xa3, 0xee, 0xd0, 0xc7, 0x5c, 0x81, 0xb3, 0x89, 0x27, 0x88, 0xb6, + 0xe5, 0x62, 0xc3, 0x4f, 0xe9, 0xfa, 0xfb, 0x1c, 0x6a, 0xaf, 0xf1, 0x81, 0xe7, 0x18, 0x27, 0xd8, + 0x8f, 0x1a, 0xc0, 0xb7, 0xa6, 0xd4, 0x6a, 0x08, 0x26, 0xb1, 0xb4, 0xb8, 0xf9, 0xfc, 0x55, 0x37, + 0xdf, 0xfc, 0xd3, 0x0c, 0xc8, 0x49, 0x0e, 0x7e, 0x95, 0xc7, 0xff, 0x53, 0x06, 0x66, 0xce, 0xd9, + 0xcc, 0xb7, 0xd5, 0x73, 0x58, 0xb8, 0xec, 0x34, 0xb3, 0x13, 0x9d, 0x66, 0x6e, 0xe2, 0xd3, 0xcc, + 0x5f, 0xfd, 0x34, 0x8b, 0x57, 0x3d, 0xcd, 0x6f, 0x82, 0xa7, 0xe7, 0x6d, 0x9a, 0x9c, 0x7e, 0xc0, + 0xd3, 0xf3, 0x05, 0x69, 0x6e, 0xf3, 0xcf, 0xc2, 0x57, 0xed, 0x1e, 0x7f, 0xb5, 0xba, 0xf2, 0xd2, + 0xfc, 0xad, 0x9a, 0xb1, 0xaa, 0x09, 0x0d, 0x99, 0x35, 0xdd, 0x34, 0x99, 0xe0, 0x13, 0x6f, 0xd5, + 0x22, 0x69, 0x56, 0x7c, 0xab, 0x8e, 0xa8, 0x9b, 0xdf, 0x87, 0x7a, 0xfc, 0xb1, 0x05, 0x3d, 0x80, + 0x9c, 0x65, 0x1f, 0x3a, 0xe7, 0x9e, 0xea, 0x85, 0xa7, 0x37, 0x4a, 0xb0, 0xf8, 0x0a, 0xaa, 0x62, + 0x97, 0x3b, 0x9a, 0x07, 0xd4, 0xda, 0x6f, 0x77, 0xba, 0xda, 0xc6, 0x56, 0x6b, 0x77, 0x57, 0xd9, + 0xd6, 0xd6, 0xbb, 0xfd, 0x2d, 0x79, 0xea, 0x3c, 0x7c, 0x5b, 0xd9, 0xec, 0xcb, 0x12, 0xfa, 0x04, + 0x66, 0xe3, 0x70, 0xb5, 0xf3, 0x62, 0xab, 0x2f, 0x67, 0x16, 0xff, 0x55, 0x82, 0x1b, 0xa9, 0x17, + 0x10, 0x92, 0xa1, 0xba, 0xb5, 0xfa, 0xf4, 0x89, 0xf6, 0xe5, 0xea, 0xca, 0x9e, 0xb6, 0xb6, 0x22, + 0x4f, 0xc5, 0x21, 0x4f, 0x57, 0x64, 0x09, 0xcd, 0x40, 0x8d, 0x42, 0x7e, 0x7d, 0xe5, 0x19, 0x23, + 0xca, 0x24, 0x40, 0x4f, 0x57, 0xe4, 0x2c, 0xba, 0x09, 0x37, 0xf6, 0xba, 0x6a, 0x5f, 0x6d, 0x75, + 0xfa, 0x5a, 0x6c, 0xc9, 0xdc, 0x05, 0xa8, 0xa7, 0x2b, 0x72, 0x1e, 0x2d, 0xc0, 0x7c, 0x1c, 0x15, + 0x7e, 0xa4, 0x70, 0x11, 0xee, 0xe9, 0x8a, 0x5c, 0x5c, 0x5c, 0xe7, 0x9d, 0xf1, 0x91, 0xd9, 0xa1, + 0x39, 0x90, 0xdb, 0xca, 0x66, 0x6b, 0x7f, 0xbb, 0xaf, 0x6d, 0x76, 0xb6, 0x95, 0xfe, 0x6f, 0xef, + 0x29, 0xf2, 0x14, 0x2a, 0x42, 0x76, 0x67, 0xef, 0x89, 0x2c, 0x91, 0x1f, 0xdd, 0x17, 0x2f, 0xe4, + 0x0c, 0x83, 0xac, 0xc9, 0xd9, 0xc5, 0xad, 0x40, 0x52, 0x41, 0xe7, 0xac, 0xb8, 0xc4, 0x9e, 0xda, + 0xed, 0x77, 0x37, 0xba, 0xdb, 0xf2, 0x14, 0x2a, 0x41, 0x4e, 0xed, 0xef, 0xec, 0xb1, 0x35, 0x7a, + 0x6a, 0x5f, 0xce, 0xa0, 0x1a, 0x94, 0x5f, 0x29, 0xeb, 0xbd, 0xee, 0xc6, 0x4b, 0xa5, 0x2f, 0x67, + 0x17, 0x77, 0xe1, 0x46, 0x6a, 0x2b, 0x2e, 0xba, 0x07, 0x77, 0x82, 0x05, 0x7b, 0xca, 0x8b, 0x1d, + 0x65, 0xb7, 0xaf, 0xb4, 0x29, 0x77, 0xe2, 0xfa, 0xe4, 0xc4, 0xb7, 0x7b, 0x11, 0x44, 0x5a, 0x7c, + 0x9c, 0x68, 0x05, 0xe6, 0x6d, 0x92, 0x65, 0xc8, 0x77, 0x76, 0xdb, 0xca, 0x37, 0xf2, 0x14, 0x61, + 0xa0, 0xdf, 0xd9, 0x51, 0x7a, 0xfd, 0x16, 0x61, 0x6c, 0xf1, 0x10, 0xa6, 0x13, 0x3d, 0x96, 0x44, + 0x49, 0x3a, 0x3b, 0xad, 0x17, 0x8a, 0xd6, 0xdb, 0xdf, 0xdc, 0xec, 0x7c, 0xa3, 0x05, 0x33, 0x17, + 0x60, 0x3e, 0x06, 0x17, 0x96, 0x41, 0x77, 0xe0, 0x56, 0x0c, 0xb7, 0xdb, 0xdd, 0x55, 0xb4, 0xee, + 0xd7, 0x8a, 0xfa, 0x4a, 0xed, 0xf4, 0x15, 0x39, 0xb3, 0xf8, 0x63, 0x90, 0x93, 0x0d, 0x0b, 0x64, + 0x41, 0xe5, 0x85, 0xaa, 0xf4, 0x7a, 0x5a, 0xaf, 0xbb, 0xaf, 0x6e, 0x28, 0x1a, 0x39, 0x79, 0xed, + 0x95, 0xb2, 0xce, 0x3e, 0x96, 0x82, 0xeb, 0xb5, 0x5f, 0xca, 0xd2, 0xe2, 0x5f, 0x4a, 0x50, 0x15, + 0xdb, 0x18, 0xd0, 0x2c, 0x4c, 0x07, 0xc4, 0xfd, 0x96, 0xda, 0xef, 0xec, 0xbe, 0x90, 0xa7, 0x88, + 0xa6, 0x71, 0x20, 0x7f, 0x1e, 0x93, 0x04, 0x90, 0xb2, 0xdb, 0x26, 0x54, 0x19, 0x61, 0xea, 0x46, + 0x77, 0x67, 0x6f, 0x5b, 0xe9, 0x2b, 0x72, 0x56, 0xa0, 0xe3, 0xef, 0x67, 0x39, 0x84, 0xa0, 0x1e, + 0xac, 0xb6, 0xde, 0x55, 0xfb, 0x4a, 0x5b, 0xce, 0xa3, 0x06, 0xcc, 0x71, 0xd8, 0x76, 0x67, 0xa7, + 0xd3, 0xd7, 0x54, 0xa5, 0xb5, 0xb1, 0xa5, 0xb4, 0xe5, 0xc2, 0xe2, 0x3e, 0xff, 0x1f, 0x1c, 0x5e, + 0x01, 0x43, 0x50, 0x0f, 0x84, 0xb9, 0xd3, 0xf9, 0x86, 0xb1, 0x37, 0x0f, 0xa8, 0xbd, 0xdf, 0xda, + 0x0e, 0x2d, 0xae, 0xf5, 0x42, 0xd9, 0x25, 0xa6, 0xb8, 0x00, 0xf3, 0x71, 0xf8, 0x76, 0x5f, 0x51, + 0x77, 0x5b, 0xe4, 0x10, 0x57, 0xff, 0xaa, 0x00, 0x05, 0x5e, 0x36, 0xff, 0x11, 0x54, 0x84, 0x0e, + 0x0a, 0x74, 0x59, 0x5f, 0xc5, 0x42, 0x5a, 0x8f, 0x0f, 0x6a, 0x41, 0x55, 0xec, 0xed, 0x41, 0x51, + 0xe0, 0x95, 0xd2, 0xf2, 0x93, 0xbe, 0x84, 0x02, 0x10, 0x35, 0x18, 0xa1, 0x28, 0x72, 0x3c, 0xd7, + 0xea, 0xb4, 0x70, 0x2b, 0x15, 0xc7, 0x3b, 0x92, 0x7e, 0x08, 0x10, 0xf5, 0xe8, 0x20, 0xf1, 0x41, + 0x35, 0xd1, 0xb8, 0x93, 0xce, 0x45, 0x1f, 0x1a, 0x74, 0xcf, 0x29, 0xe5, 0x50, 0x34, 0x49, 0xdf, + 0x47, 0xfa, 0xaa, 0xbf, 0x49, 0x4c, 0x5c, 0x77, 0xfd, 0xb0, 0x18, 0x84, 0x2e, 0x6e, 0x00, 0x49, + 0x5f, 0x61, 0x0f, 0xe6, 0xe9, 0x0a, 0xe7, 0x5f, 0x82, 0xde, 0xdf, 0x13, 0x92, 0xbe, 0xe2, 0xd7, + 0x70, 0x93, 0xae, 0x98, 0x96, 0x7f, 0xa1, 0x89, 0xba, 0x43, 0xd2, 0xd7, 0x6d, 0x83, 0x1c, 0xad, + 0x7b, 0x4e, 0xa1, 0xce, 0xc7, 0xb6, 0xef, 0x51, 0x28, 0x76, 0x63, 0x9f, 0x53, 0xa8, 0xd8, 0x45, + 0xfe, 0x9e, 0x25, 0x98, 0x77, 0x3d, 0xb7, 0x44, 0xec, 0xc2, 0x4e, 0x5d, 0x62, 0x7d, 0xf3, 0x77, + 0xee, 0x1d, 0x59, 0xfe, 0xf1, 0xf8, 0x60, 0xd9, 0x70, 0x86, 0x8f, 0x39, 0xc1, 0xe3, 0xe0, 0xff, + 0x1a, 0x02, 0xc0, 0xdf, 0x66, 0x6a, 0xdb, 0xd6, 0x29, 0x7e, 0xc9, 0xfa, 0x26, 0x7d, 0xe7, 0xbf, + 0x32, 0x75, 0x3e, 0x7e, 0xfe, 0x9c, 0x02, 0x0e, 0x0a, 0x74, 0xca, 0xda, 0xff, 0x05, 0x00, 0x00, + 0xff, 0xff, 0x93, 0x5f, 0xa9, 0x80, 0xe2, 0x3b, 0x00, 0x00, } diff --git a/rpc/egress.pb.go b/rpc/egress.pb.go index 9eac155f9..0fd832bdc 100644 --- a/rpc/egress.pb.go +++ b/rpc/egress.pb.go @@ -128,7 +128,6 @@ func (x *StartEgressRequest) GetReplay() *livekit.ExportReplayRequest { return nil } -// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetRoomComposite() *livekit.RoomCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_RoomComposite); ok { @@ -138,7 +137,6 @@ func (x *StartEgressRequest) GetRoomComposite() *livekit.RoomCompositeEgressRequ return nil } -// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetWeb() *livekit.WebEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_Web); ok { @@ -148,7 +146,6 @@ func (x *StartEgressRequest) GetWeb() *livekit.WebEgressRequest { return nil } -// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetParticipant() *livekit.ParticipantEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_Participant); ok { @@ -158,7 +155,6 @@ func (x *StartEgressRequest) GetParticipant() *livekit.ParticipantEgressRequest return nil } -// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetTrackComposite() *livekit.TrackCompositeEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_TrackComposite); ok { @@ -168,7 +164,6 @@ func (x *StartEgressRequest) GetTrackComposite() *livekit.TrackCompositeEgressRe return nil } -// Deprecated: Marked as deprecated in rpc/egress.proto. func (x *StartEgressRequest) GetTrack() *livekit.TrackEgressRequest { if x != nil { if x, ok := x.Request.(*StartEgressRequest_Track); ok { @@ -234,28 +229,22 @@ type StartEgressRequest_Replay struct { type StartEgressRequest_RoomComposite struct { // --- deprecated --- - // - // Deprecated: Marked as deprecated in rpc/egress.proto. RoomComposite *livekit.RoomCompositeEgressRequest `protobuf:"bytes,5,opt,name=room_composite,json=roomComposite,proto3,oneof"` } type StartEgressRequest_Web struct { - // Deprecated: Marked as deprecated in rpc/egress.proto. Web *livekit.WebEgressRequest `protobuf:"bytes,11,opt,name=web,proto3,oneof"` } type StartEgressRequest_Participant struct { - // Deprecated: Marked as deprecated in rpc/egress.proto. Participant *livekit.ParticipantEgressRequest `protobuf:"bytes,13,opt,name=participant,proto3,oneof"` } type StartEgressRequest_TrackComposite struct { - // Deprecated: Marked as deprecated in rpc/egress.proto. TrackComposite *livekit.TrackCompositeEgressRequest `protobuf:"bytes,6,opt,name=track_composite,json=trackComposite,proto3,oneof"` } type StartEgressRequest_Track struct { - // Deprecated: Marked as deprecated in rpc/egress.proto. Track *livekit.TrackEgressRequest `protobuf:"bytes,7,opt,name=track,proto3,oneof"` } @@ -357,16 +346,16 @@ var File_rpc_egress_proto protoreflect.FileDescriptor const file_rpc_egress_proto_rawDesc = "" + "\n" + - "\x10rpc/egress.proto\x12\x03rpc\x1a\roptions.proto\x1a\x14logger/options.proto\x1a\x14livekit_egress.proto\"\xe7\x05\n" + + "\x10rpc/egress.proto\x12\x03rpc\x1a\roptions.proto\x1a\x14logger/options.proto\x1a\x14livekit_egress.proto\"\xd3\x05\n" + "\x12StartEgressRequest\x12)\n" + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x125\n" + "\x06egress\x18\x10 \x01(\v2\x1b.livekit.StartEgressRequestH\x00R\x06egress\x126\n" + - "\x06replay\x18\x11 \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12P\n" + - "\x0eroom_composite\x18\x05 \x01(\v2#.livekit.RoomCompositeEgressRequestB\x02\x18\x01H\x00R\rroomComposite\x121\n" + - "\x03web\x18\v \x01(\v2\x19.livekit.WebEgressRequestB\x02\x18\x01H\x00R\x03web\x12I\n" + - "\vparticipant\x18\r \x01(\v2!.livekit.ParticipantEgressRequestB\x02\x18\x01H\x00R\vparticipant\x12S\n" + - "\x0ftrack_composite\x18\x06 \x01(\v2$.livekit.TrackCompositeEgressRequestB\x02\x18\x01H\x00R\x0etrackComposite\x127\n" + - "\x05track\x18\a \x01(\v2\x1b.livekit.TrackEgressRequestB\x02\x18\x01H\x00R\x05track\x12#\n" + + "\x06replay\x18\x11 \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12L\n" + + "\x0eroom_composite\x18\x05 \x01(\v2#.livekit.RoomCompositeEgressRequestH\x00R\rroomComposite\x12-\n" + + "\x03web\x18\v \x01(\v2\x19.livekit.WebEgressRequestH\x00R\x03web\x12E\n" + + "\vparticipant\x18\r \x01(\v2!.livekit.ParticipantEgressRequestH\x00R\vparticipant\x12O\n" + + "\x0ftrack_composite\x18\x06 \x01(\v2$.livekit.TrackCompositeEgressRequestH\x00R\x0etrackComposite\x123\n" + + "\x05track\x18\a \x01(\v2\x1b.livekit.TrackEgressRequestH\x00R\x05track\x12#\n" + "\aroom_id\x18\x03 \x01(\tB\n" + "\x9a\xec,\x06roomIDR\x06roomId\x12\x1a\n" + "\x05token\x18\b \x01(\tB\x04\x88\xec,\x01R\x05token\x12\x15\n" + diff --git a/rpc/egress.psrpc.go b/rpc/egress.psrpc.go index 67275f9a3..1ee57bae2 100644 --- a/rpc/egress.psrpc.go +++ b/rpc/egress.psrpc.go @@ -312,46 +312,45 @@ func (UnimplementedEgressHandlerServer) StopEgress(context.Context, *livekit4.St } var psrpcFileDescriptor2 = []byte{ - // 645 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xcf, 0x4e, 0xdb, 0x3e, - 0x1c, 0xc7, 0xf4, 0xd7, 0x40, 0xbf, 0xa5, 0xa5, 0x3f, 0x8f, 0x09, 0xd3, 0x81, 0x28, 0x65, 0x87, - 0x4c, 0x42, 0x2d, 0x63, 0xda, 0xa6, 0xdd, 0xb6, 0x42, 0x35, 0x2a, 0xed, 0x80, 0xdc, 0xa1, 0x49, - 0xdb, 0x21, 0x4a, 0x1d, 0xaf, 0x8b, 0x9a, 0xc6, 0x9e, 0xe3, 0xc0, 0x78, 0x83, 0xf1, 0x0a, 0xdc, - 0xf6, 0x0a, 0x1c, 0xf6, 0x4a, 0xbb, 0xf0, 0x10, 0x53, 0x9d, 0x34, 0x04, 0x28, 0x68, 0xa7, 0x38, - 0x9f, 0x7f, 0xf6, 0xd7, 0xf6, 0xd7, 0x50, 0x53, 0x92, 0xb5, 0xf9, 0x50, 0xf1, 0x28, 0x6a, 0x49, - 0x25, 0xb4, 0xc0, 0x05, 0x25, 0x59, 0xbd, 0x22, 0xa4, 0xf6, 0x45, 0x98, 0x62, 0xf5, 0x95, 0x40, - 0x0c, 0x87, 0x5c, 0xb5, 0x6f, 0xa3, 0xfe, 0x09, 0x1f, 0xf9, 0xda, 0xc9, 0xfb, 0x9b, 0x7f, 0x8a, - 0x80, 0xfb, 0xda, 0x55, 0xba, 0x6b, 0x50, 0xca, 0xbf, 0xc7, 0x3c, 0xd2, 0xf8, 0x19, 0x94, 0x12, - 0x99, 0xe3, 0x7b, 0x04, 0x35, 0x90, 0x5d, 0xea, 0x2c, 0x5d, 0x5c, 0xed, 0x2c, 0x26, 0x60, 0xef, - 0x80, 0x4e, 0x47, 0x1e, 0x7e, 0x09, 0x56, 0x32, 0x26, 0xb5, 0x06, 0xb2, 0xcb, 0x7b, 0x4f, 0x5a, - 0xe9, 0x44, 0xad, 0xbb, 0xb9, 0x87, 0x73, 0x34, 0x15, 0xe3, 0x57, 0x60, 0x29, 0x2e, 0x03, 0xf7, - 0x8c, 0xfc, 0x6f, 0x6c, 0xeb, 0x99, 0xad, 0xfb, 0x43, 0x0a, 0xa5, 0xa9, 0x21, 0x73, 0xbe, 0x44, - 0x8d, 0x8f, 0xa0, 0xaa, 0x84, 0x18, 0x3b, 0x4c, 0x8c, 0xa5, 0x88, 0x7c, 0xcd, 0x49, 0xd1, 0xf8, - 0xb7, 0x33, 0x3f, 0x15, 0x62, 0xbc, 0x3f, 0x65, 0x6f, 0x4c, 0xdf, 0x99, 0x27, 0xe8, 0x70, 0x8e, - 0x56, 0x54, 0x5e, 0x81, 0x9f, 0x43, 0xe1, 0x94, 0x0f, 0x48, 0xd9, 0xc4, 0xac, 0x65, 0x31, 0x9f, - 0xf8, 0x60, 0x96, 0x79, 0xa2, 0xc5, 0x3d, 0x28, 0x4b, 0x57, 0x69, 0x9f, 0xf9, 0xd2, 0x0d, 0x35, - 0xa9, 0x18, 0xeb, 0x56, 0x66, 0x3d, 0xba, 0xe6, 0x66, 0x45, 0xe4, 0xbd, 0xb8, 0x0f, 0xcb, 0x5a, - 0xb9, 0x6c, 0x94, 0x2b, 0xc8, 0x32, 0x71, 0x4f, 0xb3, 0xb8, 0x8f, 0x13, 0xfe, 0xc1, 0x8a, 0xaa, - 0xfa, 0x86, 0x04, 0xbf, 0x86, 0xa2, 0x41, 0xc8, 0xc2, 0xad, 0x23, 0x31, 0x51, 0xb3, 0x12, 0x12, - 0x3d, 0xde, 0x86, 0x05, 0xb3, 0xbb, 0xbe, 0x47, 0x0a, 0xe6, 0xd4, 0xe1, 0xe2, 0x6a, 0xc7, 0x9a, - 0x40, 0xbd, 0x03, 0x9a, 0x7c, 0x3d, 0x5c, 0x87, 0xa2, 0x16, 0x23, 0x1e, 0x92, 0x45, 0x23, 0xf9, - 0xef, 0xe7, 0xd5, 0x0e, 0xa2, 0x09, 0x84, 0x1f, 0x83, 0x75, 0x1a, 0x39, 0xb1, 0x0a, 0x48, 0x69, - 0x42, 0xd2, 0xe2, 0x69, 0x74, 0xac, 0x02, 0xbc, 0x0b, 0x2b, 0x2c, 0x10, 0xb1, 0xe7, 0x0c, 0x5c, - 0x36, 0x8a, 0xa5, 0xc3, 0x43, 0x77, 0x10, 0x70, 0x8f, 0x40, 0x03, 0xd9, 0x8b, 0x14, 0x1b, 0xae, - 0x63, 0xa8, 0x6e, 0xc2, 0xe0, 0x6d, 0xa8, 0xf0, 0x48, 0xfb, 0x63, 0x57, 0x73, 0xcf, 0x61, 0x32, - 0x26, 0xd5, 0x06, 0xb2, 0x11, 0x5d, 0xca, 0xc0, 0x7d, 0x19, 0xe3, 0x4d, 0x28, 0x2b, 0xae, 0xd5, - 0x99, 0xc3, 0x44, 0x1c, 0x6a, 0xb2, 0xdc, 0x40, 0x76, 0x91, 0x82, 0x81, 0xf6, 0x27, 0x48, 0xa7, - 0x04, 0x0b, 0x2a, 0xa9, 0xb3, 0xb9, 0x06, 0xab, 0x1f, 0xfc, 0x48, 0xbf, 0x63, 0xda, 0x3f, 0xb9, - 0xb9, 0x89, 0xcd, 0x37, 0x40, 0xee, 0x52, 0x91, 0x14, 0x61, 0xc4, 0xf1, 0x06, 0x40, 0xd6, 0x09, - 0x11, 0x41, 0x8d, 0x82, 0x5d, 0xa2, 0xa5, 0xe9, 0xe5, 0x8f, 0xf6, 0x7e, 0x23, 0xa8, 0x26, 0x8e, - 0x5e, 0xa8, 0xb9, 0x0a, 0xdd, 0x00, 0xbf, 0x87, 0x72, 0xee, 0xe6, 0xe3, 0xd5, 0x96, 0x92, 0x6c, - 0x46, 0x2f, 0xd4, 0x1f, 0x5d, 0xdf, 0xf8, 0x34, 0xe0, 0xab, 0x68, 0xc2, 0xe5, 0x39, 0xb2, 0x6a, - 0xe8, 0x2d, 0xda, 0x45, 0xf8, 0x0b, 0xd4, 0x6e, 0x2f, 0x0b, 0xaf, 0x9b, 0xb4, 0x7b, 0x0a, 0xa9, - 0x6f, 0xdc, 0xc3, 0x26, 0xb5, 0x64, 0xe1, 0xf3, 0x36, 0xda, 0xfb, 0x85, 0xa0, 0x92, 0xd0, 0x87, - 0x6e, 0xe8, 0x05, 0x5c, 0xe1, 0x1e, 0x2c, 0x1d, 0x4b, 0xcf, 0xd5, 0xbc, 0xaf, 0x15, 0x77, 0xc7, - 0xf8, 0xba, 0x23, 0xf3, 0xf0, 0x83, 0xab, 0xb7, 0x2e, 0xcf, 0xd1, 0x7c, 0x0d, 0xe1, 0x2e, 0x40, - 0x5f, 0x0b, 0x99, 0xae, 0xb9, 0x9e, 0x7b, 0x11, 0xa6, 0xe0, 0xbf, 0xc4, 0x74, 0xb6, 0x3e, 0x6f, - 0x0e, 0x7d, 0xfd, 0x2d, 0x1e, 0xb4, 0x98, 0x18, 0xb7, 0x53, 0x61, 0xdb, 0x3c, 0x5c, 0x4c, 0x04, - 0x6d, 0x25, 0xd9, 0xc0, 0x32, 0x7f, 0x2f, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x74, 0x13, 0x5f, - 0x66, 0x1a, 0x05, 0x00, 0x00, + // 639 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x4e, 0x13, 0x4d, + 0x14, 0xff, 0x86, 0x7e, 0x5d, 0xe8, 0x29, 0x2d, 0xf5, 0x88, 0x61, 0xa8, 0x10, 0x4a, 0xf1, 0xa2, + 0x26, 0xd8, 0x12, 0x88, 0x26, 0xde, 0x69, 0xa1, 0x91, 0x26, 0x24, 0x9a, 0x45, 0x62, 0xa2, 0x17, + 0x9b, 0xed, 0xec, 0x58, 0x37, 0xdd, 0xee, 0x8c, 0xb3, 0xb3, 0x20, 0x6f, 0x20, 0xaf, 0xc0, 0x9d, + 0xaf, 0xc0, 0x85, 0x2f, 0xe2, 0x6b, 0xf0, 0x10, 0xa6, 0xb3, 0xed, 0xb2, 0x2c, 0x62, 0xbc, 0xea, + 0xf4, 0xf7, 0x6f, 0xce, 0x99, 0x39, 0xb3, 0x50, 0x53, 0x92, 0x75, 0xf8, 0x50, 0xf1, 0x28, 0x6a, + 0x4b, 0x25, 0xb4, 0xc0, 0x82, 0x92, 0xac, 0x5e, 0x11, 0x52, 0xfb, 0x22, 0x9c, 0x62, 0xf5, 0xe5, + 0x40, 0x0c, 0x87, 0x5c, 0x75, 0xf2, 0xa8, 0x7f, 0xca, 0x47, 0xbe, 0x76, 0xb2, 0xfe, 0xe6, 0xaf, + 0x22, 0xe0, 0xb1, 0x76, 0x95, 0xee, 0x19, 0xd4, 0xe6, 0x5f, 0x63, 0x1e, 0x69, 0x7c, 0x0a, 0xa5, + 0x44, 0xe6, 0xf8, 0x1e, 0x25, 0x0d, 0xd2, 0x2a, 0x75, 0x17, 0x2f, 0xaf, 0xb7, 0x17, 0x12, 0xb0, + 0x7f, 0x60, 0xcf, 0x56, 0x1e, 0x3e, 0x07, 0x2b, 0x59, 0xd3, 0x5a, 0x83, 0xb4, 0xca, 0xbb, 0x8f, + 0xdb, 0xd3, 0x8d, 0xda, 0x77, 0x73, 0x0f, 0xff, 0xb3, 0xa7, 0x62, 0x7c, 0x01, 0x96, 0xe2, 0x32, + 0x70, 0xcf, 0xe9, 0x03, 0x63, 0x5b, 0x4b, 0x6d, 0xbd, 0x6f, 0x52, 0x28, 0x6d, 0x1b, 0x32, 0xe3, + 0x4b, 0xd4, 0x78, 0x04, 0x55, 0x25, 0xc4, 0xd8, 0x61, 0x62, 0x2c, 0x45, 0xe4, 0x6b, 0x4e, 0x8b, + 0xc6, 0xbf, 0x95, 0xfa, 0x6d, 0x21, 0xc6, 0xfb, 0x33, 0x36, 0xbf, 0x7d, 0x45, 0x65, 0x59, 0x7c, + 0x06, 0x85, 0x33, 0x3e, 0xa0, 0x65, 0x13, 0xb1, 0x9a, 0x46, 0x7c, 0xe0, 0x83, 0xbc, 0x71, 0xa2, + 0xc3, 0x1e, 0x94, 0xa5, 0xab, 0xb4, 0xcf, 0x7c, 0xe9, 0x86, 0x9a, 0x56, 0x8c, 0x6d, 0x33, 0xb5, + 0xbd, 0xbb, 0xe1, 0xf2, 0xf6, 0xac, 0x0f, 0xdf, 0xc2, 0x92, 0x56, 0x2e, 0x1b, 0x65, 0x9a, 0xb0, + 0x4c, 0xd4, 0x93, 0x34, 0xea, 0xfd, 0x84, 0xbf, 0xb7, 0x8b, 0xaa, 0xbe, 0x45, 0xe3, 0x1e, 0x14, + 0x0d, 0x42, 0xe7, 0x73, 0x57, 0x60, 0x62, 0xf2, 0xee, 0x44, 0x8b, 0x5b, 0x30, 0x6f, 0x4e, 0xd2, + 0xf7, 0x68, 0xc1, 0xdc, 0x30, 0x5c, 0x5e, 0x6f, 0x5b, 0x13, 0xa8, 0x7f, 0x60, 0x27, 0xbf, 0x1e, + 0xd6, 0xa1, 0xa8, 0xc5, 0x88, 0x87, 0x74, 0xc1, 0x48, 0xfe, 0xff, 0x7e, 0xbd, 0x4d, 0xec, 0x04, + 0xc2, 0x47, 0x60, 0x9d, 0x45, 0x4e, 0xac, 0x02, 0x5a, 0x9a, 0x90, 0x76, 0xf1, 0x2c, 0x3a, 0x51, + 0x01, 0xee, 0xc0, 0x32, 0x0b, 0x44, 0xec, 0x39, 0x03, 0x97, 0x8d, 0x62, 0xe9, 0xf0, 0xd0, 0x1d, + 0x04, 0xdc, 0xa3, 0xd0, 0x20, 0xad, 0x05, 0x1b, 0x0d, 0xd7, 0x35, 0x54, 0x2f, 0x61, 0x70, 0x0b, + 0x2a, 0x3c, 0xd2, 0xfe, 0xd8, 0xd5, 0xdc, 0x73, 0x98, 0x8c, 0x69, 0xb5, 0x41, 0x5a, 0xc4, 0x5e, + 0x4c, 0xc1, 0x7d, 0x19, 0xe3, 0x06, 0x94, 0x15, 0xd7, 0xea, 0xdc, 0x61, 0x22, 0x0e, 0x35, 0x5d, + 0x6a, 0x90, 0x56, 0xd1, 0x06, 0x03, 0xed, 0x4f, 0x90, 0x6e, 0x09, 0xe6, 0x55, 0xd2, 0x63, 0x73, + 0x15, 0x56, 0x8e, 0xfc, 0x48, 0xbf, 0x66, 0xda, 0x3f, 0xbd, 0x7d, 0x78, 0xcd, 0x97, 0x40, 0xef, + 0x52, 0x91, 0x14, 0x61, 0xc4, 0x71, 0x1d, 0x20, 0x9d, 0xfa, 0x88, 0x92, 0x46, 0xa1, 0x55, 0xb2, + 0x4b, 0xb3, 0x41, 0x8f, 0x76, 0x7f, 0x12, 0xa8, 0x26, 0x8e, 0x7e, 0xa8, 0xb9, 0x0a, 0xdd, 0x00, + 0xdf, 0x40, 0x39, 0x33, 0xe5, 0xb8, 0xd2, 0x56, 0x92, 0xfd, 0x61, 0xee, 0xeb, 0x0f, 0x6f, 0xa6, + 0x7b, 0x1a, 0xf0, 0x59, 0x34, 0xe1, 0xea, 0x82, 0x58, 0x35, 0xf2, 0x8a, 0xec, 0x10, 0xfc, 0x04, + 0xb5, 0x7c, 0x59, 0xb8, 0x66, 0xd2, 0xee, 0x69, 0xa4, 0xbe, 0x7e, 0x0f, 0x9b, 0xf4, 0x92, 0x86, + 0xcf, 0xb5, 0xc8, 0xee, 0x0f, 0x02, 0x95, 0x84, 0x3e, 0x74, 0x43, 0x2f, 0xe0, 0x0a, 0xfb, 0xb0, + 0x78, 0x22, 0x3d, 0x57, 0xf3, 0x63, 0xad, 0xb8, 0x3b, 0xc6, 0x9b, 0xd7, 0x97, 0x85, 0xff, 0x5a, + 0xbd, 0x75, 0x75, 0x41, 0xe6, 0x6a, 0x04, 0x7b, 0x00, 0xc7, 0x5a, 0xc8, 0x69, 0xcd, 0xf5, 0xcc, + 0xeb, 0x9f, 0x81, 0xff, 0x12, 0xd3, 0xdd, 0xfc, 0xb8, 0x31, 0xf4, 0xf5, 0x97, 0x78, 0xd0, 0x66, + 0x62, 0xdc, 0x99, 0x0a, 0x3b, 0xe6, 0x23, 0xc5, 0x44, 0xd0, 0x51, 0x92, 0x0d, 0x2c, 0xf3, 0x6f, + 0xef, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0x48, 0x7e, 0xb7, 0x06, 0x05, 0x00, 0x00, } From 61ed308e93b69102fdd17265de8003f5dc697621 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Mon, 16 Mar 2026 23:44:37 +0800 Subject: [PATCH 05/15] deprecate unused quality fields --- protobufs/livekit_egress.proto | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index 93f023b6a..c1ce8b47d 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -170,12 +170,14 @@ message EncodingOptions { int32 framerate = 4; // (default 30) AudioCodec audio_codec = 5; // (default OPUS) int32 audio_bitrate = 6; // (default 128) - int32 audio_quality = 11; // quality setting on audio encoder int32 audio_frequency = 7; // (default 44100) VideoCodec video_codec = 8; // (default H264_MAIN) int32 video_bitrate = 9; // (default 4500) - int32 video_quality = 12; // quality setting on video encoder double key_frame_interval = 10; // in seconds (default 4s for streaming, segment duration for segmented output, encoder default for files) + + // --- Deprecated --- + int32 audio_quality = 11 [deprecated = true]; // quality setting on audio encoder + int32 video_quality = 12 [deprecated = true]; // quality setting on video encoder } // --- Output Types --- From b6cc8ec406740e3cea7052618480941b70b9568b Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 15:46:13 +0000 Subject: [PATCH 06/15] generated protobuf --- livekit/livekit_egress.pb.go | 48 ++-- livekit/livekit_egress.twirp.go | 445 ++++++++++++++++---------------- 2 files changed, 250 insertions(+), 243 deletions(-) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index 37f9a6554..400d5cd1e 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -1377,14 +1377,18 @@ type EncodingOptions struct { Framerate int32 `protobuf:"varint,4,opt,name=framerate,proto3" json:"framerate,omitempty"` // (default 30) AudioCodec AudioCodec `protobuf:"varint,5,opt,name=audio_codec,json=audioCodec,proto3,enum=livekit.AudioCodec" json:"audio_codec,omitempty"` // (default OPUS) AudioBitrate int32 `protobuf:"varint,6,opt,name=audio_bitrate,json=audioBitrate,proto3" json:"audio_bitrate,omitempty"` // (default 128) - AudioQuality int32 `protobuf:"varint,11,opt,name=audio_quality,json=audioQuality,proto3" json:"audio_quality,omitempty"` // quality setting on audio encoder AudioFrequency int32 `protobuf:"varint,7,opt,name=audio_frequency,json=audioFrequency,proto3" json:"audio_frequency,omitempty"` // (default 44100) VideoCodec VideoCodec `protobuf:"varint,8,opt,name=video_codec,json=videoCodec,proto3,enum=livekit.VideoCodec" json:"video_codec,omitempty"` // (default H264_MAIN) VideoBitrate int32 `protobuf:"varint,9,opt,name=video_bitrate,json=videoBitrate,proto3" json:"video_bitrate,omitempty"` // (default 4500) - VideoQuality int32 `protobuf:"varint,12,opt,name=video_quality,json=videoQuality,proto3" json:"video_quality,omitempty"` // quality setting on video encoder KeyFrameInterval float64 `protobuf:"fixed64,10,opt,name=key_frame_interval,json=keyFrameInterval,proto3" json:"key_frame_interval,omitempty"` // in seconds (default 4s for streaming, segment duration for segmented output, encoder default for files) - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // --- Deprecated --- + // + // Deprecated: Marked as deprecated in livekit_egress.proto. + AudioQuality int32 `protobuf:"varint,11,opt,name=audio_quality,json=audioQuality,proto3" json:"audio_quality,omitempty"` // quality setting on audio encoder + // Deprecated: Marked as deprecated in livekit_egress.proto. + VideoQuality int32 `protobuf:"varint,12,opt,name=video_quality,json=videoQuality,proto3" json:"video_quality,omitempty"` // quality setting on video encoder + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EncodingOptions) Reset() { @@ -1459,13 +1463,6 @@ func (x *EncodingOptions) GetAudioBitrate() int32 { return 0 } -func (x *EncodingOptions) GetAudioQuality() int32 { - if x != nil { - return x.AudioQuality - } - return 0 -} - func (x *EncodingOptions) GetAudioFrequency() int32 { if x != nil { return x.AudioFrequency @@ -1487,16 +1484,25 @@ func (x *EncodingOptions) GetVideoBitrate() int32 { return 0 } -func (x *EncodingOptions) GetVideoQuality() int32 { +func (x *EncodingOptions) GetKeyFrameInterval() float64 { if x != nil { - return x.VideoQuality + return x.KeyFrameInterval } return 0 } -func (x *EncodingOptions) GetKeyFrameInterval() float64 { +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *EncodingOptions) GetAudioQuality() int32 { if x != nil { - return x.KeyFrameInterval + return x.AudioQuality + } + return 0 +} + +// Deprecated: Marked as deprecated in livekit_egress.proto. +func (x *EncodingOptions) GetVideoQuality() int32 { + if x != nil { + return x.VideoQuality } return 0 } @@ -5551,7 +5557,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\btrack_id\x18\x01 \x01(\tB\v\x9a\xec,\atrackIDH\x00R\atrackId\x123\n" + "\x14participant_identity\x18\x02 \x01(\tH\x00R\x13participantIdentity\x12\x16\n" + "\x05topic\x18\x03 \x01(\tH\x00R\x05topicB\a\n" + - "\x05match\"\xca\x03\n" + + "\x05match\"\xd2\x03\n" + "\x0fEncodingOptions\x12\x14\n" + "\x05width\x18\x01 \x01(\x05R\x05width\x12\x16\n" + "\x06height\x18\x02 \x01(\x05R\x06height\x12\x14\n" + @@ -5559,15 +5565,15 @@ const file_livekit_egress_proto_rawDesc = "" + "\tframerate\x18\x04 \x01(\x05R\tframerate\x124\n" + "\vaudio_codec\x18\x05 \x01(\x0e2\x13.livekit.AudioCodecR\n" + "audioCodec\x12#\n" + - "\raudio_bitrate\x18\x06 \x01(\x05R\faudioBitrate\x12#\n" + - "\raudio_quality\x18\v \x01(\x05R\faudioQuality\x12'\n" + + "\raudio_bitrate\x18\x06 \x01(\x05R\faudioBitrate\x12'\n" + "\x0faudio_frequency\x18\a \x01(\x05R\x0eaudioFrequency\x124\n" + "\vvideo_codec\x18\b \x01(\x0e2\x13.livekit.VideoCodecR\n" + "videoCodec\x12#\n" + - "\rvideo_bitrate\x18\t \x01(\x05R\fvideoBitrate\x12#\n" + - "\rvideo_quality\x18\f \x01(\x05R\fvideoQuality\x12,\n" + + "\rvideo_bitrate\x18\t \x01(\x05R\fvideoBitrate\x12,\n" + "\x12key_frame_interval\x18\n" + - " \x01(\x01R\x10keyFrameInterval\"\xb7\x02\n" + + " \x01(\x01R\x10keyFrameInterval\x12'\n" + + "\raudio_quality\x18\v \x01(\x05B\x02\x18\x01R\faudioQuality\x12'\n" + + "\rvideo_quality\x18\f \x01(\x05B\x02\x18\x01R\fvideoQuality\"\xb7\x02\n" + "\x06Output\x12)\n" + "\x04file\x18\x01 \x01(\v2\x13.livekit.FileOutputH\x00R\x04file\x12/\n" + "\x06stream\x18\x02 \x01(\v2\x15.livekit.StreamOutputH\x00R\x06stream\x12:\n" + diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index d343b8284..e9d314443 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -3312,15 +3312,15 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 4314 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0xdc, 0x48, - 0x76, 0x62, 0x7f, 0xf7, 0xeb, 0x0f, 0x51, 0x25, 0x59, 0xd3, 0x96, 0x3d, 0x63, 0x6f, 0x3b, 0xe3, - 0x0f, 0x8d, 0x56, 0x56, 0x24, 0xaf, 0xc7, 0xeb, 0xcd, 0xce, 0xa6, 0xa5, 0xa6, 0xac, 0x5e, 0x4b, - 0x6a, 0x85, 0xdd, 0x1a, 0x4f, 0x02, 0x24, 0x04, 0x45, 0x96, 0x24, 0x42, 0xdd, 0x64, 0x2f, 0xc9, - 0x96, 0xad, 0xfd, 0x05, 0x9b, 0x1c, 0x92, 0x20, 0x01, 0x12, 0xc0, 0x40, 0x90, 0x1c, 0x82, 0x1c, - 0x82, 0x3d, 0xe5, 0x92, 0x6b, 0xce, 0xf9, 0x40, 0x0e, 0x41, 0x90, 0x7b, 0x8e, 0x81, 0x83, 0x45, - 0x0e, 0xb9, 0x07, 0xf5, 0x41, 0xb2, 0x48, 0x51, 0x72, 0xcb, 0x72, 0x66, 0x2f, 0x7b, 0x52, 0xd7, - 0x7b, 0xaf, 0x8a, 0xaf, 0xea, 0x7d, 0xd4, 0x7b, 0xaf, 0x9e, 0x60, 0x6e, 0x60, 0x9d, 0xe2, 0x13, + // 4324 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0x1c, 0x5b, + 0x56, 0xae, 0xfe, 0xee, 0xd3, 0x1f, 0x2e, 0x5f, 0x3b, 0x7e, 0x1d, 0x27, 0xef, 0x25, 0xd3, 0xe1, + 0xe5, 0xc3, 0xcf, 0xe3, 0x18, 0x3b, 0x93, 0x97, 0xc9, 0x30, 0x6f, 0x68, 0xbb, 0xcb, 0x71, 0x4f, + 0x6c, 0xb7, 0xa9, 0x6e, 0xbf, 0x3c, 0x90, 0xa0, 0x54, 0xae, 0xba, 0xb6, 0x4b, 0xee, 0xae, 0xea, + 0xa9, 0xaa, 0x76, 0xe2, 0xf9, 0x05, 0x03, 0x0b, 0x40, 0x20, 0x81, 0x14, 0x09, 0xc1, 0x02, 0xb1, + 0x40, 0xb3, 0x62, 0xc3, 0x96, 0x3d, 0x20, 0x24, 0x10, 0x62, 0xcf, 0x12, 0x05, 0x8d, 0x58, 0xb0, + 0x47, 0xf7, 0xa3, 0xaa, 0x6e, 0x95, 0xcb, 0x4e, 0x3b, 0x0e, 0x6f, 0x36, 0xb3, 0x72, 0xdf, 0x73, + 0xce, 0xbd, 0x75, 0xee, 0x3d, 0x1f, 0xf7, 0x9c, 0x73, 0x8f, 0x61, 0x6e, 0x60, 0x9d, 0xe2, 0x13, 0xcb, 0xd7, 0xf0, 0x91, 0x8b, 0x3d, 0x6f, 0x79, 0xe4, 0x3a, 0xbe, 0x83, 0x8a, 0x1c, 0xba, 0x10, 0xa2, 0x87, 0x8e, 0x89, 0x07, 0x1c, 0xbd, 0x30, 0x37, 0x70, 0x8e, 0x8e, 0xb0, 0xfb, 0xd8, 0x19, 0xf9, 0x96, 0x63, 0x73, 0x68, 0xf3, 0x3f, 0xb2, 0x80, 0x7a, 0xbe, 0xee, 0xfa, 0x0a, 0x5d, 0x4a, @@ -3365,222 +3365,223 @@ var twirpFileDescriptor1 = []byte{ 0x46, 0x42, 0x6a, 0x0c, 0xa9, 0x06, 0x54, 0x44, 0x1e, 0x43, 0xdd, 0x37, 0x8e, 0x9b, 0x2d, 0x80, 0x48, 0x58, 0x68, 0x0d, 0xca, 0x1e, 0x1e, 0x60, 0xc3, 0x77, 0xdc, 0xe0, 0xc4, 0x6e, 0xc4, 0x84, 0xda, 0xe3, 0x58, 0x35, 0xa2, 0x23, 0x16, 0x5e, 0x15, 0x71, 0xff, 0xdf, 0x07, 0x37, 0x0f, 0x79, - 0xdf, 0x19, 0x59, 0x06, 0x3d, 0x2d, 0x42, 0xc5, 0x86, 0xd1, 0x9e, 0xfe, 0x31, 0x0b, 0xd3, 0x09, + 0xdf, 0x19, 0x59, 0x06, 0x3d, 0x2d, 0x42, 0xc5, 0x86, 0xd1, 0x9e, 0xfe, 0x35, 0x0b, 0xd3, 0x09, 0xcf, 0x89, 0xe6, 0x20, 0xff, 0xda, 0x32, 0xfd, 0x63, 0xca, 0x50, 0x5e, 0x65, 0x03, 0xe2, 0x89, 0x8e, 0xb1, 0x75, 0x74, 0xec, 0xd3, 0x2f, 0xe6, 0x55, 0x3e, 0x22, 0xd4, 0x26, 0x1e, 0xf9, 0xc7, 0xf4, 0x13, 0x79, 0x95, 0x0d, 0xd0, 0x6d, 0x28, 0x1f, 0xba, 0xfa, 0x10, 0xbb, 0xe4, 0xc6, 0xc9, 0x51, 0x4c, 0x04, 0x40, 0x4f, 0xa0, 0xc2, 0xfc, 0x86, 0xe1, 0x98, 0xd8, 0xe0, 0xd7, 0xc0, 0x6c, 0xd2, 0x7a, 0x4c, 0x6c, 0xa8, 0xcc, 0xbf, 0xd0, 0xdf, 0xe8, 0x1e, 0xd4, 0xd8, 0xac, 0x03, 0xcb, - 0xa7, 0xeb, 0x16, 0xe8, 0xba, 0x55, 0x0a, 0x5c, 0x67, 0xb0, 0x88, 0xe8, 0x27, 0x63, 0x7d, 0x40, - 0xce, 0xa7, 0x22, 0x10, 0xfd, 0x16, 0x83, 0xa1, 0x07, 0x30, 0xcd, 0x88, 0x0e, 0x5d, 0x72, 0x7b, - 0xda, 0xc6, 0x59, 0xa3, 0x48, 0xc9, 0xea, 0x14, 0xbc, 0x19, 0x40, 0x09, 0xa3, 0xcc, 0xc9, 0x30, - 0x46, 0x4b, 0x09, 0x46, 0xa9, 0x4d, 0x72, 0x46, 0x4f, 0xc3, 0xdf, 0x84, 0x07, 0x36, 0x2b, 0x60, - 0xb4, 0xcc, 0x78, 0xa0, 0x40, 0x81, 0x51, 0x46, 0x14, 0x30, 0x5a, 0x15, 0x88, 0x02, 0x46, 0x97, - 0x00, 0x9d, 0xe0, 0x33, 0x8d, 0x9e, 0x9c, 0x66, 0xd9, 0x3e, 0x76, 0x4f, 0xf5, 0x41, 0x03, 0xee, - 0x4a, 0x0f, 0x25, 0x55, 0x3e, 0xc1, 0x67, 0x9b, 0x04, 0xd1, 0xe1, 0xf0, 0xe6, 0xdf, 0x67, 0xa0, - 0xc0, 0xee, 0x33, 0xf4, 0x08, 0x72, 0x87, 0xd6, 0x80, 0x05, 0x02, 0xa2, 0x29, 0x6f, 0x5a, 0x03, - 0xcc, 0x48, 0xb6, 0xa6, 0x54, 0x4a, 0x82, 0x1e, 0x43, 0xc1, 0xf3, 0x5d, 0xac, 0x0f, 0xb9, 0x0f, - 0xbc, 0x21, 0x5c, 0x78, 0x04, 0x1c, 0x92, 0x73, 0x32, 0xf4, 0x1c, 0x4a, 0x1e, 0x3e, 0x1a, 0x62, - 0xdb, 0xf7, 0xb8, 0xe3, 0xbb, 0x1d, 0x4d, 0x61, 0x08, 0x6c, 0xc6, 0x3e, 0x14, 0xd2, 0xa3, 0x65, - 0x28, 0x58, 0x43, 0xfd, 0x08, 0x7b, 0xe7, 0x42, 0x85, 0x0e, 0x01, 0x47, 0xdf, 0x62, 0x54, 0x64, - 0x1f, 0x43, 0x43, 0x1f, 0x51, 0x15, 0x11, 0xf7, 0xb1, 0x63, 0xe8, 0xa3, 0x68, 0x1f, 0x84, 0x44, - 0xbc, 0xb9, 0x0b, 0x13, 0xdd, 0xdc, 0xe4, 0x16, 0x36, 0x28, 0xa8, 0xf9, 0x07, 0x12, 0x40, 0xc4, - 0x31, 0xfa, 0x1e, 0x94, 0xc9, 0xd1, 0x68, 0xfe, 0xd9, 0x88, 0x1d, 0x61, 0x3d, 0x19, 0x68, 0xb0, - 0x0d, 0xf6, 0xcf, 0x46, 0x58, 0x2d, 0x1d, 0xf2, 0x5f, 0xc4, 0x39, 0x93, 0xdf, 0x23, 0xdd, 0x3f, - 0x66, 0x66, 0xa9, 0x86, 0x63, 0xf4, 0x08, 0x64, 0xd3, 0xf2, 0xf4, 0x83, 0x01, 0xd6, 0x86, 0xba, - 0x6d, 0x1d, 0x62, 0xcf, 0xe7, 0x37, 0xe2, 0x34, 0x87, 0xef, 0x70, 0x70, 0xf3, 0x15, 0x54, 0xc5, - 0x93, 0x47, 0x6b, 0x50, 0xa2, 0x91, 0x9f, 0xe1, 0x0c, 0x38, 0x33, 0x9f, 0x24, 0x44, 0xb4, 0xc7, - 0xd1, 0x6a, 0x48, 0x88, 0x10, 0xe4, 0xc6, 0xee, 0xc0, 0x6b, 0x64, 0xee, 0x66, 0x1f, 0x96, 0x55, - 0xfa, 0xbb, 0xf9, 0xd7, 0x39, 0x98, 0x4d, 0x11, 0x10, 0x11, 0x68, 0xe2, 0x03, 0x9f, 0xa5, 0x0b, - 0x34, 0xe5, 0x3b, 0x0f, 0x60, 0x9a, 0xec, 0x91, 0x44, 0x9d, 0x1a, 0xb9, 0x62, 0xac, 0x37, 0x7c, - 0xeb, 0xf5, 0x00, 0xbc, 0x47, 0xa1, 0x44, 0xdf, 0x47, 0x03, 0xfd, 0x6c, 0x60, 0x79, 0x3e, 0x8b, - 0x51, 0xa9, 0x4b, 0x52, 0xab, 0x01, 0x90, 0xc6, 0xa9, 0x4b, 0x80, 0xc8, 0x87, 0xb5, 0x38, 0x65, - 0x85, 0x52, 0xca, 0x04, 0xb3, 0x27, 0x52, 0x3f, 0x02, 0x99, 0x2b, 0x96, 0x66, 0x8e, 0x5d, 0x9d, - 0x78, 0x2f, 0xaa, 0x56, 0x35, 0x75, 0x9a, 0xc3, 0xdb, 0x1c, 0x8c, 0x14, 0x81, 0x4d, 0x6f, 0x7c, - 0x48, 0xd8, 0x04, 0xba, 0xd3, 0x0b, 0x54, 0xb7, 0x47, 0x69, 0xa2, 0x4d, 0xb0, 0x71, 0xaa, 0x14, - 0x4b, 0xa9, 0x52, 0x44, 0xf7, 0x20, 0xe3, 0xad, 0x71, 0xbd, 0x9d, 0x89, 0x3e, 0xb2, 0xb6, 0x3f, - 0x1a, 0x38, 0x3a, 0xb9, 0x99, 0x32, 0xde, 0x1a, 0x09, 0xb0, 0x8f, 0x8c, 0x11, 0xd7, 0xd7, 0x28, - 0xc0, 0x7e, 0xb1, 0xb1, 0x17, 0x92, 0x11, 0x02, 0xb4, 0x02, 0x79, 0xfd, 0xa7, 0x63, 0x17, 0x53, - 0x37, 0x25, 0x46, 0xbd, 0x2d, 0x02, 0x5d, 0x1f, 0x38, 0x07, 0x21, 0x3d, 0x23, 0x24, 0x56, 0xad, - 0x0f, 0xac, 0x6e, 0xaf, 0x47, 0x9d, 0x8f, 0x68, 0xd5, 0x2d, 0x0a, 0x0e, 0xe9, 0x39, 0x19, 0x31, - 0x06, 0x16, 0x03, 0x37, 0xff, 0x3b, 0x0b, 0x15, 0xc1, 0x1a, 0xc9, 0xa6, 0x0d, 0x7d, 0xe4, 0x8f, - 0x5d, 0xc1, 0x05, 0x49, 0xec, 0x98, 0x39, 0x3c, 0xf0, 0x40, 0xd1, 0xd5, 0x91, 0x49, 0xbf, 0x3a, - 0xb2, 0xb1, 0xab, 0x23, 0x45, 0x77, 0x72, 0xa9, 0xba, 0xd3, 0x3a, 0x2f, 0xbd, 0x7c, 0xc2, 0x2a, - 0x29, 0xc3, 0x97, 0x48, 0xee, 0x09, 0x54, 0xa8, 0x4b, 0xe1, 0x9e, 0xbc, 0x90, 0xf0, 0xe4, 0x74, - 0x3a, 0xf7, 0xe4, 0x56, 0xf8, 0x3b, 0x55, 0xde, 0xc5, 0xcb, 0xe4, 0x5d, 0x9a, 0x48, 0xde, 0xe5, - 0x89, 0xe5, 0x0d, 0x57, 0x97, 0x77, 0xe5, 0xaa, 0xf2, 0xee, 0x01, 0x44, 0xee, 0x34, 0xe6, 0xc4, - 0xa4, 0x09, 0x9c, 0x58, 0x26, 0xdd, 0x89, 0xfd, 0xb3, 0x04, 0xb5, 0x98, 0xdb, 0xe5, 0x07, 0x24, - 0x4d, 0x74, 0x40, 0x99, 0x89, 0x0f, 0x28, 0x3b, 0xe9, 0x01, 0xad, 0x40, 0x51, 0x1f, 0x58, 0x9a, - 0xe3, 0x05, 0x57, 0xcf, 0xe5, 0x27, 0xe4, 0x79, 0x24, 0x35, 0x1b, 0xb9, 0x0e, 0xb9, 0x8f, 0xdd, - 0xe6, 0x7f, 0xe6, 0xa0, 0x14, 0xb0, 0x8a, 0xee, 0x01, 0xe8, 0x86, 0x81, 0x3d, 0x4f, 0x3b, 0xc1, - 0x3c, 0x0c, 0x5f, 0xcf, 0xfd, 0xec, 0xdd, 0x92, 0xa4, 0x96, 0x19, 0xfc, 0x25, 0x3e, 0x43, 0xb7, - 0xa1, 0xe0, 0x61, 0xc3, 0xc5, 0xec, 0x84, 0x02, 0x02, 0x0e, 0x43, 0x8f, 0xa0, 0xe6, 0x61, 0xcf, - 0xb3, 0x1c, 0x5b, 0xf3, 0x9d, 0x13, 0x6c, 0x33, 0x1f, 0xc7, 0x89, 0xaa, 0x1c, 0xd5, 0x27, 0x18, - 0xb4, 0x04, 0xd3, 0xba, 0xe7, 0x8d, 0x87, 0x58, 0x73, 0x9d, 0x01, 0xd6, 0x74, 0xd7, 0xa6, 0xa1, - 0x42, 0x40, 0x5c, 0x63, 0x48, 0xd5, 0x19, 0xe0, 0x96, 0x6b, 0xa3, 0x1e, 0x7c, 0x22, 0x52, 0xe3, - 0x37, 0x3e, 0x76, 0x6d, 0x7d, 0x40, 0xe2, 0xcb, 0x1a, 0x9d, 0x75, 0x9b, 0xcc, 0x7a, 0xfb, 0x6e, - 0x69, 0x2e, 0x9a, 0xa7, 0x70, 0xa2, 0x4e, 0x5b, 0x4d, 0x83, 0x9a, 0xc4, 0x80, 0x5d, 0x7c, 0x44, - 0xdc, 0x2b, 0x73, 0xda, 0x7c, 0x44, 0x74, 0x05, 0xdb, 0xe6, 0xc8, 0xb1, 0x6c, 0x9f, 0x5b, 0x6e, - 0x38, 0x26, 0x73, 0x0e, 0xc6, 0xc6, 0x09, 0xcf, 0xf2, 0xcb, 0x2a, 0x1f, 0xa1, 0x87, 0x20, 0x1f, - 0x3a, 0xae, 0x81, 0x35, 0xa2, 0x51, 0x9a, 0xe7, 0x9f, 0x0d, 0xd8, 0x7d, 0x5d, 0x52, 0xeb, 0x14, - 0xbe, 0xa7, 0xfb, 0xc7, 0x3d, 0x02, 0x45, 0x3f, 0x80, 0xd2, 0x10, 0xfb, 0x3a, 0xcd, 0x9a, 0x58, - 0xda, 0x7e, 0xe7, 0x9c, 0xda, 0x2c, 0xef, 0x70, 0x0a, 0xc5, 0xf6, 0xdd, 0x33, 0x35, 0x9c, 0x80, - 0x1a, 0x50, 0xf4, 0xf5, 0xa3, 0x23, 0xcb, 0x3e, 0xa2, 0x36, 0x59, 0x56, 0x83, 0x21, 0x7a, 0x0c, - 0xb3, 0x86, 0x63, 0xfb, 0xf4, 0xd6, 0xb0, 0xbc, 0x91, 0xe3, 0x59, 0xf4, 0xe2, 0x28, 0x53, 0x2a, - 0xc4, 0x51, 0xed, 0x08, 0x43, 0xb2, 0xbc, 0x91, 0xeb, 0xbc, 0x39, 0xe3, 0xc6, 0x18, 0x85, 0x2c, - 0x7b, 0x04, 0x1a, 0x64, 0x79, 0x94, 0x64, 0xe1, 0x07, 0x50, 0x8b, 0x71, 0x44, 0x92, 0xe6, 0x50, - 0x49, 0x54, 0xf2, 0x93, 0xf8, 0xc8, 0x53, 0x7d, 0x30, 0xc6, 0xfc, 0x9e, 0x64, 0x83, 0xe7, 0x99, - 0x67, 0x52, 0xf3, 0x35, 0x94, 0x43, 0x45, 0x47, 0xf7, 0xa1, 0x62, 0xb8, 0x98, 0x06, 0xf2, 0xfa, - 0xc0, 0x8b, 0x69, 0x99, 0x88, 0x10, 0xce, 0x39, 0x13, 0x3b, 0xe7, 0x90, 0xeb, 0xec, 0x7b, 0xb9, - 0x6e, 0xfe, 0x4c, 0x82, 0xe9, 0x84, 0xe1, 0xa0, 0x07, 0x50, 0xd5, 0x0d, 0xc3, 0x19, 0xdb, 0xbe, - 0x50, 0x52, 0x0a, 0x18, 0xe0, 0x18, 0x7a, 0x0b, 0x7f, 0x0e, 0xc1, 0x90, 0x9a, 0x83, 0xa8, 0xed, - 0xc0, 0x11, 0xc4, 0x1e, 0x3e, 0x87, 0x3a, 0x39, 0x5b, 0xdd, 0xb2, 0xb1, 0x2b, 0x06, 0x00, 0xb5, - 0x10, 0x4a, 0x56, 0x6b, 0xfe, 0x85, 0x04, 0x55, 0xd1, 0x1e, 0x3f, 0x86, 0xb1, 0x7d, 0x44, 0xf5, - 0x6d, 0xfe, 0x2e, 0x54, 0x84, 0x03, 0x4c, 0xa9, 0x89, 0x2c, 0x40, 0x69, 0xec, 0x11, 0xc3, 0x19, - 0x06, 0x12, 0x0e, 0xc7, 0xe8, 0x2e, 0x94, 0x46, 0xba, 0xe7, 0xbd, 0x76, 0x5c, 0x96, 0xbf, 0x06, - 0x8c, 0x86, 0xd0, 0xa6, 0x07, 0x33, 0xdb, 0x96, 0x77, 0x95, 0xd2, 0xde, 0x23, 0x28, 0xb3, 0x9a, - 0x22, 0x31, 0x71, 0xb6, 0xfb, 0xea, 0xdb, 0x77, 0x4b, 0x25, 0x06, 0xec, 0xb4, 0xd5, 0xe0, 0x17, - 0x35, 0x63, 0xdd, 0xf0, 0xad, 0x53, 0xcc, 0x23, 0x4f, 0x3e, 0x6a, 0xfe, 0x08, 0x90, 0xf8, 0x51, - 0x6f, 0xe4, 0xd8, 0x1e, 0x59, 0x38, 0x6f, 0xf9, 0x78, 0x78, 0xbe, 0x1c, 0xc0, 0xe8, 0x48, 0x92, - 0xad, 0x32, 0x8a, 0xe6, 0x3f, 0x48, 0x30, 0xbb, 0x3f, 0x32, 0x75, 0x1f, 0xc7, 0x19, 0x8f, 0xf1, - 0x26, 0x5d, 0xca, 0x1b, 0x3f, 0xc8, 0x4c, 0x74, 0x90, 0x51, 0xe9, 0x2b, 0x1b, 0x2b, 0x7d, 0xdd, - 0x87, 0x69, 0xdd, 0x34, 0x35, 0x96, 0x8c, 0x68, 0x34, 0xc8, 0xcd, 0xd1, 0x20, 0xb7, 0xa6, 0x9b, - 0x26, 0x8b, 0x87, 0xf7, 0xdd, 0x81, 0x47, 0x62, 0x49, 0x17, 0x0f, 0x9d, 0x53, 0x1c, 0x23, 0xcd, - 0x53, 0x52, 0x99, 0x61, 0x22, 0xea, 0xe6, 0x57, 0x30, 0xd3, 0xf3, 0x9d, 0xd1, 0x87, 0xf2, 0xdf, - 0xfc, 0xf3, 0x0a, 0x40, 0x74, 0x30, 0x57, 0xd9, 0xf9, 0x3d, 0x28, 0x52, 0xe9, 0x86, 0xe2, 0x83, - 0xb7, 0xef, 0x96, 0x0a, 0x04, 0xd4, 0x69, 0xab, 0xec, 0xaf, 0x19, 0x57, 0x81, 0x5a, 0x42, 0x05, - 0x9e, 0x43, 0x85, 0x55, 0x13, 0x59, 0xc2, 0xb2, 0x40, 0x63, 0x9b, 0x9b, 0x09, 0x79, 0xb1, 0xb2, - 0x19, 0xcd, 0x58, 0xc0, 0x0b, 0x7f, 0xa3, 0xef, 0x92, 0xec, 0x4f, 0xf7, 0xc7, 0x1e, 0x2f, 0xa8, - 0xdc, 0x48, 0x4e, 0xa3, 0x48, 0x95, 0x13, 0xa1, 0x4f, 0x01, 0x68, 0xb5, 0x0e, 0x9b, 0x9a, 0xee, - 0x53, 0x87, 0x98, 0x55, 0xcb, 0x1c, 0xd2, 0xf2, 0xd1, 0x4d, 0x6a, 0x51, 0x0c, 0x59, 0xa1, 0xc8, - 0x22, 0x1d, 0xb7, 0x68, 0xc5, 0x72, 0x4c, 0x55, 0x84, 0x22, 0x11, 0x9b, 0xc9, 0x21, 0x2d, 0x92, - 0x72, 0x15, 0xd8, 0x89, 0x34, 0x3e, 0xa5, 0xfe, 0xea, 0x96, 0x90, 0xe2, 0x24, 0x6b, 0xdd, 0xe4, - 0x8e, 0x66, 0xc4, 0xe8, 0x29, 0x31, 0x6d, 0x92, 0x2d, 0x34, 0x3e, 0x4b, 0x64, 0xa2, 0xca, 0x9b, - 0x91, 0xe3, 0xfa, 0x2a, 0x45, 0x0a, 0xf3, 0x18, 0x35, 0xda, 0x86, 0x3a, 0x3d, 0x4f, 0xc3, 0x19, - 0x52, 0x3f, 0x8f, 0x79, 0x50, 0x70, 0x2f, 0x9c, 0xaf, 0x3a, 0xce, 0x70, 0x23, 0xc0, 0x26, 0x3f, - 0x5f, 0x73, 0x45, 0x2c, 0xfa, 0x2e, 0xab, 0x93, 0xd7, 0x13, 0x35, 0xc4, 0x57, 0xf8, 0x20, 0x39, - 0x91, 0x96, 0xcb, 0x15, 0xa8, 0x08, 0xc5, 0x9a, 0xc6, 0x2c, 0x9d, 0xf6, 0x9d, 0xb4, 0x4a, 0x56, - 0x72, 0xba, 0x38, 0x0f, 0x75, 0x61, 0x9a, 0xd5, 0x8e, 0xa2, 0x4d, 0xb0, 0x74, 0xe3, 0xd7, 0xa2, - 0xda, 0x3e, 0xc1, 0x5f, 0xb8, 0x8b, 0xba, 0x1f, 0x43, 0xa3, 0x35, 0xc8, 0x53, 0x08, 0xcf, 0x47, - 0x6e, 0xc5, 0x97, 0x49, 0xce, 0x66, 0xb4, 0xe8, 0x39, 0xd4, 0xb9, 0x7d, 0xb9, 0xd8, 0x1b, 0x0f, - 0x7c, 0xaf, 0x31, 0x9d, 0xf0, 0x17, 0xcc, 0xca, 0xa8, 0xbf, 0xa8, 0x31, 0x52, 0x95, 0x51, 0xa2, - 0x27, 0x50, 0xa5, 0x79, 0x76, 0x30, 0x53, 0xa6, 0x33, 0x67, 0x62, 0xd5, 0x0a, 0x3a, 0xaf, 0x42, - 0xc8, 0x82, 0x59, 0x5f, 0x41, 0x90, 0xde, 0x85, 0x13, 0x67, 0x12, 0xf5, 0x37, 0x9e, 0xcb, 0x31, - 0x27, 0x55, 0xe7, 0xd4, 0xc1, 0xfc, 0x67, 0x50, 0x63, 0xa9, 0x40, 0x30, 0x7b, 0x2e, 0xc1, 0x30, - 0x4d, 0x06, 0xd8, 0xdc, 0x2a, 0xa5, 0x14, 0xf8, 0x1d, 0x1a, 0xfa, 0x28, 0x9c, 0x78, 0x3b, 0xc1, - 0x2f, 0x09, 0xa3, 0x19, 0xbf, 0x84, 0x2c, 0x98, 0x35, 0x07, 0x79, 0xec, 0xba, 0x8e, 0xcb, 0x43, - 0x0c, 0x36, 0x20, 0xf6, 0x40, 0x7f, 0xd0, 0x84, 0xa4, 0x31, 0xcf, 0x4a, 0x64, 0x14, 0x42, 0x52, - 0x0f, 0x12, 0xbf, 0x98, 0xd8, 0xd7, 0xad, 0x81, 0xd7, 0xb8, 0xc1, 0xe2, 0x17, 0x3e, 0x44, 0x5f, - 0xc0, 0x4c, 0x10, 0x7c, 0x6b, 0x03, 0xc7, 0x60, 0x69, 0xef, 0x27, 0x2c, 0x45, 0x0e, 0x10, 0xdb, - 0x1c, 0x8e, 0x96, 0x61, 0xf6, 0x40, 0x37, 0x4e, 0xc6, 0x23, 0x8d, 0x17, 0x3d, 0xb4, 0xb1, 0x87, - 0xcd, 0xc6, 0x4d, 0x56, 0x13, 0x66, 0x28, 0x1e, 0xa6, 0xef, 0x7b, 0xd8, 0x44, 0x77, 0xa0, 0xe2, - 0x62, 0xdf, 0x3d, 0xd3, 0xe8, 0xbd, 0xdd, 0xb8, 0x45, 0xd9, 0x02, 0x0a, 0xda, 0x20, 0x10, 0x62, - 0xa7, 0xbc, 0x5a, 0x54, 0x4c, 0xbc, 0x23, 0x45, 0x62, 0x26, 0x97, 0xc9, 0x7a, 0xa6, 0x21, 0x6d, - 0x49, 0x61, 0xcd, 0xe8, 0x0b, 0x5e, 0x8f, 0x4a, 0xe6, 0x47, 0x81, 0x84, 0x39, 0x39, 0xab, 0x48, - 0x7d, 0x29, 0x14, 0x98, 0xaa, 0xc9, 0x9a, 0x94, 0x20, 0x59, 0x3e, 0x29, 0x24, 0x5e, 0x2f, 0x43, - 0xd1, 0x65, 0xfa, 0x49, 0xd2, 0x1b, 0x26, 0xa5, 0xe6, 0xcf, 0x33, 0x00, 0x11, 0x6f, 0xe9, 0xaf, - 0x18, 0x82, 0x4f, 0xcb, 0x5c, 0xe6, 0xd3, 0xb2, 0x71, 0x9f, 0xb6, 0x00, 0xa5, 0x58, 0xe1, 0x21, - 0xab, 0x86, 0x63, 0xb4, 0x1a, 0x3a, 0x56, 0x96, 0xaa, 0x2e, 0xa4, 0x1c, 0xd4, 0x72, 0xc2, 0xbb, - 0x86, 0x9a, 0x52, 0x10, 0x35, 0xa5, 0x09, 0xb5, 0x81, 0xee, 0x11, 0x65, 0x27, 0x82, 0xd1, 0x59, - 0x06, 0x9a, 0x55, 0x2b, 0x04, 0xa8, 0x12, 0x58, 0xcb, 0x27, 0xea, 0x42, 0xd0, 0x16, 0xf6, 0xe8, - 0x11, 0xd7, 0xd4, 0x60, 0xd8, 0x5c, 0x86, 0x02, 0xfb, 0x0a, 0x02, 0x28, 0xb4, 0x36, 0xfa, 0x9d, - 0xaf, 0x15, 0x79, 0x0a, 0x55, 0xa1, 0xb4, 0xd9, 0xd9, 0xed, 0xf4, 0xb6, 0x94, 0xb6, 0x2c, 0x11, - 0xcc, 0x66, 0xab, 0xb3, 0xad, 0xb4, 0xe5, 0x4c, 0xf3, 0xe7, 0x12, 0x94, 0x02, 0xa9, 0x04, 0xc9, - 0xa0, 0x18, 0x78, 0x04, 0xe3, 0x8f, 0x74, 0x6c, 0x85, 0xc4, 0xb1, 0x21, 0xc8, 0x79, 0xd6, 0x4f, - 0x31, 0x3f, 0x4e, 0xfa, 0x9b, 0xd0, 0x87, 0x8a, 0xce, 0xa2, 0xb1, 0x70, 0xdc, 0xfc, 0xb7, 0x0c, - 0x54, 0x45, 0x9d, 0x38, 0x5f, 0x67, 0x92, 0x26, 0xae, 0x33, 0x95, 0x2e, 0xa8, 0x33, 0x89, 0xfc, - 0x66, 0x2e, 0xe0, 0x37, 0x2b, 0xf0, 0xfb, 0x05, 0xcc, 0x84, 0x0b, 0x87, 0x8c, 0xb3, 0x00, 0x53, - 0x0e, 0x10, 0xa1, 0x85, 0x3e, 0x81, 0xf9, 0x38, 0x2b, 0xe1, 0x0c, 0xe6, 0x2e, 0xe6, 0x44, 0x76, - 0xc2, 0x59, 0xf7, 0x48, 0xfe, 0xc8, 0x7c, 0x20, 0xb3, 0xd4, 0x3c, 0xfd, 0x7e, 0x95, 0x03, 0x99, - 0xad, 0xc6, 0x25, 0x54, 0xb8, 0x4c, 0x42, 0xc5, 0x98, 0x84, 0x9a, 0x7f, 0x2c, 0x01, 0x44, 0x5e, - 0x70, 0xf2, 0x42, 0xcd, 0x9d, 0xa8, 0xca, 0x42, 0x98, 0x92, 0xe8, 0xaa, 0x41, 0x41, 0xe5, 0x3c, - 0x4b, 0x57, 0x50, 0x9a, 0xe6, 0xbf, 0x48, 0x50, 0x0a, 0xfc, 0xeb, 0xb7, 0xa0, 0x97, 0xb9, 0x0b, - 0xe4, 0x9c, 0xbf, 0x40, 0x2f, 0x0b, 0x71, 0xbd, 0x24, 0x27, 0x11, 0x5c, 0xce, 0xe4, 0x24, 0xd8, - 0xf9, 0x02, 0xbf, 0x70, 0xc7, 0xb6, 0xdf, 0x7c, 0x9b, 0x81, 0x1b, 0xad, 0xb1, 0xef, 0x9c, 0xbb, - 0xed, 0x85, 0xf7, 0x71, 0x69, 0xa2, 0xf7, 0xf1, 0xa9, 0xd4, 0xf7, 0xf1, 0xcc, 0x7b, 0xde, 0xc7, - 0xa7, 0x84, 0xf7, 0xf1, 0x1f, 0xf2, 0x7b, 0x38, 0x78, 0x24, 0xcf, 0xd2, 0x7b, 0x6d, 0x21, 0xad, - 0xe4, 0xcd, 0xdf, 0xcb, 0xe9, 0x85, 0xdc, 0xe5, 0x6f, 0xe6, 0x4a, 0x74, 0x21, 0x07, 0x2b, 0xe4, - 0xe8, 0x0a, 0x97, 0xbe, 0x0b, 0x84, 0xf7, 0x32, 0x5f, 0x86, 0x78, 0x6f, 0xde, 0xe9, 0xd0, 0xfc, - 0x93, 0x0c, 0x4c, 0x93, 0xc3, 0x11, 0x02, 0x8f, 0x2b, 0x17, 0xa6, 0xf2, 0x97, 0xd5, 0xe9, 0x32, - 0x13, 0x95, 0xa1, 0xb2, 0x13, 0x97, 0xa1, 0x72, 0x57, 0xaf, 0xd3, 0x15, 0xae, 0x5a, 0xa7, 0xfb, - 0xbb, 0x1c, 0xcc, 0xa6, 0x44, 0xb5, 0x24, 0xd7, 0x60, 0x51, 0x6d, 0x22, 0xd7, 0x60, 0x40, 0x92, - 0x6b, 0xf0, 0x5f, 0x26, 0xc9, 0x9d, 0xd8, 0x63, 0xbb, 0x73, 0x78, 0xe8, 0x61, 0x5f, 0x1b, 0x7a, - 0xdc, 0x40, 0x6a, 0x14, 0xdc, 0xa5, 0xd0, 0x1d, 0x8f, 0x5c, 0x39, 0xd8, 0x36, 0x05, 0x2a, 0x66, - 0x29, 0x15, 0x6c, 0x9b, 0x21, 0x8d, 0xd8, 0x53, 0x92, 0xbb, 0x72, 0x4f, 0x49, 0x7e, 0xe2, 0x9e, - 0x92, 0xc2, 0xd5, 0x7a, 0x4a, 0x8a, 0xd7, 0xe8, 0x29, 0x29, 0x7d, 0x58, 0x4f, 0x49, 0x79, 0xf2, - 0x9e, 0x12, 0xb8, 0x7a, 0x4f, 0x49, 0xe5, 0x5a, 0x3d, 0x25, 0xff, 0x5e, 0x80, 0x85, 0x8b, 0x53, - 0x99, 0xcb, 0x4b, 0x0b, 0x51, 0x06, 0x9e, 0xb9, 0xa4, 0xf9, 0x24, 0x9b, 0x6c, 0xfb, 0xf8, 0x12, - 0xd8, 0x6b, 0xab, 0x36, 0xb4, 0xde, 0x58, 0xf6, 0x51, 0x63, 0x9a, 0x4a, 0x24, 0xd1, 0x1c, 0xb1, - 0x43, 0x71, 0x2a, 0x7b, 0x07, 0x66, 0x83, 0x44, 0xbf, 0x48, 0x6e, 0x82, 0xae, 0x95, 0x7c, 0x4a, - 0xd7, 0x0a, 0x7a, 0xc2, 0x63, 0x4d, 0xa6, 0x38, 0x97, 0x78, 0x31, 0x1a, 0x3f, 0x06, 0xcf, 0xa0, - 0x6b, 0x89, 0xc0, 0x36, 0xfd, 0x19, 0x94, 0x4f, 0x09, 0xc2, 0xda, 0xaf, 0x84, 0x48, 0x15, 0xde, - 0xff, 0x14, 0xca, 0x67, 0x47, 0xcf, 0xa1, 0x91, 0xda, 0x96, 0xae, 0xa1, 0xb6, 0xe5, 0x2b, 0xa8, - 0x6d, 0xd2, 0xd5, 0x57, 0xae, 0xe6, 0xea, 0x7f, 0x23, 0xcc, 0xf6, 0x82, 0x05, 0xaa, 0xc9, 0xd4, - 0x4b, 0x38, 0xad, 0x20, 0xdf, 0xbb, 0xe4, 0xa2, 0xa8, 0x5d, 0xfd, 0xa2, 0x40, 0xdf, 0x0f, 0x12, - 0xb8, 0x60, 0x91, 0x3a, 0x5d, 0x24, 0xf5, 0x2d, 0x99, 0x67, 0x70, 0xc1, 0x54, 0xd1, 0xb0, 0xe4, - 0xc9, 0x0d, 0x8b, 0x7d, 0x48, 0xbc, 0xa1, 0xfe, 0x37, 0x0f, 0x72, 0x32, 0xbf, 0xff, 0x96, 0x3a, - 0xa4, 0xaa, 0xe9, 0x1d, 0x52, 0xa1, 0xde, 0xe7, 0x3e, 0x50, 0xef, 0xf3, 0x1f, 0xa6, 0xf7, 0x85, - 0x6b, 0xe9, 0xfd, 0xb7, 0xe5, 0xae, 0x93, 0x7a, 0x5f, 0xbe, 0xae, 0xde, 0xc3, 0xf5, 0xf4, 0xbe, - 0xf2, 0x31, 0xf4, 0xbe, 0xf6, 0x41, 0x7a, 0x5f, 0xbf, 0x8e, 0xde, 0xff, 0x4d, 0x0e, 0x1a, 0x17, - 0x15, 0xa8, 0x2e, 0xbf, 0x4d, 0xc4, 0xd6, 0xb5, 0x4c, 0xa2, 0x75, 0xed, 0x3b, 0x50, 0x8d, 0xf5, - 0xac, 0x31, 0x4b, 0xa8, 0x78, 0x51, 0xb7, 0x9a, 0xa0, 0x32, 0xb9, 0x6b, 0x44, 0xc5, 0xf9, 0x6b, - 0x44, 0xc5, 0x85, 0xeb, 0xaa, 0x4c, 0xf1, 0x7a, 0x2a, 0x53, 0xfa, 0x18, 0x2a, 0x53, 0xfe, 0x20, - 0x95, 0x81, 0x09, 0x55, 0x46, 0x50, 0x94, 0x3f, 0x2a, 0xc0, 0xad, 0x4b, 0xca, 0x8f, 0x97, 0xeb, - 0xca, 0x53, 0x60, 0x9d, 0x58, 0x51, 0x73, 0x67, 0x26, 0x6a, 0xee, 0xa4, 0x18, 0xde, 0xdc, 0xa9, - 0x8a, 0x23, 0x93, 0xcc, 0x4b, 0x34, 0x85, 0x66, 0xd3, 0x9b, 0x42, 0x13, 0x2d, 0xa1, 0xbf, 0x24, - 0xd7, 0x59, 0xba, 0x96, 0xeb, 0x2c, 0x5c, 0xc3, 0x75, 0x16, 0x7f, 0x15, 0x32, 0x7c, 0x88, 0x1d, - 0x4c, 0x5f, 0xc7, 0x75, 0xfe, 0x42, 0x02, 0x74, 0xbe, 0x92, 0x7e, 0xb9, 0x21, 0xdc, 0x17, 0xfa, - 0x43, 0x33, 0xe7, 0xfa, 0x43, 0xa3, 0xee, 0xd0, 0xc7, 0x5c, 0x81, 0xb3, 0x89, 0x27, 0x88, 0xb6, - 0xe5, 0x62, 0xc3, 0x4f, 0xe9, 0xfa, 0xfb, 0x1c, 0x6a, 0xaf, 0xf1, 0x81, 0xe7, 0x18, 0x27, 0xd8, - 0x8f, 0x1a, 0xc0, 0xb7, 0xa6, 0xd4, 0x6a, 0x08, 0x26, 0xb1, 0xb4, 0xb8, 0xf9, 0xfc, 0x55, 0x37, - 0xdf, 0xfc, 0xd3, 0x0c, 0xc8, 0x49, 0x0e, 0x7e, 0x95, 0xc7, 0xff, 0x53, 0x06, 0x66, 0xce, 0xd9, - 0xcc, 0xb7, 0xd5, 0x73, 0x58, 0xb8, 0xec, 0x34, 0xb3, 0x13, 0x9d, 0x66, 0x6e, 0xe2, 0xd3, 0xcc, - 0x5f, 0xfd, 0x34, 0x8b, 0x57, 0x3d, 0xcd, 0x6f, 0x82, 0xa7, 0xe7, 0x6d, 0x9a, 0x9c, 0x7e, 0xc0, - 0xd3, 0xf3, 0x05, 0x69, 0x6e, 0xf3, 0xcf, 0xc2, 0x57, 0xed, 0x1e, 0x7f, 0xb5, 0xba, 0xf2, 0xd2, - 0xfc, 0xad, 0x9a, 0xb1, 0xaa, 0x09, 0x0d, 0x99, 0x35, 0xdd, 0x34, 0x99, 0xe0, 0x13, 0x6f, 0xd5, - 0x22, 0x69, 0x56, 0x7c, 0xab, 0x8e, 0xa8, 0x9b, 0xdf, 0x87, 0x7a, 0xfc, 0xb1, 0x05, 0x3d, 0x80, - 0x9c, 0x65, 0x1f, 0x3a, 0xe7, 0x9e, 0xea, 0x85, 0xa7, 0x37, 0x4a, 0xb0, 0xf8, 0x0a, 0xaa, 0x62, - 0x97, 0x3b, 0x9a, 0x07, 0xd4, 0xda, 0x6f, 0x77, 0xba, 0xda, 0xc6, 0x56, 0x6b, 0x77, 0x57, 0xd9, - 0xd6, 0xd6, 0xbb, 0xfd, 0x2d, 0x79, 0xea, 0x3c, 0x7c, 0x5b, 0xd9, 0xec, 0xcb, 0x12, 0xfa, 0x04, - 0x66, 0xe3, 0x70, 0xb5, 0xf3, 0x62, 0xab, 0x2f, 0x67, 0x16, 0xff, 0x55, 0x82, 0x1b, 0xa9, 0x17, - 0x10, 0x92, 0xa1, 0xba, 0xb5, 0xfa, 0xf4, 0x89, 0xf6, 0xe5, 0xea, 0xca, 0x9e, 0xb6, 0xb6, 0x22, - 0x4f, 0xc5, 0x21, 0x4f, 0x57, 0x64, 0x09, 0xcd, 0x40, 0x8d, 0x42, 0x7e, 0x7d, 0xe5, 0x19, 0x23, - 0xca, 0x24, 0x40, 0x4f, 0x57, 0xe4, 0x2c, 0xba, 0x09, 0x37, 0xf6, 0xba, 0x6a, 0x5f, 0x6d, 0x75, - 0xfa, 0x5a, 0x6c, 0xc9, 0xdc, 0x05, 0xa8, 0xa7, 0x2b, 0x72, 0x1e, 0x2d, 0xc0, 0x7c, 0x1c, 0x15, - 0x7e, 0xa4, 0x70, 0x11, 0xee, 0xe9, 0x8a, 0x5c, 0x5c, 0x5c, 0xe7, 0x9d, 0xf1, 0x91, 0xd9, 0xa1, - 0x39, 0x90, 0xdb, 0xca, 0x66, 0x6b, 0x7f, 0xbb, 0xaf, 0x6d, 0x76, 0xb6, 0x95, 0xfe, 0x6f, 0xef, - 0x29, 0xf2, 0x14, 0x2a, 0x42, 0x76, 0x67, 0xef, 0x89, 0x2c, 0x91, 0x1f, 0xdd, 0x17, 0x2f, 0xe4, - 0x0c, 0x83, 0xac, 0xc9, 0xd9, 0xc5, 0xad, 0x40, 0x52, 0x41, 0xe7, 0xac, 0xb8, 0xc4, 0x9e, 0xda, - 0xed, 0x77, 0x37, 0xba, 0xdb, 0xf2, 0x14, 0x2a, 0x41, 0x4e, 0xed, 0xef, 0xec, 0xb1, 0x35, 0x7a, - 0x6a, 0x5f, 0xce, 0xa0, 0x1a, 0x94, 0x5f, 0x29, 0xeb, 0xbd, 0xee, 0xc6, 0x4b, 0xa5, 0x2f, 0x67, - 0x17, 0x77, 0xe1, 0x46, 0x6a, 0x2b, 0x2e, 0xba, 0x07, 0x77, 0x82, 0x05, 0x7b, 0xca, 0x8b, 0x1d, - 0x65, 0xb7, 0xaf, 0xb4, 0x29, 0x77, 0xe2, 0xfa, 0xe4, 0xc4, 0xb7, 0x7b, 0x11, 0x44, 0x5a, 0x7c, - 0x9c, 0x68, 0x05, 0xe6, 0x6d, 0x92, 0x65, 0xc8, 0x77, 0x76, 0xdb, 0xca, 0x37, 0xf2, 0x14, 0x61, - 0xa0, 0xdf, 0xd9, 0x51, 0x7a, 0xfd, 0x16, 0x61, 0x6c, 0xf1, 0x10, 0xa6, 0x13, 0x3d, 0x96, 0x44, - 0x49, 0x3a, 0x3b, 0xad, 0x17, 0x8a, 0xd6, 0xdb, 0xdf, 0xdc, 0xec, 0x7c, 0xa3, 0x05, 0x33, 0x17, - 0x60, 0x3e, 0x06, 0x17, 0x96, 0x41, 0x77, 0xe0, 0x56, 0x0c, 0xb7, 0xdb, 0xdd, 0x55, 0xb4, 0xee, - 0xd7, 0x8a, 0xfa, 0x4a, 0xed, 0xf4, 0x15, 0x39, 0xb3, 0xf8, 0x63, 0x90, 0x93, 0x0d, 0x0b, 0x64, - 0x41, 0xe5, 0x85, 0xaa, 0xf4, 0x7a, 0x5a, 0xaf, 0xbb, 0xaf, 0x6e, 0x28, 0x1a, 0x39, 0x79, 0xed, - 0x95, 0xb2, 0xce, 0x3e, 0x96, 0x82, 0xeb, 0xb5, 0x5f, 0xca, 0xd2, 0xe2, 0x5f, 0x4a, 0x50, 0x15, - 0xdb, 0x18, 0xd0, 0x2c, 0x4c, 0x07, 0xc4, 0xfd, 0x96, 0xda, 0xef, 0xec, 0xbe, 0x90, 0xa7, 0x88, - 0xa6, 0x71, 0x20, 0x7f, 0x1e, 0x93, 0x04, 0x90, 0xb2, 0xdb, 0x26, 0x54, 0x19, 0x61, 0xea, 0x46, - 0x77, 0x67, 0x6f, 0x5b, 0xe9, 0x2b, 0x72, 0x56, 0xa0, 0xe3, 0xef, 0x67, 0x39, 0x84, 0xa0, 0x1e, - 0xac, 0xb6, 0xde, 0x55, 0xfb, 0x4a, 0x5b, 0xce, 0xa3, 0x06, 0xcc, 0x71, 0xd8, 0x76, 0x67, 0xa7, - 0xd3, 0xd7, 0x54, 0xa5, 0xb5, 0xb1, 0xa5, 0xb4, 0xe5, 0xc2, 0xe2, 0x3e, 0xff, 0x1f, 0x1c, 0x5e, - 0x01, 0x43, 0x50, 0x0f, 0x84, 0xb9, 0xd3, 0xf9, 0x86, 0xb1, 0x37, 0x0f, 0xa8, 0xbd, 0xdf, 0xda, - 0x0e, 0x2d, 0xae, 0xf5, 0x42, 0xd9, 0x25, 0xa6, 0xb8, 0x00, 0xf3, 0x71, 0xf8, 0x76, 0x5f, 0x51, - 0x77, 0x5b, 0xe4, 0x10, 0x57, 0xff, 0xaa, 0x00, 0x05, 0x5e, 0x36, 0xff, 0x11, 0x54, 0x84, 0x0e, - 0x0a, 0x74, 0x59, 0x5f, 0xc5, 0x42, 0x5a, 0x8f, 0x0f, 0x6a, 0x41, 0x55, 0xec, 0xed, 0x41, 0x51, - 0xe0, 0x95, 0xd2, 0xf2, 0x93, 0xbe, 0x84, 0x02, 0x10, 0x35, 0x18, 0xa1, 0x28, 0x72, 0x3c, 0xd7, - 0xea, 0xb4, 0x70, 0x2b, 0x15, 0xc7, 0x3b, 0x92, 0x7e, 0x08, 0x10, 0xf5, 0xe8, 0x20, 0xf1, 0x41, - 0x35, 0xd1, 0xb8, 0x93, 0xce, 0x45, 0x1f, 0x1a, 0x74, 0xcf, 0x29, 0xe5, 0x50, 0x34, 0x49, 0xdf, - 0x47, 0xfa, 0xaa, 0xbf, 0x49, 0x4c, 0x5c, 0x77, 0xfd, 0xb0, 0x18, 0x84, 0x2e, 0x6e, 0x00, 0x49, - 0x5f, 0x61, 0x0f, 0xe6, 0xe9, 0x0a, 0xe7, 0x5f, 0x82, 0xde, 0xdf, 0x13, 0x92, 0xbe, 0xe2, 0xd7, - 0x70, 0x93, 0xae, 0x98, 0x96, 0x7f, 0xa1, 0x89, 0xba, 0x43, 0xd2, 0xd7, 0x6d, 0x83, 0x1c, 0xad, - 0x7b, 0x4e, 0xa1, 0xce, 0xc7, 0xb6, 0xef, 0x51, 0x28, 0x76, 0x63, 0x9f, 0x53, 0xa8, 0xd8, 0x45, - 0xfe, 0x9e, 0x25, 0x98, 0x77, 0x3d, 0xb7, 0x44, 0xec, 0xc2, 0x4e, 0x5d, 0x62, 0x7d, 0xf3, 0x77, - 0xee, 0x1d, 0x59, 0xfe, 0xf1, 0xf8, 0x60, 0xd9, 0x70, 0x86, 0x8f, 0x39, 0xc1, 0xe3, 0xe0, 0xff, - 0x1a, 0x02, 0xc0, 0xdf, 0x66, 0x6a, 0xdb, 0xd6, 0x29, 0x7e, 0xc9, 0xfa, 0x26, 0x7d, 0xe7, 0xbf, - 0x32, 0x75, 0x3e, 0x7e, 0xfe, 0x9c, 0x02, 0x0e, 0x0a, 0x74, 0xca, 0xda, 0xff, 0x05, 0x00, 0x00, - 0xff, 0xff, 0x93, 0x5f, 0xa9, 0x80, 0xe2, 0x3b, 0x00, 0x00, + 0xa7, 0xeb, 0x16, 0xe8, 0xba, 0x55, 0x0a, 0x5c, 0x67, 0x30, 0xf4, 0x00, 0xa6, 0x19, 0xd1, 0xa1, + 0x4b, 0x2e, 0x46, 0xdb, 0x38, 0x6b, 0x14, 0x29, 0x59, 0x9d, 0x82, 0x37, 0x03, 0x28, 0xe1, 0x81, + 0xf9, 0x0f, 0xc6, 0x43, 0x29, 0xc1, 0x03, 0x35, 0x37, 0xce, 0xc3, 0x69, 0xf8, 0x9b, 0xf0, 0xc0, + 0x66, 0x05, 0x3c, 0x94, 0x19, 0x0f, 0x14, 0x18, 0xf0, 0xb0, 0x04, 0xe8, 0x04, 0x9f, 0x69, 0x74, + 0xbf, 0x9a, 0x65, 0xfb, 0xd8, 0x3d, 0xd5, 0x07, 0x0d, 0xb8, 0x2b, 0x3d, 0x94, 0x54, 0xf9, 0x04, + 0x9f, 0x6d, 0x12, 0x44, 0x87, 0xc3, 0xd1, 0x83, 0x60, 0x5b, 0x3f, 0x19, 0xeb, 0x03, 0x22, 0xd1, + 0x0a, 0x59, 0x72, 0x3d, 0xd3, 0x90, 0xf8, 0xd6, 0x7e, 0x8b, 0xc1, 0x09, 0x21, 0xfb, 0x76, 0x40, + 0x58, 0x8d, 0x08, 0x29, 0x82, 0x13, 0x36, 0xff, 0x3e, 0x03, 0x05, 0x76, 0xaf, 0xa1, 0x47, 0x90, + 0x3b, 0xb4, 0x06, 0x2c, 0x20, 0x10, 0x4d, 0x7a, 0xd3, 0x1a, 0x60, 0x46, 0xb2, 0x35, 0xa5, 0x52, + 0x12, 0xf4, 0x18, 0x0a, 0x9e, 0xef, 0x62, 0x7d, 0xc8, 0x7d, 0xe1, 0x0d, 0xe1, 0xe2, 0x23, 0xe0, + 0x90, 0x9c, 0x93, 0xa1, 0xe7, 0x50, 0xf2, 0xf0, 0xd1, 0x10, 0xdb, 0xbe, 0xc7, 0x1d, 0xe0, 0xed, + 0x68, 0x0a, 0x43, 0x60, 0x33, 0xf6, 0xa1, 0x90, 0x1e, 0x2d, 0x43, 0xc1, 0x1a, 0xea, 0x47, 0xd8, + 0x3b, 0x17, 0x32, 0x74, 0x08, 0x38, 0xfa, 0x16, 0xa3, 0x22, 0xfb, 0x18, 0x1a, 0xfa, 0x88, 0xaa, + 0x8a, 0xb8, 0x8f, 0x1d, 0x43, 0x1f, 0x45, 0xfb, 0x20, 0x24, 0xe2, 0x0d, 0x5e, 0x98, 0xe8, 0x06, + 0x27, 0xb7, 0xb1, 0x41, 0x41, 0xcd, 0x3f, 0x90, 0x00, 0x22, 0x8e, 0xd1, 0xf7, 0xa0, 0x4c, 0x8e, + 0x46, 0xf3, 0xcf, 0x46, 0xec, 0x08, 0xeb, 0xc9, 0x80, 0x83, 0x6d, 0xb0, 0x7f, 0x36, 0xc2, 0x6a, + 0xe9, 0x90, 0xff, 0x22, 0x4e, 0x9a, 0xfc, 0x1e, 0xe9, 0xfe, 0x31, 0x33, 0x4f, 0x35, 0x1c, 0xa3, + 0x47, 0x20, 0x9b, 0x96, 0xa7, 0x1f, 0x0c, 0xb0, 0x36, 0xd4, 0x6d, 0xeb, 0x10, 0x7b, 0x3e, 0xbf, + 0x19, 0xa7, 0x39, 0x7c, 0x87, 0x83, 0x9b, 0xaf, 0xa0, 0x2a, 0x9e, 0x3c, 0x5a, 0x83, 0x12, 0x8d, + 0x00, 0x0d, 0x67, 0xc0, 0x99, 0xf9, 0x24, 0x21, 0xa2, 0x3d, 0x8e, 0x56, 0x43, 0x42, 0x84, 0x20, + 0x37, 0x76, 0x07, 0x5e, 0x23, 0x73, 0x37, 0xfb, 0xb0, 0xac, 0xd2, 0xdf, 0xcd, 0xbf, 0xce, 0xc1, + 0x6c, 0x8a, 0x80, 0x88, 0x40, 0x13, 0x1f, 0xf8, 0x2c, 0x5d, 0xa0, 0x29, 0xdf, 0x79, 0x00, 0xd3, + 0x64, 0x8f, 0x24, 0xfa, 0xd4, 0xc8, 0x55, 0x63, 0xbd, 0xe1, 0x5b, 0xaf, 0x07, 0xe0, 0x3d, 0x0a, + 0x25, 0x16, 0x34, 0x1a, 0xe8, 0x67, 0x03, 0xcb, 0xf3, 0x59, 0xac, 0x4a, 0x5d, 0x93, 0x5a, 0x0d, + 0x80, 0x34, 0x5e, 0x5d, 0x02, 0x44, 0x3e, 0xac, 0xc5, 0x29, 0x2b, 0x94, 0x52, 0x26, 0x98, 0x3d, + 0x91, 0xfa, 0x11, 0xc8, 0x5c, 0xb1, 0x34, 0x73, 0xec, 0xea, 0xc4, 0x8b, 0x51, 0xb5, 0xaa, 0xa9, + 0xd3, 0x1c, 0xde, 0xe6, 0x60, 0xa4, 0x08, 0x6c, 0x7a, 0xe3, 0x43, 0xc2, 0x26, 0xd0, 0x9d, 0x5e, + 0xa0, 0xba, 0x3d, 0x4a, 0x13, 0x6d, 0x82, 0x8d, 0x53, 0xa5, 0x58, 0x4a, 0x95, 0x22, 0xba, 0x07, + 0x19, 0x6f, 0x8d, 0xeb, 0xed, 0x4c, 0xf4, 0x91, 0xb5, 0xfd, 0xd1, 0xc0, 0xd1, 0xc9, 0x0d, 0x95, + 0xf1, 0xd6, 0x48, 0xa0, 0x7d, 0x64, 0x8c, 0xb8, 0xbe, 0x46, 0x81, 0xf6, 0x8b, 0x8d, 0xbd, 0x90, + 0x8c, 0x10, 0xa0, 0x15, 0xc8, 0xeb, 0x3f, 0x1d, 0xbb, 0x98, 0xfa, 0x34, 0x31, 0xfa, 0x6d, 0x11, + 0xe8, 0xfa, 0xc0, 0x39, 0x08, 0xe9, 0x19, 0x21, 0xb1, 0x6a, 0x7d, 0x60, 0x75, 0x7b, 0x3d, 0xea, + 0xa9, 0x44, 0xab, 0x6e, 0x51, 0x70, 0x48, 0xcf, 0xc9, 0x88, 0x31, 0xb0, 0x58, 0xb8, 0xf9, 0xdf, + 0x59, 0xa8, 0x08, 0xd6, 0x48, 0x36, 0x6d, 0xe8, 0x23, 0x7f, 0xec, 0x0a, 0x4e, 0x4d, 0x62, 0xc7, + 0xcc, 0xe1, 0xa1, 0x4f, 0x0b, 0xaf, 0x90, 0x4c, 0xfa, 0x15, 0x92, 0x8d, 0x5d, 0x21, 0x29, 0xba, + 0x93, 0x4b, 0xd5, 0x9d, 0xd6, 0x79, 0xe9, 0xe5, 0x13, 0x56, 0x49, 0x19, 0xbe, 0x44, 0x72, 0x4f, + 0xa0, 0x42, 0x5d, 0x0a, 0x77, 0xfb, 0x85, 0x84, 0xdb, 0xa7, 0xd3, 0xb9, 0xdb, 0xb7, 0xc2, 0xdf, + 0xa9, 0xf2, 0x2e, 0x5e, 0x26, 0xef, 0xd2, 0x44, 0xf2, 0x2e, 0x4f, 0x2c, 0x6f, 0xb8, 0xba, 0xbc, + 0x2b, 0x57, 0x95, 0x77, 0x0f, 0x20, 0x72, 0xa7, 0x31, 0x27, 0x26, 0x4d, 0xe0, 0xc4, 0x32, 0xe9, + 0x4e, 0xec, 0x9f, 0x24, 0xa8, 0xc5, 0xdc, 0x2e, 0x3f, 0x20, 0x69, 0xa2, 0x03, 0xca, 0x4c, 0x7c, + 0x40, 0xd9, 0x49, 0x0f, 0x68, 0x05, 0x8a, 0xfa, 0xc0, 0xd2, 0x1c, 0x2f, 0xb8, 0x7a, 0x2e, 0x3f, + 0x21, 0xcf, 0x23, 0x29, 0xda, 0xc8, 0x75, 0xc8, 0x0d, 0xeb, 0x36, 0xff, 0x33, 0x07, 0xa5, 0x80, + 0x55, 0x74, 0x0f, 0x40, 0x37, 0x0c, 0xec, 0x79, 0xda, 0x09, 0xe6, 0xe1, 0xf8, 0x7a, 0xee, 0x67, + 0xef, 0x96, 0x24, 0xb5, 0xcc, 0xe0, 0x2f, 0xf1, 0x19, 0xba, 0x0d, 0x05, 0x0f, 0x1b, 0x2e, 0x66, + 0x27, 0x14, 0x10, 0x70, 0x18, 0x7a, 0x04, 0x35, 0x0f, 0x7b, 0x9e, 0xe5, 0xd8, 0x9a, 0xef, 0x9c, + 0x60, 0x9b, 0xf9, 0x38, 0x4e, 0x54, 0xe5, 0xa8, 0x3e, 0xc1, 0xa0, 0x25, 0x98, 0xd6, 0x3d, 0x6f, + 0x3c, 0xc4, 0x9a, 0xeb, 0x0c, 0xb0, 0xa6, 0xbb, 0x36, 0x0d, 0x00, 0x02, 0xe2, 0x1a, 0x43, 0xaa, + 0xce, 0x00, 0xb7, 0x5c, 0x1b, 0xf5, 0xe0, 0x13, 0x91, 0x1a, 0xbf, 0xf1, 0xb1, 0x6b, 0xeb, 0x03, + 0x12, 0x67, 0xd6, 0xe8, 0xac, 0xdb, 0x64, 0xd6, 0xdb, 0x77, 0x4b, 0x73, 0xd1, 0x3c, 0x85, 0x13, + 0x75, 0xda, 0x6a, 0x1a, 0xd4, 0x24, 0x06, 0xec, 0xe2, 0x23, 0xe2, 0x5e, 0x99, 0xd3, 0xe6, 0x23, + 0xa2, 0x2b, 0xd8, 0x36, 0x47, 0x8e, 0x65, 0xfb, 0xdc, 0x72, 0xc3, 0x31, 0x99, 0x73, 0x30, 0x36, + 0x4e, 0x78, 0xb6, 0x5f, 0x56, 0xf9, 0x08, 0x3d, 0x04, 0xf9, 0xd0, 0x71, 0x0d, 0xac, 0x11, 0x8d, + 0xd2, 0x3c, 0xff, 0x6c, 0xc0, 0xee, 0xeb, 0x92, 0x5a, 0xa7, 0xf0, 0x3d, 0xdd, 0x3f, 0xee, 0x11, + 0x28, 0xfa, 0x01, 0x94, 0x86, 0xd8, 0xd7, 0x69, 0xf6, 0xc4, 0xd2, 0xf7, 0x3b, 0xe7, 0xd4, 0x66, + 0x79, 0x87, 0x53, 0x28, 0xb6, 0xef, 0x9e, 0xa9, 0xe1, 0x04, 0xd4, 0x80, 0xa2, 0xaf, 0x1f, 0x1d, + 0x59, 0xf6, 0x11, 0xb5, 0xc9, 0xb2, 0x1a, 0x0c, 0xd1, 0x63, 0x98, 0x35, 0x1c, 0xdb, 0xa7, 0xb7, + 0x86, 0xe5, 0x8d, 0x1c, 0xcf, 0xa2, 0x17, 0x47, 0x99, 0x52, 0x21, 0x8e, 0x6a, 0x47, 0x18, 0x92, + 0xed, 0x8d, 0x5c, 0xe7, 0xcd, 0x19, 0x37, 0xc6, 0x28, 0x64, 0xd9, 0x23, 0xd0, 0x20, 0xdb, 0xa3, + 0x24, 0x0b, 0x3f, 0x80, 0x5a, 0x8c, 0x23, 0x92, 0x3c, 0x87, 0x4a, 0xa2, 0x92, 0x9f, 0xc4, 0x47, + 0x9e, 0xea, 0x83, 0x31, 0xe6, 0xf7, 0x24, 0x1b, 0x3c, 0xcf, 0x3c, 0x93, 0x9a, 0xaf, 0xa1, 0x1c, + 0x2a, 0x3a, 0xba, 0x0f, 0x15, 0xc3, 0xc5, 0x34, 0xa0, 0xd7, 0x07, 0x5e, 0x4c, 0xcb, 0x44, 0x84, + 0x70, 0xce, 0x99, 0xd8, 0x39, 0x87, 0x5c, 0x67, 0xdf, 0xcb, 0x75, 0xf3, 0x67, 0x12, 0x4c, 0x27, + 0x0c, 0x07, 0x3d, 0x80, 0xaa, 0x6e, 0x18, 0xce, 0xd8, 0xf6, 0x85, 0xd2, 0x52, 0xc0, 0x00, 0xc7, + 0xd0, 0x5b, 0xf8, 0x73, 0x08, 0x86, 0xd4, 0x1c, 0x44, 0x6d, 0x07, 0x8e, 0x20, 0xf6, 0xf0, 0x39, + 0xd4, 0xc9, 0xd9, 0xea, 0x96, 0x8d, 0x5d, 0x31, 0x00, 0xa8, 0x85, 0x50, 0xb2, 0x5a, 0xf3, 0x2f, + 0x24, 0xa8, 0x8a, 0xf6, 0xf8, 0x31, 0x8c, 0xed, 0x23, 0xaa, 0x6f, 0xf3, 0x77, 0xa1, 0x22, 0x1c, + 0x60, 0x4a, 0x6d, 0x64, 0x01, 0x4a, 0x63, 0x8f, 0x18, 0xce, 0x30, 0x90, 0x70, 0x38, 0x46, 0x77, + 0xa1, 0x34, 0xd2, 0x3d, 0xef, 0xb5, 0xe3, 0xb2, 0x3c, 0x36, 0x60, 0x34, 0x84, 0x36, 0x3d, 0x98, + 0xd9, 0xb6, 0xbc, 0xab, 0x94, 0xf8, 0x1e, 0x41, 0x99, 0xd5, 0x16, 0x89, 0x89, 0xb3, 0xdd, 0x57, + 0xdf, 0xbe, 0x5b, 0x2a, 0x31, 0x60, 0xa7, 0xad, 0x06, 0xbf, 0xa8, 0x19, 0xeb, 0x86, 0x6f, 0x9d, + 0x62, 0x1e, 0x79, 0xf2, 0x51, 0xf3, 0x47, 0x80, 0xc4, 0x8f, 0x7a, 0x23, 0xc7, 0xf6, 0xc8, 0xc2, + 0x79, 0xcb, 0xc7, 0xc3, 0xf3, 0x65, 0x01, 0x46, 0x47, 0x92, 0x6d, 0x95, 0x51, 0x34, 0xff, 0x41, + 0x82, 0xd9, 0xfd, 0x91, 0xa9, 0xfb, 0x38, 0xce, 0x78, 0x8c, 0x37, 0xe9, 0x52, 0xde, 0xf8, 0x41, + 0x66, 0xa2, 0x83, 0x8c, 0x4a, 0x60, 0xd9, 0x58, 0x09, 0xec, 0x3e, 0x4c, 0xeb, 0xa6, 0xa9, 0xb1, + 0x64, 0x44, 0xa3, 0x41, 0x6e, 0x8e, 0x06, 0xb9, 0x35, 0xdd, 0x34, 0x59, 0x3c, 0xbc, 0xef, 0x0e, + 0x3c, 0x12, 0x4b, 0xba, 0x78, 0xe8, 0x9c, 0xe2, 0x18, 0x69, 0x9e, 0x92, 0xca, 0x0c, 0x13, 0x51, + 0x37, 0xbf, 0x82, 0x99, 0x9e, 0xef, 0x8c, 0x3e, 0x94, 0xff, 0xe6, 0x9f, 0x57, 0x00, 0xa2, 0x83, + 0xb9, 0xca, 0xce, 0xef, 0x41, 0x91, 0x4a, 0x37, 0x14, 0x1f, 0xbc, 0x7d, 0xb7, 0x54, 0x20, 0xa0, + 0x4e, 0x5b, 0x65, 0x7f, 0xcd, 0xb8, 0x0a, 0xd4, 0x12, 0x2a, 0xf0, 0x1c, 0x2a, 0xac, 0xaa, 0xc8, + 0x12, 0x96, 0x05, 0x1a, 0xdb, 0xdc, 0x4c, 0xc8, 0x8b, 0x95, 0xcf, 0x68, 0xc6, 0x02, 0x5e, 0xf8, + 0x1b, 0x7d, 0x97, 0x64, 0x7f, 0xba, 0x3f, 0xf6, 0x78, 0x61, 0xe5, 0x46, 0x72, 0x1a, 0x45, 0xaa, + 0x9c, 0x08, 0x7d, 0x0a, 0x40, 0xab, 0x76, 0xd8, 0xd4, 0x74, 0x9f, 0x3a, 0xc4, 0xac, 0x5a, 0xe6, + 0x90, 0x96, 0x8f, 0x6e, 0x52, 0x8b, 0x62, 0xc8, 0x0a, 0x45, 0x16, 0xe9, 0xb8, 0x45, 0x2b, 0x97, + 0x63, 0xaa, 0x22, 0x14, 0x89, 0xd8, 0x4c, 0x0e, 0x69, 0x91, 0x94, 0xab, 0xc0, 0x4e, 0xa4, 0xf1, + 0x29, 0xf5, 0x57, 0xb7, 0x84, 0x14, 0x27, 0x59, 0xf3, 0x26, 0x77, 0x34, 0x23, 0x46, 0x4f, 0x89, + 0x69, 0x93, 0x6c, 0xa1, 0xf1, 0x59, 0x22, 0x13, 0x55, 0xde, 0x8c, 0x1c, 0xd7, 0x57, 0x29, 0x52, + 0x98, 0xc7, 0xa8, 0xd1, 0x36, 0xd4, 0xe9, 0x79, 0x1a, 0xce, 0x90, 0xfa, 0x79, 0xcc, 0x83, 0x82, + 0x7b, 0xe1, 0x7c, 0xd5, 0x71, 0x86, 0x1b, 0x01, 0x36, 0xf9, 0xf9, 0x9a, 0x2b, 0x62, 0xd1, 0x77, + 0x59, 0xbd, 0xbc, 0x9e, 0xa8, 0x25, 0xbe, 0xc2, 0x07, 0xc9, 0x89, 0xb4, 0x6c, 0xae, 0x40, 0x45, + 0x28, 0xda, 0x34, 0x66, 0xe9, 0xb4, 0xef, 0xa4, 0x55, 0xb4, 0x92, 0xd3, 0xc5, 0x79, 0xa8, 0x0b, + 0xd3, 0xac, 0x86, 0x14, 0x6d, 0x82, 0xa5, 0x1b, 0xbf, 0x16, 0xd5, 0xf8, 0x09, 0xfe, 0xc2, 0x5d, + 0xd4, 0xfd, 0x18, 0x1a, 0xad, 0x41, 0x9e, 0x42, 0x78, 0x3e, 0x72, 0x2b, 0xbe, 0x4c, 0x72, 0x36, + 0xa3, 0x45, 0xcf, 0xa1, 0xce, 0xed, 0xcb, 0xc5, 0xde, 0x78, 0xe0, 0x7b, 0x8d, 0xe9, 0x84, 0xbf, + 0x60, 0x56, 0x46, 0xfd, 0x45, 0x8d, 0x91, 0xaa, 0x8c, 0x12, 0x3d, 0x81, 0x2a, 0xcd, 0xb3, 0x83, + 0x99, 0x32, 0x9d, 0x39, 0x13, 0xab, 0x56, 0xd0, 0x79, 0x15, 0x42, 0x16, 0xcc, 0xfa, 0x0a, 0x82, + 0xf4, 0x2e, 0x9c, 0x38, 0x93, 0xa8, 0xc3, 0xf1, 0x5c, 0x8e, 0x39, 0xa9, 0x3a, 0xa7, 0x0e, 0xe6, + 0x3f, 0x83, 0x1a, 0x4b, 0x05, 0x82, 0xd9, 0x73, 0x09, 0x86, 0x69, 0x32, 0xc0, 0xe6, 0x56, 0x29, + 0xa5, 0xc0, 0xef, 0xd0, 0xd0, 0x47, 0xe1, 0xc4, 0xdb, 0x09, 0x7e, 0x49, 0x18, 0xcd, 0xf8, 0x25, + 0x64, 0xc1, 0xac, 0x39, 0xc8, 0x63, 0xd7, 0x75, 0x5c, 0x1e, 0x62, 0xb0, 0x01, 0xb1, 0x07, 0xfa, + 0x83, 0x26, 0x24, 0x8d, 0x79, 0x56, 0x2a, 0xa3, 0x10, 0x92, 0x7a, 0x90, 0xf8, 0xc5, 0xc4, 0xbe, + 0x6e, 0x0d, 0xbc, 0xc6, 0x0d, 0x16, 0xbf, 0xf0, 0x21, 0xfa, 0x02, 0x66, 0x82, 0xe0, 0x5b, 0x1b, + 0x38, 0x06, 0x4b, 0x7b, 0x3f, 0x61, 0x29, 0x72, 0x80, 0xd8, 0xe6, 0x70, 0xb4, 0x0c, 0xb3, 0x07, + 0xba, 0x71, 0x32, 0x1e, 0x69, 0xbc, 0xe8, 0xa1, 0x8d, 0x3d, 0x6c, 0x36, 0x6e, 0xb2, 0xda, 0x30, + 0x43, 0xf1, 0x30, 0x7d, 0xdf, 0xc3, 0x26, 0xba, 0x03, 0x15, 0x17, 0xfb, 0xee, 0x99, 0x46, 0xef, + 0xed, 0xc6, 0x2d, 0xca, 0x16, 0x50, 0xd0, 0x06, 0x81, 0x10, 0x3b, 0xe5, 0xd5, 0xa2, 0x62, 0xe2, + 0x3d, 0x29, 0x12, 0x33, 0xb9, 0x4c, 0xd6, 0x33, 0x0d, 0x69, 0x4b, 0x0a, 0x6b, 0x46, 0x5f, 0xf0, + 0x7a, 0x54, 0x32, 0x3f, 0x0a, 0x24, 0xcc, 0xc9, 0x59, 0x45, 0xea, 0x4b, 0xa1, 0xc0, 0x54, 0x4d, + 0xd6, 0xa4, 0x04, 0xc9, 0xf2, 0x49, 0x21, 0xf1, 0x7a, 0x19, 0x8a, 0x2e, 0xd3, 0x4f, 0x92, 0xde, + 0x30, 0x29, 0x35, 0x7f, 0x9e, 0x01, 0x88, 0x78, 0x4b, 0x7f, 0xcd, 0x10, 0x7c, 0x5a, 0xe6, 0x32, + 0x9f, 0x96, 0x8d, 0xfb, 0xb4, 0x05, 0x28, 0xc5, 0x0a, 0x0f, 0x59, 0x35, 0x1c, 0xa3, 0xd5, 0xd0, + 0xb1, 0xb2, 0x54, 0x75, 0x21, 0xe5, 0xa0, 0x96, 0x13, 0xde, 0x35, 0xd4, 0x94, 0x82, 0xa8, 0x29, + 0x4d, 0xa8, 0x0d, 0x74, 0x8f, 0x28, 0x3b, 0x11, 0x8c, 0xce, 0x32, 0xd0, 0xac, 0x5a, 0x21, 0x40, + 0x95, 0xc0, 0x5a, 0x3e, 0x51, 0x17, 0x82, 0xb6, 0xb0, 0x47, 0x8f, 0xb8, 0xa6, 0x06, 0xc3, 0xe6, + 0x32, 0x14, 0xd8, 0x57, 0x10, 0x40, 0xa1, 0xb5, 0xd1, 0xef, 0x7c, 0xad, 0xc8, 0x53, 0xa8, 0x0a, + 0xa5, 0xcd, 0xce, 0x6e, 0xa7, 0xb7, 0xa5, 0xb4, 0x65, 0x89, 0x60, 0x36, 0x5b, 0x9d, 0x6d, 0xa5, + 0x2d, 0x67, 0x9a, 0x3f, 0x97, 0xa0, 0x14, 0x48, 0x25, 0x48, 0x06, 0xc5, 0xc0, 0x23, 0x18, 0x7f, + 0xa4, 0x63, 0x2b, 0x24, 0x8e, 0x0d, 0x41, 0xce, 0xb3, 0x7e, 0x8a, 0xf9, 0x71, 0xd2, 0xdf, 0x84, + 0x3e, 0x54, 0x74, 0x16, 0x8d, 0x85, 0xe3, 0xe6, 0xbf, 0x65, 0xa0, 0x2a, 0xea, 0xc4, 0xf9, 0x3a, + 0x93, 0x34, 0x71, 0x9d, 0xa9, 0x74, 0x41, 0x9d, 0x49, 0xe4, 0x37, 0x73, 0x01, 0xbf, 0x59, 0x81, + 0xdf, 0x2f, 0x60, 0x26, 0x5c, 0x38, 0x64, 0x9c, 0x05, 0x98, 0x72, 0x80, 0x08, 0x2d, 0xf4, 0x09, + 0xcc, 0xc7, 0x59, 0x09, 0x67, 0x30, 0x77, 0x31, 0x27, 0xb2, 0x13, 0xce, 0xba, 0x47, 0xf2, 0x47, + 0xe6, 0x03, 0x99, 0xa5, 0xe6, 0xe9, 0xf7, 0xab, 0x1c, 0xc8, 0x6c, 0x35, 0x2e, 0xa1, 0xc2, 0x65, + 0x12, 0x2a, 0xc6, 0x24, 0xd4, 0xfc, 0x63, 0x09, 0x20, 0xf2, 0x82, 0x93, 0x17, 0x6a, 0xee, 0x44, + 0x55, 0x16, 0xc2, 0x94, 0x44, 0x57, 0x0d, 0x0a, 0x2a, 0xe7, 0x59, 0xba, 0x82, 0xd2, 0x34, 0xff, + 0x59, 0x82, 0x52, 0xe0, 0x5f, 0xbf, 0x05, 0xbd, 0xcc, 0x5d, 0x20, 0xe7, 0xfc, 0x05, 0x7a, 0x59, + 0x88, 0xeb, 0x25, 0x39, 0x89, 0xe0, 0x72, 0x26, 0x27, 0xc1, 0xce, 0x17, 0xf8, 0x85, 0x3b, 0xb6, + 0xfd, 0xe6, 0xdb, 0x0c, 0xdc, 0x68, 0x8d, 0x7d, 0xe7, 0xdc, 0x6d, 0x2f, 0xbc, 0x93, 0x4b, 0x13, + 0xbd, 0x93, 0x4f, 0xa5, 0xbe, 0x93, 0x67, 0xde, 0xf3, 0x4e, 0x3e, 0x25, 0xbc, 0x93, 0xff, 0x90, + 0xdf, 0xc3, 0xc1, 0x63, 0x79, 0x96, 0xde, 0x6b, 0x0b, 0x69, 0x25, 0x6f, 0xfe, 0x6e, 0x4e, 0x2f, + 0xe4, 0x2e, 0x7f, 0x3b, 0x57, 0xa2, 0x0b, 0x39, 0x58, 0x21, 0x47, 0x57, 0xb8, 0xf4, 0x5d, 0x20, + 0xbc, 0x97, 0xf9, 0x32, 0xc4, 0x7b, 0xf3, 0x8e, 0x87, 0xe6, 0x9f, 0x64, 0x60, 0x9a, 0x1c, 0x8e, + 0x10, 0x78, 0x5c, 0xb9, 0x30, 0x95, 0xbf, 0xac, 0x4e, 0x97, 0x99, 0xa8, 0x0c, 0x95, 0x9d, 0xb8, + 0x0c, 0x95, 0xbb, 0x7a, 0x9d, 0xae, 0x70, 0xd5, 0x3a, 0xdd, 0xdf, 0xe5, 0x60, 0x36, 0x25, 0xaa, + 0x25, 0xb9, 0x06, 0x8b, 0x6a, 0x13, 0xb9, 0x06, 0x03, 0x92, 0x5c, 0x83, 0xff, 0x32, 0x49, 0xee, + 0xc4, 0x1e, 0xdd, 0x9d, 0xc3, 0x43, 0x0f, 0xfb, 0xda, 0xd0, 0xe3, 0x06, 0x52, 0xa3, 0xe0, 0x2e, + 0x85, 0xee, 0x78, 0xe4, 0xca, 0xc1, 0xb6, 0x29, 0x50, 0x31, 0x4b, 0xa9, 0x60, 0xdb, 0x0c, 0x69, + 0xc4, 0xde, 0x92, 0xdc, 0x95, 0x7b, 0x4b, 0xf2, 0x13, 0xf7, 0x96, 0x14, 0xae, 0xd6, 0x5b, 0x52, + 0xbc, 0x46, 0x6f, 0x49, 0xe9, 0xc3, 0x7a, 0x4b, 0xca, 0x93, 0xf7, 0x96, 0xc0, 0xd5, 0x7b, 0x4b, + 0x2a, 0xd7, 0xea, 0x2d, 0xf9, 0xf7, 0x02, 0x2c, 0x5c, 0x9c, 0xca, 0x5c, 0x5e, 0x5a, 0x88, 0x32, + 0xf0, 0xcc, 0x25, 0x4d, 0x28, 0xd9, 0x64, 0xfb, 0xc7, 0x97, 0xc0, 0xde, 0x2f, 0xb5, 0xa1, 0xf5, + 0xc6, 0xb2, 0x8f, 0x1a, 0xd3, 0x54, 0x22, 0x89, 0x26, 0x89, 0x1d, 0x8a, 0x53, 0xd9, 0x7b, 0x30, + 0x1b, 0x24, 0xfa, 0x46, 0x72, 0x13, 0x74, 0xaf, 0xe4, 0x53, 0xba, 0x57, 0xd0, 0x13, 0x1e, 0x6b, + 0x32, 0xc5, 0xb9, 0xc4, 0x8b, 0xd1, 0xf8, 0x31, 0x78, 0x06, 0x5d, 0x4b, 0x04, 0xb6, 0xe9, 0xcf, + 0xa0, 0x7c, 0x4a, 0x10, 0xd6, 0x7e, 0x25, 0x44, 0xaa, 0xf0, 0xfe, 0xa7, 0x50, 0x3e, 0x3b, 0x7a, + 0x0e, 0x8d, 0xd4, 0xb6, 0x74, 0x0d, 0xb5, 0x2d, 0x5f, 0x41, 0x6d, 0x93, 0xae, 0xbe, 0x72, 0x35, + 0x57, 0xff, 0x1b, 0x61, 0xb6, 0x17, 0x2c, 0x50, 0x4d, 0xa6, 0x5e, 0xc2, 0x69, 0x05, 0xf9, 0xde, + 0x25, 0x17, 0x45, 0xed, 0xea, 0x17, 0x05, 0xfa, 0x7e, 0x90, 0xc0, 0x05, 0x8b, 0xd4, 0xe9, 0x22, + 0xa9, 0x6f, 0xc9, 0x3c, 0x83, 0x0b, 0xa6, 0x8a, 0x86, 0x25, 0x4f, 0x6e, 0x58, 0xec, 0x43, 0xe2, + 0x0d, 0xf5, 0xbf, 0x79, 0x90, 0x93, 0xf9, 0xfd, 0xb7, 0xd4, 0x29, 0x55, 0x4d, 0xef, 0x94, 0x0a, + 0xf5, 0x3e, 0xf7, 0x81, 0x7a, 0x9f, 0xff, 0x30, 0xbd, 0x2f, 0x5c, 0x4b, 0xef, 0xbf, 0x2d, 0x77, + 0x9d, 0xd4, 0xfb, 0xf2, 0x75, 0xf5, 0x1e, 0xae, 0xa7, 0xf7, 0x95, 0x8f, 0xa1, 0xf7, 0xb5, 0x0f, + 0xd2, 0xfb, 0xfa, 0x75, 0xf4, 0xfe, 0x6f, 0x72, 0xd0, 0xb8, 0xa8, 0x40, 0x75, 0xf9, 0x6d, 0x22, + 0xb6, 0xb0, 0x65, 0x12, 0x2d, 0x6c, 0xdf, 0x81, 0x6a, 0xac, 0x77, 0x8d, 0x59, 0x42, 0xc5, 0x8b, + 0xba, 0xd6, 0x04, 0x95, 0xc9, 0x5d, 0x23, 0x2a, 0xce, 0x5f, 0x23, 0x2a, 0x2e, 0x5c, 0x57, 0x65, + 0x8a, 0xd7, 0x53, 0x99, 0xd2, 0xc7, 0x50, 0x99, 0xf2, 0x07, 0xa9, 0x0c, 0x4c, 0xa8, 0x32, 0x82, + 0xa2, 0xfc, 0x51, 0x01, 0x6e, 0x5d, 0x52, 0x7e, 0xbc, 0x5c, 0x57, 0x9e, 0x02, 0x6b, 0xdb, 0x8a, + 0x9a, 0x3c, 0x33, 0x51, 0x93, 0x27, 0xc5, 0xf0, 0x26, 0x4f, 0x55, 0x1c, 0x99, 0x64, 0x5e, 0xa2, + 0x39, 0x34, 0x9b, 0xde, 0x1c, 0x9a, 0x68, 0x0d, 0xfd, 0x25, 0xb9, 0xce, 0xd2, 0xb5, 0x5c, 0x67, + 0xe1, 0x1a, 0xae, 0xb3, 0xf8, 0xab, 0x90, 0xe1, 0x43, 0xec, 0x60, 0xfa, 0x3a, 0xae, 0xf3, 0x17, + 0x12, 0xa0, 0xf3, 0x95, 0xf4, 0xcb, 0x0d, 0xe1, 0xbe, 0xd0, 0x27, 0x9a, 0x39, 0xd7, 0x27, 0x1a, + 0x75, 0x89, 0x3e, 0xe6, 0x0a, 0x9c, 0x4d, 0x3c, 0x41, 0xb4, 0x2d, 0x17, 0x1b, 0x7e, 0x4a, 0xd7, + 0xdf, 0xe7, 0x50, 0x7b, 0x8d, 0x0f, 0x3c, 0xc7, 0x38, 0xc1, 0x7e, 0xd4, 0x08, 0xbe, 0x35, 0xa5, + 0x56, 0x43, 0x30, 0x89, 0xa5, 0xc5, 0xcd, 0xe7, 0xaf, 0xba, 0xf9, 0xe6, 0x9f, 0x66, 0x40, 0x4e, + 0x72, 0xf0, 0xab, 0x3c, 0xfe, 0x1f, 0x33, 0x30, 0x73, 0xce, 0x66, 0xbe, 0xad, 0x9e, 0xc3, 0xc2, + 0x65, 0xa7, 0x99, 0x9d, 0xe8, 0x34, 0x73, 0x13, 0x9f, 0x66, 0xfe, 0xea, 0xa7, 0x59, 0xbc, 0xea, + 0x69, 0x7e, 0x13, 0x3c, 0x3d, 0x6f, 0xd3, 0xe4, 0xf4, 0x03, 0x9e, 0x9e, 0x2f, 0x48, 0x73, 0x9b, + 0x7f, 0x16, 0xbe, 0x6a, 0xf7, 0xf8, 0xab, 0xd5, 0x95, 0x97, 0xe6, 0x6f, 0xd5, 0x8c, 0x55, 0x4d, + 0x68, 0xc8, 0xac, 0xe9, 0xa6, 0xc9, 0x04, 0x9f, 0x78, 0xab, 0x16, 0x49, 0xb3, 0xe2, 0x5b, 0x75, + 0x44, 0xdd, 0xfc, 0x3e, 0xd4, 0xe3, 0x8f, 0x2d, 0xe8, 0x01, 0xe4, 0x2c, 0xfb, 0xd0, 0x39, 0xf7, + 0x54, 0x2f, 0x3c, 0xbd, 0x51, 0x82, 0xc5, 0x57, 0x50, 0x15, 0xbb, 0xdd, 0xd1, 0x3c, 0xa0, 0xd6, + 0x7e, 0xbb, 0xd3, 0xd5, 0x36, 0xb6, 0x5a, 0xbb, 0xbb, 0xca, 0xb6, 0xb6, 0xde, 0xed, 0x6f, 0xc9, + 0x53, 0xe7, 0xe1, 0xdb, 0xca, 0x66, 0x5f, 0x96, 0xd0, 0x27, 0x30, 0x1b, 0x87, 0xab, 0x9d, 0x17, + 0x5b, 0x7d, 0x39, 0xb3, 0xf8, 0x2f, 0x12, 0xdc, 0x48, 0xbd, 0x80, 0x90, 0x0c, 0xd5, 0xad, 0xd5, + 0xa7, 0x4f, 0xb4, 0x2f, 0x57, 0x57, 0xf6, 0xb4, 0xb5, 0x15, 0x79, 0x2a, 0x0e, 0x79, 0xba, 0x22, + 0x4b, 0x68, 0x06, 0x6a, 0x14, 0xf2, 0xeb, 0x2b, 0xcf, 0x18, 0x51, 0x26, 0x01, 0x7a, 0xba, 0x22, + 0x67, 0xd1, 0x4d, 0xb8, 0xb1, 0xd7, 0x55, 0xfb, 0x6a, 0xab, 0xd3, 0xd7, 0x62, 0x4b, 0xe6, 0x2e, + 0x40, 0x3d, 0x5d, 0x91, 0xf3, 0x68, 0x01, 0xe6, 0xe3, 0xa8, 0xf0, 0x23, 0x85, 0x8b, 0x70, 0x4f, + 0x57, 0xe4, 0xe2, 0xe2, 0x3a, 0xef, 0x90, 0x8f, 0xcc, 0x0e, 0xcd, 0x81, 0xdc, 0x56, 0x36, 0x5b, + 0xfb, 0xdb, 0x7d, 0x6d, 0xb3, 0xb3, 0xad, 0xf4, 0x7f, 0x7b, 0x4f, 0x91, 0xa7, 0x50, 0x11, 0xb2, + 0x3b, 0x7b, 0x4f, 0x64, 0x89, 0xfc, 0xe8, 0xbe, 0x78, 0x21, 0x67, 0x18, 0x64, 0x4d, 0xce, 0x2e, + 0x6e, 0x05, 0x92, 0x0a, 0x3a, 0x67, 0xc5, 0x25, 0xf6, 0xd4, 0x6e, 0xbf, 0xbb, 0xd1, 0xdd, 0x96, + 0xa7, 0x50, 0x09, 0x72, 0x6a, 0x7f, 0x67, 0x8f, 0xad, 0xd1, 0x53, 0xfb, 0x72, 0x06, 0xd5, 0xa0, + 0xfc, 0x4a, 0x59, 0xef, 0x75, 0x37, 0x5e, 0x2a, 0x7d, 0x39, 0xbb, 0xb8, 0x0b, 0x37, 0x52, 0x5b, + 0x71, 0xd1, 0x3d, 0xb8, 0x13, 0x2c, 0xd8, 0x53, 0x5e, 0xec, 0x28, 0xbb, 0x7d, 0xa5, 0x4d, 0xb9, + 0x13, 0xd7, 0x27, 0x27, 0xbe, 0xdd, 0x8b, 0x20, 0xd2, 0xe2, 0xe3, 0x44, 0x2b, 0x30, 0x6f, 0x93, + 0x2c, 0x43, 0xbe, 0xb3, 0xdb, 0x56, 0xbe, 0x91, 0xa7, 0x08, 0x03, 0xfd, 0xce, 0x8e, 0xd2, 0xeb, + 0xb7, 0x08, 0x63, 0x8b, 0x87, 0x30, 0x9d, 0xe8, 0xb1, 0x24, 0x4a, 0xd2, 0xd9, 0x69, 0xbd, 0x50, + 0xb4, 0xde, 0xfe, 0xe6, 0x66, 0xe7, 0x1b, 0x2d, 0x98, 0xb9, 0x00, 0xf3, 0x31, 0xb8, 0xb0, 0x0c, + 0xba, 0x03, 0xb7, 0x62, 0xb8, 0xdd, 0xee, 0xae, 0xa2, 0x75, 0xbf, 0x56, 0xd4, 0x57, 0x6a, 0xa7, + 0xaf, 0xc8, 0x99, 0xc5, 0x1f, 0x83, 0x9c, 0x6c, 0x58, 0x20, 0x0b, 0x2a, 0x2f, 0x54, 0xa5, 0xd7, + 0xd3, 0x7a, 0xdd, 0x7d, 0x75, 0x43, 0xd1, 0xc8, 0xc9, 0x6b, 0xaf, 0x94, 0x75, 0xf6, 0xb1, 0x14, + 0x5c, 0xaf, 0xfd, 0x52, 0x96, 0x16, 0xff, 0x52, 0x82, 0xaa, 0xd8, 0xc6, 0x80, 0x66, 0x61, 0x3a, + 0x20, 0xee, 0xb7, 0xd4, 0x7e, 0x67, 0xf7, 0x85, 0x3c, 0x45, 0x34, 0x8d, 0x03, 0xf9, 0xf3, 0x98, + 0x24, 0x80, 0x94, 0xdd, 0x36, 0xa1, 0xca, 0x08, 0x53, 0x37, 0xba, 0x3b, 0x7b, 0xdb, 0x4a, 0x5f, + 0x91, 0xb3, 0x02, 0x1d, 0x7f, 0x3f, 0xcb, 0x21, 0x04, 0xf5, 0x60, 0xb5, 0xf5, 0xae, 0xda, 0x57, + 0xda, 0x72, 0x1e, 0x35, 0x60, 0x8e, 0xc3, 0xb6, 0x3b, 0x3b, 0x9d, 0xbe, 0xa6, 0x2a, 0xad, 0x8d, + 0x2d, 0xa5, 0x2d, 0x17, 0x16, 0xf7, 0xf9, 0xff, 0xe2, 0xf0, 0x0a, 0x18, 0x82, 0x7a, 0x20, 0xcc, + 0x9d, 0xce, 0x37, 0x8c, 0xbd, 0x79, 0x40, 0xed, 0xfd, 0xd6, 0x76, 0x68, 0x71, 0xad, 0x17, 0xca, + 0x2e, 0x31, 0xc5, 0x05, 0x98, 0x8f, 0xc3, 0xb7, 0xfb, 0x8a, 0xba, 0xdb, 0x22, 0x87, 0xb8, 0xfa, + 0x57, 0x05, 0x28, 0xf0, 0xb2, 0xf9, 0x8f, 0xa0, 0x22, 0x74, 0x50, 0xa0, 0xcb, 0xfa, 0x2a, 0x16, + 0xd2, 0x7a, 0x7c, 0x50, 0x0b, 0xaa, 0x62, 0x6f, 0x0f, 0x8a, 0x02, 0xaf, 0x94, 0x96, 0x9f, 0xf4, + 0x25, 0x14, 0x80, 0xa8, 0xc1, 0x08, 0x45, 0x91, 0xe3, 0xb9, 0x56, 0xa7, 0x85, 0x5b, 0xa9, 0x38, + 0xde, 0x91, 0xf4, 0x43, 0x80, 0xa8, 0x47, 0x07, 0x89, 0x0f, 0xaa, 0x89, 0xc6, 0x9d, 0x74, 0x2e, + 0xfa, 0xd0, 0xa0, 0x7b, 0x4e, 0x29, 0x87, 0xa2, 0x49, 0xfa, 0x3e, 0xd2, 0x57, 0xfd, 0x4d, 0x62, + 0xe2, 0xba, 0xeb, 0x87, 0xc5, 0x20, 0x74, 0x71, 0x03, 0x48, 0xfa, 0x0a, 0x7b, 0x30, 0x4f, 0x57, + 0x38, 0xff, 0x12, 0xf4, 0xfe, 0x9e, 0x90, 0xf4, 0x15, 0xbf, 0x86, 0x9b, 0x74, 0xc5, 0xb4, 0xfc, + 0x0b, 0x4d, 0xd4, 0x1d, 0x92, 0xbe, 0x6e, 0x1b, 0xe4, 0x68, 0xdd, 0x73, 0x0a, 0x75, 0x3e, 0xb6, + 0x7d, 0x8f, 0x42, 0xb1, 0x1b, 0xfb, 0x9c, 0x42, 0xc5, 0x2e, 0xf2, 0xf7, 0x2c, 0xc1, 0xbc, 0xeb, + 0xb9, 0x25, 0x62, 0x17, 0x76, 0xea, 0x12, 0xeb, 0x9b, 0xbf, 0x73, 0xef, 0xc8, 0xf2, 0x8f, 0xc7, + 0x07, 0xcb, 0x86, 0x33, 0x7c, 0xcc, 0x09, 0x1e, 0x07, 0xff, 0xd7, 0x10, 0x00, 0xfe, 0x36, 0x53, + 0xdb, 0xb6, 0x4e, 0xf1, 0x4b, 0xd6, 0x37, 0xe9, 0x3b, 0xff, 0x95, 0xa9, 0xf3, 0xf1, 0xf3, 0xe7, + 0x14, 0x70, 0x50, 0xa0, 0x53, 0xd6, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x2d, 0xf7, 0x77, + 0xea, 0x3b, 0x00, 0x00, } From e5566fe4555c0cab573e16f406e3e4a8c97fc168 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Wed, 18 Mar 2026 14:44:38 +0800 Subject: [PATCH 07/15] remove mcap related fields for now --- protobufs/livekit_egress.proto | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index c1ce8b47d..bc917a5f9 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -185,10 +185,10 @@ message EncodingOptions { message Output { oneof config { FileOutput file = 1; - StreamOutput stream = 2; // reuses v1 StreamOutput - SegmentedFileOutput segments = 3; // reuses v1 SegmentedFileOutput - ImageOutput images = 4; // reuses v1 ImageOutput - McapOutput mcap = 5; + StreamOutput stream = 2; + SegmentedFileOutput segments = 3; + ImageOutput images = 4; + // 5 reserved for mcap; } // Per-output storage override (falls back to request, then server) @@ -276,12 +276,6 @@ enum ImageFileSuffix { IMAGE_SUFFIX_NONE_OVERWRITE = 2; // Do not append any suffix and overwrite the existing image with the latest } -// Raw track data packaged into MCAP container format. -message McapOutput { - string filepath = 1; - bool disable_manifest = 2; -} - // --- Storage --- message StorageConfig { @@ -391,7 +385,6 @@ message EgressInfo { repeated FileInfo file_results = 16; repeated SegmentsInfo segment_results = 17; repeated ImagesInfo image_results = 20; - repeated McapInfo mcap_results = 28; string error = 9; int32 error_code = 22; @@ -471,16 +464,6 @@ message ImagesInfo { int64 ended_at = 3; } -message McapInfo { - string filename = 1; - int64 started_at = 2; - int64 ended_at = 3; - int64 duration = 4; - int64 size = 5; - string location = 6; - int64 track_count = 7; -} - // --- Auto Egress --- message AutoParticipantEgress { From ecfea899215729ae7a98a6e451a89ccaf669856a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 06:45:28 +0000 Subject: [PATCH 08/15] generated protobuf --- livekit/livekit_egress.pb.go | 751 ++++++++++++-------------------- livekit/livekit_egress.twirp.go | 539 ++++++++++++----------- 2 files changed, 548 insertions(+), 742 deletions(-) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index 400d5cd1e..33b0cbf6b 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -596,7 +596,7 @@ func (x StreamInfo_Status) Number() protoreflect.EnumNumber { // Deprecated: Use StreamInfo_Status.Descriptor instead. func (StreamInfo_Status) EnumDescriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{27, 0} + return file_livekit_egress_proto_rawDescGZIP(), []int{26, 0} } type StartEgressRequest struct { @@ -1515,7 +1515,6 @@ type Output struct { // *Output_Stream // *Output_Segments // *Output_Images - // *Output_Mcap Config isOutput_Config `protobuf_oneof:"config"` // Per-output storage override (falls back to request, then server) Storage *StorageConfig `protobuf:"bytes,6,opt,name=storage,proto3" json:"storage,omitempty"` @@ -1596,15 +1595,6 @@ func (x *Output) GetImages() *ImageOutput { return nil } -func (x *Output) GetMcap() *McapOutput { - if x != nil { - if x, ok := x.Config.(*Output_Mcap); ok { - return x.Mcap - } - } - return nil -} - func (x *Output) GetStorage() *StorageConfig { if x != nil { return x.Storage @@ -1621,19 +1611,15 @@ type Output_File struct { } type Output_Stream struct { - Stream *StreamOutput `protobuf:"bytes,2,opt,name=stream,proto3,oneof"` // reuses v1 StreamOutput + Stream *StreamOutput `protobuf:"bytes,2,opt,name=stream,proto3,oneof"` } type Output_Segments struct { - Segments *SegmentedFileOutput `protobuf:"bytes,3,opt,name=segments,proto3,oneof"` // reuses v1 SegmentedFileOutput + Segments *SegmentedFileOutput `protobuf:"bytes,3,opt,name=segments,proto3,oneof"` } type Output_Images struct { - Images *ImageOutput `protobuf:"bytes,4,opt,name=images,proto3,oneof"` // reuses v1 ImageOutput -} - -type Output_Mcap struct { - Mcap *McapOutput `protobuf:"bytes,5,opt,name=mcap,proto3,oneof"` + Images *ImageOutput `protobuf:"bytes,4,opt,name=images,proto3,oneof"` // 5 reserved for mcap; } func (*Output_File) isOutput_Config() {} @@ -1644,8 +1630,6 @@ func (*Output_Segments) isOutput_Config() {} func (*Output_Images) isOutput_Config() {} -func (*Output_Mcap) isOutput_Config() {} - // Unified file output — replaces v1 EncodedFileOutput and DirectFileOutput. // Whether transcoded depends on encoding options on the request. type FileOutput struct { @@ -2106,59 +2090,6 @@ func (*ImageOutput_Azure) isImageOutput_Output() {} func (*ImageOutput_AliOSS) isImageOutput_Output() {} -// Raw track data packaged into MCAP container format. -type McapOutput struct { - state protoimpl.MessageState `protogen:"open.v1"` - Filepath string `protobuf:"bytes,1,opt,name=filepath,proto3" json:"filepath,omitempty"` - DisableManifest bool `protobuf:"varint,2,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *McapOutput) Reset() { - *x = McapOutput{} - mi := &file_livekit_egress_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *McapOutput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*McapOutput) ProtoMessage() {} - -func (x *McapOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[15] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use McapOutput.ProtoReflect.Descriptor instead. -func (*McapOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{15} -} - -func (x *McapOutput) GetFilepath() string { - if x != nil { - return x.Filepath - } - return "" -} - -func (x *McapOutput) GetDisableManifest() bool { - if x != nil { - return x.DisableManifest - } - return false -} - type StorageConfig struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Provider: @@ -2174,7 +2105,7 @@ type StorageConfig struct { func (x *StorageConfig) Reset() { *x = StorageConfig{} - mi := &file_livekit_egress_proto_msgTypes[16] + mi := &file_livekit_egress_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2186,7 +2117,7 @@ func (x *StorageConfig) String() string { func (*StorageConfig) ProtoMessage() {} func (x *StorageConfig) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[16] + mi := &file_livekit_egress_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2199,7 +2130,7 @@ func (x *StorageConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use StorageConfig.ProtoReflect.Descriptor instead. func (*StorageConfig) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{16} + return file_livekit_egress_proto_rawDescGZIP(), []int{15} } func (x *StorageConfig) GetProvider() isStorageConfig_Provider { @@ -2294,7 +2225,7 @@ type S3Upload struct { func (x *S3Upload) Reset() { *x = S3Upload{} - mi := &file_livekit_egress_proto_msgTypes[17] + mi := &file_livekit_egress_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2306,7 +2237,7 @@ func (x *S3Upload) String() string { func (*S3Upload) ProtoMessage() {} func (x *S3Upload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[17] + mi := &file_livekit_egress_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2319,7 +2250,7 @@ func (x *S3Upload) ProtoReflect() protoreflect.Message { // Deprecated: Use S3Upload.ProtoReflect.Descriptor instead. func (*S3Upload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{17} + return file_livekit_egress_proto_rawDescGZIP(), []int{16} } func (x *S3Upload) GetAccessKey() string { @@ -2425,7 +2356,7 @@ type GCPUpload struct { func (x *GCPUpload) Reset() { *x = GCPUpload{} - mi := &file_livekit_egress_proto_msgTypes[18] + mi := &file_livekit_egress_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2437,7 +2368,7 @@ func (x *GCPUpload) String() string { func (*GCPUpload) ProtoMessage() {} func (x *GCPUpload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[18] + mi := &file_livekit_egress_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2450,7 +2381,7 @@ func (x *GCPUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use GCPUpload.ProtoReflect.Descriptor instead. func (*GCPUpload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{18} + return file_livekit_egress_proto_rawDescGZIP(), []int{17} } func (x *GCPUpload) GetCredentials() string { @@ -2485,7 +2416,7 @@ type AzureBlobUpload struct { func (x *AzureBlobUpload) Reset() { *x = AzureBlobUpload{} - mi := &file_livekit_egress_proto_msgTypes[19] + mi := &file_livekit_egress_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2497,7 +2428,7 @@ func (x *AzureBlobUpload) String() string { func (*AzureBlobUpload) ProtoMessage() {} func (x *AzureBlobUpload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[19] + mi := &file_livekit_egress_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2510,7 +2441,7 @@ func (x *AzureBlobUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use AzureBlobUpload.ProtoReflect.Descriptor instead. func (*AzureBlobUpload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{19} + return file_livekit_egress_proto_rawDescGZIP(), []int{18} } func (x *AzureBlobUpload) GetAccountName() string { @@ -2547,7 +2478,7 @@ type AliOSSUpload struct { func (x *AliOSSUpload) Reset() { *x = AliOSSUpload{} - mi := &file_livekit_egress_proto_msgTypes[20] + mi := &file_livekit_egress_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2559,7 +2490,7 @@ func (x *AliOSSUpload) String() string { func (*AliOSSUpload) ProtoMessage() {} func (x *AliOSSUpload) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[20] + mi := &file_livekit_egress_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2572,7 +2503,7 @@ func (x *AliOSSUpload) ProtoReflect() protoreflect.Message { // Deprecated: Use AliOSSUpload.ProtoReflect.Descriptor instead. func (*AliOSSUpload) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{20} + return file_livekit_egress_proto_rawDescGZIP(), []int{19} } func (x *AliOSSUpload) GetAccessKey() string { @@ -2621,7 +2552,7 @@ type ProxyConfig struct { func (x *ProxyConfig) Reset() { *x = ProxyConfig{} - mi := &file_livekit_egress_proto_msgTypes[21] + mi := &file_livekit_egress_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2633,7 +2564,7 @@ func (x *ProxyConfig) String() string { func (*ProxyConfig) ProtoMessage() {} func (x *ProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[21] + mi := &file_livekit_egress_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2646,7 +2577,7 @@ func (x *ProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ProxyConfig.ProtoReflect.Descriptor instead. func (*ProxyConfig) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{21} + return file_livekit_egress_proto_rawDescGZIP(), []int{20} } func (x *ProxyConfig) GetUrl() string { @@ -2681,7 +2612,7 @@ type ListEgressRequest struct { func (x *ListEgressRequest) Reset() { *x = ListEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[22] + mi := &file_livekit_egress_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2693,7 +2624,7 @@ func (x *ListEgressRequest) String() string { func (*ListEgressRequest) ProtoMessage() {} func (x *ListEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[22] + mi := &file_livekit_egress_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2706,7 +2637,7 @@ func (x *ListEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEgressRequest.ProtoReflect.Descriptor instead. func (*ListEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{22} + return file_livekit_egress_proto_rawDescGZIP(), []int{21} } func (x *ListEgressRequest) GetRoomName() string { @@ -2739,7 +2670,7 @@ type ListEgressResponse struct { func (x *ListEgressResponse) Reset() { *x = ListEgressResponse{} - mi := &file_livekit_egress_proto_msgTypes[23] + mi := &file_livekit_egress_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2751,7 +2682,7 @@ func (x *ListEgressResponse) String() string { func (*ListEgressResponse) ProtoMessage() {} func (x *ListEgressResponse) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[23] + mi := &file_livekit_egress_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2764,7 +2695,7 @@ func (x *ListEgressResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEgressResponse.ProtoReflect.Descriptor instead. func (*ListEgressResponse) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{23} + return file_livekit_egress_proto_rawDescGZIP(), []int{22} } func (x *ListEgressResponse) GetItems() []*EgressInfo { @@ -2787,7 +2718,7 @@ type UpdateEgressRequest struct { func (x *UpdateEgressRequest) Reset() { *x = UpdateEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[24] + mi := &file_livekit_egress_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2799,7 +2730,7 @@ func (x *UpdateEgressRequest) String() string { func (*UpdateEgressRequest) ProtoMessage() {} func (x *UpdateEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[24] + mi := &file_livekit_egress_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2812,7 +2743,7 @@ func (x *UpdateEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateEgressRequest.ProtoReflect.Descriptor instead. func (*UpdateEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{24} + return file_livekit_egress_proto_rawDescGZIP(), []int{23} } func (x *UpdateEgressRequest) GetEgressId() string { @@ -2859,7 +2790,7 @@ type StopEgressRequest struct { func (x *StopEgressRequest) Reset() { *x = StopEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[25] + mi := &file_livekit_egress_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2871,7 +2802,7 @@ func (x *StopEgressRequest) String() string { func (*StopEgressRequest) ProtoMessage() {} func (x *StopEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[25] + mi := &file_livekit_egress_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2884,7 +2815,7 @@ func (x *StopEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopEgressRequest.ProtoReflect.Descriptor instead. func (*StopEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{25} + return file_livekit_egress_proto_rawDescGZIP(), []int{24} } func (x *StopEgressRequest) GetEgressId() string { @@ -2918,7 +2849,6 @@ type EgressInfo struct { FileResults []*FileInfo `protobuf:"bytes,16,rep,name=file_results,json=fileResults,proto3" json:"file_results,omitempty"` SegmentResults []*SegmentsInfo `protobuf:"bytes,17,rep,name=segment_results,json=segmentResults,proto3" json:"segment_results,omitempty"` ImageResults []*ImagesInfo `protobuf:"bytes,20,rep,name=image_results,json=imageResults,proto3" json:"image_results,omitempty"` - McapResults []*McapInfo `protobuf:"bytes,28,rep,name=mcap_results,json=mcapResults,proto3" json:"mcap_results,omitempty"` Error string `protobuf:"bytes,9,opt,name=error,proto3" json:"error,omitempty"` ErrorCode int32 `protobuf:"varint,22,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` Details string `protobuf:"bytes,21,opt,name=details,proto3" json:"details,omitempty"` @@ -2939,7 +2869,7 @@ type EgressInfo struct { func (x *EgressInfo) Reset() { *x = EgressInfo{} - mi := &file_livekit_egress_proto_msgTypes[26] + mi := &file_livekit_egress_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2951,7 +2881,7 @@ func (x *EgressInfo) String() string { func (*EgressInfo) ProtoMessage() {} func (x *EgressInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[26] + mi := &file_livekit_egress_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2964,7 +2894,7 @@ func (x *EgressInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EgressInfo.ProtoReflect.Descriptor instead. func (*EgressInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{26} + return file_livekit_egress_proto_rawDescGZIP(), []int{25} } func (x *EgressInfo) GetEgressId() string { @@ -3121,13 +3051,6 @@ func (x *EgressInfo) GetImageResults() []*ImagesInfo { return nil } -func (x *EgressInfo) GetMcapResults() []*McapInfo { - if x != nil { - return x.McapResults - } - return nil -} - func (x *EgressInfo) GetError() string { if x != nil { return x.Error @@ -3294,7 +3217,7 @@ type StreamInfo struct { func (x *StreamInfo) Reset() { *x = StreamInfo{} - mi := &file_livekit_egress_proto_msgTypes[27] + mi := &file_livekit_egress_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3306,7 +3229,7 @@ func (x *StreamInfo) String() string { func (*StreamInfo) ProtoMessage() {} func (x *StreamInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[27] + mi := &file_livekit_egress_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3319,7 +3242,7 @@ func (x *StreamInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamInfo.ProtoReflect.Descriptor instead. func (*StreamInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{27} + return file_livekit_egress_proto_rawDescGZIP(), []int{26} } func (x *StreamInfo) GetUrl() string { @@ -3392,7 +3315,7 @@ type FileInfo struct { func (x *FileInfo) Reset() { *x = FileInfo{} - mi := &file_livekit_egress_proto_msgTypes[28] + mi := &file_livekit_egress_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3404,7 +3327,7 @@ func (x *FileInfo) String() string { func (*FileInfo) ProtoMessage() {} func (x *FileInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[28] + mi := &file_livekit_egress_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3417,7 +3340,7 @@ func (x *FileInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use FileInfo.ProtoReflect.Descriptor instead. func (*FileInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{28} + return file_livekit_egress_proto_rawDescGZIP(), []int{27} } func (x *FileInfo) GetFilename() string { @@ -3479,7 +3402,7 @@ type SegmentsInfo struct { func (x *SegmentsInfo) Reset() { *x = SegmentsInfo{} - mi := &file_livekit_egress_proto_msgTypes[29] + mi := &file_livekit_egress_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3491,7 +3414,7 @@ func (x *SegmentsInfo) String() string { func (*SegmentsInfo) ProtoMessage() {} func (x *SegmentsInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[29] + mi := &file_livekit_egress_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3504,7 +3427,7 @@ func (x *SegmentsInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SegmentsInfo.ProtoReflect.Descriptor instead. func (*SegmentsInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{29} + return file_livekit_egress_proto_rawDescGZIP(), []int{28} } func (x *SegmentsInfo) GetPlaylistName() string { @@ -3582,7 +3505,7 @@ type ImagesInfo struct { func (x *ImagesInfo) Reset() { *x = ImagesInfo{} - mi := &file_livekit_egress_proto_msgTypes[30] + mi := &file_livekit_egress_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3594,7 +3517,7 @@ func (x *ImagesInfo) String() string { func (*ImagesInfo) ProtoMessage() {} func (x *ImagesInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[30] + mi := &file_livekit_egress_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3607,7 +3530,7 @@ func (x *ImagesInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ImagesInfo.ProtoReflect.Descriptor instead. func (*ImagesInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{30} + return file_livekit_egress_proto_rawDescGZIP(), []int{29} } func (x *ImagesInfo) GetFilenamePrefix() string { @@ -3638,98 +3561,6 @@ func (x *ImagesInfo) GetEndedAt() int64 { return 0 } -type McapInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` - StartedAt int64 `protobuf:"varint,2,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` - EndedAt int64 `protobuf:"varint,3,opt,name=ended_at,json=endedAt,proto3" json:"ended_at,omitempty"` - Duration int64 `protobuf:"varint,4,opt,name=duration,proto3" json:"duration,omitempty"` - Size int64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` - Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` - TrackCount int64 `protobuf:"varint,7,opt,name=track_count,json=trackCount,proto3" json:"track_count,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *McapInfo) Reset() { - *x = McapInfo{} - mi := &file_livekit_egress_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *McapInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*McapInfo) ProtoMessage() {} - -func (x *McapInfo) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[31] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use McapInfo.ProtoReflect.Descriptor instead. -func (*McapInfo) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{31} -} - -func (x *McapInfo) GetFilename() string { - if x != nil { - return x.Filename - } - return "" -} - -func (x *McapInfo) GetStartedAt() int64 { - if x != nil { - return x.StartedAt - } - return 0 -} - -func (x *McapInfo) GetEndedAt() int64 { - if x != nil { - return x.EndedAt - } - return 0 -} - -func (x *McapInfo) GetDuration() int64 { - if x != nil { - return x.Duration - } - return 0 -} - -func (x *McapInfo) GetSize() int64 { - if x != nil { - return x.Size - } - return 0 -} - -func (x *McapInfo) GetLocation() string { - if x != nil { - return x.Location - } - return "" -} - -func (x *McapInfo) GetTrackCount() int64 { - if x != nil { - return x.TrackCount - } - return 0 -} - type AutoParticipantEgress struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Options: @@ -3745,7 +3576,7 @@ type AutoParticipantEgress struct { func (x *AutoParticipantEgress) Reset() { *x = AutoParticipantEgress{} - mi := &file_livekit_egress_proto_msgTypes[32] + mi := &file_livekit_egress_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3757,7 +3588,7 @@ func (x *AutoParticipantEgress) String() string { func (*AutoParticipantEgress) ProtoMessage() {} func (x *AutoParticipantEgress) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[32] + mi := &file_livekit_egress_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3770,7 +3601,7 @@ func (x *AutoParticipantEgress) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoParticipantEgress.ProtoReflect.Descriptor instead. func (*AutoParticipantEgress) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{32} + return file_livekit_egress_proto_rawDescGZIP(), []int{30} } func (x *AutoParticipantEgress) GetOptions() isAutoParticipantEgress_Options { @@ -3845,7 +3676,7 @@ type AutoTrackEgress struct { func (x *AutoTrackEgress) Reset() { *x = AutoTrackEgress{} - mi := &file_livekit_egress_proto_msgTypes[33] + mi := &file_livekit_egress_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3857,7 +3688,7 @@ func (x *AutoTrackEgress) String() string { func (*AutoTrackEgress) ProtoMessage() {} func (x *AutoTrackEgress) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[33] + mi := &file_livekit_egress_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3870,7 +3701,7 @@ func (x *AutoTrackEgress) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoTrackEgress.ProtoReflect.Descriptor instead. func (*AutoTrackEgress) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{33} + return file_livekit_egress_proto_rawDescGZIP(), []int{31} } func (x *AutoTrackEgress) GetFilepath() string { @@ -3983,7 +3814,7 @@ type ExportReplayRequest struct { func (x *ExportReplayRequest) Reset() { *x = ExportReplayRequest{} - mi := &file_livekit_egress_proto_msgTypes[34] + mi := &file_livekit_egress_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3995,7 +3826,7 @@ func (x *ExportReplayRequest) String() string { func (*ExportReplayRequest) ProtoMessage() {} func (x *ExportReplayRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[34] + mi := &file_livekit_egress_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4008,7 +3839,7 @@ func (x *ExportReplayRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportReplayRequest.ProtoReflect.Descriptor instead. func (*ExportReplayRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{34} + return file_livekit_egress_proto_rawDescGZIP(), []int{32} } func (x *ExportReplayRequest) GetReplayId() string { @@ -4180,7 +4011,7 @@ type RoomCompositeEgressRequest struct { func (x *RoomCompositeEgressRequest) Reset() { *x = RoomCompositeEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[35] + mi := &file_livekit_egress_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4192,7 +4023,7 @@ func (x *RoomCompositeEgressRequest) String() string { func (*RoomCompositeEgressRequest) ProtoMessage() {} func (x *RoomCompositeEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[35] + mi := &file_livekit_egress_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4205,7 +4036,7 @@ func (x *RoomCompositeEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomCompositeEgressRequest.ProtoReflect.Descriptor instead. func (*RoomCompositeEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{35} + return file_livekit_egress_proto_rawDescGZIP(), []int{33} } func (x *RoomCompositeEgressRequest) GetRoomName() string { @@ -4416,7 +4247,7 @@ type WebEgressRequest struct { func (x *WebEgressRequest) Reset() { *x = WebEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[36] + mi := &file_livekit_egress_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4428,7 +4259,7 @@ func (x *WebEgressRequest) String() string { func (*WebEgressRequest) ProtoMessage() {} func (x *WebEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[36] + mi := &file_livekit_egress_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4441,7 +4272,7 @@ func (x *WebEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WebEgressRequest.ProtoReflect.Descriptor instead. func (*WebEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{36} + return file_livekit_egress_proto_rawDescGZIP(), []int{34} } func (x *WebEgressRequest) GetUrl() string { @@ -4631,7 +4462,7 @@ type ParticipantEgressRequest struct { func (x *ParticipantEgressRequest) Reset() { *x = ParticipantEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[37] + mi := &file_livekit_egress_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4643,7 +4474,7 @@ func (x *ParticipantEgressRequest) String() string { func (*ParticipantEgressRequest) ProtoMessage() {} func (x *ParticipantEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[37] + mi := &file_livekit_egress_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4656,7 +4487,7 @@ func (x *ParticipantEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ParticipantEgressRequest.ProtoReflect.Descriptor instead. func (*ParticipantEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{37} + return file_livekit_egress_proto_rawDescGZIP(), []int{35} } func (x *ParticipantEgressRequest) GetRoomName() string { @@ -4783,7 +4614,7 @@ type TrackCompositeEgressRequest struct { func (x *TrackCompositeEgressRequest) Reset() { *x = TrackCompositeEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[38] + mi := &file_livekit_egress_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4795,7 +4626,7 @@ func (x *TrackCompositeEgressRequest) String() string { func (*TrackCompositeEgressRequest) ProtoMessage() {} func (x *TrackCompositeEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[38] + mi := &file_livekit_egress_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4808,7 +4639,7 @@ func (x *TrackCompositeEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrackCompositeEgressRequest.ProtoReflect.Descriptor instead. func (*TrackCompositeEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{38} + return file_livekit_egress_proto_rawDescGZIP(), []int{36} } func (x *TrackCompositeEgressRequest) GetRoomName() string { @@ -4986,7 +4817,7 @@ type TrackEgressRequest struct { func (x *TrackEgressRequest) Reset() { *x = TrackEgressRequest{} - mi := &file_livekit_egress_proto_msgTypes[39] + mi := &file_livekit_egress_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4998,7 +4829,7 @@ func (x *TrackEgressRequest) String() string { func (*TrackEgressRequest) ProtoMessage() {} func (x *TrackEgressRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[39] + mi := &file_livekit_egress_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5011,7 +4842,7 @@ func (x *TrackEgressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrackEgressRequest.ProtoReflect.Descriptor instead. func (*TrackEgressRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{39} + return file_livekit_egress_proto_rawDescGZIP(), []int{37} } func (x *TrackEgressRequest) GetRoomName() string { @@ -5093,7 +4924,7 @@ type DirectFileOutput struct { func (x *DirectFileOutput) Reset() { *x = DirectFileOutput{} - mi := &file_livekit_egress_proto_msgTypes[40] + mi := &file_livekit_egress_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5105,7 +4936,7 @@ func (x *DirectFileOutput) String() string { func (*DirectFileOutput) ProtoMessage() {} func (x *DirectFileOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[40] + mi := &file_livekit_egress_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5118,7 +4949,7 @@ func (x *DirectFileOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectFileOutput.ProtoReflect.Descriptor instead. func (*DirectFileOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{40} + return file_livekit_egress_proto_rawDescGZIP(), []int{38} } func (x *DirectFileOutput) GetFilepath() string { @@ -5224,7 +5055,7 @@ type EncodedFileOutput struct { func (x *EncodedFileOutput) Reset() { *x = EncodedFileOutput{} - mi := &file_livekit_egress_proto_msgTypes[41] + mi := &file_livekit_egress_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5236,7 +5067,7 @@ func (x *EncodedFileOutput) String() string { func (*EncodedFileOutput) ProtoMessage() {} func (x *EncodedFileOutput) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[41] + mi := &file_livekit_egress_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5249,7 +5080,7 @@ func (x *EncodedFileOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use EncodedFileOutput.ProtoReflect.Descriptor instead. func (*EncodedFileOutput) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{41} + return file_livekit_egress_proto_rawDescGZIP(), []int{39} } func (x *EncodedFileOutput) GetFileType() EncodedFileType { @@ -5354,7 +5185,7 @@ type UpdateLayoutRequest struct { func (x *UpdateLayoutRequest) Reset() { *x = UpdateLayoutRequest{} - mi := &file_livekit_egress_proto_msgTypes[42] + mi := &file_livekit_egress_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5366,7 +5197,7 @@ func (x *UpdateLayoutRequest) String() string { func (*UpdateLayoutRequest) ProtoMessage() {} func (x *UpdateLayoutRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[42] + mi := &file_livekit_egress_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5379,7 +5210,7 @@ func (x *UpdateLayoutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateLayoutRequest.ProtoReflect.Descriptor instead. func (*UpdateLayoutRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{42} + return file_livekit_egress_proto_rawDescGZIP(), []int{40} } func (x *UpdateLayoutRequest) GetEgressId() string { @@ -5407,7 +5238,7 @@ type UpdateStreamRequest struct { func (x *UpdateStreamRequest) Reset() { *x = UpdateStreamRequest{} - mi := &file_livekit_egress_proto_msgTypes[43] + mi := &file_livekit_egress_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5419,7 +5250,7 @@ func (x *UpdateStreamRequest) String() string { func (*UpdateStreamRequest) ProtoMessage() {} func (x *UpdateStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[43] + mi := &file_livekit_egress_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5432,7 +5263,7 @@ func (x *UpdateStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateStreamRequest.ProtoReflect.Descriptor instead. func (*UpdateStreamRequest) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{43} + return file_livekit_egress_proto_rawDescGZIP(), []int{41} } func (x *UpdateStreamRequest) GetEgressId() string { @@ -5465,7 +5296,7 @@ type StreamInfoList struct { func (x *StreamInfoList) Reset() { *x = StreamInfoList{} - mi := &file_livekit_egress_proto_msgTypes[44] + mi := &file_livekit_egress_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5477,7 +5308,7 @@ func (x *StreamInfoList) String() string { func (*StreamInfoList) ProtoMessage() {} func (x *StreamInfoList) ProtoReflect() protoreflect.Message { - mi := &file_livekit_egress_proto_msgTypes[44] + mi := &file_livekit_egress_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5490,7 +5321,7 @@ func (x *StreamInfoList) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamInfoList.ProtoReflect.Descriptor instead. func (*StreamInfoList) Descriptor() ([]byte, []int) { - return file_livekit_egress_proto_rawDescGZIP(), []int{44} + return file_livekit_egress_proto_rawDescGZIP(), []int{42} } func (x *StreamInfoList) GetInfo() []*StreamInfo { @@ -5573,13 +5404,12 @@ const file_livekit_egress_proto_rawDesc = "" + "\x12key_frame_interval\x18\n" + " \x01(\x01R\x10keyFrameInterval\x12'\n" + "\raudio_quality\x18\v \x01(\x05B\x02\x18\x01R\faudioQuality\x12'\n" + - "\rvideo_quality\x18\f \x01(\x05B\x02\x18\x01R\fvideoQuality\"\xb7\x02\n" + + "\rvideo_quality\x18\f \x01(\x05B\x02\x18\x01R\fvideoQuality\"\x8c\x02\n" + "\x06Output\x12)\n" + "\x04file\x18\x01 \x01(\v2\x13.livekit.FileOutputH\x00R\x04file\x12/\n" + "\x06stream\x18\x02 \x01(\v2\x15.livekit.StreamOutputH\x00R\x06stream\x12:\n" + "\bsegments\x18\x03 \x01(\v2\x1c.livekit.SegmentedFileOutputH\x00R\bsegments\x12.\n" + - "\x06images\x18\x04 \x01(\v2\x14.livekit.ImageOutputH\x00R\x06images\x12)\n" + - "\x04mcap\x18\x05 \x01(\v2\x13.livekit.McapOutputH\x00R\x04mcap\x120\n" + + "\x06images\x18\x04 \x01(\v2\x14.livekit.ImageOutputH\x00R\x06images\x120\n" + "\astorage\x18\x06 \x01(\v2\x16.livekit.StorageConfigR\astorageB\b\n" + "\x06config\"\x8a\x01\n" + "\n" + @@ -5618,11 +5448,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\x05azure\x18\n" + " \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + "\x06aliOSS\x18\v \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output\"S\n" + - "\n" + - "McapOutput\x12\x1a\n" + - "\bfilepath\x18\x01 \x01(\tR\bfilepath\x12)\n" + - "\x10disable_manifest\x18\x02 \x01(\bR\x0fdisableManifest\"\xcc\x01\n" + + "\x06output\"\xcc\x01\n" + "\rStorageConfig\x12#\n" + "\x02s3\x18\x01 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + "\x03gcp\x18\x02 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + @@ -5682,7 +5508,8 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fadd_stream_urls\x18\x04 \x03(\tR\raddStreamUrls\x12,\n" + "\x12remove_stream_urls\x18\x05 \x03(\tR\x10removeStreamUrls\">\n" + "\x11StopEgressRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\x97\v\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\xe1\n" + + "\n" + "\n" + "EgressInfo\x12)\n" + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\x12#\n" + @@ -5708,8 +5535,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0estream_results\x18\x0f \x03(\v2\x13.livekit.StreamInfoR\rstreamResults\x124\n" + "\ffile_results\x18\x10 \x03(\v2\x11.livekit.FileInfoR\vfileResults\x12>\n" + "\x0fsegment_results\x18\x11 \x03(\v2\x15.livekit.SegmentsInfoR\x0esegmentResults\x128\n" + - "\rimage_results\x18\x14 \x03(\v2\x13.livekit.ImagesInfoR\fimageResults\x124\n" + - "\fmcap_results\x18\x1c \x03(\v2\x11.livekit.McapInfoR\vmcapResults\x12\x14\n" + + "\rimage_results\x18\x14 \x03(\v2\x13.livekit.ImagesInfoR\fimageResults\x12\x14\n" + "\x05error\x18\t \x01(\tR\x05error\x12\x1d\n" + "\n" + "error_code\x18\x16 \x01(\x05R\terrorCode\x12\x18\n" + @@ -5766,17 +5592,7 @@ const file_livekit_egress_proto_rawDesc = "" + "imageCount\x12\x1d\n" + "\n" + "started_at\x18\x02 \x01(\x03R\tstartedAt\x12\x19\n" + - "\bended_at\x18\x03 \x01(\x03R\aendedAt\"\xcd\x01\n" + - "\bMcapInfo\x12\x1a\n" + - "\bfilename\x18\x01 \x01(\tR\bfilename\x12\x1d\n" + - "\n" + - "started_at\x18\x02 \x01(\x03R\tstartedAt\x12\x19\n" + - "\bended_at\x18\x03 \x01(\x03R\aendedAt\x12\x1a\n" + - "\bduration\x18\x04 \x01(\x03R\bduration\x12\x12\n" + - "\x04size\x18\x05 \x01(\x03R\x04size\x12\x1a\n" + - "\blocation\x18\x06 \x01(\tR\blocation\x12\x1f\n" + - "\vtrack_count\x18\a \x01(\x03R\n" + - "trackCount\"\x9a\x02\n" + + "\bended_at\x18\x03 \x01(\x03R\aendedAt\"\x9a\x02\n" + "\x15AutoParticipantEgress\x128\n" + "\x06preset\x18\x01 \x01(\x0e2\x1e.livekit.EncodingOptionsPresetH\x00R\x06preset\x126\n" + "\badvanced\x18\x02 \x01(\v2\x18.livekit.EncodingOptionsH\x00R\badvanced\x12=\n" + @@ -5987,7 +5803,7 @@ func file_livekit_egress_proto_rawDescGZIP() []byte { } var file_livekit_egress_proto_enumTypes = make([]protoimpl.EnumInfo, 11) -var file_livekit_egress_proto_msgTypes = make([]protoimpl.MessageInfo, 46) +var file_livekit_egress_proto_msgTypes = make([]protoimpl.MessageInfo, 44) var file_livekit_egress_proto_goTypes = []any{ (AudioChannel)(0), // 0: livekit.AudioChannel (EncodingOptionsPreset)(0), // 1: livekit.EncodingOptionsPreset @@ -6015,42 +5831,40 @@ var file_livekit_egress_proto_goTypes = []any{ (*StreamOutput)(nil), // 23: livekit.StreamOutput (*SegmentedFileOutput)(nil), // 24: livekit.SegmentedFileOutput (*ImageOutput)(nil), // 25: livekit.ImageOutput - (*McapOutput)(nil), // 26: livekit.McapOutput - (*StorageConfig)(nil), // 27: livekit.StorageConfig - (*S3Upload)(nil), // 28: livekit.S3Upload - (*GCPUpload)(nil), // 29: livekit.GCPUpload - (*AzureBlobUpload)(nil), // 30: livekit.AzureBlobUpload - (*AliOSSUpload)(nil), // 31: livekit.AliOSSUpload - (*ProxyConfig)(nil), // 32: livekit.ProxyConfig - (*ListEgressRequest)(nil), // 33: livekit.ListEgressRequest - (*ListEgressResponse)(nil), // 34: livekit.ListEgressResponse - (*UpdateEgressRequest)(nil), // 35: livekit.UpdateEgressRequest - (*StopEgressRequest)(nil), // 36: livekit.StopEgressRequest - (*EgressInfo)(nil), // 37: livekit.EgressInfo - (*StreamInfo)(nil), // 38: livekit.StreamInfo - (*FileInfo)(nil), // 39: livekit.FileInfo - (*SegmentsInfo)(nil), // 40: livekit.SegmentsInfo - (*ImagesInfo)(nil), // 41: livekit.ImagesInfo - (*McapInfo)(nil), // 42: livekit.McapInfo - (*AutoParticipantEgress)(nil), // 43: livekit.AutoParticipantEgress - (*AutoTrackEgress)(nil), // 44: livekit.AutoTrackEgress - (*ExportReplayRequest)(nil), // 45: livekit.ExportReplayRequest - (*RoomCompositeEgressRequest)(nil), // 46: livekit.RoomCompositeEgressRequest - (*WebEgressRequest)(nil), // 47: livekit.WebEgressRequest - (*ParticipantEgressRequest)(nil), // 48: livekit.ParticipantEgressRequest - (*TrackCompositeEgressRequest)(nil), // 49: livekit.TrackCompositeEgressRequest - (*TrackEgressRequest)(nil), // 50: livekit.TrackEgressRequest - (*DirectFileOutput)(nil), // 51: livekit.DirectFileOutput - (*EncodedFileOutput)(nil), // 52: livekit.EncodedFileOutput - (*UpdateLayoutRequest)(nil), // 53: livekit.UpdateLayoutRequest - (*UpdateStreamRequest)(nil), // 54: livekit.UpdateStreamRequest - (*StreamInfoList)(nil), // 55: livekit.StreamInfoList - nil, // 56: livekit.S3Upload.MetadataEntry - (*WebhookConfig)(nil), // 57: livekit.WebhookConfig - (ParticipantInfo_Kind)(0), // 58: livekit.ParticipantInfo.Kind - (AudioCodec)(0), // 59: livekit.AudioCodec - (VideoCodec)(0), // 60: livekit.VideoCodec - (ImageCodec)(0), // 61: livekit.ImageCodec + (*StorageConfig)(nil), // 26: livekit.StorageConfig + (*S3Upload)(nil), // 27: livekit.S3Upload + (*GCPUpload)(nil), // 28: livekit.GCPUpload + (*AzureBlobUpload)(nil), // 29: livekit.AzureBlobUpload + (*AliOSSUpload)(nil), // 30: livekit.AliOSSUpload + (*ProxyConfig)(nil), // 31: livekit.ProxyConfig + (*ListEgressRequest)(nil), // 32: livekit.ListEgressRequest + (*ListEgressResponse)(nil), // 33: livekit.ListEgressResponse + (*UpdateEgressRequest)(nil), // 34: livekit.UpdateEgressRequest + (*StopEgressRequest)(nil), // 35: livekit.StopEgressRequest + (*EgressInfo)(nil), // 36: livekit.EgressInfo + (*StreamInfo)(nil), // 37: livekit.StreamInfo + (*FileInfo)(nil), // 38: livekit.FileInfo + (*SegmentsInfo)(nil), // 39: livekit.SegmentsInfo + (*ImagesInfo)(nil), // 40: livekit.ImagesInfo + (*AutoParticipantEgress)(nil), // 41: livekit.AutoParticipantEgress + (*AutoTrackEgress)(nil), // 42: livekit.AutoTrackEgress + (*ExportReplayRequest)(nil), // 43: livekit.ExportReplayRequest + (*RoomCompositeEgressRequest)(nil), // 44: livekit.RoomCompositeEgressRequest + (*WebEgressRequest)(nil), // 45: livekit.WebEgressRequest + (*ParticipantEgressRequest)(nil), // 46: livekit.ParticipantEgressRequest + (*TrackCompositeEgressRequest)(nil), // 47: livekit.TrackCompositeEgressRequest + (*TrackEgressRequest)(nil), // 48: livekit.TrackEgressRequest + (*DirectFileOutput)(nil), // 49: livekit.DirectFileOutput + (*EncodedFileOutput)(nil), // 50: livekit.EncodedFileOutput + (*UpdateLayoutRequest)(nil), // 51: livekit.UpdateLayoutRequest + (*UpdateStreamRequest)(nil), // 52: livekit.UpdateStreamRequest + (*StreamInfoList)(nil), // 53: livekit.StreamInfoList + nil, // 54: livekit.S3Upload.MetadataEntry + (*WebhookConfig)(nil), // 55: livekit.WebhookConfig + (ParticipantInfo_Kind)(0), // 56: livekit.ParticipantInfo.Kind + (AudioCodec)(0), // 57: livekit.AudioCodec + (VideoCodec)(0), // 58: livekit.VideoCodec + (ImageCodec)(0), // 59: livekit.ImageCodec } var file_livekit_egress_proto_depIdxs = []int32{ 12, // 0: livekit.StartEgressRequest.template:type_name -> livekit.TemplateSource @@ -6059,156 +5873,154 @@ var file_livekit_egress_proto_depIdxs = []int32{ 1, // 3: livekit.StartEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset 20, // 4: livekit.StartEgressRequest.advanced:type_name -> livekit.EncodingOptions 21, // 5: livekit.StartEgressRequest.outputs:type_name -> livekit.Output - 27, // 6: livekit.StartEgressRequest.storage:type_name -> livekit.StorageConfig - 57, // 7: livekit.StartEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 26, // 6: livekit.StartEgressRequest.storage:type_name -> livekit.StorageConfig + 55, // 7: livekit.StartEgressRequest.webhooks:type_name -> livekit.WebhookConfig 15, // 8: livekit.MediaSource.participant_video:type_name -> livekit.ParticipantVideo 16, // 9: livekit.MediaSource.audio:type_name -> livekit.AudioConfig 18, // 10: livekit.MediaSource.data:type_name -> livekit.DataConfig 17, // 11: livekit.AudioConfig.routes:type_name -> livekit.AudioRoute - 58, // 12: livekit.AudioRoute.participant_kind:type_name -> livekit.ParticipantInfo.Kind + 56, // 12: livekit.AudioRoute.participant_kind:type_name -> livekit.ParticipantInfo.Kind 0, // 13: livekit.AudioRoute.channel:type_name -> livekit.AudioChannel 19, // 14: livekit.DataConfig.selectors:type_name -> livekit.DataSelector - 59, // 15: livekit.EncodingOptions.audio_codec:type_name -> livekit.AudioCodec - 60, // 16: livekit.EncodingOptions.video_codec:type_name -> livekit.VideoCodec + 57, // 15: livekit.EncodingOptions.audio_codec:type_name -> livekit.AudioCodec + 58, // 16: livekit.EncodingOptions.video_codec:type_name -> livekit.VideoCodec 22, // 17: livekit.Output.file:type_name -> livekit.FileOutput 23, // 18: livekit.Output.stream:type_name -> livekit.StreamOutput 24, // 19: livekit.Output.segments:type_name -> livekit.SegmentedFileOutput 25, // 20: livekit.Output.images:type_name -> livekit.ImageOutput - 26, // 21: livekit.Output.mcap:type_name -> livekit.McapOutput - 27, // 22: livekit.Output.storage:type_name -> livekit.StorageConfig - 2, // 23: livekit.FileOutput.file_type:type_name -> livekit.EncodedFileType - 3, // 24: livekit.StreamOutput.protocol:type_name -> livekit.StreamProtocol - 4, // 25: livekit.SegmentedFileOutput.protocol:type_name -> livekit.SegmentedFileProtocol - 5, // 26: livekit.SegmentedFileOutput.filename_suffix:type_name -> livekit.SegmentedFileSuffix - 28, // 27: livekit.SegmentedFileOutput.s3:type_name -> livekit.S3Upload - 29, // 28: livekit.SegmentedFileOutput.gcp:type_name -> livekit.GCPUpload - 30, // 29: livekit.SegmentedFileOutput.azure:type_name -> livekit.AzureBlobUpload - 31, // 30: livekit.SegmentedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 6, // 31: livekit.ImageOutput.filename_suffix:type_name -> livekit.ImageFileSuffix - 61, // 32: livekit.ImageOutput.image_codec:type_name -> livekit.ImageCodec - 28, // 33: livekit.ImageOutput.s3:type_name -> livekit.S3Upload - 29, // 34: livekit.ImageOutput.gcp:type_name -> livekit.GCPUpload - 30, // 35: livekit.ImageOutput.azure:type_name -> livekit.AzureBlobUpload - 31, // 36: livekit.ImageOutput.aliOSS:type_name -> livekit.AliOSSUpload - 28, // 37: livekit.StorageConfig.s3:type_name -> livekit.S3Upload - 29, // 38: livekit.StorageConfig.gcp:type_name -> livekit.GCPUpload - 30, // 39: livekit.StorageConfig.azure:type_name -> livekit.AzureBlobUpload - 31, // 40: livekit.StorageConfig.ali_oss:type_name -> livekit.AliOSSUpload - 56, // 41: livekit.S3Upload.metadata:type_name -> livekit.S3Upload.MetadataEntry - 32, // 42: livekit.S3Upload.proxy:type_name -> livekit.ProxyConfig - 32, // 43: livekit.GCPUpload.proxy:type_name -> livekit.ProxyConfig - 37, // 44: livekit.ListEgressResponse.items:type_name -> livekit.EgressInfo - 7, // 45: livekit.EgressInfo.source_type:type_name -> livekit.EgressSourceType - 8, // 46: livekit.EgressInfo.status:type_name -> livekit.EgressStatus - 11, // 47: livekit.EgressInfo.egress:type_name -> livekit.StartEgressRequest - 45, // 48: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest - 46, // 49: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest - 47, // 50: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest - 48, // 51: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest - 49, // 52: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest - 50, // 53: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest - 38, // 54: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo - 39, // 55: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo - 40, // 56: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo - 41, // 57: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo - 42, // 58: livekit.EgressInfo.mcap_results:type_name -> livekit.McapInfo - 55, // 59: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList - 39, // 60: livekit.EgressInfo.file:type_name -> livekit.FileInfo - 40, // 61: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo - 10, // 62: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status - 1, // 63: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 64: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions - 52, // 65: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 66: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput - 28, // 67: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload - 29, // 68: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload - 30, // 69: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload - 31, // 70: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload - 12, // 71: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource - 13, // 72: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource - 14, // 73: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource - 1, // 74: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 75: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions - 21, // 76: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output - 27, // 77: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig - 57, // 78: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig - 9, // 79: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing - 52, // 80: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 81: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 82: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 83: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 84: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 52, // 85: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 86: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 87: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 88: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 57, // 89: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 52, // 90: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 91: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 92: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 93: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 94: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions - 52, // 95: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 96: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 97: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 98: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 57, // 99: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 1, // 100: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 101: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions - 52, // 102: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 103: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 104: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 105: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 57, // 106: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 52, // 107: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 108: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 109: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 110: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 111: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 52, // 112: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 113: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 114: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 115: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 57, // 116: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 51, // 117: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput - 57, // 118: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 28, // 119: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload - 29, // 120: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload - 30, // 121: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload - 31, // 122: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 2, // 123: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType - 28, // 124: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload - 29, // 125: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload - 30, // 126: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload - 31, // 127: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 38, // 128: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo - 11, // 129: livekit.Egress.StartEgress:input_type -> livekit.StartEgressRequest - 35, // 130: livekit.Egress.UpdateEgress:input_type -> livekit.UpdateEgressRequest - 33, // 131: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest - 36, // 132: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest - 46, // 133: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest - 47, // 134: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest - 48, // 135: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest - 49, // 136: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest - 50, // 137: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest - 53, // 138: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest - 54, // 139: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest - 37, // 140: livekit.Egress.StartEgress:output_type -> livekit.EgressInfo - 37, // 141: livekit.Egress.UpdateEgress:output_type -> livekit.EgressInfo - 34, // 142: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse - 37, // 143: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo - 37, // 144: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo - 37, // 145: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo - 37, // 146: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo - 37, // 147: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo - 37, // 148: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo - 37, // 149: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo - 37, // 150: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo - 140, // [140:151] is the sub-list for method output_type - 129, // [129:140] is the sub-list for method input_type - 129, // [129:129] is the sub-list for extension type_name - 129, // [129:129] is the sub-list for extension extendee - 0, // [0:129] is the sub-list for field type_name + 26, // 21: livekit.Output.storage:type_name -> livekit.StorageConfig + 2, // 22: livekit.FileOutput.file_type:type_name -> livekit.EncodedFileType + 3, // 23: livekit.StreamOutput.protocol:type_name -> livekit.StreamProtocol + 4, // 24: livekit.SegmentedFileOutput.protocol:type_name -> livekit.SegmentedFileProtocol + 5, // 25: livekit.SegmentedFileOutput.filename_suffix:type_name -> livekit.SegmentedFileSuffix + 27, // 26: livekit.SegmentedFileOutput.s3:type_name -> livekit.S3Upload + 28, // 27: livekit.SegmentedFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 28: livekit.SegmentedFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 29: livekit.SegmentedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 6, // 30: livekit.ImageOutput.filename_suffix:type_name -> livekit.ImageFileSuffix + 59, // 31: livekit.ImageOutput.image_codec:type_name -> livekit.ImageCodec + 27, // 32: livekit.ImageOutput.s3:type_name -> livekit.S3Upload + 28, // 33: livekit.ImageOutput.gcp:type_name -> livekit.GCPUpload + 29, // 34: livekit.ImageOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 35: livekit.ImageOutput.aliOSS:type_name -> livekit.AliOSSUpload + 27, // 36: livekit.StorageConfig.s3:type_name -> livekit.S3Upload + 28, // 37: livekit.StorageConfig.gcp:type_name -> livekit.GCPUpload + 29, // 38: livekit.StorageConfig.azure:type_name -> livekit.AzureBlobUpload + 30, // 39: livekit.StorageConfig.ali_oss:type_name -> livekit.AliOSSUpload + 54, // 40: livekit.S3Upload.metadata:type_name -> livekit.S3Upload.MetadataEntry + 31, // 41: livekit.S3Upload.proxy:type_name -> livekit.ProxyConfig + 31, // 42: livekit.GCPUpload.proxy:type_name -> livekit.ProxyConfig + 36, // 43: livekit.ListEgressResponse.items:type_name -> livekit.EgressInfo + 7, // 44: livekit.EgressInfo.source_type:type_name -> livekit.EgressSourceType + 8, // 45: livekit.EgressInfo.status:type_name -> livekit.EgressStatus + 11, // 46: livekit.EgressInfo.egress:type_name -> livekit.StartEgressRequest + 43, // 47: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest + 44, // 48: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest + 45, // 49: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest + 46, // 50: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest + 47, // 51: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest + 48, // 52: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest + 37, // 53: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo + 38, // 54: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo + 39, // 55: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo + 40, // 56: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo + 53, // 57: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList + 38, // 58: livekit.EgressInfo.file:type_name -> livekit.FileInfo + 39, // 59: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo + 10, // 60: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status + 1, // 61: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 62: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions + 50, // 63: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput + 24, // 64: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput + 27, // 65: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload + 28, // 66: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload + 29, // 67: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload + 30, // 68: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload + 12, // 69: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource + 13, // 70: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource + 14, // 71: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource + 1, // 72: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 73: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions + 21, // 74: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output + 26, // 75: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig + 55, // 76: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig + 9, // 77: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing + 50, // 78: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 79: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 80: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 81: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 82: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 83: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 84: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 85: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 86: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 87: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 50, // 88: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 89: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 90: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 91: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 92: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 93: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 94: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 95: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 96: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 97: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 1, // 98: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 99: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 100: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 101: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 102: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 103: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 104: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 50, // 105: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 106: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 107: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 108: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 109: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 110: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 111: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 112: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 113: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 114: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 49, // 115: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput + 55, // 116: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 27, // 117: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload + 28, // 118: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 119: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 120: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 2, // 121: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType + 27, // 122: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload + 28, // 123: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 124: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 125: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 37, // 126: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo + 11, // 127: livekit.Egress.StartEgress:input_type -> livekit.StartEgressRequest + 34, // 128: livekit.Egress.UpdateEgress:input_type -> livekit.UpdateEgressRequest + 32, // 129: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest + 35, // 130: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest + 44, // 131: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest + 45, // 132: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest + 46, // 133: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest + 47, // 134: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest + 48, // 135: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest + 51, // 136: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest + 52, // 137: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest + 36, // 138: livekit.Egress.StartEgress:output_type -> livekit.EgressInfo + 36, // 139: livekit.Egress.UpdateEgress:output_type -> livekit.EgressInfo + 33, // 140: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse + 36, // 141: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo + 36, // 142: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo + 36, // 143: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo + 36, // 144: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo + 36, // 145: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo + 36, // 146: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo + 36, // 147: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo + 36, // 148: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo + 138, // [138:149] is the sub-list for method output_type + 127, // [127:138] is the sub-list for method input_type + 127, // [127:127] is the sub-list for extension type_name + 127, // [127:127] is the sub-list for extension extendee + 0, // [0:127] is the sub-list for field type_name } func init() { file_livekit_egress_proto_init() } @@ -6243,7 +6055,6 @@ func file_livekit_egress_proto_init() { (*Output_Stream)(nil), (*Output_Segments)(nil), (*Output_Images)(nil), - (*Output_Mcap)(nil), } file_livekit_egress_proto_msgTypes[13].OneofWrappers = []any{ (*SegmentedFileOutput_S3)(nil), @@ -6257,13 +6068,13 @@ func file_livekit_egress_proto_init() { (*ImageOutput_Azure)(nil), (*ImageOutput_AliOSS)(nil), } - file_livekit_egress_proto_msgTypes[16].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[15].OneofWrappers = []any{ (*StorageConfig_S3)(nil), (*StorageConfig_Gcp)(nil), (*StorageConfig_Azure)(nil), (*StorageConfig_AliOss)(nil), } - file_livekit_egress_proto_msgTypes[26].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[25].OneofWrappers = []any{ (*EgressInfo_Egress)(nil), (*EgressInfo_Replay)(nil), (*EgressInfo_RoomComposite)(nil), @@ -6275,59 +6086,59 @@ func file_livekit_egress_proto_init() { (*EgressInfo_File)(nil), (*EgressInfo_Segments)(nil), } - file_livekit_egress_proto_msgTypes[32].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[30].OneofWrappers = []any{ (*AutoParticipantEgress_Preset)(nil), (*AutoParticipantEgress_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[33].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[31].OneofWrappers = []any{ (*AutoTrackEgress_S3)(nil), (*AutoTrackEgress_Gcp)(nil), (*AutoTrackEgress_Azure)(nil), (*AutoTrackEgress_AliOSS)(nil), } - file_livekit_egress_proto_msgTypes[34].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[32].OneofWrappers = []any{ (*ExportReplayRequest_Template)(nil), (*ExportReplayRequest_Web)(nil), (*ExportReplayRequest_Media)(nil), (*ExportReplayRequest_Preset)(nil), (*ExportReplayRequest_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[35].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[33].OneofWrappers = []any{ (*RoomCompositeEgressRequest_File)(nil), (*RoomCompositeEgressRequest_Stream)(nil), (*RoomCompositeEgressRequest_Segments)(nil), (*RoomCompositeEgressRequest_Preset)(nil), (*RoomCompositeEgressRequest_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[36].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[34].OneofWrappers = []any{ (*WebEgressRequest_File)(nil), (*WebEgressRequest_Stream)(nil), (*WebEgressRequest_Segments)(nil), (*WebEgressRequest_Preset)(nil), (*WebEgressRequest_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[37].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[35].OneofWrappers = []any{ (*ParticipantEgressRequest_Preset)(nil), (*ParticipantEgressRequest_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[38].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[36].OneofWrappers = []any{ (*TrackCompositeEgressRequest_File)(nil), (*TrackCompositeEgressRequest_Stream)(nil), (*TrackCompositeEgressRequest_Segments)(nil), (*TrackCompositeEgressRequest_Preset)(nil), (*TrackCompositeEgressRequest_Advanced)(nil), } - file_livekit_egress_proto_msgTypes[39].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[37].OneofWrappers = []any{ (*TrackEgressRequest_File)(nil), (*TrackEgressRequest_WebsocketUrl)(nil), } - file_livekit_egress_proto_msgTypes[40].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[38].OneofWrappers = []any{ (*DirectFileOutput_S3)(nil), (*DirectFileOutput_Gcp)(nil), (*DirectFileOutput_Azure)(nil), (*DirectFileOutput_AliOSS)(nil), } - file_livekit_egress_proto_msgTypes[41].OneofWrappers = []any{ + file_livekit_egress_proto_msgTypes[39].OneofWrappers = []any{ (*EncodedFileOutput_S3)(nil), (*EncodedFileOutput_Gcp)(nil), (*EncodedFileOutput_Azure)(nil), @@ -6339,7 +6150,7 @@ func file_livekit_egress_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_livekit_egress_proto_rawDesc), len(file_livekit_egress_proto_rawDesc)), NumEnums: 11, - NumMessages: 46, + NumMessages: 44, NumExtensions: 0, NumServices: 1, }, diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index e9d314443..8aca39951 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -3312,276 +3312,271 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 4324 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0x1c, 0x5b, - 0x56, 0xae, 0xfe, 0xee, 0xd3, 0x1f, 0x2e, 0x5f, 0x3b, 0x7e, 0x1d, 0x27, 0xef, 0x25, 0xd3, 0xe1, - 0xe5, 0xc3, 0xcf, 0xe3, 0x18, 0x3b, 0x93, 0x97, 0xc9, 0x30, 0x6f, 0x68, 0xbb, 0xcb, 0x71, 0x4f, - 0x6c, 0xb7, 0xa9, 0x6e, 0xbf, 0x3c, 0x90, 0xa0, 0x54, 0xae, 0xba, 0xb6, 0x4b, 0xee, 0xae, 0xea, - 0xa9, 0xaa, 0x76, 0xe2, 0xf9, 0x05, 0x03, 0x0b, 0x40, 0x20, 0x81, 0x14, 0x09, 0xc1, 0x02, 0xb1, - 0x40, 0xb3, 0x62, 0xc3, 0x96, 0x3d, 0x20, 0x24, 0x10, 0x62, 0xcf, 0x12, 0x05, 0x8d, 0x58, 0xb0, - 0x47, 0xf7, 0xa3, 0xaa, 0x6e, 0x95, 0xcb, 0x4e, 0x3b, 0x0e, 0x6f, 0x36, 0xb3, 0x72, 0xdf, 0x73, - 0xce, 0xbd, 0x75, 0xee, 0x3d, 0x1f, 0xf7, 0x9c, 0x73, 0x8f, 0x61, 0x6e, 0x60, 0x9d, 0xe2, 0x13, - 0xcb, 0xd7, 0xf0, 0x91, 0x8b, 0x3d, 0x6f, 0x79, 0xe4, 0x3a, 0xbe, 0x83, 0x8a, 0x1c, 0xba, 0x10, - 0xa2, 0x87, 0x8e, 0x89, 0x07, 0x1c, 0xbd, 0x30, 0x37, 0x70, 0x8e, 0x8e, 0xb0, 0xfb, 0xd8, 0x19, - 0xf9, 0x96, 0x63, 0x73, 0x68, 0xf3, 0x3f, 0xb2, 0x80, 0x7a, 0xbe, 0xee, 0xfa, 0x0a, 0x5d, 0x4a, - 0xc5, 0x3f, 0x19, 0x63, 0xcf, 0x47, 0xb7, 0xa0, 0xec, 0x3a, 0xce, 0x50, 0xb3, 0xf5, 0x21, 0x6e, - 0x48, 0x77, 0xa5, 0x87, 0x65, 0xb5, 0x44, 0x00, 0xbb, 0xfa, 0x10, 0xa3, 0xef, 0x41, 0xc9, 0xc7, - 0xc3, 0xd1, 0x40, 0xf7, 0x71, 0x23, 0x73, 0x57, 0x7a, 0x58, 0x59, 0xfd, 0x64, 0x99, 0x7f, 0x72, - 0xb9, 0xcf, 0x11, 0x3d, 0x67, 0xec, 0x1a, 0x78, 0x6b, 0x4a, 0x0d, 0x49, 0xd1, 0x7d, 0xc8, 0xbe, - 0xc6, 0x07, 0x8d, 0x2c, 0x9d, 0x81, 0xc2, 0x19, 0xaf, 0xf0, 0x41, 0x48, 0x4c, 0x08, 0xd0, 0x12, - 0xe4, 0x87, 0xd8, 0xb4, 0xf4, 0x46, 0x8e, 0x52, 0xce, 0x85, 0x94, 0x3b, 0x04, 0x1a, 0xd2, 0x32, - 0x22, 0xf4, 0x0c, 0x0a, 0x23, 0x17, 0x7b, 0xd8, 0x6f, 0xe4, 0xef, 0x4a, 0x0f, 0xeb, 0xab, 0x9f, - 0x85, 0xe4, 0x8a, 0x6d, 0x38, 0xa6, 0x65, 0x1f, 0x75, 0xd9, 0x86, 0xf7, 0x28, 0xd5, 0x96, 0xa4, - 0x72, 0x7a, 0xf4, 0x14, 0x4a, 0xba, 0x79, 0xaa, 0xdb, 0x06, 0x36, 0x1b, 0x05, 0xfa, 0xa9, 0xc6, - 0x45, 0x73, 0xb7, 0x24, 0x35, 0xa4, 0x45, 0x8f, 0xa0, 0xe8, 0x8c, 0xfd, 0xd1, 0xd8, 0xf7, 0x1a, - 0xc5, 0xbb, 0xd9, 0x87, 0x95, 0xd5, 0xe9, 0x70, 0x5a, 0x97, 0xc2, 0xd5, 0x00, 0x8f, 0x56, 0xa0, - 0xe8, 0xf9, 0x8e, 0xab, 0x1f, 0xe1, 0x46, 0x89, 0x7e, 0x61, 0x3e, 0x24, 0xed, 0x31, 0xf8, 0x86, - 0x63, 0x1f, 0x5a, 0x47, 0x6a, 0x40, 0x86, 0x56, 0xa1, 0xf4, 0x1a, 0x1f, 0x1c, 0x3b, 0xce, 0x89, - 0xd7, 0x28, 0xd3, 0xd5, 0xe7, 0xc5, 0x93, 0x22, 0x08, 0x3e, 0x25, 0xa4, 0x5b, 0x2f, 0x41, 0xc1, - 0xa3, 0xa7, 0xb2, 0x0e, 0x50, 0xc2, 0x9c, 0xf3, 0xe6, 0x1f, 0x4a, 0x50, 0x8f, 0x4b, 0x03, 0xcd, - 0x43, 0x61, 0xa0, 0x9f, 0x39, 0x63, 0x9f, 0x8b, 0x94, 0x8f, 0xd0, 0xa7, 0x00, 0xfa, 0xd8, 0xb4, - 0x1c, 0xcd, 0xb1, 0x07, 0x67, 0x54, 0xa4, 0x25, 0xb5, 0x4c, 0x21, 0x5d, 0x7b, 0x70, 0x46, 0xd0, - 0xa7, 0x96, 0x89, 0x39, 0x3a, 0xcb, 0xd0, 0x14, 0x42, 0xd1, 0xf7, 0x61, 0xda, 0x18, 0x7b, 0xbe, - 0x33, 0xd4, 0x0e, 0x74, 0x0f, 0x6b, 0x63, 0x77, 0x40, 0x25, 0x57, 0x56, 0x6b, 0x0c, 0xbc, 0xae, - 0x7b, 0x78, 0xdf, 0x1d, 0x34, 0x7f, 0x5f, 0x82, 0x72, 0x28, 0x6c, 0x24, 0x43, 0x96, 0x50, 0x32, - 0x46, 0xc8, 0xcf, 0x6b, 0x72, 0xb1, 0x04, 0x48, 0x7f, 0xad, 0x5b, 0xbe, 0xe6, 0x11, 0x6d, 0xd6, - 0x3c, 0xeb, 0xc8, 0xd6, 0x19, 0x23, 0x25, 0x55, 0xa6, 0x18, 0xaa, 0xe6, 0x3d, 0x0a, 0x6f, 0xfe, - 0x42, 0x82, 0x8a, 0xa0, 0x4e, 0xe8, 0x19, 0xd4, 0xd9, 0xe2, 0xbe, 0xab, 0x1b, 0x27, 0x9a, 0x65, - 0x32, 0xc6, 0xd6, 0xe5, 0xb7, 0xef, 0x96, 0xaa, 0x14, 0xd3, 0x27, 0x88, 0x4e, 0x7b, 0x6b, 0x4a, - 0x15, 0xc7, 0x26, 0xda, 0x82, 0x99, 0x91, 0xee, 0xfa, 0x96, 0x61, 0x8d, 0x74, 0xdb, 0xd7, 0x28, - 0x8e, 0x5b, 0xc5, 0xcd, 0x50, 0x72, 0x7b, 0x11, 0xc5, 0xd7, 0x84, 0x60, 0x6b, 0x4a, 0x95, 0x47, - 0x09, 0x18, 0x5a, 0x84, 0x3c, 0xdd, 0x2d, 0xb7, 0x90, 0x48, 0xef, 0x5b, 0x04, 0xca, 0xa5, 0xce, - 0x48, 0xd0, 0x03, 0xc8, 0x99, 0xba, 0x1f, 0x98, 0xc8, 0x6c, 0x48, 0xda, 0xd6, 0x7d, 0x9d, 0x53, - 0x52, 0x82, 0xf5, 0x22, 0xe4, 0x29, 0x4b, 0xcd, 0xdf, 0x03, 0x39, 0xc9, 0x05, 0x5a, 0x80, 0x92, - 0x65, 0x62, 0xdb, 0xb7, 0xfc, 0xb3, 0xc0, 0xc8, 0x83, 0x31, 0x5a, 0x86, 0xd9, 0x91, 0x8b, 0x0f, - 0xb1, 0xab, 0x79, 0x86, 0x8b, 0xb1, 0xad, 0x79, 0xc7, 0xba, 0x8b, 0xb9, 0x58, 0x66, 0x18, 0xaa, - 0x47, 0x31, 0x3d, 0x82, 0x68, 0x3e, 0x87, 0x8a, 0xc0, 0x27, 0xfa, 0x02, 0x0a, 0xae, 0x33, 0xf6, - 0xb1, 0xd7, 0x90, 0xa8, 0x16, 0xcf, 0xc6, 0x77, 0xa3, 0x12, 0x9c, 0xca, 0x49, 0x9a, 0xff, 0x23, - 0x01, 0x44, 0x60, 0xf4, 0x10, 0x4a, 0x09, 0x31, 0x54, 0xde, 0xbe, 0x5b, 0x2a, 0xfa, 0xa1, 0x04, - 0xf8, 0x4f, 0x13, 0xad, 0xc1, 0x9c, 0x78, 0xf8, 0xe1, 0x66, 0x08, 0x97, 0xe5, 0xad, 0x29, 0x75, - 0x56, 0xc0, 0x76, 0x82, 0x9d, 0xfd, 0x18, 0xc4, 0xb3, 0xd7, 0x4e, 0x2c, 0xdb, 0xa4, 0x47, 0x5e, - 0x5f, 0xfd, 0x34, 0x4d, 0x60, 0x1d, 0xfb, 0xd0, 0x59, 0x7e, 0x69, 0xd9, 0xe6, 0xd6, 0x94, 0x3a, - 0x2d, 0x4c, 0x24, 0x20, 0xf4, 0x18, 0x8a, 0xc6, 0xb1, 0x6e, 0xdb, 0x98, 0xa9, 0x5a, 0x7d, 0xf5, - 0x46, 0x42, 0x6a, 0x0c, 0xa9, 0x06, 0x54, 0x44, 0x1e, 0x43, 0xdd, 0x37, 0x8e, 0x9b, 0x2d, 0x80, - 0x48, 0x58, 0x68, 0x0d, 0xca, 0x1e, 0x1e, 0x60, 0xc3, 0x77, 0xdc, 0xe0, 0xc4, 0x6e, 0xc4, 0x84, - 0xda, 0xe3, 0x58, 0x35, 0xa2, 0x23, 0x16, 0x5e, 0x15, 0x71, 0xff, 0xdf, 0x07, 0x37, 0x0f, 0x79, - 0xdf, 0x19, 0x59, 0x06, 0x3d, 0x2d, 0x42, 0xc5, 0x86, 0xd1, 0x9e, 0xfe, 0x35, 0x0b, 0xd3, 0x09, - 0xcf, 0x89, 0xe6, 0x20, 0xff, 0xda, 0x32, 0xfd, 0x63, 0xca, 0x50, 0x5e, 0x65, 0x03, 0xe2, 0x89, - 0x8e, 0xb1, 0x75, 0x74, 0xec, 0xd3, 0x2f, 0xe6, 0x55, 0x3e, 0x22, 0xd4, 0x26, 0x1e, 0xf9, 0xc7, - 0xf4, 0x13, 0x79, 0x95, 0x0d, 0xd0, 0x6d, 0x28, 0x1f, 0xba, 0xfa, 0x10, 0xbb, 0xe4, 0xc6, 0xc9, - 0x51, 0x4c, 0x04, 0x40, 0x4f, 0xa0, 0xc2, 0xfc, 0x86, 0xe1, 0x98, 0xd8, 0xe0, 0xd7, 0xc0, 0x6c, - 0xd2, 0x7a, 0x4c, 0x6c, 0xa8, 0xcc, 0xbf, 0xd0, 0xdf, 0xe8, 0x1e, 0xd4, 0xd8, 0xac, 0x03, 0xcb, - 0xa7, 0xeb, 0x16, 0xe8, 0xba, 0x55, 0x0a, 0x5c, 0x67, 0x30, 0xf4, 0x00, 0xa6, 0x19, 0xd1, 0xa1, - 0x4b, 0x2e, 0x46, 0xdb, 0x38, 0x6b, 0x14, 0x29, 0x59, 0x9d, 0x82, 0x37, 0x03, 0x28, 0xe1, 0x81, - 0xf9, 0x0f, 0xc6, 0x43, 0x29, 0xc1, 0x03, 0x35, 0x37, 0xce, 0xc3, 0x69, 0xf8, 0x9b, 0xf0, 0xc0, - 0x66, 0x05, 0x3c, 0x94, 0x19, 0x0f, 0x14, 0x18, 0xf0, 0xb0, 0x04, 0xe8, 0x04, 0x9f, 0x69, 0x74, - 0xbf, 0x9a, 0x65, 0xfb, 0xd8, 0x3d, 0xd5, 0x07, 0x0d, 0xb8, 0x2b, 0x3d, 0x94, 0x54, 0xf9, 0x04, - 0x9f, 0x6d, 0x12, 0x44, 0x87, 0xc3, 0xd1, 0x83, 0x60, 0x5b, 0x3f, 0x19, 0xeb, 0x03, 0x22, 0xd1, - 0x0a, 0x59, 0x72, 0x3d, 0xd3, 0x90, 0xf8, 0xd6, 0x7e, 0x8b, 0xc1, 0x09, 0x21, 0xfb, 0x76, 0x40, - 0x58, 0x8d, 0x08, 0x29, 0x82, 0x13, 0x36, 0xff, 0x3e, 0x03, 0x05, 0x76, 0xaf, 0xa1, 0x47, 0x90, - 0x3b, 0xb4, 0x06, 0x2c, 0x20, 0x10, 0x4d, 0x7a, 0xd3, 0x1a, 0x60, 0x46, 0xb2, 0x35, 0xa5, 0x52, - 0x12, 0xf4, 0x18, 0x0a, 0x9e, 0xef, 0x62, 0x7d, 0xc8, 0x7d, 0xe1, 0x0d, 0xe1, 0xe2, 0x23, 0xe0, - 0x90, 0x9c, 0x93, 0xa1, 0xe7, 0x50, 0xf2, 0xf0, 0xd1, 0x10, 0xdb, 0xbe, 0xc7, 0x1d, 0xe0, 0xed, - 0x68, 0x0a, 0x43, 0x60, 0x33, 0xf6, 0xa1, 0x90, 0x1e, 0x2d, 0x43, 0xc1, 0x1a, 0xea, 0x47, 0xd8, - 0x3b, 0x17, 0x32, 0x74, 0x08, 0x38, 0xfa, 0x16, 0xa3, 0x22, 0xfb, 0x18, 0x1a, 0xfa, 0x88, 0xaa, - 0x8a, 0xb8, 0x8f, 0x1d, 0x43, 0x1f, 0x45, 0xfb, 0x20, 0x24, 0xe2, 0x0d, 0x5e, 0x98, 0xe8, 0x06, - 0x27, 0xb7, 0xb1, 0x41, 0x41, 0xcd, 0x3f, 0x90, 0x00, 0x22, 0x8e, 0xd1, 0xf7, 0xa0, 0x4c, 0x8e, - 0x46, 0xf3, 0xcf, 0x46, 0xec, 0x08, 0xeb, 0xc9, 0x80, 0x83, 0x6d, 0xb0, 0x7f, 0x36, 0xc2, 0x6a, - 0xe9, 0x90, 0xff, 0x22, 0x4e, 0x9a, 0xfc, 0x1e, 0xe9, 0xfe, 0x31, 0x33, 0x4f, 0x35, 0x1c, 0xa3, - 0x47, 0x20, 0x9b, 0x96, 0xa7, 0x1f, 0x0c, 0xb0, 0x36, 0xd4, 0x6d, 0xeb, 0x10, 0x7b, 0x3e, 0xbf, - 0x19, 0xa7, 0x39, 0x7c, 0x87, 0x83, 0x9b, 0xaf, 0xa0, 0x2a, 0x9e, 0x3c, 0x5a, 0x83, 0x12, 0x8d, - 0x00, 0x0d, 0x67, 0xc0, 0x99, 0xf9, 0x24, 0x21, 0xa2, 0x3d, 0x8e, 0x56, 0x43, 0x42, 0x84, 0x20, - 0x37, 0x76, 0x07, 0x5e, 0x23, 0x73, 0x37, 0xfb, 0xb0, 0xac, 0xd2, 0xdf, 0xcd, 0xbf, 0xce, 0xc1, - 0x6c, 0x8a, 0x80, 0x88, 0x40, 0x13, 0x1f, 0xf8, 0x2c, 0x5d, 0xa0, 0x29, 0xdf, 0x79, 0x00, 0xd3, - 0x64, 0x8f, 0x24, 0xfa, 0xd4, 0xc8, 0x55, 0x63, 0xbd, 0xe1, 0x5b, 0xaf, 0x07, 0xe0, 0x3d, 0x0a, - 0x25, 0x16, 0x34, 0x1a, 0xe8, 0x67, 0x03, 0xcb, 0xf3, 0x59, 0xac, 0x4a, 0x5d, 0x93, 0x5a, 0x0d, - 0x80, 0x34, 0x5e, 0x5d, 0x02, 0x44, 0x3e, 0xac, 0xc5, 0x29, 0x2b, 0x94, 0x52, 0x26, 0x98, 0x3d, - 0x91, 0xfa, 0x11, 0xc8, 0x5c, 0xb1, 0x34, 0x73, 0xec, 0xea, 0xc4, 0x8b, 0x51, 0xb5, 0xaa, 0xa9, - 0xd3, 0x1c, 0xde, 0xe6, 0x60, 0xa4, 0x08, 0x6c, 0x7a, 0xe3, 0x43, 0xc2, 0x26, 0xd0, 0x9d, 0x5e, - 0xa0, 0xba, 0x3d, 0x4a, 0x13, 0x6d, 0x82, 0x8d, 0x53, 0xa5, 0x58, 0x4a, 0x95, 0x22, 0xba, 0x07, - 0x19, 0x6f, 0x8d, 0xeb, 0xed, 0x4c, 0xf4, 0x91, 0xb5, 0xfd, 0xd1, 0xc0, 0xd1, 0xc9, 0x0d, 0x95, - 0xf1, 0xd6, 0x48, 0xa0, 0x7d, 0x64, 0x8c, 0xb8, 0xbe, 0x46, 0x81, 0xf6, 0x8b, 0x8d, 0xbd, 0x90, - 0x8c, 0x10, 0xa0, 0x15, 0xc8, 0xeb, 0x3f, 0x1d, 0xbb, 0x98, 0xfa, 0x34, 0x31, 0xfa, 0x6d, 0x11, - 0xe8, 0xfa, 0xc0, 0x39, 0x08, 0xe9, 0x19, 0x21, 0xb1, 0x6a, 0x7d, 0x60, 0x75, 0x7b, 0x3d, 0xea, - 0xa9, 0x44, 0xab, 0x6e, 0x51, 0x70, 0x48, 0xcf, 0xc9, 0x88, 0x31, 0xb0, 0x58, 0xb8, 0xf9, 0xdf, - 0x59, 0xa8, 0x08, 0xd6, 0x48, 0x36, 0x6d, 0xe8, 0x23, 0x7f, 0xec, 0x0a, 0x4e, 0x4d, 0x62, 0xc7, - 0xcc, 0xe1, 0xa1, 0x4f, 0x0b, 0xaf, 0x90, 0x4c, 0xfa, 0x15, 0x92, 0x8d, 0x5d, 0x21, 0x29, 0xba, - 0x93, 0x4b, 0xd5, 0x9d, 0xd6, 0x79, 0xe9, 0xe5, 0x13, 0x56, 0x49, 0x19, 0xbe, 0x44, 0x72, 0x4f, - 0xa0, 0x42, 0x5d, 0x0a, 0x77, 0xfb, 0x85, 0x84, 0xdb, 0xa7, 0xd3, 0xb9, 0xdb, 0xb7, 0xc2, 0xdf, - 0xa9, 0xf2, 0x2e, 0x5e, 0x26, 0xef, 0xd2, 0x44, 0xf2, 0x2e, 0x4f, 0x2c, 0x6f, 0xb8, 0xba, 0xbc, - 0x2b, 0x57, 0x95, 0x77, 0x0f, 0x20, 0x72, 0xa7, 0x31, 0x27, 0x26, 0x4d, 0xe0, 0xc4, 0x32, 0xe9, - 0x4e, 0xec, 0x9f, 0x24, 0xa8, 0xc5, 0xdc, 0x2e, 0x3f, 0x20, 0x69, 0xa2, 0x03, 0xca, 0x4c, 0x7c, - 0x40, 0xd9, 0x49, 0x0f, 0x68, 0x05, 0x8a, 0xfa, 0xc0, 0xd2, 0x1c, 0x2f, 0xb8, 0x7a, 0x2e, 0x3f, - 0x21, 0xcf, 0x23, 0x29, 0xda, 0xc8, 0x75, 0xc8, 0x0d, 0xeb, 0x36, 0xff, 0x33, 0x07, 0xa5, 0x80, - 0x55, 0x74, 0x0f, 0x40, 0x37, 0x0c, 0xec, 0x79, 0xda, 0x09, 0xe6, 0xe1, 0xf8, 0x7a, 0xee, 0x67, - 0xef, 0x96, 0x24, 0xb5, 0xcc, 0xe0, 0x2f, 0xf1, 0x19, 0xba, 0x0d, 0x05, 0x0f, 0x1b, 0x2e, 0x66, - 0x27, 0x14, 0x10, 0x70, 0x18, 0x7a, 0x04, 0x35, 0x0f, 0x7b, 0x9e, 0xe5, 0xd8, 0x9a, 0xef, 0x9c, - 0x60, 0x9b, 0xf9, 0x38, 0x4e, 0x54, 0xe5, 0xa8, 0x3e, 0xc1, 0xa0, 0x25, 0x98, 0xd6, 0x3d, 0x6f, - 0x3c, 0xc4, 0x9a, 0xeb, 0x0c, 0xb0, 0xa6, 0xbb, 0x36, 0x0d, 0x00, 0x02, 0xe2, 0x1a, 0x43, 0xaa, - 0xce, 0x00, 0xb7, 0x5c, 0x1b, 0xf5, 0xe0, 0x13, 0x91, 0x1a, 0xbf, 0xf1, 0xb1, 0x6b, 0xeb, 0x03, - 0x12, 0x67, 0xd6, 0xe8, 0xac, 0xdb, 0x64, 0xd6, 0xdb, 0x77, 0x4b, 0x73, 0xd1, 0x3c, 0x85, 0x13, - 0x75, 0xda, 0x6a, 0x1a, 0xd4, 0x24, 0x06, 0xec, 0xe2, 0x23, 0xe2, 0x5e, 0x99, 0xd3, 0xe6, 0x23, - 0xa2, 0x2b, 0xd8, 0x36, 0x47, 0x8e, 0x65, 0xfb, 0xdc, 0x72, 0xc3, 0x31, 0x99, 0x73, 0x30, 0x36, - 0x4e, 0x78, 0xb6, 0x5f, 0x56, 0xf9, 0x08, 0x3d, 0x04, 0xf9, 0xd0, 0x71, 0x0d, 0xac, 0x11, 0x8d, - 0xd2, 0x3c, 0xff, 0x6c, 0xc0, 0xee, 0xeb, 0x92, 0x5a, 0xa7, 0xf0, 0x3d, 0xdd, 0x3f, 0xee, 0x11, - 0x28, 0xfa, 0x01, 0x94, 0x86, 0xd8, 0xd7, 0x69, 0xf6, 0xc4, 0xd2, 0xf7, 0x3b, 0xe7, 0xd4, 0x66, - 0x79, 0x87, 0x53, 0x28, 0xb6, 0xef, 0x9e, 0xa9, 0xe1, 0x04, 0xd4, 0x80, 0xa2, 0xaf, 0x1f, 0x1d, - 0x59, 0xf6, 0x11, 0xb5, 0xc9, 0xb2, 0x1a, 0x0c, 0xd1, 0x63, 0x98, 0x35, 0x1c, 0xdb, 0xa7, 0xb7, - 0x86, 0xe5, 0x8d, 0x1c, 0xcf, 0xa2, 0x17, 0x47, 0x99, 0x52, 0x21, 0x8e, 0x6a, 0x47, 0x18, 0x92, - 0xed, 0x8d, 0x5c, 0xe7, 0xcd, 0x19, 0x37, 0xc6, 0x28, 0x64, 0xd9, 0x23, 0xd0, 0x20, 0xdb, 0xa3, - 0x24, 0x0b, 0x3f, 0x80, 0x5a, 0x8c, 0x23, 0x92, 0x3c, 0x87, 0x4a, 0xa2, 0x92, 0x9f, 0xc4, 0x47, - 0x9e, 0xea, 0x83, 0x31, 0xe6, 0xf7, 0x24, 0x1b, 0x3c, 0xcf, 0x3c, 0x93, 0x9a, 0xaf, 0xa1, 0x1c, - 0x2a, 0x3a, 0xba, 0x0f, 0x15, 0xc3, 0xc5, 0x34, 0xa0, 0xd7, 0x07, 0x5e, 0x4c, 0xcb, 0x44, 0x84, - 0x70, 0xce, 0x99, 0xd8, 0x39, 0x87, 0x5c, 0x67, 0xdf, 0xcb, 0x75, 0xf3, 0x67, 0x12, 0x4c, 0x27, - 0x0c, 0x07, 0x3d, 0x80, 0xaa, 0x6e, 0x18, 0xce, 0xd8, 0xf6, 0x85, 0xd2, 0x52, 0xc0, 0x00, 0xc7, - 0xd0, 0x5b, 0xf8, 0x73, 0x08, 0x86, 0xd4, 0x1c, 0x44, 0x6d, 0x07, 0x8e, 0x20, 0xf6, 0xf0, 0x39, - 0xd4, 0xc9, 0xd9, 0xea, 0x96, 0x8d, 0x5d, 0x31, 0x00, 0xa8, 0x85, 0x50, 0xb2, 0x5a, 0xf3, 0x2f, - 0x24, 0xa8, 0x8a, 0xf6, 0xf8, 0x31, 0x8c, 0xed, 0x23, 0xaa, 0x6f, 0xf3, 0x77, 0xa1, 0x22, 0x1c, - 0x60, 0x4a, 0x6d, 0x64, 0x01, 0x4a, 0x63, 0x8f, 0x18, 0xce, 0x30, 0x90, 0x70, 0x38, 0x46, 0x77, - 0xa1, 0x34, 0xd2, 0x3d, 0xef, 0xb5, 0xe3, 0xb2, 0x3c, 0x36, 0x60, 0x34, 0x84, 0x36, 0x3d, 0x98, - 0xd9, 0xb6, 0xbc, 0xab, 0x94, 0xf8, 0x1e, 0x41, 0x99, 0xd5, 0x16, 0x89, 0x89, 0xb3, 0xdd, 0x57, - 0xdf, 0xbe, 0x5b, 0x2a, 0x31, 0x60, 0xa7, 0xad, 0x06, 0xbf, 0xa8, 0x19, 0xeb, 0x86, 0x6f, 0x9d, - 0x62, 0x1e, 0x79, 0xf2, 0x51, 0xf3, 0x47, 0x80, 0xc4, 0x8f, 0x7a, 0x23, 0xc7, 0xf6, 0xc8, 0xc2, - 0x79, 0xcb, 0xc7, 0xc3, 0xf3, 0x65, 0x01, 0x46, 0x47, 0x92, 0x6d, 0x95, 0x51, 0x34, 0xff, 0x41, - 0x82, 0xd9, 0xfd, 0x91, 0xa9, 0xfb, 0x38, 0xce, 0x78, 0x8c, 0x37, 0xe9, 0x52, 0xde, 0xf8, 0x41, - 0x66, 0xa2, 0x83, 0x8c, 0x4a, 0x60, 0xd9, 0x58, 0x09, 0xec, 0x3e, 0x4c, 0xeb, 0xa6, 0xa9, 0xb1, - 0x64, 0x44, 0xa3, 0x41, 0x6e, 0x8e, 0x06, 0xb9, 0x35, 0xdd, 0x34, 0x59, 0x3c, 0xbc, 0xef, 0x0e, - 0x3c, 0x12, 0x4b, 0xba, 0x78, 0xe8, 0x9c, 0xe2, 0x18, 0x69, 0x9e, 0x92, 0xca, 0x0c, 0x13, 0x51, - 0x37, 0xbf, 0x82, 0x99, 0x9e, 0xef, 0x8c, 0x3e, 0x94, 0xff, 0xe6, 0x9f, 0x57, 0x00, 0xa2, 0x83, - 0xb9, 0xca, 0xce, 0xef, 0x41, 0x91, 0x4a, 0x37, 0x14, 0x1f, 0xbc, 0x7d, 0xb7, 0x54, 0x20, 0xa0, - 0x4e, 0x5b, 0x65, 0x7f, 0xcd, 0xb8, 0x0a, 0xd4, 0x12, 0x2a, 0xf0, 0x1c, 0x2a, 0xac, 0xaa, 0xc8, - 0x12, 0x96, 0x05, 0x1a, 0xdb, 0xdc, 0x4c, 0xc8, 0x8b, 0x95, 0xcf, 0x68, 0xc6, 0x02, 0x5e, 0xf8, - 0x1b, 0x7d, 0x97, 0x64, 0x7f, 0xba, 0x3f, 0xf6, 0x78, 0x61, 0xe5, 0x46, 0x72, 0x1a, 0x45, 0xaa, - 0x9c, 0x08, 0x7d, 0x0a, 0x40, 0xab, 0x76, 0xd8, 0xd4, 0x74, 0x9f, 0x3a, 0xc4, 0xac, 0x5a, 0xe6, - 0x90, 0x96, 0x8f, 0x6e, 0x52, 0x8b, 0x62, 0xc8, 0x0a, 0x45, 0x16, 0xe9, 0xb8, 0x45, 0x2b, 0x97, - 0x63, 0xaa, 0x22, 0x14, 0x89, 0xd8, 0x4c, 0x0e, 0x69, 0x91, 0x94, 0xab, 0xc0, 0x4e, 0xa4, 0xf1, - 0x29, 0xf5, 0x57, 0xb7, 0x84, 0x14, 0x27, 0x59, 0xf3, 0x26, 0x77, 0x34, 0x23, 0x46, 0x4f, 0x89, - 0x69, 0x93, 0x6c, 0xa1, 0xf1, 0x59, 0x22, 0x13, 0x55, 0xde, 0x8c, 0x1c, 0xd7, 0x57, 0x29, 0x52, - 0x98, 0xc7, 0xa8, 0xd1, 0x36, 0xd4, 0xe9, 0x79, 0x1a, 0xce, 0x90, 0xfa, 0x79, 0xcc, 0x83, 0x82, - 0x7b, 0xe1, 0x7c, 0xd5, 0x71, 0x86, 0x1b, 0x01, 0x36, 0xf9, 0xf9, 0x9a, 0x2b, 0x62, 0xd1, 0x77, - 0x59, 0xbd, 0xbc, 0x9e, 0xa8, 0x25, 0xbe, 0xc2, 0x07, 0xc9, 0x89, 0xb4, 0x6c, 0xae, 0x40, 0x45, - 0x28, 0xda, 0x34, 0x66, 0xe9, 0xb4, 0xef, 0xa4, 0x55, 0xb4, 0x92, 0xd3, 0xc5, 0x79, 0xa8, 0x0b, - 0xd3, 0xac, 0x86, 0x14, 0x6d, 0x82, 0xa5, 0x1b, 0xbf, 0x16, 0xd5, 0xf8, 0x09, 0xfe, 0xc2, 0x5d, - 0xd4, 0xfd, 0x18, 0x1a, 0xad, 0x41, 0x9e, 0x42, 0x78, 0x3e, 0x72, 0x2b, 0xbe, 0x4c, 0x72, 0x36, - 0xa3, 0x45, 0xcf, 0xa1, 0xce, 0xed, 0xcb, 0xc5, 0xde, 0x78, 0xe0, 0x7b, 0x8d, 0xe9, 0x84, 0xbf, - 0x60, 0x56, 0x46, 0xfd, 0x45, 0x8d, 0x91, 0xaa, 0x8c, 0x12, 0x3d, 0x81, 0x2a, 0xcd, 0xb3, 0x83, - 0x99, 0x32, 0x9d, 0x39, 0x13, 0xab, 0x56, 0xd0, 0x79, 0x15, 0x42, 0x16, 0xcc, 0xfa, 0x0a, 0x82, - 0xf4, 0x2e, 0x9c, 0x38, 0x93, 0xa8, 0xc3, 0xf1, 0x5c, 0x8e, 0x39, 0xa9, 0x3a, 0xa7, 0x0e, 0xe6, - 0x3f, 0x83, 0x1a, 0x4b, 0x05, 0x82, 0xd9, 0x73, 0x09, 0x86, 0x69, 0x32, 0xc0, 0xe6, 0x56, 0x29, - 0xa5, 0xc0, 0xef, 0xd0, 0xd0, 0x47, 0xe1, 0xc4, 0xdb, 0x09, 0x7e, 0x49, 0x18, 0xcd, 0xf8, 0x25, - 0x64, 0xc1, 0xac, 0x39, 0xc8, 0x63, 0xd7, 0x75, 0x5c, 0x1e, 0x62, 0xb0, 0x01, 0xb1, 0x07, 0xfa, - 0x83, 0x26, 0x24, 0x8d, 0x79, 0x56, 0x2a, 0xa3, 0x10, 0x92, 0x7a, 0x90, 0xf8, 0xc5, 0xc4, 0xbe, - 0x6e, 0x0d, 0xbc, 0xc6, 0x0d, 0x16, 0xbf, 0xf0, 0x21, 0xfa, 0x02, 0x66, 0x82, 0xe0, 0x5b, 0x1b, - 0x38, 0x06, 0x4b, 0x7b, 0x3f, 0x61, 0x29, 0x72, 0x80, 0xd8, 0xe6, 0x70, 0xb4, 0x0c, 0xb3, 0x07, - 0xba, 0x71, 0x32, 0x1e, 0x69, 0xbc, 0xe8, 0xa1, 0x8d, 0x3d, 0x6c, 0x36, 0x6e, 0xb2, 0xda, 0x30, - 0x43, 0xf1, 0x30, 0x7d, 0xdf, 0xc3, 0x26, 0xba, 0x03, 0x15, 0x17, 0xfb, 0xee, 0x99, 0x46, 0xef, - 0xed, 0xc6, 0x2d, 0xca, 0x16, 0x50, 0xd0, 0x06, 0x81, 0x10, 0x3b, 0xe5, 0xd5, 0xa2, 0x62, 0xe2, - 0x3d, 0x29, 0x12, 0x33, 0xb9, 0x4c, 0xd6, 0x33, 0x0d, 0x69, 0x4b, 0x0a, 0x6b, 0x46, 0x5f, 0xf0, - 0x7a, 0x54, 0x32, 0x3f, 0x0a, 0x24, 0xcc, 0xc9, 0x59, 0x45, 0xea, 0x4b, 0xa1, 0xc0, 0x54, 0x4d, - 0xd6, 0xa4, 0x04, 0xc9, 0xf2, 0x49, 0x21, 0xf1, 0x7a, 0x19, 0x8a, 0x2e, 0xd3, 0x4f, 0x92, 0xde, - 0x30, 0x29, 0x35, 0x7f, 0x9e, 0x01, 0x88, 0x78, 0x4b, 0x7f, 0xcd, 0x10, 0x7c, 0x5a, 0xe6, 0x32, - 0x9f, 0x96, 0x8d, 0xfb, 0xb4, 0x05, 0x28, 0xc5, 0x0a, 0x0f, 0x59, 0x35, 0x1c, 0xa3, 0xd5, 0xd0, - 0xb1, 0xb2, 0x54, 0x75, 0x21, 0xe5, 0xa0, 0x96, 0x13, 0xde, 0x35, 0xd4, 0x94, 0x82, 0xa8, 0x29, - 0x4d, 0xa8, 0x0d, 0x74, 0x8f, 0x28, 0x3b, 0x11, 0x8c, 0xce, 0x32, 0xd0, 0xac, 0x5a, 0x21, 0x40, - 0x95, 0xc0, 0x5a, 0x3e, 0x51, 0x17, 0x82, 0xb6, 0xb0, 0x47, 0x8f, 0xb8, 0xa6, 0x06, 0xc3, 0xe6, - 0x32, 0x14, 0xd8, 0x57, 0x10, 0x40, 0xa1, 0xb5, 0xd1, 0xef, 0x7c, 0xad, 0xc8, 0x53, 0xa8, 0x0a, - 0xa5, 0xcd, 0xce, 0x6e, 0xa7, 0xb7, 0xa5, 0xb4, 0x65, 0x89, 0x60, 0x36, 0x5b, 0x9d, 0x6d, 0xa5, - 0x2d, 0x67, 0x9a, 0x3f, 0x97, 0xa0, 0x14, 0x48, 0x25, 0x48, 0x06, 0xc5, 0xc0, 0x23, 0x18, 0x7f, - 0xa4, 0x63, 0x2b, 0x24, 0x8e, 0x0d, 0x41, 0xce, 0xb3, 0x7e, 0x8a, 0xf9, 0x71, 0xd2, 0xdf, 0x84, - 0x3e, 0x54, 0x74, 0x16, 0x8d, 0x85, 0xe3, 0xe6, 0xbf, 0x65, 0xa0, 0x2a, 0xea, 0xc4, 0xf9, 0x3a, - 0x93, 0x34, 0x71, 0x9d, 0xa9, 0x74, 0x41, 0x9d, 0x49, 0xe4, 0x37, 0x73, 0x01, 0xbf, 0x59, 0x81, - 0xdf, 0x2f, 0x60, 0x26, 0x5c, 0x38, 0x64, 0x9c, 0x05, 0x98, 0x72, 0x80, 0x08, 0x2d, 0xf4, 0x09, - 0xcc, 0xc7, 0x59, 0x09, 0x67, 0x30, 0x77, 0x31, 0x27, 0xb2, 0x13, 0xce, 0xba, 0x47, 0xf2, 0x47, - 0xe6, 0x03, 0x99, 0xa5, 0xe6, 0xe9, 0xf7, 0xab, 0x1c, 0xc8, 0x6c, 0x35, 0x2e, 0xa1, 0xc2, 0x65, - 0x12, 0x2a, 0xc6, 0x24, 0xd4, 0xfc, 0x63, 0x09, 0x20, 0xf2, 0x82, 0x93, 0x17, 0x6a, 0xee, 0x44, - 0x55, 0x16, 0xc2, 0x94, 0x44, 0x57, 0x0d, 0x0a, 0x2a, 0xe7, 0x59, 0xba, 0x82, 0xd2, 0x34, 0xff, - 0x59, 0x82, 0x52, 0xe0, 0x5f, 0xbf, 0x05, 0xbd, 0xcc, 0x5d, 0x20, 0xe7, 0xfc, 0x05, 0x7a, 0x59, - 0x88, 0xeb, 0x25, 0x39, 0x89, 0xe0, 0x72, 0x26, 0x27, 0xc1, 0xce, 0x17, 0xf8, 0x85, 0x3b, 0xb6, - 0xfd, 0xe6, 0xdb, 0x0c, 0xdc, 0x68, 0x8d, 0x7d, 0xe7, 0xdc, 0x6d, 0x2f, 0xbc, 0x93, 0x4b, 0x13, - 0xbd, 0x93, 0x4f, 0xa5, 0xbe, 0x93, 0x67, 0xde, 0xf3, 0x4e, 0x3e, 0x25, 0xbc, 0x93, 0xff, 0x90, - 0xdf, 0xc3, 0xc1, 0x63, 0x79, 0x96, 0xde, 0x6b, 0x0b, 0x69, 0x25, 0x6f, 0xfe, 0x6e, 0x4e, 0x2f, - 0xe4, 0x2e, 0x7f, 0x3b, 0x57, 0xa2, 0x0b, 0x39, 0x58, 0x21, 0x47, 0x57, 0xb8, 0xf4, 0x5d, 0x20, - 0xbc, 0x97, 0xf9, 0x32, 0xc4, 0x7b, 0xf3, 0x8e, 0x87, 0xe6, 0x9f, 0x64, 0x60, 0x9a, 0x1c, 0x8e, - 0x10, 0x78, 0x5c, 0xb9, 0x30, 0x95, 0xbf, 0xac, 0x4e, 0x97, 0x99, 0xa8, 0x0c, 0x95, 0x9d, 0xb8, - 0x0c, 0x95, 0xbb, 0x7a, 0x9d, 0xae, 0x70, 0xd5, 0x3a, 0xdd, 0xdf, 0xe5, 0x60, 0x36, 0x25, 0xaa, - 0x25, 0xb9, 0x06, 0x8b, 0x6a, 0x13, 0xb9, 0x06, 0x03, 0x92, 0x5c, 0x83, 0xff, 0x32, 0x49, 0xee, - 0xc4, 0x1e, 0xdd, 0x9d, 0xc3, 0x43, 0x0f, 0xfb, 0xda, 0xd0, 0xe3, 0x06, 0x52, 0xa3, 0xe0, 0x2e, - 0x85, 0xee, 0x78, 0xe4, 0xca, 0xc1, 0xb6, 0x29, 0x50, 0x31, 0x4b, 0xa9, 0x60, 0xdb, 0x0c, 0x69, - 0xc4, 0xde, 0x92, 0xdc, 0x95, 0x7b, 0x4b, 0xf2, 0x13, 0xf7, 0x96, 0x14, 0xae, 0xd6, 0x5b, 0x52, - 0xbc, 0x46, 0x6f, 0x49, 0xe9, 0xc3, 0x7a, 0x4b, 0xca, 0x93, 0xf7, 0x96, 0xc0, 0xd5, 0x7b, 0x4b, - 0x2a, 0xd7, 0xea, 0x2d, 0xf9, 0xf7, 0x02, 0x2c, 0x5c, 0x9c, 0xca, 0x5c, 0x5e, 0x5a, 0x88, 0x32, - 0xf0, 0xcc, 0x25, 0x4d, 0x28, 0xd9, 0x64, 0xfb, 0xc7, 0x97, 0xc0, 0xde, 0x2f, 0xb5, 0xa1, 0xf5, - 0xc6, 0xb2, 0x8f, 0x1a, 0xd3, 0x54, 0x22, 0x89, 0x26, 0x89, 0x1d, 0x8a, 0x53, 0xd9, 0x7b, 0x30, - 0x1b, 0x24, 0xfa, 0x46, 0x72, 0x13, 0x74, 0xaf, 0xe4, 0x53, 0xba, 0x57, 0xd0, 0x13, 0x1e, 0x6b, - 0x32, 0xc5, 0xb9, 0xc4, 0x8b, 0xd1, 0xf8, 0x31, 0x78, 0x06, 0x5d, 0x4b, 0x04, 0xb6, 0xe9, 0xcf, - 0xa0, 0x7c, 0x4a, 0x10, 0xd6, 0x7e, 0x25, 0x44, 0xaa, 0xf0, 0xfe, 0xa7, 0x50, 0x3e, 0x3b, 0x7a, - 0x0e, 0x8d, 0xd4, 0xb6, 0x74, 0x0d, 0xb5, 0x2d, 0x5f, 0x41, 0x6d, 0x93, 0xae, 0xbe, 0x72, 0x35, - 0x57, 0xff, 0x1b, 0x61, 0xb6, 0x17, 0x2c, 0x50, 0x4d, 0xa6, 0x5e, 0xc2, 0x69, 0x05, 0xf9, 0xde, - 0x25, 0x17, 0x45, 0xed, 0xea, 0x17, 0x05, 0xfa, 0x7e, 0x90, 0xc0, 0x05, 0x8b, 0xd4, 0xe9, 0x22, - 0xa9, 0x6f, 0xc9, 0x3c, 0x83, 0x0b, 0xa6, 0x8a, 0x86, 0x25, 0x4f, 0x6e, 0x58, 0xec, 0x43, 0xe2, - 0x0d, 0xf5, 0xbf, 0x79, 0x90, 0x93, 0xf9, 0xfd, 0xb7, 0xd4, 0x29, 0x55, 0x4d, 0xef, 0x94, 0x0a, - 0xf5, 0x3e, 0xf7, 0x81, 0x7a, 0x9f, 0xff, 0x30, 0xbd, 0x2f, 0x5c, 0x4b, 0xef, 0xbf, 0x2d, 0x77, - 0x9d, 0xd4, 0xfb, 0xf2, 0x75, 0xf5, 0x1e, 0xae, 0xa7, 0xf7, 0x95, 0x8f, 0xa1, 0xf7, 0xb5, 0x0f, - 0xd2, 0xfb, 0xfa, 0x75, 0xf4, 0xfe, 0x6f, 0x72, 0xd0, 0xb8, 0xa8, 0x40, 0x75, 0xf9, 0x6d, 0x22, - 0xb6, 0xb0, 0x65, 0x12, 0x2d, 0x6c, 0xdf, 0x81, 0x6a, 0xac, 0x77, 0x8d, 0x59, 0x42, 0xc5, 0x8b, - 0xba, 0xd6, 0x04, 0x95, 0xc9, 0x5d, 0x23, 0x2a, 0xce, 0x5f, 0x23, 0x2a, 0x2e, 0x5c, 0x57, 0x65, - 0x8a, 0xd7, 0x53, 0x99, 0xd2, 0xc7, 0x50, 0x99, 0xf2, 0x07, 0xa9, 0x0c, 0x4c, 0xa8, 0x32, 0x82, - 0xa2, 0xfc, 0x51, 0x01, 0x6e, 0x5d, 0x52, 0x7e, 0xbc, 0x5c, 0x57, 0x9e, 0x02, 0x6b, 0xdb, 0x8a, - 0x9a, 0x3c, 0x33, 0x51, 0x93, 0x27, 0xc5, 0xf0, 0x26, 0x4f, 0x55, 0x1c, 0x99, 0x64, 0x5e, 0xa2, - 0x39, 0x34, 0x9b, 0xde, 0x1c, 0x9a, 0x68, 0x0d, 0xfd, 0x25, 0xb9, 0xce, 0xd2, 0xb5, 0x5c, 0x67, - 0xe1, 0x1a, 0xae, 0xb3, 0xf8, 0xab, 0x90, 0xe1, 0x43, 0xec, 0x60, 0xfa, 0x3a, 0xae, 0xf3, 0x17, - 0x12, 0xa0, 0xf3, 0x95, 0xf4, 0xcb, 0x0d, 0xe1, 0xbe, 0xd0, 0x27, 0x9a, 0x39, 0xd7, 0x27, 0x1a, - 0x75, 0x89, 0x3e, 0xe6, 0x0a, 0x9c, 0x4d, 0x3c, 0x41, 0xb4, 0x2d, 0x17, 0x1b, 0x7e, 0x4a, 0xd7, - 0xdf, 0xe7, 0x50, 0x7b, 0x8d, 0x0f, 0x3c, 0xc7, 0x38, 0xc1, 0x7e, 0xd4, 0x08, 0xbe, 0x35, 0xa5, - 0x56, 0x43, 0x30, 0x89, 0xa5, 0xc5, 0xcd, 0xe7, 0xaf, 0xba, 0xf9, 0xe6, 0x9f, 0x66, 0x40, 0x4e, - 0x72, 0xf0, 0xab, 0x3c, 0xfe, 0x1f, 0x33, 0x30, 0x73, 0xce, 0x66, 0xbe, 0xad, 0x9e, 0xc3, 0xc2, - 0x65, 0xa7, 0x99, 0x9d, 0xe8, 0x34, 0x73, 0x13, 0x9f, 0x66, 0xfe, 0xea, 0xa7, 0x59, 0xbc, 0xea, - 0x69, 0x7e, 0x13, 0x3c, 0x3d, 0x6f, 0xd3, 0xe4, 0xf4, 0x03, 0x9e, 0x9e, 0x2f, 0x48, 0x73, 0x9b, - 0x7f, 0x16, 0xbe, 0x6a, 0xf7, 0xf8, 0xab, 0xd5, 0x95, 0x97, 0xe6, 0x6f, 0xd5, 0x8c, 0x55, 0x4d, - 0x68, 0xc8, 0xac, 0xe9, 0xa6, 0xc9, 0x04, 0x9f, 0x78, 0xab, 0x16, 0x49, 0xb3, 0xe2, 0x5b, 0x75, - 0x44, 0xdd, 0xfc, 0x3e, 0xd4, 0xe3, 0x8f, 0x2d, 0xe8, 0x01, 0xe4, 0x2c, 0xfb, 0xd0, 0x39, 0xf7, - 0x54, 0x2f, 0x3c, 0xbd, 0x51, 0x82, 0xc5, 0x57, 0x50, 0x15, 0xbb, 0xdd, 0xd1, 0x3c, 0xa0, 0xd6, - 0x7e, 0xbb, 0xd3, 0xd5, 0x36, 0xb6, 0x5a, 0xbb, 0xbb, 0xca, 0xb6, 0xb6, 0xde, 0xed, 0x6f, 0xc9, - 0x53, 0xe7, 0xe1, 0xdb, 0xca, 0x66, 0x5f, 0x96, 0xd0, 0x27, 0x30, 0x1b, 0x87, 0xab, 0x9d, 0x17, - 0x5b, 0x7d, 0x39, 0xb3, 0xf8, 0x2f, 0x12, 0xdc, 0x48, 0xbd, 0x80, 0x90, 0x0c, 0xd5, 0xad, 0xd5, - 0xa7, 0x4f, 0xb4, 0x2f, 0x57, 0x57, 0xf6, 0xb4, 0xb5, 0x15, 0x79, 0x2a, 0x0e, 0x79, 0xba, 0x22, - 0x4b, 0x68, 0x06, 0x6a, 0x14, 0xf2, 0xeb, 0x2b, 0xcf, 0x18, 0x51, 0x26, 0x01, 0x7a, 0xba, 0x22, - 0x67, 0xd1, 0x4d, 0xb8, 0xb1, 0xd7, 0x55, 0xfb, 0x6a, 0xab, 0xd3, 0xd7, 0x62, 0x4b, 0xe6, 0x2e, - 0x40, 0x3d, 0x5d, 0x91, 0xf3, 0x68, 0x01, 0xe6, 0xe3, 0xa8, 0xf0, 0x23, 0x85, 0x8b, 0x70, 0x4f, - 0x57, 0xe4, 0xe2, 0xe2, 0x3a, 0xef, 0x90, 0x8f, 0xcc, 0x0e, 0xcd, 0x81, 0xdc, 0x56, 0x36, 0x5b, - 0xfb, 0xdb, 0x7d, 0x6d, 0xb3, 0xb3, 0xad, 0xf4, 0x7f, 0x7b, 0x4f, 0x91, 0xa7, 0x50, 0x11, 0xb2, - 0x3b, 0x7b, 0x4f, 0x64, 0x89, 0xfc, 0xe8, 0xbe, 0x78, 0x21, 0x67, 0x18, 0x64, 0x4d, 0xce, 0x2e, - 0x6e, 0x05, 0x92, 0x0a, 0x3a, 0x67, 0xc5, 0x25, 0xf6, 0xd4, 0x6e, 0xbf, 0xbb, 0xd1, 0xdd, 0x96, - 0xa7, 0x50, 0x09, 0x72, 0x6a, 0x7f, 0x67, 0x8f, 0xad, 0xd1, 0x53, 0xfb, 0x72, 0x06, 0xd5, 0xa0, - 0xfc, 0x4a, 0x59, 0xef, 0x75, 0x37, 0x5e, 0x2a, 0x7d, 0x39, 0xbb, 0xb8, 0x0b, 0x37, 0x52, 0x5b, - 0x71, 0xd1, 0x3d, 0xb8, 0x13, 0x2c, 0xd8, 0x53, 0x5e, 0xec, 0x28, 0xbb, 0x7d, 0xa5, 0x4d, 0xb9, - 0x13, 0xd7, 0x27, 0x27, 0xbe, 0xdd, 0x8b, 0x20, 0xd2, 0xe2, 0xe3, 0x44, 0x2b, 0x30, 0x6f, 0x93, - 0x2c, 0x43, 0xbe, 0xb3, 0xdb, 0x56, 0xbe, 0x91, 0xa7, 0x08, 0x03, 0xfd, 0xce, 0x8e, 0xd2, 0xeb, - 0xb7, 0x08, 0x63, 0x8b, 0x87, 0x30, 0x9d, 0xe8, 0xb1, 0x24, 0x4a, 0xd2, 0xd9, 0x69, 0xbd, 0x50, - 0xb4, 0xde, 0xfe, 0xe6, 0x66, 0xe7, 0x1b, 0x2d, 0x98, 0xb9, 0x00, 0xf3, 0x31, 0xb8, 0xb0, 0x0c, - 0xba, 0x03, 0xb7, 0x62, 0xb8, 0xdd, 0xee, 0xae, 0xa2, 0x75, 0xbf, 0x56, 0xd4, 0x57, 0x6a, 0xa7, - 0xaf, 0xc8, 0x99, 0xc5, 0x1f, 0x83, 0x9c, 0x6c, 0x58, 0x20, 0x0b, 0x2a, 0x2f, 0x54, 0xa5, 0xd7, - 0xd3, 0x7a, 0xdd, 0x7d, 0x75, 0x43, 0xd1, 0xc8, 0xc9, 0x6b, 0xaf, 0x94, 0x75, 0xf6, 0xb1, 0x14, - 0x5c, 0xaf, 0xfd, 0x52, 0x96, 0x16, 0xff, 0x52, 0x82, 0xaa, 0xd8, 0xc6, 0x80, 0x66, 0x61, 0x3a, - 0x20, 0xee, 0xb7, 0xd4, 0x7e, 0x67, 0xf7, 0x85, 0x3c, 0x45, 0x34, 0x8d, 0x03, 0xf9, 0xf3, 0x98, - 0x24, 0x80, 0x94, 0xdd, 0x36, 0xa1, 0xca, 0x08, 0x53, 0x37, 0xba, 0x3b, 0x7b, 0xdb, 0x4a, 0x5f, - 0x91, 0xb3, 0x02, 0x1d, 0x7f, 0x3f, 0xcb, 0x21, 0x04, 0xf5, 0x60, 0xb5, 0xf5, 0xae, 0xda, 0x57, - 0xda, 0x72, 0x1e, 0x35, 0x60, 0x8e, 0xc3, 0xb6, 0x3b, 0x3b, 0x9d, 0xbe, 0xa6, 0x2a, 0xad, 0x8d, - 0x2d, 0xa5, 0x2d, 0x17, 0x16, 0xf7, 0xf9, 0xff, 0xe2, 0xf0, 0x0a, 0x18, 0x82, 0x7a, 0x20, 0xcc, - 0x9d, 0xce, 0x37, 0x8c, 0xbd, 0x79, 0x40, 0xed, 0xfd, 0xd6, 0x76, 0x68, 0x71, 0xad, 0x17, 0xca, - 0x2e, 0x31, 0xc5, 0x05, 0x98, 0x8f, 0xc3, 0xb7, 0xfb, 0x8a, 0xba, 0xdb, 0x22, 0x87, 0xb8, 0xfa, - 0x57, 0x05, 0x28, 0xf0, 0xb2, 0xf9, 0x8f, 0xa0, 0x22, 0x74, 0x50, 0xa0, 0xcb, 0xfa, 0x2a, 0x16, - 0xd2, 0x7a, 0x7c, 0x50, 0x0b, 0xaa, 0x62, 0x6f, 0x0f, 0x8a, 0x02, 0xaf, 0x94, 0x96, 0x9f, 0xf4, - 0x25, 0x14, 0x80, 0xa8, 0xc1, 0x08, 0x45, 0x91, 0xe3, 0xb9, 0x56, 0xa7, 0x85, 0x5b, 0xa9, 0x38, - 0xde, 0x91, 0xf4, 0x43, 0x80, 0xa8, 0x47, 0x07, 0x89, 0x0f, 0xaa, 0x89, 0xc6, 0x9d, 0x74, 0x2e, - 0xfa, 0xd0, 0xa0, 0x7b, 0x4e, 0x29, 0x87, 0xa2, 0x49, 0xfa, 0x3e, 0xd2, 0x57, 0xfd, 0x4d, 0x62, - 0xe2, 0xba, 0xeb, 0x87, 0xc5, 0x20, 0x74, 0x71, 0x03, 0x48, 0xfa, 0x0a, 0x7b, 0x30, 0x4f, 0x57, - 0x38, 0xff, 0x12, 0xf4, 0xfe, 0x9e, 0x90, 0xf4, 0x15, 0xbf, 0x86, 0x9b, 0x74, 0xc5, 0xb4, 0xfc, - 0x0b, 0x4d, 0xd4, 0x1d, 0x92, 0xbe, 0x6e, 0x1b, 0xe4, 0x68, 0xdd, 0x73, 0x0a, 0x75, 0x3e, 0xb6, - 0x7d, 0x8f, 0x42, 0xb1, 0x1b, 0xfb, 0x9c, 0x42, 0xc5, 0x2e, 0xf2, 0xf7, 0x2c, 0xc1, 0xbc, 0xeb, - 0xb9, 0x25, 0x62, 0x17, 0x76, 0xea, 0x12, 0xeb, 0x9b, 0xbf, 0x73, 0xef, 0xc8, 0xf2, 0x8f, 0xc7, - 0x07, 0xcb, 0x86, 0x33, 0x7c, 0xcc, 0x09, 0x1e, 0x07, 0xff, 0xd7, 0x10, 0x00, 0xfe, 0x36, 0x53, - 0xdb, 0xb6, 0x4e, 0xf1, 0x4b, 0xd6, 0x37, 0xe9, 0x3b, 0xff, 0x95, 0xa9, 0xf3, 0xf1, 0xf3, 0xe7, - 0x14, 0x70, 0x50, 0xa0, 0x53, 0xd6, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x2d, 0xf7, 0x77, - 0xea, 0x3b, 0x00, 0x00, + // 4246 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0x1b, 0x49, + 0x76, 0x6a, 0x7e, 0xf3, 0xf1, 0xab, 0x55, 0x92, 0x65, 0x5a, 0x9e, 0x19, 0x7b, 0xe9, 0x8c, 0x3f, + 0x34, 0x5a, 0x59, 0x91, 0xbc, 0x1e, 0xaf, 0x37, 0x3b, 0x1b, 0x4a, 0x6c, 0x99, 0x5c, 0x4b, 0xa2, + 0xd2, 0xa4, 0xc6, 0x93, 0x00, 0x49, 0xa3, 0xc5, 0x2e, 0x49, 0x0d, 0x91, 0xdd, 0xdc, 0xee, 0xa6, + 0x6c, 0xed, 0x2f, 0xd8, 0x04, 0x41, 0x12, 0x24, 0x40, 0x0e, 0x06, 0x82, 0xe4, 0x10, 0xe4, 0x10, + 0xec, 0x29, 0xbf, 0x20, 0xf7, 0x04, 0x08, 0x90, 0x20, 0xc8, 0x39, 0x39, 0x06, 0x0e, 0x16, 0x39, + 0xe4, 0x1e, 0xd4, 0x47, 0x77, 0x17, 0x9b, 0x2d, 0x9a, 0xb2, 0x9c, 0xc9, 0x65, 0x4e, 0x62, 0xbd, + 0xf7, 0xaa, 0xfa, 0x55, 0xbd, 0x8f, 0x7a, 0xef, 0xd5, 0x13, 0x2c, 0xf6, 0xcd, 0x73, 0x7c, 0x66, + 0x7a, 0x1a, 0x3e, 0x71, 0xb0, 0xeb, 0xae, 0x0d, 0x1d, 0xdb, 0xb3, 0x51, 0x96, 0x43, 0x97, 0x03, + 0xf4, 0xc0, 0x36, 0x70, 0x9f, 0xa3, 0x97, 0x17, 0xfb, 0xf6, 0xc9, 0x09, 0x76, 0x1e, 0xdb, 0x43, + 0xcf, 0xb4, 0x2d, 0x0e, 0xad, 0xfd, 0x5b, 0x12, 0x50, 0xc7, 0xd3, 0x1d, 0x4f, 0xa1, 0x4b, 0xa9, + 0xf8, 0x67, 0x23, 0xec, 0x7a, 0xe8, 0x36, 0xe4, 0x1d, 0xdb, 0x1e, 0x68, 0x96, 0x3e, 0xc0, 0x55, + 0xe9, 0xae, 0xf4, 0x30, 0xaf, 0xe6, 0x08, 0x60, 0x5f, 0x1f, 0x60, 0xf4, 0x03, 0xc8, 0x79, 0x78, + 0x30, 0xec, 0xeb, 0x1e, 0xae, 0x26, 0xee, 0x4a, 0x0f, 0x0b, 0x1b, 0x37, 0xd7, 0xf8, 0x27, 0xd7, + 0xba, 0x1c, 0xd1, 0xb1, 0x47, 0x4e, 0x0f, 0x37, 0xe7, 0xd4, 0x80, 0x14, 0xdd, 0x87, 0xe4, 0x6b, + 0x7c, 0x54, 0x4d, 0xd2, 0x19, 0x28, 0x98, 0xf1, 0x0a, 0x1f, 0x05, 0xc4, 0x84, 0x00, 0xad, 0x42, + 0x7a, 0x80, 0x0d, 0x53, 0xaf, 0xa6, 0x28, 0xe5, 0x62, 0x40, 0xb9, 0x47, 0xa0, 0x01, 0x2d, 0x23, + 0x42, 0xcf, 0x20, 0x33, 0x74, 0xb0, 0x8b, 0xbd, 0x6a, 0xfa, 0xae, 0xf4, 0xb0, 0xbc, 0xf1, 0x59, + 0x40, 0xae, 0x58, 0x3d, 0xdb, 0x30, 0xad, 0x93, 0x36, 0xdb, 0xf0, 0x01, 0xa5, 0x6a, 0x4a, 0x2a, + 0xa7, 0x47, 0x4f, 0x21, 0xa7, 0x1b, 0xe7, 0xba, 0xd5, 0xc3, 0x46, 0x35, 0x43, 0x3f, 0x55, 0xbd, + 0x6c, 0x6e, 0x53, 0x52, 0x03, 0x5a, 0xf4, 0x08, 0xb2, 0xf6, 0xc8, 0x1b, 0x8e, 0x3c, 0xb7, 0x9a, + 0xbd, 0x9b, 0x7c, 0x58, 0xd8, 0xa8, 0x04, 0xd3, 0xda, 0x14, 0xae, 0xfa, 0x78, 0xb4, 0x0e, 0x59, + 0xd7, 0xb3, 0x1d, 0xfd, 0x04, 0x57, 0x73, 0xf4, 0x0b, 0x4b, 0x01, 0x69, 0x87, 0xc1, 0xb7, 0x6d, + 0xeb, 0xd8, 0x3c, 0x51, 0x7d, 0x32, 0xb4, 0x01, 0xb9, 0xd7, 0xf8, 0xe8, 0xd4, 0xb6, 0xcf, 0xdc, + 0x6a, 0x9e, 0xae, 0xbe, 0x24, 0x9e, 0x14, 0x41, 0xf0, 0x29, 0x01, 0xdd, 0x56, 0x0e, 0x32, 0x2e, + 0x3d, 0x95, 0x2d, 0x80, 0x1c, 0xe6, 0x9c, 0xd7, 0xfe, 0x48, 0x82, 0xf2, 0xb8, 0x34, 0xd0, 0x12, + 0x64, 0xfa, 0xfa, 0x85, 0x3d, 0xf2, 0xb8, 0x48, 0xf9, 0x08, 0x7d, 0x0a, 0xa0, 0x8f, 0x0c, 0xd3, + 0xd6, 0x6c, 0xab, 0x7f, 0x41, 0x45, 0x9a, 0x53, 0xf3, 0x14, 0xd2, 0xb6, 0xfa, 0x17, 0x04, 0x7d, + 0x6e, 0x1a, 0x98, 0xa3, 0x93, 0x0c, 0x4d, 0x21, 0x14, 0x7d, 0x1f, 0x2a, 0xbd, 0x91, 0xeb, 0xd9, + 0x03, 0xed, 0x48, 0x77, 0xb1, 0x36, 0x72, 0xfa, 0x54, 0x72, 0x79, 0xb5, 0xc4, 0xc0, 0x5b, 0xba, + 0x8b, 0x0f, 0x9d, 0x7e, 0xed, 0xf7, 0x25, 0xc8, 0x07, 0xc2, 0x46, 0x32, 0x24, 0x09, 0x25, 0x63, + 0x84, 0xfc, 0xbc, 0x26, 0x17, 0xab, 0x80, 0xf4, 0xd7, 0xba, 0xe9, 0x69, 0x2e, 0xd1, 0x66, 0xcd, + 0x35, 0x4f, 0x2c, 0x9d, 0x31, 0x92, 0x53, 0x65, 0x8a, 0xa1, 0x6a, 0xde, 0xa1, 0xf0, 0xda, 0xaf, + 0x24, 0x28, 0x08, 0xea, 0x84, 0x9e, 0x41, 0x99, 0x2d, 0xee, 0x39, 0x7a, 0xef, 0x4c, 0x33, 0x0d, + 0xc6, 0xd8, 0x96, 0xfc, 0xf6, 0xdd, 0x6a, 0x91, 0x62, 0xba, 0x04, 0xd1, 0x6a, 0x34, 0xe7, 0x54, + 0x71, 0x6c, 0xa0, 0x26, 0xcc, 0x0f, 0x75, 0xc7, 0x33, 0x7b, 0xe6, 0x50, 0xb7, 0x3c, 0x8d, 0xe2, + 0xb8, 0x55, 0xdc, 0x0a, 0x24, 0x77, 0x10, 0x52, 0x7c, 0x4d, 0x08, 0x9a, 0x73, 0xaa, 0x3c, 0x8c, + 0xc0, 0xd0, 0x0a, 0xa4, 0xe9, 0x6e, 0xb9, 0x85, 0x84, 0x7a, 0x5f, 0x27, 0x50, 0x2e, 0x75, 0x46, + 0x82, 0x1e, 0x40, 0xca, 0xd0, 0x3d, 0xdf, 0x44, 0x16, 0x02, 0xd2, 0x86, 0xee, 0xe9, 0x9c, 0x92, + 0x12, 0x6c, 0x65, 0x21, 0x4d, 0x59, 0xaa, 0xfd, 0x1e, 0xc8, 0x51, 0x2e, 0xd0, 0x32, 0xe4, 0x4c, + 0x03, 0x5b, 0x9e, 0xe9, 0x5d, 0xf8, 0x46, 0xee, 0x8f, 0xd1, 0x1a, 0x2c, 0x0c, 0x1d, 0x7c, 0x8c, + 0x1d, 0xcd, 0xed, 0x39, 0x18, 0x5b, 0x9a, 0x7b, 0xaa, 0x3b, 0x98, 0x8b, 0x65, 0x9e, 0xa1, 0x3a, + 0x14, 0xd3, 0x21, 0x88, 0xda, 0x73, 0x28, 0x08, 0x7c, 0xa2, 0x2f, 0x20, 0xe3, 0xd8, 0x23, 0x0f, + 0xbb, 0x55, 0x89, 0x6a, 0xf1, 0xc2, 0xf8, 0x6e, 0x54, 0x82, 0x53, 0x39, 0x49, 0xed, 0xbf, 0x25, + 0x80, 0x10, 0x8c, 0x1e, 0x42, 0x2e, 0x22, 0x86, 0xc2, 0xdb, 0x77, 0xab, 0x59, 0x2f, 0x90, 0x00, + 0xff, 0x69, 0xa0, 0x4d, 0x58, 0x14, 0x0f, 0x3f, 0xd8, 0x0c, 0xe1, 0x32, 0xdf, 0x9c, 0x53, 0x17, + 0x04, 0x6c, 0xcb, 0xdf, 0xd9, 0x4f, 0x41, 0x3c, 0x7b, 0xed, 0xcc, 0xb4, 0x0c, 0x7a, 0xe4, 0xe5, + 0x8d, 0x4f, 0xe3, 0x04, 0xd6, 0xb2, 0x8e, 0xed, 0xb5, 0x97, 0xa6, 0x65, 0x34, 0xe7, 0xd4, 0x8a, + 0x30, 0x91, 0x80, 0xd0, 0x63, 0xc8, 0xf6, 0x4e, 0x75, 0xcb, 0xc2, 0x4c, 0xd5, 0xca, 0x1b, 0x37, + 0x22, 0x52, 0x63, 0x48, 0xd5, 0xa7, 0x22, 0xf2, 0x18, 0xe8, 0x5e, 0xef, 0xb4, 0x56, 0x07, 0x08, + 0x85, 0x85, 0x36, 0x21, 0xef, 0xe2, 0x3e, 0xee, 0x79, 0xb6, 0xe3, 0x9f, 0xd8, 0x8d, 0x31, 0xa1, + 0x76, 0x38, 0x56, 0x0d, 0xe9, 0x88, 0x85, 0x17, 0x45, 0xdc, 0xff, 0xf5, 0xc1, 0x2d, 0x41, 0xda, + 0xb3, 0x87, 0x66, 0x8f, 0x9e, 0x16, 0xa1, 0x62, 0xc3, 0x70, 0x4f, 0xff, 0x9c, 0x84, 0x4a, 0xc4, + 0x73, 0xa2, 0x45, 0x48, 0xbf, 0x36, 0x0d, 0xef, 0x94, 0x32, 0x94, 0x56, 0xd9, 0x80, 0x78, 0xa2, + 0x53, 0x6c, 0x9e, 0x9c, 0x7a, 0xf4, 0x8b, 0x69, 0x95, 0x8f, 0x08, 0xb5, 0x81, 0x87, 0xde, 0x29, + 0xfd, 0x44, 0x5a, 0x65, 0x03, 0xf4, 0x09, 0xe4, 0x8f, 0x1d, 0x7d, 0x80, 0x1d, 0x72, 0xe3, 0xa4, + 0x28, 0x26, 0x04, 0xa0, 0x27, 0x50, 0x60, 0x7e, 0xa3, 0x67, 0x1b, 0xb8, 0xc7, 0xaf, 0x81, 0x85, + 0xa8, 0xf5, 0x18, 0xb8, 0xa7, 0x32, 0xff, 0x42, 0x7f, 0xa3, 0x7b, 0x50, 0x62, 0xb3, 0x8e, 0x4c, + 0x8f, 0xae, 0x9b, 0xa1, 0xeb, 0x16, 0x29, 0x70, 0x8b, 0xc1, 0xd0, 0x03, 0xa8, 0x30, 0xa2, 0x63, + 0x87, 0x5c, 0x8c, 0x56, 0xef, 0xa2, 0x9a, 0xa5, 0x64, 0x65, 0x0a, 0xde, 0xf1, 0xa1, 0x84, 0x07, + 0xe6, 0x3f, 0x18, 0x0f, 0xb9, 0x08, 0x0f, 0xd4, 0xdc, 0x38, 0x0f, 0xe7, 0xc1, 0x6f, 0xc2, 0x03, + 0x9b, 0xe5, 0xf3, 0x90, 0x67, 0x3c, 0x50, 0xa0, 0xcf, 0xc3, 0x2a, 0xa0, 0x33, 0x7c, 0xa1, 0xd1, + 0xfd, 0x6a, 0xa6, 0xe5, 0x61, 0xe7, 0x5c, 0xef, 0x57, 0xe1, 0xae, 0xf4, 0x50, 0x52, 0xe5, 0x33, + 0x7c, 0xb1, 0x43, 0x10, 0x2d, 0x0e, 0x47, 0x0f, 0xfc, 0x6d, 0xfd, 0x6c, 0xa4, 0xf7, 0x89, 0x44, + 0x0b, 0x64, 0xc9, 0xad, 0x44, 0x55, 0xe2, 0x5b, 0xfb, 0x2d, 0x06, 0x27, 0x84, 0xec, 0xdb, 0x3e, + 0x61, 0x31, 0x24, 0xa4, 0x08, 0x4e, 0x58, 0xfb, 0xc3, 0x04, 0x64, 0xd8, 0xbd, 0x86, 0x1e, 0x41, + 0xea, 0xd8, 0xec, 0xb3, 0x80, 0x40, 0x34, 0xe9, 0x1d, 0xb3, 0x8f, 0x19, 0x49, 0x73, 0x4e, 0xa5, + 0x24, 0xe8, 0x31, 0x64, 0x5c, 0xcf, 0xc1, 0xfa, 0x80, 0xfb, 0xc2, 0x1b, 0xc2, 0xc5, 0x47, 0xc0, + 0x01, 0x39, 0x27, 0x43, 0xcf, 0x21, 0xe7, 0xe2, 0x93, 0x01, 0xb6, 0x3c, 0x97, 0x3b, 0xc0, 0x4f, + 0xc2, 0x29, 0x0c, 0x81, 0x8d, 0xb1, 0x0f, 0x05, 0xf4, 0x68, 0x0d, 0x32, 0xe6, 0x40, 0x3f, 0xc1, + 0xee, 0x44, 0xc8, 0xd0, 0x22, 0xe0, 0xf0, 0x5b, 0x8c, 0x4a, 0xbc, 0x96, 0x33, 0x33, 0x5d, 0xcb, + 0xe4, 0x8a, 0xed, 0x51, 0x50, 0xed, 0x0f, 0x24, 0x80, 0x90, 0x0d, 0xf4, 0x03, 0xc8, 0x93, 0xfd, + 0x6a, 0xde, 0xc5, 0x90, 0x9d, 0x4b, 0x39, 0x1a, 0x45, 0x30, 0xae, 0xbb, 0x17, 0x43, 0xac, 0xe6, + 0x8e, 0xf9, 0x2f, 0xe2, 0x79, 0xc9, 0xef, 0xa1, 0xee, 0x9d, 0x32, 0x9b, 0x53, 0x83, 0x31, 0x7a, + 0x04, 0xb2, 0x61, 0xba, 0xfa, 0x51, 0x1f, 0x6b, 0x03, 0xdd, 0x32, 0x8f, 0xb1, 0xeb, 0xf1, 0xeb, + 0xae, 0xc2, 0xe1, 0x7b, 0x1c, 0x5c, 0x7b, 0x05, 0x45, 0xf1, 0x38, 0xd1, 0x26, 0xe4, 0x68, 0x58, + 0xd7, 0xb3, 0xfb, 0x9c, 0x99, 0x9b, 0x91, 0x73, 0x3f, 0xe0, 0x68, 0x35, 0x20, 0x44, 0x08, 0x52, + 0x23, 0xa7, 0xef, 0x56, 0x13, 0x77, 0x93, 0x0f, 0xf3, 0x2a, 0xfd, 0x5d, 0xfb, 0xeb, 0x14, 0x2c, + 0xc4, 0x9c, 0x3a, 0x91, 0x52, 0xe4, 0x03, 0x9f, 0xc5, 0x4b, 0x29, 0xe6, 0x3b, 0x0f, 0xa0, 0x42, + 0xf6, 0x48, 0x42, 0x4a, 0x8d, 0xdc, 0x1f, 0xe6, 0x1b, 0xbe, 0xf5, 0xb2, 0x0f, 0x3e, 0xa0, 0x50, + 0x62, 0x16, 0xc3, 0xbe, 0x7e, 0xd1, 0x37, 0x5d, 0x8f, 0x05, 0xa0, 0xd4, 0xdf, 0xa8, 0x45, 0x1f, + 0x48, 0x83, 0xd0, 0x55, 0x40, 0xe4, 0xc3, 0xda, 0x38, 0x65, 0x81, 0x52, 0xca, 0x04, 0x73, 0x20, + 0x52, 0x3f, 0x02, 0x99, 0x6b, 0x8b, 0x66, 0x8c, 0x1c, 0x9d, 0xb8, 0x26, 0xaa, 0x2b, 0x25, 0xb5, + 0xc2, 0xe1, 0x0d, 0x0e, 0x46, 0x8a, 0xc0, 0xa6, 0x3b, 0x3a, 0x26, 0x6c, 0x02, 0xdd, 0xe9, 0x25, + 0xfa, 0xd8, 0xa1, 0x34, 0xe1, 0x26, 0xd8, 0x38, 0x56, 0x8a, 0xb9, 0x58, 0x29, 0xa2, 0x7b, 0x90, + 0x70, 0x37, 0xa9, 0xdf, 0x2a, 0x6c, 0xcc, 0x87, 0x1f, 0xd9, 0x3c, 0x1c, 0xf6, 0x6d, 0x9d, 0x5c, + 0x3b, 0x09, 0x77, 0x93, 0x44, 0xcf, 0x27, 0xbd, 0x21, 0xd7, 0xd7, 0x30, 0x7a, 0x7e, 0xb1, 0x7d, + 0x10, 0x90, 0x11, 0x02, 0xb4, 0x0e, 0x69, 0xfd, 0xe7, 0x23, 0x07, 0x53, 0x47, 0x25, 0x86, 0xb4, + 0x75, 0x02, 0xdd, 0xea, 0xdb, 0x47, 0x01, 0x3d, 0x23, 0x24, 0xa6, 0xaa, 0xf7, 0xcd, 0x76, 0xa7, + 0x43, 0xdd, 0x8f, 0x68, 0xaa, 0x75, 0x0a, 0x0e, 0xe8, 0x39, 0x19, 0x31, 0x06, 0x16, 0xe0, 0xd6, + 0xfe, 0x2b, 0x09, 0x05, 0xc1, 0xc4, 0xc8, 0xa6, 0x7b, 0xfa, 0xd0, 0x1b, 0x39, 0x82, 0xa7, 0x92, + 0xd8, 0x31, 0x73, 0x78, 0xe0, 0xa8, 0x82, 0x7b, 0x21, 0x11, 0x7f, 0x2f, 0x24, 0xc7, 0xee, 0x85, + 0x18, 0xdd, 0x49, 0xc5, 0xea, 0x4e, 0x7d, 0x52, 0x7a, 0xe9, 0x88, 0x55, 0x52, 0x86, 0xa7, 0x48, + 0xee, 0x09, 0x14, 0xa8, 0x9f, 0xe0, 0xbe, 0x3c, 0x13, 0xf1, 0xe5, 0x74, 0x3a, 0xf7, 0xe5, 0x66, + 0xf0, 0x3b, 0x56, 0xde, 0xd9, 0x69, 0xf2, 0xce, 0xcd, 0x24, 0xef, 0xfc, 0xcc, 0xf2, 0x86, 0xab, + 0xcb, 0xbb, 0x70, 0x55, 0x79, 0xff, 0xa3, 0x04, 0xa5, 0x31, 0x0f, 0xc9, 0xf7, 0x22, 0xcd, 0xb4, + 0x97, 0xc4, 0xcc, 0x7b, 0x49, 0xce, 0xba, 0x97, 0x75, 0xc8, 0xea, 0x7d, 0x53, 0xb3, 0x5d, 0xdf, + 0xf5, 0x4f, 0xdf, 0x8c, 0xeb, 0x92, 0x14, 0x69, 0xe8, 0xd8, 0xe4, 0x86, 0x73, 0x6a, 0xff, 0x91, + 0x82, 0x9c, 0xcf, 0x2a, 0xba, 0x07, 0xa0, 0xf7, 0x7a, 0xd8, 0x75, 0xb5, 0x33, 0xcc, 0xc3, 0xe1, + 0xad, 0xd4, 0x2f, 0xde, 0xad, 0x4a, 0x6a, 0x9e, 0xc1, 0x5f, 0xe2, 0x0b, 0xf4, 0x09, 0x64, 0x5c, + 0xdc, 0x73, 0x30, 0x8b, 0x5b, 0x7c, 0x02, 0x0e, 0x43, 0x8f, 0xa0, 0xe4, 0x62, 0xd7, 0x35, 0x6d, + 0x4b, 0xf3, 0xec, 0x33, 0x6c, 0x31, 0x77, 0xc4, 0x89, 0x8a, 0x1c, 0xd5, 0x25, 0x18, 0xb4, 0x0a, + 0x15, 0xdd, 0x75, 0x47, 0x03, 0xac, 0x39, 0x76, 0x1f, 0x6b, 0xba, 0x63, 0xd1, 0x0b, 0xd8, 0x27, + 0x2e, 0x31, 0xa4, 0x6a, 0xf7, 0x71, 0xdd, 0xb1, 0x50, 0x07, 0x6e, 0x8a, 0xd4, 0xf8, 0x8d, 0x87, + 0x1d, 0x4b, 0xef, 0x93, 0x38, 0xaf, 0x44, 0x67, 0x7d, 0x42, 0x66, 0xbd, 0x7d, 0xb7, 0xba, 0x18, + 0xce, 0x53, 0x38, 0x51, 0xab, 0xa1, 0xc6, 0x41, 0x0d, 0x62, 0x6b, 0x0e, 0x3e, 0x21, 0x9e, 0x90, + 0xf9, 0x57, 0x3e, 0x22, 0x77, 0x13, 0xb6, 0x8c, 0xa1, 0x6d, 0x5a, 0x1e, 0x37, 0xb2, 0x60, 0x4c, + 0xe6, 0x1c, 0x8d, 0x7a, 0x67, 0x3c, 0xdb, 0xce, 0xab, 0x7c, 0x84, 0x1e, 0x82, 0x7c, 0x6c, 0x3b, + 0x3d, 0xac, 0x91, 0x1b, 0x4c, 0x73, 0xbd, 0x8b, 0x3e, 0xbb, 0x5a, 0x73, 0x6a, 0x99, 0xc2, 0x0f, + 0x74, 0xef, 0xb4, 0x43, 0xa0, 0xe8, 0x47, 0x90, 0x1b, 0x60, 0x4f, 0xa7, 0xd9, 0x0b, 0x4b, 0x9f, + 0xef, 0x4c, 0xa8, 0xcd, 0xda, 0x1e, 0xa7, 0x50, 0x2c, 0xcf, 0xb9, 0x50, 0x83, 0x09, 0xa8, 0x0a, + 0x59, 0x4f, 0x3f, 0x39, 0x31, 0xad, 0x13, 0x6a, 0x3e, 0x79, 0xd5, 0x1f, 0xa2, 0xc7, 0xb0, 0xd0, + 0xb3, 0x2d, 0x8f, 0x3a, 0x78, 0xd3, 0x1d, 0xda, 0xae, 0x49, 0x7d, 0x7c, 0x9e, 0x52, 0x21, 0x8e, + 0x6a, 0x84, 0x18, 0x92, 0x6d, 0x0d, 0x1d, 0xfb, 0xcd, 0x05, 0xb7, 0x9b, 0x30, 0x64, 0x38, 0x20, + 0x50, 0x3f, 0xdb, 0xa2, 0x24, 0xcb, 0x3f, 0x82, 0xd2, 0x18, 0x47, 0x24, 0x79, 0x0d, 0x94, 0x44, + 0x25, 0x3f, 0x89, 0x3b, 0x3b, 0xd7, 0xfb, 0x23, 0xcc, 0xaf, 0x34, 0x36, 0x78, 0x9e, 0x78, 0x26, + 0xd5, 0x5e, 0x43, 0x3e, 0x50, 0x74, 0x74, 0x1f, 0x0a, 0x3d, 0x07, 0xd3, 0x80, 0x5a, 0xef, 0xbb, + 0x63, 0x5a, 0x26, 0x22, 0x84, 0x73, 0x4e, 0x8c, 0x9d, 0x73, 0xc0, 0x75, 0xf2, 0xbd, 0x5c, 0xd7, + 0x7e, 0x21, 0x41, 0x25, 0x62, 0x38, 0xe8, 0x01, 0x14, 0xf5, 0x5e, 0xcf, 0x1e, 0x59, 0x9e, 0x50, + 0xda, 0xf1, 0x19, 0xe0, 0x18, 0x7a, 0x61, 0x7e, 0x0e, 0xfe, 0x90, 0x9a, 0x83, 0xa8, 0xed, 0xc0, + 0x11, 0xc4, 0x1e, 0x3e, 0x87, 0x32, 0x39, 0x5b, 0xdd, 0xb4, 0xb0, 0x23, 0xde, 0xd5, 0xa5, 0x00, + 0x4a, 0x56, 0xab, 0xfd, 0x85, 0x04, 0x45, 0xd1, 0x1e, 0x3f, 0x86, 0xb1, 0x7d, 0x44, 0xf5, 0xad, + 0xfd, 0x2e, 0x14, 0x84, 0x03, 0x8c, 0xa9, 0x4d, 0x2c, 0x43, 0x6e, 0xe4, 0x12, 0xc3, 0x19, 0xf8, + 0x12, 0x0e, 0xc6, 0xe8, 0x2e, 0xe4, 0x86, 0xba, 0xeb, 0xbe, 0xb6, 0x1d, 0x96, 0x47, 0xfa, 0x8c, + 0x06, 0xd0, 0x9a, 0x0b, 0xf3, 0xbb, 0xa6, 0x7b, 0x95, 0x12, 0xdb, 0x23, 0xc8, 0xb3, 0xda, 0x1e, + 0x31, 0x71, 0xb6, 0xfb, 0xe2, 0xdb, 0x77, 0xab, 0x39, 0x06, 0x6c, 0x35, 0x54, 0xff, 0x17, 0x35, + 0x63, 0xbd, 0xe7, 0x99, 0xe7, 0x98, 0x07, 0x89, 0x7c, 0x54, 0xfb, 0x09, 0x20, 0xf1, 0xa3, 0xee, + 0xd0, 0xb6, 0x5c, 0xb2, 0x70, 0xda, 0xf4, 0xf0, 0x60, 0x32, 0x2d, 0x67, 0x74, 0x24, 0xd9, 0x55, + 0x19, 0x45, 0xed, 0xef, 0x25, 0x58, 0x38, 0x1c, 0x1a, 0xba, 0x87, 0xc7, 0x19, 0x1f, 0xe3, 0x4d, + 0x9a, 0xca, 0x1b, 0x3f, 0xc8, 0x44, 0x78, 0x90, 0x61, 0x09, 0x2a, 0x39, 0x56, 0x82, 0xba, 0x0f, + 0x15, 0xdd, 0x30, 0x34, 0x96, 0x0c, 0x68, 0x34, 0x1e, 0x4d, 0xd1, 0x78, 0xb4, 0xa4, 0x1b, 0x06, + 0x0b, 0x5d, 0x0f, 0x9d, 0xbe, 0x4b, 0xc2, 0x3e, 0x07, 0x0f, 0xec, 0x73, 0x3c, 0x46, 0x9a, 0xa6, + 0xa4, 0x32, 0xc3, 0x84, 0xd4, 0xb5, 0xaf, 0x60, 0xbe, 0xe3, 0xd9, 0xc3, 0x0f, 0xe5, 0xbf, 0xf6, + 0xef, 0x00, 0x10, 0x1e, 0xcc, 0x55, 0x76, 0x7e, 0x0f, 0xb2, 0x54, 0xba, 0x81, 0xf8, 0xe0, 0xed, + 0xbb, 0xd5, 0x0c, 0x01, 0xb5, 0x1a, 0x2a, 0xfb, 0x6b, 0x8c, 0xab, 0x40, 0x29, 0xa2, 0x02, 0xcf, + 0xa1, 0xc0, 0xaa, 0x7a, 0x2c, 0xb7, 0x58, 0xa6, 0x61, 0xc8, 0xad, 0x88, 0xbc, 0x58, 0xf9, 0x8a, + 0x26, 0x17, 0xe0, 0x06, 0xbf, 0xd1, 0xf7, 0x49, 0xf6, 0xa5, 0x7b, 0x23, 0x97, 0x17, 0x36, 0x6e, + 0x44, 0xa7, 0x51, 0xa4, 0xca, 0x89, 0xd0, 0xa7, 0x00, 0xb4, 0x6a, 0x86, 0x0d, 0x4d, 0xf7, 0xa8, + 0x43, 0x4c, 0xaa, 0x79, 0x0e, 0xa9, 0x7b, 0xe8, 0x16, 0xb5, 0x28, 0x86, 0x2c, 0x50, 0x64, 0x96, + 0x8e, 0xeb, 0xb4, 0x72, 0x38, 0xa2, 0x2a, 0x42, 0x91, 0x88, 0xcd, 0xe4, 0x90, 0x3a, 0xc9, 0x8e, + 0x32, 0xec, 0x44, 0xaa, 0x9f, 0x52, 0x7f, 0x75, 0x5b, 0xc8, 0x46, 0xa2, 0x35, 0x67, 0x72, 0x47, + 0x33, 0x62, 0xf4, 0x94, 0x98, 0x36, 0x09, 0xec, 0xab, 0x9f, 0x45, 0x32, 0x41, 0xe5, 0xcd, 0xd0, + 0x76, 0x3c, 0x95, 0x22, 0x85, 0x79, 0x8c, 0x1a, 0xed, 0x42, 0x99, 0x9e, 0x67, 0xcf, 0x1e, 0x50, + 0x3f, 0x8f, 0x79, 0x50, 0x70, 0x2f, 0x98, 0xaf, 0xda, 0xf6, 0x60, 0xdb, 0xc7, 0x46, 0x3f, 0x5f, + 0x72, 0x44, 0x2c, 0xfa, 0x3e, 0xab, 0x57, 0x97, 0x23, 0xb5, 0xbc, 0x57, 0xf8, 0x28, 0x3a, 0x91, + 0x96, 0xad, 0x15, 0x28, 0x08, 0x45, 0x93, 0xea, 0x02, 0x9d, 0xf6, 0xbd, 0xb8, 0x8a, 0x52, 0x74, + 0xba, 0x38, 0x0f, 0xb5, 0xa1, 0xc2, 0x6a, 0x38, 0xe1, 0x26, 0x58, 0x66, 0xf0, 0x6b, 0x61, 0x8d, + 0x9d, 0xe0, 0x2f, 0xdd, 0x45, 0xd9, 0x1b, 0x43, 0xa3, 0x4d, 0x48, 0x53, 0x08, 0x4f, 0x1d, 0x6e, + 0x8f, 0x2f, 0x13, 0x9d, 0xcd, 0x68, 0xd1, 0x73, 0x28, 0x73, 0xfb, 0x72, 0xb0, 0x3b, 0xea, 0x7b, + 0x6e, 0xb5, 0x12, 0xf1, 0x17, 0xcc, 0xca, 0xa8, 0xbf, 0x28, 0x31, 0x52, 0x95, 0x51, 0xa2, 0x27, + 0x50, 0xa4, 0x29, 0xb1, 0x3f, 0x53, 0xa6, 0x33, 0xe7, 0xc7, 0xaa, 0x05, 0x74, 0x5e, 0x81, 0x90, + 0xf9, 0xb3, 0xbe, 0x02, 0x3f, 0x13, 0x0b, 0x26, 0xce, 0x47, 0xea, 0x60, 0x3c, 0xed, 0x62, 0x4e, + 0xaa, 0xcc, 0xa9, 0xfd, 0xf9, 0xcf, 0xa0, 0xc4, 0xa2, 0x76, 0x7f, 0xf6, 0x62, 0x84, 0x61, 0x1a, + 0xb7, 0xb3, 0xb9, 0x45, 0x4a, 0xe9, 0xcf, 0x5c, 0x84, 0x34, 0x76, 0x1c, 0xdb, 0xe1, 0xc1, 0x02, + 0x1b, 0x10, 0xcd, 0xa6, 0x3f, 0x68, 0x16, 0x50, 0x5d, 0x62, 0x45, 0x27, 0x0a, 0x21, 0xf1, 0x3e, + 0x89, 0x44, 0x0c, 0xec, 0xe9, 0x66, 0xdf, 0xad, 0xde, 0x60, 0x91, 0x08, 0x1f, 0xa2, 0x2f, 0x60, + 0xde, 0x4f, 0x00, 0xb4, 0xbe, 0xdd, 0x63, 0xb9, 0xe6, 0x4d, 0x96, 0x97, 0xfa, 0x88, 0x5d, 0x0e, + 0x47, 0x6b, 0xb0, 0x70, 0xa4, 0xf7, 0xce, 0x46, 0x43, 0x8d, 0x57, 0x1a, 0xb4, 0x91, 0x8b, 0x8d, + 0xea, 0x2d, 0x56, 0x65, 0x65, 0x28, 0x1e, 0x70, 0x1f, 0xba, 0xd8, 0x40, 0x77, 0xa0, 0xe0, 0x60, + 0xcf, 0xb9, 0xd0, 0xe8, 0x0d, 0x5c, 0xbd, 0x4d, 0xd9, 0x02, 0x0a, 0xda, 0x26, 0x10, 0x62, 0x71, + 0xbc, 0xee, 0x92, 0x8d, 0xbc, 0xcc, 0x84, 0x02, 0x23, 0xd7, 0xc2, 0x56, 0xa2, 0x2a, 0x35, 0xa5, + 0xa0, 0xfa, 0xf2, 0x05, 0xaf, 0xec, 0x44, 0x93, 0x12, 0x5f, 0x56, 0x9c, 0x9c, 0xd5, 0x76, 0xbe, + 0x14, 0x4a, 0x35, 0xc5, 0x68, 0x75, 0x47, 0x90, 0x11, 0x9f, 0x14, 0x10, 0x6f, 0xe5, 0x21, 0xeb, + 0x30, 0x4d, 0x23, 0x39, 0x05, 0x13, 0x54, 0xed, 0x97, 0x09, 0x80, 0x90, 0xb7, 0xf8, 0x77, 0x01, + 0xc1, 0x3b, 0x25, 0xa6, 0x79, 0xa7, 0xe4, 0xb8, 0x77, 0x5a, 0x86, 0xdc, 0x58, 0xb6, 0x9f, 0x54, + 0x83, 0x31, 0xda, 0x08, 0x5c, 0x24, 0xcb, 0x0f, 0x97, 0x63, 0x0e, 0x6a, 0x2d, 0xe2, 0x27, 0x03, + 0x4d, 0xc9, 0x88, 0x9a, 0x52, 0x83, 0x52, 0x5f, 0x77, 0x89, 0xda, 0x12, 0xc1, 0xe8, 0x2c, 0xed, + 0x4b, 0xaa, 0x05, 0x02, 0x54, 0x09, 0xac, 0xee, 0x11, 0x75, 0x21, 0x68, 0x13, 0xbb, 0xf4, 0x88, + 0x4b, 0xaa, 0x3f, 0xac, 0xad, 0x41, 0x86, 0x7d, 0x05, 0x01, 0x64, 0xea, 0xdb, 0xdd, 0xd6, 0xd7, + 0x8a, 0x3c, 0x87, 0x8a, 0x90, 0xdb, 0x69, 0xed, 0xb7, 0x3a, 0x4d, 0xa5, 0x21, 0x4b, 0x04, 0xb3, + 0x53, 0x6f, 0xed, 0x2a, 0x0d, 0x39, 0x51, 0xfb, 0xa5, 0x04, 0x39, 0x5f, 0x2a, 0x7e, 0x19, 0x49, + 0x0c, 0x21, 0xfc, 0xf1, 0x47, 0x3a, 0xb6, 0x4c, 0xe4, 0xd8, 0x10, 0xa4, 0x5c, 0xf3, 0xe7, 0x98, + 0x1f, 0x27, 0xfd, 0x4d, 0xe8, 0x03, 0x45, 0x67, 0x71, 0x55, 0x30, 0xae, 0xfd, 0x4b, 0x02, 0x8a, + 0xa2, 0x4e, 0x4c, 0x16, 0x77, 0xa4, 0x99, 0x8b, 0x3b, 0xb9, 0x4b, 0x8a, 0x3b, 0x22, 0xbf, 0x89, + 0x4b, 0xf8, 0x4d, 0x0a, 0xfc, 0x7e, 0x01, 0xf3, 0xc1, 0xc2, 0x01, 0xe3, 0x2c, 0x54, 0x94, 0x7d, + 0x44, 0x60, 0xa1, 0x4f, 0x60, 0x69, 0x9c, 0x95, 0x60, 0x06, 0x73, 0x17, 0x8b, 0x22, 0x3b, 0xc1, + 0xac, 0x7b, 0x24, 0x13, 0x64, 0xde, 0x8c, 0x59, 0x6a, 0x9a, 0x7e, 0xbf, 0xc8, 0x81, 0xcc, 0x56, + 0xc7, 0x25, 0x94, 0x99, 0x26, 0xa1, 0xec, 0x98, 0x84, 0x6a, 0x7f, 0x22, 0x01, 0x84, 0xfe, 0x6c, + 0xf6, 0xea, 0xc8, 0x9d, 0xb0, 0xb4, 0x41, 0x98, 0x92, 0xe8, 0xaa, 0x7e, 0x15, 0x63, 0x92, 0xa5, + 0x2b, 0x28, 0x4d, 0xed, 0x6d, 0x02, 0x6e, 0xd4, 0x47, 0x9e, 0x3d, 0x71, 0xcf, 0x09, 0x2f, 0xb4, + 0xd2, 0x4c, 0x2f, 0xb4, 0x73, 0xb1, 0x2f, 0xb4, 0x89, 0xf7, 0xbc, 0xd0, 0xce, 0x09, 0x2f, 0xb4, + 0x3f, 0xe6, 0x37, 0x90, 0xff, 0x4c, 0x9b, 0xa4, 0x57, 0xc1, 0x72, 0x5c, 0x5d, 0x96, 0xbf, 0xd8, + 0xd2, 0xab, 0xa8, 0xcd, 0x5f, 0x6d, 0x95, 0xf0, 0x2a, 0xf2, 0x57, 0x48, 0xd1, 0x15, 0xa6, 0x56, + 0xa4, 0x83, 0x1b, 0x89, 0x2f, 0x43, 0xbc, 0x1d, 0x7f, 0x6b, 0xaf, 0xfd, 0x69, 0x02, 0x2a, 0xe4, + 0x70, 0x84, 0x2b, 0x77, 0xac, 0x04, 0x2c, 0xcd, 0x50, 0x02, 0x4e, 0x4f, 0x2b, 0x26, 0x25, 0x66, + 0x2a, 0xc0, 0x24, 0x67, 0x2e, 0xc0, 0xa4, 0xae, 0x5e, 0x4c, 0xca, 0x5c, 0xb5, 0x98, 0xf4, 0x77, + 0x29, 0x58, 0x88, 0x89, 0xe7, 0x48, 0x94, 0xcd, 0xe2, 0xb9, 0x48, 0x94, 0xcd, 0x80, 0x24, 0xca, + 0xe6, 0xbf, 0x48, 0x3a, 0x5d, 0x61, 0xcf, 0xbd, 0xf6, 0xf1, 0xb1, 0x8b, 0x3d, 0x6d, 0xe0, 0x72, + 0x9d, 0x2d, 0x51, 0x70, 0x9b, 0x42, 0xf7, 0x5c, 0xe2, 0xa2, 0xb1, 0x65, 0x08, 0x54, 0x4c, 0x79, + 0x0b, 0xd8, 0x32, 0x02, 0x1a, 0xb1, 0xab, 0x21, 0x75, 0xe5, 0xae, 0x86, 0xf4, 0xcc, 0x5d, 0x0d, + 0x99, 0xab, 0x75, 0x35, 0x64, 0xaf, 0xd1, 0xd5, 0x90, 0xfb, 0xb0, 0xae, 0x86, 0xfc, 0xec, 0x5d, + 0x0d, 0x70, 0xf5, 0xae, 0x86, 0xc2, 0xb5, 0xba, 0x1a, 0xfe, 0x35, 0x03, 0xcb, 0x97, 0x07, 0xf1, + 0xd3, 0x93, 0xea, 0x30, 0xf7, 0x4c, 0x4c, 0x69, 0x7f, 0x48, 0x46, 0x1b, 0x0f, 0xbe, 0x04, 0xf6, + 0x72, 0xa6, 0x0d, 0xcc, 0x37, 0xa6, 0x75, 0x52, 0xad, 0x50, 0x89, 0x44, 0x9e, 0xe7, 0xf7, 0x28, + 0x4e, 0x65, 0x2f, 0x91, 0x6c, 0x10, 0xe9, 0x58, 0x48, 0xcd, 0xd0, 0x37, 0x91, 0x8e, 0xe9, 0x9b, + 0x40, 0x4f, 0x78, 0x6c, 0xc6, 0x14, 0x67, 0x8a, 0x17, 0xa3, 0xf1, 0x96, 0xff, 0x00, 0xb7, 0x19, + 0x09, 0x04, 0xe3, 0x1f, 0xe0, 0xf8, 0x14, 0x3f, 0x0c, 0xfc, 0x4a, 0x88, 0xec, 0xe0, 0xfd, 0x8f, + 0x70, 0x7c, 0x76, 0xf8, 0x10, 0x17, 0xaa, 0x6d, 0xee, 0x1a, 0x6a, 0x9b, 0xbf, 0x82, 0xda, 0x46, + 0x5d, 0x7d, 0xe1, 0x6a, 0xae, 0xfe, 0x37, 0x82, 0x3c, 0xc7, 0x5f, 0xa0, 0x18, 0x4d, 0x3a, 0x84, + 0xd3, 0xf2, 0x33, 0x9d, 0x29, 0x17, 0x45, 0xe9, 0xea, 0x17, 0x05, 0xfa, 0xa1, 0x9f, 0xba, 0xf8, + 0x8b, 0x94, 0xe9, 0x22, 0xb1, 0xaf, 0x98, 0x3c, 0x77, 0xf1, 0xa7, 0x8a, 0x86, 0x25, 0xcf, 0x6e, + 0x58, 0xec, 0x43, 0xe2, 0x0d, 0xf5, 0x3f, 0x69, 0x90, 0xa3, 0x99, 0xed, 0xb7, 0xd4, 0xa3, 0x53, + 0x8c, 0xef, 0xd1, 0x09, 0xf4, 0x3e, 0xf5, 0x81, 0x7a, 0x9f, 0xfe, 0x30, 0xbd, 0xcf, 0x5c, 0x4b, + 0xef, 0xbf, 0x2d, 0x77, 0x1d, 0xd5, 0xfb, 0xfc, 0x75, 0xf5, 0x1e, 0xae, 0xa7, 0xf7, 0x85, 0x8f, + 0xa1, 0xf7, 0xa5, 0x0f, 0xd2, 0xfb, 0xf2, 0x75, 0xf4, 0xfe, 0x6f, 0x52, 0x50, 0xbd, 0xac, 0x34, + 0x33, 0xfd, 0x36, 0x11, 0x9b, 0xa7, 0x12, 0x91, 0xe6, 0xa9, 0xef, 0x41, 0x71, 0xac, 0x6b, 0x8a, + 0x59, 0x42, 0xc1, 0x0d, 0xfb, 0xa5, 0x04, 0x95, 0x49, 0x5d, 0x23, 0x2a, 0x4e, 0x5f, 0x23, 0x2a, + 0xce, 0x5c, 0x57, 0x65, 0xb2, 0xd7, 0x53, 0x99, 0xdc, 0xc7, 0x50, 0x99, 0xfc, 0x07, 0xa9, 0x0c, + 0xcc, 0xa8, 0x32, 0x82, 0xa2, 0xfc, 0x71, 0x06, 0x6e, 0x4f, 0x29, 0xbc, 0x4d, 0xd7, 0x95, 0xa7, + 0xc0, 0x1a, 0x86, 0xc2, 0xf6, 0xc2, 0x44, 0xd8, 0x5e, 0x48, 0x31, 0xbc, 0xbd, 0x50, 0x15, 0x47, + 0x06, 0x99, 0x17, 0x69, 0x4b, 0x4c, 0xc6, 0xb7, 0x25, 0x46, 0x9a, 0x12, 0xff, 0x9f, 0x5c, 0x67, + 0xee, 0x5a, 0xae, 0x33, 0x73, 0x0d, 0xd7, 0x99, 0xfd, 0x2e, 0x64, 0xf8, 0x10, 0x3b, 0xa8, 0x5c, + 0xc7, 0x75, 0xfe, 0x4a, 0x02, 0x34, 0x59, 0x43, 0x9e, 0x6e, 0x08, 0xf7, 0x85, 0x0e, 0xc5, 0xc4, + 0x44, 0x87, 0x62, 0xd8, 0x9f, 0xf8, 0x98, 0x2b, 0x70, 0x32, 0x52, 0x7c, 0x6f, 0x98, 0x0e, 0xee, + 0x79, 0x31, 0xfd, 0x66, 0x9f, 0x43, 0xe9, 0x35, 0x3e, 0x72, 0xed, 0xde, 0x19, 0xf6, 0xc2, 0x16, + 0xe4, 0xe6, 0x9c, 0x5a, 0x0c, 0xc0, 0x24, 0x96, 0x16, 0x37, 0x9f, 0xbe, 0xea, 0xe6, 0x6b, 0x7f, + 0x96, 0x00, 0x39, 0xca, 0xc1, 0x77, 0x79, 0xfc, 0x3f, 0x24, 0x60, 0x7e, 0xc2, 0x66, 0xbe, 0xad, + 0xc6, 0xb8, 0xcc, 0xb4, 0xd3, 0x4c, 0xce, 0x74, 0x9a, 0xa9, 0x99, 0x4f, 0x33, 0x7d, 0xf5, 0xd3, + 0xcc, 0x5e, 0xf5, 0x34, 0xbf, 0xf1, 0x1f, 0x5d, 0x77, 0x69, 0x72, 0xfa, 0x01, 0x8f, 0xae, 0x97, + 0xa4, 0xb9, 0xb5, 0x3f, 0x0f, 0xde, 0x73, 0x3b, 0xfc, 0xbd, 0xe6, 0xca, 0x4b, 0xf3, 0x57, 0x5a, + 0xc6, 0xaa, 0x26, 0x74, 0x0d, 0x96, 0x74, 0xc3, 0x60, 0x82, 0x8f, 0xbc, 0xd2, 0x8a, 0xa4, 0x49, + 0xf1, 0x95, 0x36, 0xa4, 0xae, 0xfd, 0x10, 0xca, 0xe3, 0x8f, 0x13, 0xe8, 0x01, 0xa4, 0x4c, 0xeb, + 0xd8, 0x9e, 0x78, 0xa4, 0x16, 0x1e, 0x9d, 0x28, 0xc1, 0xca, 0x2b, 0x28, 0x8a, 0x7d, 0xd6, 0x68, + 0x09, 0x50, 0xfd, 0xb0, 0xd1, 0x6a, 0x6b, 0xdb, 0xcd, 0xfa, 0xfe, 0xbe, 0xb2, 0xab, 0x6d, 0xb5, + 0xbb, 0x4d, 0x79, 0x6e, 0x12, 0xbe, 0xab, 0xec, 0x74, 0x65, 0x09, 0xdd, 0x84, 0x85, 0x71, 0xb8, + 0xda, 0x7a, 0xd1, 0xec, 0xca, 0x89, 0x95, 0x7f, 0x92, 0xe0, 0x46, 0xec, 0x05, 0x84, 0x64, 0x28, + 0x36, 0x37, 0x9e, 0x3e, 0xd1, 0xbe, 0xdc, 0x58, 0x3f, 0xd0, 0x36, 0xd7, 0xe5, 0xb9, 0x71, 0xc8, + 0xd3, 0x75, 0x59, 0x42, 0xf3, 0x50, 0xa2, 0x90, 0x5f, 0x5f, 0x7f, 0xc6, 0x88, 0x12, 0x11, 0xd0, + 0xd3, 0x75, 0x39, 0x89, 0x6e, 0xc1, 0x8d, 0x83, 0xb6, 0xda, 0x55, 0xeb, 0xad, 0xae, 0x36, 0xb6, + 0x64, 0xea, 0x12, 0xd4, 0xd3, 0x75, 0x39, 0x8d, 0x96, 0x61, 0x69, 0x1c, 0x15, 0x7c, 0x24, 0x73, + 0x19, 0xee, 0xe9, 0xba, 0x9c, 0x5d, 0xd9, 0xe2, 0xbd, 0xd9, 0xa1, 0xd9, 0xa1, 0x45, 0x90, 0x1b, + 0xca, 0x4e, 0xfd, 0x70, 0xb7, 0xab, 0xed, 0xb4, 0x76, 0x95, 0xee, 0x6f, 0x1f, 0x28, 0xf2, 0x1c, + 0xca, 0x42, 0x72, 0xef, 0xe0, 0x89, 0x2c, 0x91, 0x1f, 0xed, 0x17, 0x2f, 0xe4, 0x04, 0x83, 0x6c, + 0xca, 0xc9, 0x95, 0xa6, 0x2f, 0x29, 0xbf, 0xbd, 0x53, 0x5c, 0xe2, 0x40, 0x6d, 0x77, 0xdb, 0xdb, + 0xed, 0x5d, 0x79, 0x0e, 0xe5, 0x20, 0xa5, 0x76, 0xf7, 0x0e, 0xd8, 0x1a, 0x1d, 0xb5, 0x2b, 0x27, + 0x50, 0x09, 0xf2, 0xaf, 0x94, 0xad, 0x4e, 0x7b, 0xfb, 0xa5, 0xd2, 0x95, 0x93, 0x2b, 0xfb, 0x70, + 0x23, 0xb6, 0x5f, 0x14, 0xdd, 0x83, 0x3b, 0xfe, 0x82, 0x1d, 0xe5, 0xc5, 0x9e, 0xb2, 0xdf, 0x55, + 0x1a, 0x94, 0x3b, 0x71, 0x7d, 0x72, 0xe2, 0xbb, 0x9d, 0x10, 0x22, 0xad, 0x3c, 0x8e, 0xf4, 0xab, + 0xf2, 0x5e, 0xbe, 0x3c, 0xa4, 0x5b, 0xfb, 0x0d, 0xe5, 0x1b, 0x79, 0x8e, 0x30, 0xd0, 0x6d, 0xed, + 0x29, 0x9d, 0x6e, 0x9d, 0x30, 0xb6, 0x72, 0x0c, 0x95, 0x48, 0x23, 0x20, 0x51, 0x92, 0xd6, 0x5e, + 0xfd, 0x85, 0xa2, 0x75, 0x0e, 0x77, 0x76, 0x5a, 0xdf, 0x68, 0xfe, 0xcc, 0x65, 0x58, 0x1a, 0x83, + 0x0b, 0xcb, 0xa0, 0x3b, 0x70, 0x7b, 0x0c, 0xb7, 0xdf, 0xde, 0x57, 0xb4, 0xf6, 0xd7, 0x8a, 0xfa, + 0x4a, 0x6d, 0x75, 0x15, 0x39, 0xb1, 0xf2, 0x53, 0x90, 0xa3, 0x4f, 0xf5, 0x64, 0x41, 0xe5, 0x85, + 0xaa, 0x74, 0x3a, 0x5a, 0xa7, 0x7d, 0xa8, 0x6e, 0x2b, 0x1a, 0x39, 0x79, 0xed, 0x95, 0xb2, 0xc5, + 0x3e, 0x16, 0x83, 0xeb, 0x34, 0x5e, 0xca, 0xd2, 0xca, 0x5f, 0x4a, 0x50, 0x14, 0x1f, 0xf0, 0xd1, + 0x02, 0x54, 0x7c, 0xe2, 0x6e, 0x5d, 0xed, 0xb6, 0xf6, 0x5f, 0xc8, 0x73, 0x44, 0xd3, 0x38, 0x90, + 0x3f, 0x27, 0x49, 0x02, 0x48, 0xd9, 0x6f, 0x10, 0xaa, 0x84, 0x30, 0x75, 0xbb, 0xbd, 0x77, 0xb0, + 0xab, 0x74, 0x15, 0x39, 0x29, 0xd0, 0xf1, 0xf7, 0xa6, 0x14, 0x42, 0x50, 0xf6, 0x57, 0xdb, 0x6a, + 0xab, 0x5d, 0xa5, 0x21, 0xa7, 0x51, 0x15, 0x16, 0x39, 0x6c, 0xb7, 0xb5, 0xd7, 0xea, 0x6a, 0xaa, + 0x52, 0xdf, 0x6e, 0x2a, 0x0d, 0x39, 0xb3, 0x72, 0xc8, 0xff, 0x0b, 0x84, 0x57, 0xc0, 0x10, 0x94, + 0x7d, 0x61, 0xee, 0xb5, 0xbe, 0x61, 0xec, 0x2d, 0x01, 0x6a, 0x1c, 0xd6, 0x77, 0x03, 0x8b, 0xab, + 0xbf, 0x50, 0xf6, 0x89, 0x29, 0x2e, 0xc3, 0xd2, 0x38, 0x7c, 0xb7, 0xab, 0xa8, 0xfb, 0x75, 0x72, + 0x88, 0x1b, 0x7f, 0x95, 0x81, 0x0c, 0x2f, 0x9b, 0xff, 0x04, 0x0a, 0x42, 0xef, 0x00, 0x9a, 0xd6, + 0x51, 0xb0, 0x1c, 0xd7, 0xdd, 0x82, 0xea, 0x50, 0x14, 0xbb, 0x5a, 0x50, 0x18, 0x78, 0xc5, 0x34, + 0xbb, 0xc4, 0x2f, 0xa1, 0x00, 0x84, 0xad, 0x35, 0x28, 0x8c, 0x1c, 0x27, 0x9a, 0x7c, 0x96, 0x6f, + 0xc7, 0xe2, 0x78, 0x2f, 0xce, 0x8f, 0x01, 0xc2, 0xee, 0x14, 0x24, 0x3e, 0x40, 0x46, 0x5a, 0x56, + 0xe2, 0xb9, 0xe8, 0x42, 0x95, 0xee, 0x39, 0xa6, 0x1c, 0x8a, 0x66, 0xe9, 0x78, 0x88, 0x5f, 0xf5, + 0x37, 0x89, 0x89, 0xeb, 0x8e, 0x17, 0x14, 0x83, 0xd0, 0xe5, 0xad, 0x0f, 0xf1, 0x2b, 0x1c, 0xc0, + 0x12, 0x5d, 0x61, 0xf2, 0x25, 0xe8, 0xfd, 0xdd, 0x10, 0xf1, 0x2b, 0x7e, 0x0d, 0xb7, 0xe8, 0x8a, + 0x71, 0xf9, 0x17, 0x9a, 0xa9, 0x2f, 0x22, 0x7e, 0xdd, 0x06, 0xc8, 0xe1, 0xba, 0x13, 0x0a, 0x35, + 0x19, 0xdb, 0xbe, 0x47, 0xa1, 0xd8, 0x8d, 0x3d, 0xa1, 0x50, 0x63, 0x17, 0xf9, 0x7b, 0x96, 0x60, + 0xde, 0x75, 0x62, 0x89, 0xb1, 0x0b, 0x3b, 0x76, 0x89, 0xad, 0x9d, 0xdf, 0xb9, 0x77, 0x62, 0x7a, + 0xa7, 0xa3, 0xa3, 0xb5, 0x9e, 0x3d, 0x78, 0xcc, 0x09, 0x1e, 0xfb, 0xcd, 0xf7, 0x3e, 0xe0, 0x6f, + 0x13, 0xa5, 0x5d, 0xf3, 0x1c, 0xbf, 0x64, 0x1d, 0x83, 0x9e, 0xfd, 0x9f, 0x89, 0x32, 0x1f, 0x3f, + 0x7f, 0x4e, 0x01, 0x47, 0x19, 0x3a, 0x65, 0xf3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x62, 0xe5, + 0xc2, 0xab, 0x64, 0x3a, 0x00, 0x00, } From 3a464795d2d0d13998c76cd0637c64bfda03c0d6 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Wed, 18 Mar 2026 16:01:26 +0800 Subject: [PATCH 09/15] update psrpc handler --- protobufs/rpc/egress.proto | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/protobufs/rpc/egress.proto b/protobufs/rpc/egress.proto index 587d7497d..d9182b770 100644 --- a/protobufs/rpc/egress.proto +++ b/protobufs/rpc/egress.proto @@ -34,12 +34,17 @@ service EgressInternal { } service EgressHandler { - rpc UpdateStream(livekit.UpdateStreamRequest) returns (livekit.EgressInfo) { + rpc UpdateEgress(livekit.UpdateEgressRequest) returns (livekit.EgressInfo) { option (psrpc.options).topics = true; } rpc StopEgress(livekit.StopEgressRequest) returns (livekit.EgressInfo) { option (psrpc.options).topics = true; } + + // --- Deprecated --- + rpc UpdateStream(livekit.UpdateStreamRequest) returns (livekit.EgressInfo) { + option (psrpc.options).topics = true; + } } message StartEgressRequest { From 384f889ebf4427dde667dd7a02ca2bbf1ce3f734 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 08:02:31 +0000 Subject: [PATCH 10/15] generated protobuf --- rpc/egress.pb.go | 28 +++++---- rpc/egress.psrpc.go | 136 ++++++++++++++++++++++++++------------------ 2 files changed, 98 insertions(+), 66 deletions(-) diff --git a/rpc/egress.pb.go b/rpc/egress.pb.go index 0fd832bdc..9dc42e43e 100644 --- a/rpc/egress.pb.go +++ b/rpc/egress.pb.go @@ -372,11 +372,12 @@ const file_rpc_egress_proto_rawDesc = "" + "egress_ids\x18\x01 \x03(\tR\tegressIds2\xb2\x01\n" + "\x0eEgressInternal\x12E\n" + "\vStartEgress\x12\x17.rpc.StartEgressRequest\x1a\x13.livekit.EgressInfo\"\b\xb2\x89\x01\x04\x10\x010\x01\x12Y\n" + - "\x10ListActiveEgress\x12\x1c.rpc.ListActiveEgressRequest\x1a\x1d.rpc.ListActiveEgressResponse\"\b\xb2\x89\x01\x04\x10\x01(\x012\xa1\x01\n" + + "\x10ListActiveEgress\x12\x1c.rpc.ListActiveEgressRequest\x1a\x1d.rpc.ListActiveEgressResponse\"\b\xb2\x89\x01\x04\x10\x01(\x012\xec\x01\n" + "\rEgressHandler\x12I\n" + - "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\"\x06\xb2\x89\x01\x02\x10\x01\x12E\n" + + "\fUpdateEgress\x12\x1c.livekit.UpdateEgressRequest\x1a\x13.livekit.EgressInfo\"\x06\xb2\x89\x01\x02\x10\x01\x12E\n" + "\n" + - "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\"\x06\xb2\x89\x01\x02\x10\x01B!Z\x1fgithub.com/livekit/protocol/rpcb\x06proto3" + "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\"\x06\xb2\x89\x01\x02\x10\x01\x12I\n" + + "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\"\x06\xb2\x89\x01\x02\x10\x01B!Z\x1fgithub.com/livekit/protocol/rpcb\x06proto3" var ( file_rpc_egress_proto_rawDescOnce sync.Once @@ -402,9 +403,10 @@ var file_rpc_egress_proto_goTypes = []any{ (*livekit.ParticipantEgressRequest)(nil), // 7: livekit.ParticipantEgressRequest (*livekit.TrackCompositeEgressRequest)(nil), // 8: livekit.TrackCompositeEgressRequest (*livekit.TrackEgressRequest)(nil), // 9: livekit.TrackEgressRequest - (*livekit.UpdateStreamRequest)(nil), // 10: livekit.UpdateStreamRequest + (*livekit.UpdateEgressRequest)(nil), // 10: livekit.UpdateEgressRequest (*livekit.StopEgressRequest)(nil), // 11: livekit.StopEgressRequest - (*livekit.EgressInfo)(nil), // 12: livekit.EgressInfo + (*livekit.UpdateStreamRequest)(nil), // 12: livekit.UpdateStreamRequest + (*livekit.EgressInfo)(nil), // 13: livekit.EgressInfo } var file_rpc_egress_proto_depIdxs = []int32{ 3, // 0: rpc.StartEgressRequest.egress:type_name -> livekit.StartEgressRequest @@ -416,14 +418,16 @@ var file_rpc_egress_proto_depIdxs = []int32{ 9, // 6: rpc.StartEgressRequest.track:type_name -> livekit.TrackEgressRequest 0, // 7: rpc.EgressInternal.StartEgress:input_type -> rpc.StartEgressRequest 1, // 8: rpc.EgressInternal.ListActiveEgress:input_type -> rpc.ListActiveEgressRequest - 10, // 9: rpc.EgressHandler.UpdateStream:input_type -> livekit.UpdateStreamRequest + 10, // 9: rpc.EgressHandler.UpdateEgress:input_type -> livekit.UpdateEgressRequest 11, // 10: rpc.EgressHandler.StopEgress:input_type -> livekit.StopEgressRequest - 12, // 11: rpc.EgressInternal.StartEgress:output_type -> livekit.EgressInfo - 2, // 12: rpc.EgressInternal.ListActiveEgress:output_type -> rpc.ListActiveEgressResponse - 12, // 13: rpc.EgressHandler.UpdateStream:output_type -> livekit.EgressInfo - 12, // 14: rpc.EgressHandler.StopEgress:output_type -> livekit.EgressInfo - 11, // [11:15] is the sub-list for method output_type - 7, // [7:11] is the sub-list for method input_type + 12, // 11: rpc.EgressHandler.UpdateStream:input_type -> livekit.UpdateStreamRequest + 13, // 12: rpc.EgressInternal.StartEgress:output_type -> livekit.EgressInfo + 2, // 13: rpc.EgressInternal.ListActiveEgress:output_type -> rpc.ListActiveEgressResponse + 13, // 14: rpc.EgressHandler.UpdateEgress:output_type -> livekit.EgressInfo + 13, // 15: rpc.EgressHandler.StopEgress:output_type -> livekit.EgressInfo + 13, // 16: rpc.EgressHandler.UpdateStream:output_type -> livekit.EgressInfo + 12, // [12:17] is the sub-list for method output_type + 7, // [7:12] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name diff --git a/rpc/egress.psrpc.go b/rpc/egress.psrpc.go index 1ee57bae2..196b6fdea 100644 --- a/rpc/egress.psrpc.go +++ b/rpc/egress.psrpc.go @@ -171,10 +171,13 @@ func (UnimplementedEgressInternalServer) ListActiveEgress(context.Context, *List // ============================== type EgressHandlerClient interface { - UpdateStream(ctx context.Context, topic string, req *livekit4.UpdateStreamRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) + UpdateEgress(ctx context.Context, topic string, req *livekit4.UpdateEgressRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) StopEgress(ctx context.Context, topic string, req *livekit4.StopEgressRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) + // --- Deprecated --- + UpdateStream(ctx context.Context, topic string, req *livekit4.UpdateStreamRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) + // Close immediately, without waiting for pending RPCs Close() } @@ -184,9 +187,12 @@ type EgressHandlerClient interface { // ================================== type EgressHandlerServerImpl interface { - UpdateStream(context.Context, *livekit4.UpdateStreamRequest) (*livekit4.EgressInfo, error) + UpdateEgress(context.Context, *livekit4.UpdateEgressRequest) (*livekit4.EgressInfo, error) StopEgress(context.Context, *livekit4.StopEgressRequest) (*livekit4.EgressInfo, error) + + // --- Deprecated --- + UpdateStream(context.Context, *livekit4.UpdateStreamRequest) (*livekit4.EgressInfo, error) } // ============================== @@ -194,10 +200,13 @@ type EgressHandlerServerImpl interface { // ============================== type EgressHandlerServer interface { - RegisterUpdateStreamTopic(topic string) error - DeregisterUpdateStreamTopic(topic string) + RegisterUpdateEgressTopic(topic string) error + DeregisterUpdateEgressTopic(topic string) RegisterStopEgressTopic(topic string) error DeregisterStopEgressTopic(topic string) + // --- Deprecated --- + RegisterUpdateStreamTopic(topic string) error + DeregisterUpdateStreamTopic(topic string) // Close and wait for pending RPCs to complete Shutdown() @@ -221,8 +230,9 @@ func NewEgressHandlerClient(bus psrpc.MessageBus, opts ...psrpc.ClientOption) (E ID: rand.NewClientID(), } - sd.RegisterMethod("UpdateStream", false, false, true, true) + sd.RegisterMethod("UpdateEgress", false, false, true, true) sd.RegisterMethod("StopEgress", false, false, true, true) + sd.RegisterMethod("UpdateStream", false, false, true, true) rpcClient, err := client.NewRPCClient(sd, bus, opts...) if err != nil { @@ -234,14 +244,18 @@ func NewEgressHandlerClient(bus psrpc.MessageBus, opts ...psrpc.ClientOption) (E }, nil } -func (c *egressHandlerClient) UpdateStream(ctx context.Context, topic string, req *livekit4.UpdateStreamRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) { - return client.RequestSingle[*livekit4.EgressInfo](ctx, c.client, "UpdateStream", []string{topic}, req, opts...) +func (c *egressHandlerClient) UpdateEgress(ctx context.Context, topic string, req *livekit4.UpdateEgressRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) { + return client.RequestSingle[*livekit4.EgressInfo](ctx, c.client, "UpdateEgress", []string{topic}, req, opts...) } func (c *egressHandlerClient) StopEgress(ctx context.Context, topic string, req *livekit4.StopEgressRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) { return client.RequestSingle[*livekit4.EgressInfo](ctx, c.client, "StopEgress", []string{topic}, req, opts...) } +func (c *egressHandlerClient) UpdateStream(ctx context.Context, topic string, req *livekit4.UpdateStreamRequest, opts ...psrpc.RequestOption) (*livekit4.EgressInfo, error) { + return client.RequestSingle[*livekit4.EgressInfo](ctx, c.client, "UpdateStream", []string{topic}, req, opts...) +} + func (s *egressHandlerClient) Close() { s.client.Close() } @@ -265,20 +279,21 @@ func NewEgressHandlerServer(svc EgressHandlerServerImpl, bus psrpc.MessageBus, o s := server.NewRPCServer(sd, bus, opts...) - sd.RegisterMethod("UpdateStream", false, false, true, true) + sd.RegisterMethod("UpdateEgress", false, false, true, true) sd.RegisterMethod("StopEgress", false, false, true, true) + sd.RegisterMethod("UpdateStream", false, false, true, true) return &egressHandlerServer{ svc: svc, rpc: s, }, nil } -func (s *egressHandlerServer) RegisterUpdateStreamTopic(topic string) error { - return server.RegisterHandler(s.rpc, "UpdateStream", []string{topic}, s.svc.UpdateStream, nil) +func (s *egressHandlerServer) RegisterUpdateEgressTopic(topic string) error { + return server.RegisterHandler(s.rpc, "UpdateEgress", []string{topic}, s.svc.UpdateEgress, nil) } -func (s *egressHandlerServer) DeregisterUpdateStreamTopic(topic string) { - s.rpc.DeregisterHandler("UpdateStream", []string{topic}) +func (s *egressHandlerServer) DeregisterUpdateEgressTopic(topic string) { + s.rpc.DeregisterHandler("UpdateEgress", []string{topic}) } func (s *egressHandlerServer) RegisterStopEgressTopic(topic string) error { @@ -289,6 +304,14 @@ func (s *egressHandlerServer) DeregisterStopEgressTopic(topic string) { s.rpc.DeregisterHandler("StopEgress", []string{topic}) } +func (s *egressHandlerServer) RegisterUpdateStreamTopic(topic string) error { + return server.RegisterHandler(s.rpc, "UpdateStream", []string{topic}, s.svc.UpdateStream, nil) +} + +func (s *egressHandlerServer) DeregisterUpdateStreamTopic(topic string) { + s.rpc.DeregisterHandler("UpdateStream", []string{topic}) +} + func (s *egressHandlerServer) Shutdown() { s.rpc.Close(false) } @@ -303,7 +326,7 @@ func (s *egressHandlerServer) Kill() { type UnimplementedEgressHandlerServer struct{} -func (UnimplementedEgressHandlerServer) UpdateStream(context.Context, *livekit4.UpdateStreamRequest) (*livekit4.EgressInfo, error) { +func (UnimplementedEgressHandlerServer) UpdateEgress(context.Context, *livekit4.UpdateEgressRequest) (*livekit4.EgressInfo, error) { return nil, psrpc.ErrUnimplemented } @@ -311,46 +334,51 @@ func (UnimplementedEgressHandlerServer) StopEgress(context.Context, *livekit4.St return nil, psrpc.ErrUnimplemented } +func (UnimplementedEgressHandlerServer) UpdateStream(context.Context, *livekit4.UpdateStreamRequest) (*livekit4.EgressInfo, error) { + return nil, psrpc.ErrUnimplemented +} + var psrpcFileDescriptor2 = []byte{ - // 639 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x4e, 0x13, 0x4d, - 0x14, 0xff, 0x86, 0x7e, 0x5d, 0xe8, 0x29, 0x2d, 0xf5, 0x88, 0x61, 0xa8, 0x10, 0x4a, 0xf1, 0xa2, - 0x26, 0xd8, 0x12, 0x88, 0x26, 0xde, 0x69, 0xa1, 0x91, 0x26, 0x24, 0x9a, 0x45, 0x62, 0xa2, 0x17, - 0x9b, 0xed, 0xec, 0x58, 0x37, 0xdd, 0xee, 0x8c, 0xb3, 0xb3, 0x20, 0x6f, 0x20, 0xaf, 0xc0, 0x9d, - 0xaf, 0xc0, 0x85, 0x2f, 0xe2, 0x6b, 0xf0, 0x10, 0xa6, 0xb3, 0xed, 0xb2, 0x2c, 0x62, 0xbc, 0xea, - 0xf4, 0xf7, 0x6f, 0xce, 0x99, 0x39, 0xb3, 0x50, 0x53, 0x92, 0x75, 0xf8, 0x50, 0xf1, 0x28, 0x6a, - 0x4b, 0x25, 0xb4, 0xc0, 0x82, 0x92, 0xac, 0x5e, 0x11, 0x52, 0xfb, 0x22, 0x9c, 0x62, 0xf5, 0xe5, - 0x40, 0x0c, 0x87, 0x5c, 0x75, 0xf2, 0xa8, 0x7f, 0xca, 0x47, 0xbe, 0x76, 0xb2, 0xfe, 0xe6, 0xaf, - 0x22, 0xe0, 0xb1, 0x76, 0x95, 0xee, 0x19, 0xd4, 0xe6, 0x5f, 0x63, 0x1e, 0x69, 0x7c, 0x0a, 0xa5, - 0x44, 0xe6, 0xf8, 0x1e, 0x25, 0x0d, 0xd2, 0x2a, 0x75, 0x17, 0x2f, 0xaf, 0xb7, 0x17, 0x12, 0xb0, - 0x7f, 0x60, 0xcf, 0x56, 0x1e, 0x3e, 0x07, 0x2b, 0x59, 0xd3, 0x5a, 0x83, 0xb4, 0xca, 0xbb, 0x8f, - 0xdb, 0xd3, 0x8d, 0xda, 0x77, 0x73, 0x0f, 0xff, 0xb3, 0xa7, 0x62, 0x7c, 0x01, 0x96, 0xe2, 0x32, - 0x70, 0xcf, 0xe9, 0x03, 0x63, 0x5b, 0x4b, 0x6d, 0xbd, 0x6f, 0x52, 0x28, 0x6d, 0x1b, 0x32, 0xe3, - 0x4b, 0xd4, 0x78, 0x04, 0x55, 0x25, 0xc4, 0xd8, 0x61, 0x62, 0x2c, 0x45, 0xe4, 0x6b, 0x4e, 0x8b, - 0xc6, 0xbf, 0x95, 0xfa, 0x6d, 0x21, 0xc6, 0xfb, 0x33, 0x36, 0xbf, 0x7d, 0x45, 0x65, 0x59, 0x7c, - 0x06, 0x85, 0x33, 0x3e, 0xa0, 0x65, 0x13, 0xb1, 0x9a, 0x46, 0x7c, 0xe0, 0x83, 0xbc, 0x71, 0xa2, - 0xc3, 0x1e, 0x94, 0xa5, 0xab, 0xb4, 0xcf, 0x7c, 0xe9, 0x86, 0x9a, 0x56, 0x8c, 0x6d, 0x33, 0xb5, - 0xbd, 0xbb, 0xe1, 0xf2, 0xf6, 0xac, 0x0f, 0xdf, 0xc2, 0x92, 0x56, 0x2e, 0x1b, 0x65, 0x9a, 0xb0, - 0x4c, 0xd4, 0x93, 0x34, 0xea, 0xfd, 0x84, 0xbf, 0xb7, 0x8b, 0xaa, 0xbe, 0x45, 0xe3, 0x1e, 0x14, - 0x0d, 0x42, 0xe7, 0x73, 0x57, 0x60, 0x62, 0xf2, 0xee, 0x44, 0x8b, 0x5b, 0x30, 0x6f, 0x4e, 0xd2, - 0xf7, 0x68, 0xc1, 0xdc, 0x30, 0x5c, 0x5e, 0x6f, 0x5b, 0x13, 0xa8, 0x7f, 0x60, 0x27, 0xbf, 0x1e, - 0xd6, 0xa1, 0xa8, 0xc5, 0x88, 0x87, 0x74, 0xc1, 0x48, 0xfe, 0xff, 0x7e, 0xbd, 0x4d, 0xec, 0x04, - 0xc2, 0x47, 0x60, 0x9d, 0x45, 0x4e, 0xac, 0x02, 0x5a, 0x9a, 0x90, 0x76, 0xf1, 0x2c, 0x3a, 0x51, - 0x01, 0xee, 0xc0, 0x32, 0x0b, 0x44, 0xec, 0x39, 0x03, 0x97, 0x8d, 0x62, 0xe9, 0xf0, 0xd0, 0x1d, - 0x04, 0xdc, 0xa3, 0xd0, 0x20, 0xad, 0x05, 0x1b, 0x0d, 0xd7, 0x35, 0x54, 0x2f, 0x61, 0x70, 0x0b, - 0x2a, 0x3c, 0xd2, 0xfe, 0xd8, 0xd5, 0xdc, 0x73, 0x98, 0x8c, 0x69, 0xb5, 0x41, 0x5a, 0xc4, 0x5e, - 0x4c, 0xc1, 0x7d, 0x19, 0xe3, 0x06, 0x94, 0x15, 0xd7, 0xea, 0xdc, 0x61, 0x22, 0x0e, 0x35, 0x5d, - 0x6a, 0x90, 0x56, 0xd1, 0x06, 0x03, 0xed, 0x4f, 0x90, 0x6e, 0x09, 0xe6, 0x55, 0xd2, 0x63, 0x73, - 0x15, 0x56, 0x8e, 0xfc, 0x48, 0xbf, 0x66, 0xda, 0x3f, 0xbd, 0x7d, 0x78, 0xcd, 0x97, 0x40, 0xef, - 0x52, 0x91, 0x14, 0x61, 0xc4, 0x71, 0x1d, 0x20, 0x9d, 0xfa, 0x88, 0x92, 0x46, 0xa1, 0x55, 0xb2, - 0x4b, 0xb3, 0x41, 0x8f, 0x76, 0x7f, 0x12, 0xa8, 0x26, 0x8e, 0x7e, 0xa8, 0xb9, 0x0a, 0xdd, 0x00, - 0xdf, 0x40, 0x39, 0x33, 0xe5, 0xb8, 0xd2, 0x56, 0x92, 0xfd, 0x61, 0xee, 0xeb, 0x0f, 0x6f, 0xa6, - 0x7b, 0x1a, 0xf0, 0x59, 0x34, 0xe1, 0xea, 0x82, 0x58, 0x35, 0xf2, 0x8a, 0xec, 0x10, 0xfc, 0x04, - 0xb5, 0x7c, 0x59, 0xb8, 0x66, 0xd2, 0xee, 0x69, 0xa4, 0xbe, 0x7e, 0x0f, 0x9b, 0xf4, 0x92, 0x86, - 0xcf, 0xb5, 0xc8, 0xee, 0x0f, 0x02, 0x95, 0x84, 0x3e, 0x74, 0x43, 0x2f, 0xe0, 0x0a, 0xfb, 0xb0, - 0x78, 0x22, 0x3d, 0x57, 0xf3, 0x63, 0xad, 0xb8, 0x3b, 0xc6, 0x9b, 0xd7, 0x97, 0x85, 0xff, 0x5a, - 0xbd, 0x75, 0x75, 0x41, 0xe6, 0x6a, 0x04, 0x7b, 0x00, 0xc7, 0x5a, 0xc8, 0x69, 0xcd, 0xf5, 0xcc, - 0xeb, 0x9f, 0x81, 0xff, 0x12, 0xd3, 0xdd, 0xfc, 0xb8, 0x31, 0xf4, 0xf5, 0x97, 0x78, 0xd0, 0x66, - 0x62, 0xdc, 0x99, 0x0a, 0x3b, 0xe6, 0x23, 0xc5, 0x44, 0xd0, 0x51, 0x92, 0x0d, 0x2c, 0xf3, 0x6f, - 0xef, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0x48, 0x7e, 0xb7, 0x06, 0x05, 0x00, 0x00, + // 645 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdf, 0x4e, 0xdb, 0x3c, + 0x14, 0xff, 0x4c, 0xbf, 0x06, 0x7a, 0x4a, 0x4b, 0xe7, 0x31, 0x61, 0x3a, 0x10, 0xa5, 0xec, 0x22, + 0x93, 0x58, 0x8b, 0x40, 0x9b, 0xb4, 0xbb, 0xad, 0x50, 0x8d, 0x4a, 0x48, 0x9b, 0xc2, 0xd0, 0xa4, + 0xed, 0x22, 0x4a, 0x1d, 0xaf, 0x8b, 0x9a, 0xc6, 0x9e, 0xe3, 0xc0, 0x78, 0x83, 0xf1, 0x0a, 0x3c, + 0x06, 0x17, 0x7b, 0x91, 0xbd, 0x46, 0x1f, 0x62, 0xaa, 0xdd, 0x86, 0x10, 0xd6, 0x89, 0xab, 0x38, + 0xbf, 0x7f, 0x3e, 0xc7, 0x3e, 0x09, 0xd4, 0xa4, 0xa0, 0x6d, 0x36, 0x90, 0x2c, 0x8e, 0x5b, 0x42, + 0x72, 0xc5, 0x71, 0x41, 0x0a, 0x5a, 0xaf, 0x70, 0xa1, 0x02, 0x1e, 0x4d, 0xb1, 0xfa, 0x6a, 0xc8, + 0x07, 0x03, 0x26, 0xdb, 0x79, 0x34, 0x38, 0x67, 0xc3, 0x40, 0xb9, 0x59, 0x7f, 0xf3, 0x77, 0x11, + 0xf0, 0xa9, 0xf2, 0xa4, 0xea, 0x6a, 0xd4, 0x61, 0xdf, 0x13, 0x16, 0x2b, 0xfc, 0x1c, 0x4a, 0x46, + 0xe6, 0x06, 0x3e, 0x41, 0x0d, 0x64, 0x97, 0x3a, 0xcb, 0xd7, 0xe3, 0xdd, 0x25, 0x03, 0xf6, 0x8e, + 0x9c, 0xd9, 0xca, 0xc7, 0x2f, 0xc1, 0x32, 0x6b, 0x52, 0x6b, 0x20, 0xbb, 0xbc, 0xff, 0xb4, 0x35, + 0xdd, 0xa8, 0x75, 0x3f, 0xf7, 0xf8, 0x3f, 0x67, 0x2a, 0xc6, 0xaf, 0xc0, 0x92, 0x4c, 0x84, 0xde, + 0x25, 0x79, 0xa4, 0x6d, 0x1b, 0xa9, 0xad, 0xfb, 0x43, 0x70, 0xa9, 0x1c, 0x4d, 0x66, 0x7c, 0x46, + 0x8d, 0x4f, 0xa0, 0x2a, 0x39, 0x1f, 0xb9, 0x94, 0x8f, 0x04, 0x8f, 0x03, 0xc5, 0x48, 0x51, 0xfb, + 0x77, 0x52, 0xbf, 0xc3, 0xf9, 0xe8, 0x70, 0xc6, 0xe6, 0xb7, 0xaf, 0xc8, 0x2c, 0x8b, 0x5f, 0x40, + 0xe1, 0x82, 0xf5, 0x49, 0x59, 0x47, 0xac, 0xa7, 0x11, 0x9f, 0x58, 0x3f, 0x6f, 0x9c, 0xe8, 0x70, + 0x17, 0xca, 0xc2, 0x93, 0x2a, 0xa0, 0x81, 0xf0, 0x22, 0x45, 0x2a, 0xda, 0xb6, 0x9d, 0xda, 0x3e, + 0xdc, 0x72, 0x79, 0x7b, 0xd6, 0x87, 0xdf, 0xc3, 0x8a, 0x92, 0x1e, 0x1d, 0x66, 0x9a, 0xb0, 0x74, + 0xd4, 0xb3, 0x34, 0xea, 0xe3, 0x84, 0x9f, 0xdb, 0x45, 0x55, 0xdd, 0xa1, 0xf1, 0x01, 0x14, 0x35, + 0x42, 0x16, 0x73, 0x57, 0xa0, 0x63, 0xf2, 0x6e, 0xa3, 0xc5, 0x3b, 0xb0, 0xa8, 0x4f, 0x32, 0xf0, + 0x49, 0x41, 0xdf, 0x30, 0x5c, 0x8f, 0x77, 0xad, 0x09, 0xd4, 0x3b, 0x72, 0xcc, 0xd3, 0xc7, 0x75, + 0x28, 0x2a, 0x3e, 0x64, 0x11, 0x59, 0xd2, 0x92, 0xff, 0x7f, 0x8e, 0x77, 0x91, 0x63, 0x20, 0xfc, + 0x04, 0xac, 0x8b, 0xd8, 0x4d, 0x64, 0x48, 0x4a, 0x13, 0xd2, 0x29, 0x5e, 0xc4, 0x67, 0x32, 0xc4, + 0x7b, 0xb0, 0x4a, 0x43, 0x9e, 0xf8, 0x6e, 0xdf, 0xa3, 0xc3, 0x44, 0xb8, 0x2c, 0xf2, 0xfa, 0x21, + 0xf3, 0x09, 0x34, 0x90, 0xbd, 0xe4, 0x60, 0xcd, 0x75, 0x34, 0xd5, 0x35, 0x0c, 0xde, 0x81, 0x0a, + 0x8b, 0x55, 0x30, 0xf2, 0x14, 0xf3, 0x5d, 0x2a, 0x12, 0x52, 0x6d, 0x20, 0x1b, 0x39, 0xcb, 0x29, + 0x78, 0x28, 0x12, 0xbc, 0x05, 0x65, 0xc9, 0x94, 0xbc, 0x74, 0x29, 0x4f, 0x22, 0x45, 0x56, 0x1a, + 0xc8, 0x2e, 0x3a, 0xa0, 0xa1, 0xc3, 0x09, 0xd2, 0x29, 0xc1, 0xa2, 0x34, 0x3d, 0x36, 0xd7, 0x61, + 0xed, 0x24, 0x88, 0xd5, 0x5b, 0xaa, 0x82, 0xf3, 0xbb, 0x87, 0xd7, 0x7c, 0x0d, 0xe4, 0x3e, 0x15, + 0x0b, 0x1e, 0xc5, 0x0c, 0x6f, 0x02, 0xa4, 0x53, 0x1f, 0x13, 0xd4, 0x28, 0xd8, 0x25, 0xa7, 0x34, + 0x1b, 0xf4, 0x78, 0xff, 0x17, 0x82, 0xaa, 0x71, 0xf4, 0x22, 0xc5, 0x64, 0xe4, 0x85, 0xf8, 0x1d, + 0x94, 0x33, 0x53, 0x8e, 0xd7, 0x5a, 0x52, 0xd0, 0xbf, 0xcc, 0x7d, 0xfd, 0xf1, 0xed, 0x74, 0x4f, + 0x03, 0xbe, 0xf2, 0x26, 0xdc, 0x5c, 0x21, 0xab, 0x86, 0xde, 0xa0, 0x3d, 0x84, 0xbf, 0x40, 0x2d, + 0x5f, 0x16, 0xde, 0xd0, 0x69, 0x73, 0x1a, 0xa9, 0x6f, 0xce, 0x61, 0x4d, 0x2f, 0x69, 0xf8, 0x82, + 0x8d, 0xf6, 0xc7, 0x08, 0x2a, 0x86, 0x3e, 0xf6, 0x22, 0x3f, 0x64, 0x12, 0xf7, 0x60, 0xf9, 0x4c, + 0xf8, 0x9e, 0xba, 0xdd, 0x6a, 0x56, 0x5f, 0x16, 0xfe, 0x67, 0xf5, 0xd6, 0xcd, 0x15, 0x5a, 0xa8, + 0x21, 0xdc, 0x05, 0x38, 0x55, 0x5c, 0x4c, 0x83, 0xea, 0x99, 0xaf, 0x7f, 0x06, 0x3e, 0x28, 0x26, + 0xad, 0xe8, 0x54, 0x49, 0xe6, 0x8d, 0xee, 0x55, 0x64, 0xe0, 0x87, 0x44, 0x75, 0xb6, 0x3f, 0x6f, + 0x0d, 0x02, 0xf5, 0x2d, 0xe9, 0xb7, 0x28, 0x1f, 0xb5, 0xa7, 0xc2, 0xb6, 0xfe, 0xdf, 0x51, 0x1e, + 0xb6, 0xa5, 0xa0, 0x7d, 0x4b, 0xbf, 0x1d, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0x8c, 0xeb, 0x33, + 0x3e, 0x51, 0x05, 0x00, 0x00, } From 886fda241ffe1efae585203d4b4892d71b833078 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Fri, 20 Mar 2026 16:07:19 +0800 Subject: [PATCH 11/15] aliOss -> aliOSS --- protobufs/livekit_egress.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index bc917a5f9..6a77fe3ca 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -283,7 +283,7 @@ message StorageConfig { S3Upload s3 = 1; GCPUpload gcp = 2; AzureBlobUpload azure = 3; - AliOSSUpload ali_oss = 4; + AliOSSUpload aliOSS = 4; } } From 3fd05ac768f6b3ec4fa5a59382fbb1eb4b03d533 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:08:11 +0000 Subject: [PATCH 12/15] generated protobuf --- livekit/livekit_egress.pb.go | 24 +- livekit/livekit_egress.twirp.go | 445 ++++++++++++++++---------------- 2 files changed, 234 insertions(+), 235 deletions(-) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index 33b0cbf6b..bba9184ba 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -2097,7 +2097,7 @@ type StorageConfig struct { // *StorageConfig_S3 // *StorageConfig_Gcp // *StorageConfig_Azure - // *StorageConfig_AliOss + // *StorageConfig_AliOSS Provider isStorageConfig_Provider `protobuf_oneof:"provider"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -2167,10 +2167,10 @@ func (x *StorageConfig) GetAzure() *AzureBlobUpload { return nil } -func (x *StorageConfig) GetAliOss() *AliOSSUpload { +func (x *StorageConfig) GetAliOSS() *AliOSSUpload { if x != nil { - if x, ok := x.Provider.(*StorageConfig_AliOss); ok { - return x.AliOss + if x, ok := x.Provider.(*StorageConfig_AliOSS); ok { + return x.AliOSS } } return nil @@ -2192,8 +2192,8 @@ type StorageConfig_Azure struct { Azure *AzureBlobUpload `protobuf:"bytes,3,opt,name=azure,proto3,oneof"` } -type StorageConfig_AliOss struct { - AliOss *AliOSSUpload `protobuf:"bytes,4,opt,name=ali_oss,json=aliOss,proto3,oneof"` +type StorageConfig_AliOSS struct { + AliOSS *AliOSSUpload `protobuf:"bytes,4,opt,name=aliOSS,proto3,oneof"` } func (*StorageConfig_S3) isStorageConfig_Provider() {} @@ -2202,7 +2202,7 @@ func (*StorageConfig_Gcp) isStorageConfig_Provider() {} func (*StorageConfig_Azure) isStorageConfig_Provider() {} -func (*StorageConfig_AliOss) isStorageConfig_Provider() {} +func (*StorageConfig_AliOSS) isStorageConfig_Provider() {} type S3Upload struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -5448,12 +5448,12 @@ const file_livekit_egress_proto_rawDesc = "" + "\x05azure\x18\n" + " \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + "\x06aliOSS\x18\v \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\b\n" + - "\x06output\"\xcc\x01\n" + + "\x06output\"\xcb\x01\n" + "\rStorageConfig\x12#\n" + "\x02s3\x18\x01 \x01(\v2\x11.livekit.S3UploadH\x00R\x02s3\x12&\n" + "\x03gcp\x18\x02 \x01(\v2\x12.livekit.GCPUploadH\x00R\x03gcp\x120\n" + - "\x05azure\x18\x03 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x120\n" + - "\aali_oss\x18\x04 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOssB\n" + + "\x05azure\x18\x03 \x01(\v2\x18.livekit.AzureBlobUploadH\x00R\x05azure\x12/\n" + + "\x06aliOSS\x18\x04 \x01(\v2\x15.livekit.AliOSSUploadH\x00R\x06aliOSSB\n" + "\n" + "\bprovider\"\xe2\x04\n" + "\bS3Upload\x12#\n" + @@ -5906,7 +5906,7 @@ var file_livekit_egress_proto_depIdxs = []int32{ 27, // 36: livekit.StorageConfig.s3:type_name -> livekit.S3Upload 28, // 37: livekit.StorageConfig.gcp:type_name -> livekit.GCPUpload 29, // 38: livekit.StorageConfig.azure:type_name -> livekit.AzureBlobUpload - 30, // 39: livekit.StorageConfig.ali_oss:type_name -> livekit.AliOSSUpload + 30, // 39: livekit.StorageConfig.aliOSS:type_name -> livekit.AliOSSUpload 54, // 40: livekit.S3Upload.metadata:type_name -> livekit.S3Upload.MetadataEntry 31, // 41: livekit.S3Upload.proxy:type_name -> livekit.ProxyConfig 31, // 42: livekit.GCPUpload.proxy:type_name -> livekit.ProxyConfig @@ -6072,7 +6072,7 @@ func file_livekit_egress_proto_init() { (*StorageConfig_S3)(nil), (*StorageConfig_Gcp)(nil), (*StorageConfig_Azure)(nil), - (*StorageConfig_AliOss)(nil), + (*StorageConfig_AliOSS)(nil), } file_livekit_egress_proto_msgTypes[25].OneofWrappers = []any{ (*EgressInfo_Egress)(nil), diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index 8aca39951..7e83367bb 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -3312,85 +3312,85 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 4246 bytes of a gzipped FileDescriptorProto + // 4234 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0x1b, 0x49, 0x76, 0x6a, 0x7e, 0xf3, 0xf1, 0xab, 0x55, 0x92, 0x65, 0x5a, 0x9e, 0x19, 0x7b, 0xe9, 0x8c, 0x3f, - 0x34, 0x5a, 0x59, 0x91, 0xbc, 0x1e, 0xaf, 0x37, 0x3b, 0x1b, 0x4a, 0x6c, 0x99, 0x5c, 0x4b, 0xa2, + 0x34, 0x5a, 0xd9, 0x91, 0xbc, 0x1e, 0xaf, 0x37, 0x3b, 0x1b, 0x4a, 0x6c, 0x89, 0x5c, 0x4b, 0xa2, 0xd2, 0xa4, 0xc6, 0x93, 0x00, 0x49, 0xa3, 0xc5, 0x2e, 0x49, 0x0d, 0x91, 0xdd, 0xdc, 0xee, 0xa6, 0x6c, 0xed, 0x2f, 0xd8, 0x04, 0x41, 0x12, 0x24, 0x40, 0x0e, 0x06, 0x82, 0xe4, 0x10, 0xe4, 0x10, - 0xec, 0x29, 0xbf, 0x20, 0xf7, 0x04, 0x08, 0x90, 0x20, 0xc8, 0x39, 0x39, 0x06, 0x0e, 0x16, 0x39, - 0xe4, 0x1e, 0xd4, 0x47, 0x77, 0x17, 0x9b, 0x2d, 0x9a, 0xb2, 0x9c, 0xc9, 0x65, 0x4e, 0x62, 0xbd, - 0xf7, 0xaa, 0xfa, 0x55, 0xbd, 0x8f, 0x7a, 0xef, 0xd5, 0x13, 0x2c, 0xf6, 0xcd, 0x73, 0x7c, 0x66, - 0x7a, 0x1a, 0x3e, 0x71, 0xb0, 0xeb, 0xae, 0x0d, 0x1d, 0xdb, 0xb3, 0x51, 0x96, 0x43, 0x97, 0x03, - 0xf4, 0xc0, 0x36, 0x70, 0x9f, 0xa3, 0x97, 0x17, 0xfb, 0xf6, 0xc9, 0x09, 0x76, 0x1e, 0xdb, 0x43, - 0xcf, 0xb4, 0x2d, 0x0e, 0xad, 0xfd, 0x5b, 0x12, 0x50, 0xc7, 0xd3, 0x1d, 0x4f, 0xa1, 0x4b, 0xa9, - 0xf8, 0x67, 0x23, 0xec, 0x7a, 0xe8, 0x36, 0xe4, 0x1d, 0xdb, 0x1e, 0x68, 0x96, 0x3e, 0xc0, 0x55, - 0xe9, 0xae, 0xf4, 0x30, 0xaf, 0xe6, 0x08, 0x60, 0x5f, 0x1f, 0x60, 0xf4, 0x03, 0xc8, 0x79, 0x78, - 0x30, 0xec, 0xeb, 0x1e, 0xae, 0x26, 0xee, 0x4a, 0x0f, 0x0b, 0x1b, 0x37, 0xd7, 0xf8, 0x27, 0xd7, - 0xba, 0x1c, 0xd1, 0xb1, 0x47, 0x4e, 0x0f, 0x37, 0xe7, 0xd4, 0x80, 0x14, 0xdd, 0x87, 0xe4, 0x6b, - 0x7c, 0x54, 0x4d, 0xd2, 0x19, 0x28, 0x98, 0xf1, 0x0a, 0x1f, 0x05, 0xc4, 0x84, 0x00, 0xad, 0x42, - 0x7a, 0x80, 0x0d, 0x53, 0xaf, 0xa6, 0x28, 0xe5, 0x62, 0x40, 0xb9, 0x47, 0xa0, 0x01, 0x2d, 0x23, - 0x42, 0xcf, 0x20, 0x33, 0x74, 0xb0, 0x8b, 0xbd, 0x6a, 0xfa, 0xae, 0xf4, 0xb0, 0xbc, 0xf1, 0x59, - 0x40, 0xae, 0x58, 0x3d, 0xdb, 0x30, 0xad, 0x93, 0x36, 0xdb, 0xf0, 0x01, 0xa5, 0x6a, 0x4a, 0x2a, - 0xa7, 0x47, 0x4f, 0x21, 0xa7, 0x1b, 0xe7, 0xba, 0xd5, 0xc3, 0x46, 0x35, 0x43, 0x3f, 0x55, 0xbd, - 0x6c, 0x6e, 0x53, 0x52, 0x03, 0x5a, 0xf4, 0x08, 0xb2, 0xf6, 0xc8, 0x1b, 0x8e, 0x3c, 0xb7, 0x9a, - 0xbd, 0x9b, 0x7c, 0x58, 0xd8, 0xa8, 0x04, 0xd3, 0xda, 0x14, 0xae, 0xfa, 0x78, 0xb4, 0x0e, 0x59, - 0xd7, 0xb3, 0x1d, 0xfd, 0x04, 0x57, 0x73, 0xf4, 0x0b, 0x4b, 0x01, 0x69, 0x87, 0xc1, 0xb7, 0x6d, - 0xeb, 0xd8, 0x3c, 0x51, 0x7d, 0x32, 0xb4, 0x01, 0xb9, 0xd7, 0xf8, 0xe8, 0xd4, 0xb6, 0xcf, 0xdc, - 0x6a, 0x9e, 0xae, 0xbe, 0x24, 0x9e, 0x14, 0x41, 0xf0, 0x29, 0x01, 0xdd, 0x56, 0x0e, 0x32, 0x2e, - 0x3d, 0x95, 0x2d, 0x80, 0x1c, 0xe6, 0x9c, 0xd7, 0xfe, 0x48, 0x82, 0xf2, 0xb8, 0x34, 0xd0, 0x12, + 0xec, 0x29, 0xbf, 0x20, 0xf7, 0x3d, 0x04, 0x48, 0x10, 0xe4, 0x9c, 0x1c, 0x03, 0x07, 0x8b, 0x1c, + 0x72, 0x0f, 0xea, 0xa3, 0xbb, 0x8b, 0xcd, 0x96, 0x4c, 0x5a, 0xce, 0xe4, 0x32, 0x27, 0xb1, 0xde, + 0x7b, 0x55, 0xfd, 0xaa, 0xde, 0x47, 0xbd, 0xf7, 0xea, 0x09, 0x16, 0xfb, 0xe6, 0x39, 0x3e, 0x33, + 0x3d, 0x0d, 0x9f, 0x38, 0xd8, 0x75, 0xd7, 0x86, 0x8e, 0xed, 0xd9, 0x28, 0xcb, 0xa1, 0xcb, 0x01, + 0x7a, 0x60, 0x1b, 0xb8, 0xcf, 0xd1, 0xcb, 0x8b, 0x7d, 0xfb, 0xe4, 0x04, 0x3b, 0x8f, 0xed, 0xa1, + 0x67, 0xda, 0x16, 0x87, 0xd6, 0xfe, 0x2d, 0x09, 0xa8, 0xe3, 0xe9, 0x8e, 0xa7, 0xd0, 0xa5, 0x54, + 0xfc, 0xb3, 0x11, 0x76, 0x3d, 0x74, 0x1b, 0xf2, 0x8e, 0x6d, 0x0f, 0x34, 0x4b, 0x1f, 0xe0, 0xaa, + 0x74, 0x57, 0x7a, 0x98, 0x57, 0x73, 0x04, 0xb0, 0xaf, 0x0f, 0x30, 0xfa, 0x01, 0xe4, 0x3c, 0x3c, + 0x18, 0xf6, 0x75, 0x0f, 0x57, 0x13, 0x77, 0xa5, 0x87, 0x85, 0xf5, 0x9b, 0x6b, 0xfc, 0x93, 0x6b, + 0x5d, 0x8e, 0xe8, 0xd8, 0x23, 0xa7, 0x87, 0x9b, 0x73, 0x6a, 0x40, 0x8a, 0xee, 0x43, 0xf2, 0x35, + 0x3e, 0xaa, 0x26, 0xe9, 0x0c, 0x14, 0xcc, 0x78, 0x85, 0x8f, 0x02, 0x62, 0x42, 0x80, 0x56, 0x21, + 0x3d, 0xc0, 0x86, 0xa9, 0x57, 0x53, 0x94, 0x72, 0x31, 0xa0, 0xdc, 0x23, 0xd0, 0x80, 0x96, 0x11, + 0xa1, 0xe7, 0x90, 0x19, 0x3a, 0xd8, 0xc5, 0x5e, 0x35, 0x7d, 0x57, 0x7a, 0x58, 0x5e, 0xff, 0x2c, + 0x20, 0x57, 0xac, 0x9e, 0x6d, 0x98, 0xd6, 0x49, 0x9b, 0x6d, 0xf8, 0x80, 0x52, 0x35, 0x25, 0x95, + 0xd3, 0xa3, 0x67, 0x90, 0xd3, 0x8d, 0x73, 0xdd, 0xea, 0x61, 0xa3, 0x9a, 0xa1, 0x9f, 0xaa, 0x5e, + 0x36, 0xb7, 0x29, 0xa9, 0x01, 0x2d, 0x7a, 0x04, 0x59, 0x7b, 0xe4, 0x0d, 0x47, 0x9e, 0x5b, 0xcd, + 0xde, 0x4d, 0x3e, 0x2c, 0xac, 0x57, 0x82, 0x69, 0x6d, 0x0a, 0x57, 0x7d, 0x3c, 0x7a, 0x02, 0x59, + 0xd7, 0xb3, 0x1d, 0xfd, 0x04, 0x57, 0x73, 0xf4, 0x0b, 0x4b, 0x01, 0x69, 0x87, 0xc1, 0xb7, 0x6c, + 0xeb, 0xd8, 0x3c, 0x51, 0x7d, 0x32, 0xb4, 0x0e, 0xb9, 0xd7, 0xf8, 0xe8, 0xd4, 0xb6, 0xcf, 0xdc, + 0x6a, 0x9e, 0xae, 0xbe, 0x24, 0x9e, 0x14, 0x41, 0xf0, 0x29, 0x01, 0xdd, 0x66, 0x0e, 0x32, 0x2e, + 0x3d, 0x95, 0x4d, 0x80, 0x1c, 0xe6, 0x9c, 0xd7, 0xfe, 0x44, 0x82, 0xf2, 0xb8, 0x34, 0xd0, 0x12, 0x64, 0xfa, 0xfa, 0x85, 0x3d, 0xf2, 0xb8, 0x48, 0xf9, 0x08, 0x7d, 0x0a, 0xa0, 0x8f, 0x0c, 0xd3, 0xd6, 0x6c, 0xab, 0x7f, 0x41, 0x45, 0x9a, 0x53, 0xf3, 0x14, 0xd2, 0xb6, 0xfa, 0x17, 0x04, 0x7d, 0x6e, 0x1a, 0x98, 0xa3, 0x93, 0x0c, 0x4d, 0x21, 0x14, 0x7d, 0x1f, 0x2a, 0xbd, 0x91, 0xeb, 0xd9, - 0x03, 0xed, 0x48, 0x77, 0xb1, 0x36, 0x72, 0xfa, 0x54, 0x72, 0x79, 0xb5, 0xc4, 0xc0, 0x5b, 0xba, - 0x8b, 0x0f, 0x9d, 0x7e, 0xed, 0xf7, 0x25, 0xc8, 0x07, 0xc2, 0x46, 0x32, 0x24, 0x09, 0x25, 0x63, + 0x03, 0xed, 0x48, 0x77, 0xb1, 0x36, 0x72, 0xfa, 0x54, 0x72, 0x79, 0xb5, 0xc4, 0xc0, 0x9b, 0xba, + 0x8b, 0x0f, 0x9d, 0x7e, 0xed, 0x0f, 0x25, 0xc8, 0x07, 0xc2, 0x46, 0x32, 0x24, 0x09, 0x25, 0x63, 0x84, 0xfc, 0xbc, 0x26, 0x17, 0xab, 0x80, 0xf4, 0xd7, 0xba, 0xe9, 0x69, 0x2e, 0xd1, 0x66, 0xcd, 0x35, 0x4f, 0x2c, 0x9d, 0x31, 0x92, 0x53, 0x65, 0x8a, 0xa1, 0x6a, 0xde, 0xa1, 0xf0, 0xda, 0xaf, - 0x24, 0x28, 0x08, 0xea, 0x84, 0x9e, 0x41, 0x99, 0x2d, 0xee, 0x39, 0x7a, 0xef, 0x4c, 0x33, 0x0d, - 0xc6, 0xd8, 0x96, 0xfc, 0xf6, 0xdd, 0x6a, 0x91, 0x62, 0xba, 0x04, 0xd1, 0x6a, 0x34, 0xe7, 0x54, + 0x25, 0x28, 0x08, 0xea, 0x84, 0x9e, 0x43, 0x99, 0x2d, 0xee, 0x39, 0x7a, 0xef, 0x4c, 0x33, 0x0d, + 0xc6, 0xd8, 0xa6, 0xfc, 0xf6, 0xdd, 0x6a, 0x91, 0x62, 0xba, 0x04, 0xd1, 0x6a, 0x34, 0xe7, 0x54, 0x71, 0x6c, 0xa0, 0x26, 0xcc, 0x0f, 0x75, 0xc7, 0x33, 0x7b, 0xe6, 0x50, 0xb7, 0x3c, 0x8d, 0xe2, 0xb8, 0x55, 0xdc, 0x0a, 0x24, 0x77, 0x10, 0x52, 0x7c, 0x4d, 0x08, 0x9a, 0x73, 0xaa, 0x3c, 0x8c, 0xc0, 0xd0, 0x0a, 0xa4, 0xe9, 0x6e, 0xb9, 0x85, 0x84, 0x7a, 0x5f, 0x27, 0x50, 0x2e, 0x75, 0x46, 0x82, 0x1e, 0x40, 0xca, 0xd0, 0x3d, 0xdf, 0x44, 0x16, 0x02, 0xd2, 0x86, 0xee, 0xe9, 0x9c, 0x92, - 0x12, 0x6c, 0x65, 0x21, 0x4d, 0x59, 0xaa, 0xfd, 0x1e, 0xc8, 0x51, 0x2e, 0xd0, 0x32, 0xe4, 0x4c, + 0x12, 0x6c, 0x66, 0x21, 0x4d, 0x59, 0xaa, 0xfd, 0x01, 0xc8, 0x51, 0x2e, 0xd0, 0x32, 0xe4, 0x4c, 0x03, 0x5b, 0x9e, 0xe9, 0x5d, 0xf8, 0x46, 0xee, 0x8f, 0xd1, 0x1a, 0x2c, 0x0c, 0x1d, 0x7c, 0x8c, 0x1d, 0xcd, 0xed, 0x39, 0x18, 0x5b, 0x9a, 0x7b, 0xaa, 0x3b, 0x98, 0x8b, 0x65, 0x9e, 0xa1, 0x3a, - 0x14, 0xd3, 0x21, 0x88, 0xda, 0x73, 0x28, 0x08, 0x7c, 0xa2, 0x2f, 0x20, 0xe3, 0xd8, 0x23, 0x0f, + 0x14, 0xd3, 0x21, 0x88, 0xda, 0x0b, 0x28, 0x08, 0x7c, 0xa2, 0x2f, 0x20, 0xe3, 0xd8, 0x23, 0x0f, 0xbb, 0x55, 0x89, 0x6a, 0xf1, 0xc2, 0xf8, 0x6e, 0x54, 0x82, 0x53, 0x39, 0x49, 0xed, 0xbf, 0x25, 0x80, 0x10, 0x8c, 0x1e, 0x42, 0x2e, 0x22, 0x86, 0xc2, 0xdb, 0x77, 0xab, 0x59, 0x2f, 0x90, 0x00, - 0xff, 0x69, 0xa0, 0x4d, 0x58, 0x14, 0x0f, 0x3f, 0xd8, 0x0c, 0xe1, 0x32, 0xdf, 0x9c, 0x53, 0x17, + 0xff, 0x69, 0xa0, 0x0d, 0x58, 0x14, 0x0f, 0x3f, 0xd8, 0x0c, 0xe1, 0x32, 0xdf, 0x9c, 0x53, 0x17, 0x04, 0x6c, 0xcb, 0xdf, 0xd9, 0x4f, 0x41, 0x3c, 0x7b, 0xed, 0xcc, 0xb4, 0x0c, 0x7a, 0xe4, 0xe5, - 0x8d, 0x4f, 0xe3, 0x04, 0xd6, 0xb2, 0x8e, 0xed, 0xb5, 0x97, 0xa6, 0x65, 0x34, 0xe7, 0xd4, 0x8a, - 0x30, 0x91, 0x80, 0xd0, 0x63, 0xc8, 0xf6, 0x4e, 0x75, 0xcb, 0xc2, 0x4c, 0xd5, 0xca, 0x1b, 0x37, + 0xf5, 0x4f, 0xe3, 0x04, 0xd6, 0xb2, 0x8e, 0xed, 0xb5, 0x97, 0xa6, 0x65, 0x34, 0xe7, 0xd4, 0x8a, + 0x30, 0x91, 0x80, 0xd0, 0x63, 0xc8, 0xf6, 0x4e, 0x75, 0xcb, 0xc2, 0x4c, 0xd5, 0xca, 0xeb, 0x37, 0x22, 0x52, 0x63, 0x48, 0xd5, 0xa7, 0x22, 0xf2, 0x18, 0xe8, 0x5e, 0xef, 0xb4, 0x56, 0x07, 0x08, - 0x85, 0x85, 0x36, 0x21, 0xef, 0xe2, 0x3e, 0xee, 0x79, 0xb6, 0xe3, 0x9f, 0xd8, 0x8d, 0x31, 0xa1, + 0x85, 0x85, 0x36, 0x20, 0xef, 0xe2, 0x3e, 0xee, 0x79, 0xb6, 0xe3, 0x9f, 0xd8, 0x8d, 0x31, 0xa1, 0x76, 0x38, 0x56, 0x0d, 0xe9, 0x88, 0x85, 0x17, 0x45, 0xdc, 0xff, 0xf5, 0xc1, 0x2d, 0x41, 0xda, 0xb3, 0x87, 0x66, 0x8f, 0x9e, 0x16, 0xa1, 0x62, 0xc3, 0x70, 0x4f, 0xff, 0x9c, 0x84, 0x4a, 0xc4, 0x73, 0xa2, 0x45, 0x48, 0xbf, 0x36, 0x0d, 0xef, 0x94, 0x32, 0x94, 0x56, 0xd9, 0x80, 0x78, 0xa2, 0x53, 0x6c, 0x9e, 0x9c, 0x7a, 0xf4, 0x8b, 0x69, 0x95, 0x8f, 0x08, 0xb5, 0x81, 0x87, 0xde, 0x29, 0xfd, 0x44, 0x5a, 0x65, 0x03, 0xf4, 0x09, 0xe4, 0x8f, 0x1d, 0x7d, 0x80, 0x1d, 0x72, 0xe3, 0xa4, - 0x28, 0x26, 0x04, 0xa0, 0x27, 0x50, 0x60, 0x7e, 0xa3, 0x67, 0x1b, 0xb8, 0xc7, 0xaf, 0x81, 0x85, + 0x28, 0x26, 0x04, 0xa0, 0xa7, 0x50, 0x60, 0x7e, 0xa3, 0x67, 0x1b, 0xb8, 0xc7, 0xaf, 0x81, 0x85, 0xa8, 0xf5, 0x18, 0xb8, 0xa7, 0x32, 0xff, 0x42, 0x7f, 0xa3, 0x7b, 0x50, 0x62, 0xb3, 0x8e, 0x4c, - 0x8f, 0xae, 0x9b, 0xa1, 0xeb, 0x16, 0x29, 0x70, 0x8b, 0xc1, 0xd0, 0x03, 0xa8, 0x30, 0xa2, 0x63, - 0x87, 0x5c, 0x8c, 0x56, 0xef, 0xa2, 0x9a, 0xa5, 0x64, 0x65, 0x0a, 0xde, 0xf1, 0xa1, 0x84, 0x07, + 0x8f, 0xae, 0x9b, 0xa1, 0xeb, 0x16, 0x29, 0x70, 0x93, 0xc1, 0xd0, 0x03, 0xa8, 0x30, 0xa2, 0x63, + 0x87, 0x5c, 0x8c, 0x56, 0xef, 0xa2, 0x9a, 0xa5, 0x64, 0x65, 0x0a, 0xde, 0xf6, 0xa1, 0x84, 0x07, 0xe6, 0x3f, 0x18, 0x0f, 0xb9, 0x08, 0x0f, 0xd4, 0xdc, 0x38, 0x0f, 0xe7, 0xc1, 0x6f, 0xc2, 0x03, 0x9b, 0xe5, 0xf3, 0x90, 0x67, 0x3c, 0x50, 0xa0, 0xcf, 0xc3, 0x2a, 0xa0, 0x33, 0x7c, 0xa1, 0xd1, 0xfd, 0x6a, 0xa6, 0xe5, 0x61, 0xe7, 0x5c, 0xef, 0x57, 0xe1, 0xae, 0xf4, 0x50, 0x52, 0xe5, 0x33, - 0x7c, 0xb1, 0x43, 0x10, 0x2d, 0x0e, 0x47, 0x0f, 0xfc, 0x6d, 0xfd, 0x6c, 0xa4, 0xf7, 0x89, 0x44, - 0x0b, 0x64, 0xc9, 0xad, 0x44, 0x55, 0xe2, 0x5b, 0xfb, 0x2d, 0x06, 0x27, 0x84, 0xec, 0xdb, 0x3e, - 0x61, 0x31, 0x24, 0xa4, 0x08, 0x4e, 0x58, 0xfb, 0xc3, 0x04, 0x64, 0xd8, 0xbd, 0x86, 0x1e, 0x41, - 0xea, 0xd8, 0xec, 0xb3, 0x80, 0x40, 0x34, 0xe9, 0x1d, 0xb3, 0x8f, 0x19, 0x49, 0x73, 0x4e, 0xa5, + 0x7c, 0xb1, 0x4d, 0x10, 0x2d, 0x0e, 0x47, 0x0f, 0xfc, 0x6d, 0xfd, 0x6c, 0xa4, 0xf7, 0x89, 0x44, + 0x0b, 0x64, 0xc9, 0xcd, 0x44, 0x55, 0xe2, 0x5b, 0xfb, 0x1d, 0x06, 0x27, 0x84, 0xec, 0xdb, 0x3e, + 0x61, 0x31, 0x24, 0xa4, 0x08, 0x4e, 0x58, 0xfb, 0xe3, 0x04, 0x64, 0xd8, 0xbd, 0x86, 0x1e, 0x41, + 0xea, 0xd8, 0xec, 0xb3, 0x80, 0x40, 0x34, 0xe9, 0x6d, 0xb3, 0x8f, 0x19, 0x49, 0x73, 0x4e, 0xa5, 0x24, 0xe8, 0x31, 0x64, 0x5c, 0xcf, 0xc1, 0xfa, 0x80, 0xfb, 0xc2, 0x1b, 0xc2, 0xc5, 0x47, 0xc0, - 0x01, 0x39, 0x27, 0x43, 0xcf, 0x21, 0xe7, 0xe2, 0x93, 0x01, 0xb6, 0x3c, 0x97, 0x3b, 0xc0, 0x4f, + 0x01, 0x39, 0x27, 0x43, 0x2f, 0x20, 0xe7, 0xe2, 0x93, 0x01, 0xb6, 0x3c, 0x97, 0x3b, 0xc0, 0x4f, 0xc2, 0x29, 0x0c, 0x81, 0x8d, 0xb1, 0x0f, 0x05, 0xf4, 0x68, 0x0d, 0x32, 0xe6, 0x40, 0x3f, 0xc1, - 0xee, 0x44, 0xc8, 0xd0, 0x22, 0xe0, 0xf0, 0x5b, 0x8c, 0x4a, 0xbc, 0x96, 0x33, 0x33, 0x5d, 0xcb, - 0xe4, 0x8a, 0xed, 0x51, 0x50, 0xed, 0x0f, 0x24, 0x80, 0x90, 0x0d, 0xf4, 0x03, 0xc8, 0x93, 0xfd, + 0xee, 0x44, 0xc8, 0xd0, 0x22, 0xe0, 0xf0, 0x5b, 0x8c, 0x4a, 0xbc, 0x96, 0x33, 0x53, 0x5d, 0xcb, + 0xe4, 0x8a, 0xed, 0x51, 0x50, 0xed, 0x8f, 0x24, 0x80, 0x90, 0x0d, 0xf4, 0x03, 0xc8, 0x93, 0xfd, 0x6a, 0xde, 0xc5, 0x90, 0x9d, 0x4b, 0x39, 0x1a, 0x45, 0x30, 0xae, 0xbb, 0x17, 0x43, 0xac, 0xe6, 0x8e, 0xf9, 0x2f, 0xe2, 0x79, 0xc9, 0xef, 0xa1, 0xee, 0x9d, 0x32, 0x9b, 0x53, 0x83, 0x31, 0x7a, 0x04, 0xb2, 0x61, 0xba, 0xfa, 0x51, 0x1f, 0x6b, 0x03, 0xdd, 0x32, 0x8f, 0xb1, 0xeb, 0xf1, 0xeb, - 0xae, 0xc2, 0xe1, 0x7b, 0x1c, 0x5c, 0x7b, 0x05, 0x45, 0xf1, 0x38, 0xd1, 0x26, 0xe4, 0x68, 0x58, + 0xae, 0xc2, 0xe1, 0x7b, 0x1c, 0x5c, 0x7b, 0x05, 0x45, 0xf1, 0x38, 0xd1, 0x06, 0xe4, 0x68, 0x58, 0xd7, 0xb3, 0xfb, 0x9c, 0x99, 0x9b, 0x91, 0x73, 0x3f, 0xe0, 0x68, 0x35, 0x20, 0x44, 0x08, 0x52, - 0x23, 0xa7, 0xef, 0x56, 0x13, 0x77, 0x93, 0x0f, 0xf3, 0x2a, 0xfd, 0x5d, 0xfb, 0xeb, 0x14, 0x2c, + 0x23, 0xa7, 0xef, 0x56, 0x13, 0x77, 0x93, 0x0f, 0xf3, 0x2a, 0xfd, 0x5d, 0xfb, 0xdb, 0x14, 0x2c, 0xc4, 0x9c, 0x3a, 0x91, 0x52, 0xe4, 0x03, 0x9f, 0xc5, 0x4b, 0x29, 0xe6, 0x3b, 0x0f, 0xa0, 0x42, 0xf6, 0x48, 0x42, 0x4a, 0x8d, 0xdc, 0x1f, 0xe6, 0x1b, 0xbe, 0xf5, 0xb2, 0x0f, 0x3e, 0xa0, 0x50, 0x62, 0x16, 0xc3, 0xbe, 0x7e, 0xd1, 0x37, 0x5d, 0x8f, 0x05, 0xa0, 0xd4, 0xdf, 0xa8, 0x45, 0x1f, @@ -3398,185 +3398,184 @@ var twirpFileDescriptor1 = []byte{ 0x52, 0x3f, 0x02, 0x99, 0x6b, 0x8b, 0x66, 0x8c, 0x1c, 0x9d, 0xb8, 0x26, 0xaa, 0x2b, 0x25, 0xb5, 0xc2, 0xe1, 0x0d, 0x0e, 0x46, 0x8a, 0xc0, 0xa6, 0x3b, 0x3a, 0x26, 0x6c, 0x02, 0xdd, 0xe9, 0x25, 0xfa, 0xd8, 0xa1, 0x34, 0xe1, 0x26, 0xd8, 0x38, 0x56, 0x8a, 0xb9, 0x58, 0x29, 0xa2, 0x7b, 0x90, - 0x70, 0x37, 0xa9, 0xdf, 0x2a, 0x6c, 0xcc, 0x87, 0x1f, 0xd9, 0x3c, 0x1c, 0xf6, 0x6d, 0x9d, 0x5c, - 0x3b, 0x09, 0x77, 0x93, 0x44, 0xcf, 0x27, 0xbd, 0x21, 0xd7, 0xd7, 0x30, 0x7a, 0x7e, 0xb1, 0x7d, - 0x10, 0x90, 0x11, 0x02, 0xb4, 0x0e, 0x69, 0xfd, 0xe7, 0x23, 0x07, 0x53, 0x47, 0x25, 0x86, 0xb4, - 0x75, 0x02, 0xdd, 0xea, 0xdb, 0x47, 0x01, 0x3d, 0x23, 0x24, 0xa6, 0xaa, 0xf7, 0xcd, 0x76, 0xa7, + 0x70, 0x37, 0xa8, 0xdf, 0x2a, 0xac, 0xcf, 0x87, 0x1f, 0xd9, 0x38, 0x1c, 0xf6, 0x6d, 0x9d, 0x5c, + 0x3b, 0x09, 0x77, 0x83, 0x44, 0xcf, 0x27, 0xbd, 0x21, 0xd7, 0xd7, 0x30, 0x7a, 0xde, 0xd9, 0x3a, + 0x08, 0xc8, 0x08, 0x01, 0x7a, 0x02, 0x69, 0xfd, 0xe7, 0x23, 0x07, 0x53, 0x47, 0x25, 0x86, 0xb4, + 0x75, 0x02, 0xdd, 0xec, 0xdb, 0x47, 0x01, 0x3d, 0x23, 0x24, 0xa6, 0xaa, 0xf7, 0xcd, 0x76, 0xa7, 0x43, 0xdd, 0x8f, 0x68, 0xaa, 0x75, 0x0a, 0x0e, 0xe8, 0x39, 0x19, 0x31, 0x06, 0x16, 0xe0, 0xd6, 0xfe, 0x2b, 0x09, 0x05, 0xc1, 0xc4, 0xc8, 0xa6, 0x7b, 0xfa, 0xd0, 0x1b, 0x39, 0x82, 0xa7, 0x92, 0xd8, 0x31, 0x73, 0x78, 0xe0, 0xa8, 0x82, 0x7b, 0x21, 0x11, 0x7f, 0x2f, 0x24, 0xc7, 0xee, 0x85, - 0x18, 0xdd, 0x49, 0xc5, 0xea, 0x4e, 0x7d, 0x52, 0x7a, 0xe9, 0x88, 0x55, 0x52, 0x86, 0xa7, 0x48, - 0xee, 0x09, 0x14, 0xa8, 0x9f, 0xe0, 0xbe, 0x3c, 0x13, 0xf1, 0xe5, 0x74, 0x3a, 0xf7, 0xe5, 0x66, - 0xf0, 0x3b, 0x56, 0xde, 0xd9, 0x69, 0xf2, 0xce, 0xcd, 0x24, 0xef, 0xfc, 0xcc, 0xf2, 0x86, 0xab, - 0xcb, 0xbb, 0x70, 0x55, 0x79, 0xff, 0xa3, 0x04, 0xa5, 0x31, 0x0f, 0xc9, 0xf7, 0x22, 0xcd, 0xb4, - 0x97, 0xc4, 0xcc, 0x7b, 0x49, 0xce, 0xba, 0x97, 0x75, 0xc8, 0xea, 0x7d, 0x53, 0xb3, 0x5d, 0xdf, - 0xf5, 0x4f, 0xdf, 0x8c, 0xeb, 0x92, 0x14, 0x69, 0xe8, 0xd8, 0xe4, 0x86, 0x73, 0x6a, 0xff, 0x91, - 0x82, 0x9c, 0xcf, 0x2a, 0xba, 0x07, 0xa0, 0xf7, 0x7a, 0xd8, 0x75, 0xb5, 0x33, 0xcc, 0xc3, 0xe1, - 0xad, 0xd4, 0x2f, 0xde, 0xad, 0x4a, 0x6a, 0x9e, 0xc1, 0x5f, 0xe2, 0x0b, 0xf4, 0x09, 0x64, 0x5c, - 0xdc, 0x73, 0x30, 0x8b, 0x5b, 0x7c, 0x02, 0x0e, 0x43, 0x8f, 0xa0, 0xe4, 0x62, 0xd7, 0x35, 0x6d, - 0x4b, 0xf3, 0xec, 0x33, 0x6c, 0x31, 0x77, 0xc4, 0x89, 0x8a, 0x1c, 0xd5, 0x25, 0x18, 0xb4, 0x0a, - 0x15, 0xdd, 0x75, 0x47, 0x03, 0xac, 0x39, 0x76, 0x1f, 0x6b, 0xba, 0x63, 0xd1, 0x0b, 0xd8, 0x27, - 0x2e, 0x31, 0xa4, 0x6a, 0xf7, 0x71, 0xdd, 0xb1, 0x50, 0x07, 0x6e, 0x8a, 0xd4, 0xf8, 0x8d, 0x87, - 0x1d, 0x4b, 0xef, 0x93, 0x38, 0xaf, 0x44, 0x67, 0x7d, 0x42, 0x66, 0xbd, 0x7d, 0xb7, 0xba, 0x18, - 0xce, 0x53, 0x38, 0x51, 0xab, 0xa1, 0xc6, 0x41, 0x0d, 0x62, 0x6b, 0x0e, 0x3e, 0x21, 0x9e, 0x90, - 0xf9, 0x57, 0x3e, 0x22, 0x77, 0x13, 0xb6, 0x8c, 0xa1, 0x6d, 0x5a, 0x1e, 0x37, 0xb2, 0x60, 0x4c, - 0xe6, 0x1c, 0x8d, 0x7a, 0x67, 0x3c, 0xdb, 0xce, 0xab, 0x7c, 0x84, 0x1e, 0x82, 0x7c, 0x6c, 0x3b, - 0x3d, 0xac, 0x91, 0x1b, 0x4c, 0x73, 0xbd, 0x8b, 0x3e, 0xbb, 0x5a, 0x73, 0x6a, 0x99, 0xc2, 0x0f, - 0x74, 0xef, 0xb4, 0x43, 0xa0, 0xe8, 0x47, 0x90, 0x1b, 0x60, 0x4f, 0xa7, 0xd9, 0x0b, 0x4b, 0x9f, - 0xef, 0x4c, 0xa8, 0xcd, 0xda, 0x1e, 0xa7, 0x50, 0x2c, 0xcf, 0xb9, 0x50, 0x83, 0x09, 0xa8, 0x0a, - 0x59, 0x4f, 0x3f, 0x39, 0x31, 0xad, 0x13, 0x6a, 0x3e, 0x79, 0xd5, 0x1f, 0xa2, 0xc7, 0xb0, 0xd0, - 0xb3, 0x2d, 0x8f, 0x3a, 0x78, 0xd3, 0x1d, 0xda, 0xae, 0x49, 0x7d, 0x7c, 0x9e, 0x52, 0x21, 0x8e, - 0x6a, 0x84, 0x18, 0x92, 0x6d, 0x0d, 0x1d, 0xfb, 0xcd, 0x05, 0xb7, 0x9b, 0x30, 0x64, 0x38, 0x20, - 0x50, 0x3f, 0xdb, 0xa2, 0x24, 0xcb, 0x3f, 0x82, 0xd2, 0x18, 0x47, 0x24, 0x79, 0x0d, 0x94, 0x44, - 0x25, 0x3f, 0x89, 0x3b, 0x3b, 0xd7, 0xfb, 0x23, 0xcc, 0xaf, 0x34, 0x36, 0x78, 0x9e, 0x78, 0x26, - 0xd5, 0x5e, 0x43, 0x3e, 0x50, 0x74, 0x74, 0x1f, 0x0a, 0x3d, 0x07, 0xd3, 0x80, 0x5a, 0xef, 0xbb, - 0x63, 0x5a, 0x26, 0x22, 0x84, 0x73, 0x4e, 0x8c, 0x9d, 0x73, 0xc0, 0x75, 0xf2, 0xbd, 0x5c, 0xd7, - 0x7e, 0x21, 0x41, 0x25, 0x62, 0x38, 0xe8, 0x01, 0x14, 0xf5, 0x5e, 0xcf, 0x1e, 0x59, 0x9e, 0x50, - 0xda, 0xf1, 0x19, 0xe0, 0x18, 0x7a, 0x61, 0x7e, 0x0e, 0xfe, 0x90, 0x9a, 0x83, 0xa8, 0xed, 0xc0, - 0x11, 0xc4, 0x1e, 0x3e, 0x87, 0x32, 0x39, 0x5b, 0xdd, 0xb4, 0xb0, 0x23, 0xde, 0xd5, 0xa5, 0x00, - 0x4a, 0x56, 0xab, 0xfd, 0x85, 0x04, 0x45, 0xd1, 0x1e, 0x3f, 0x86, 0xb1, 0x7d, 0x44, 0xf5, 0xad, - 0xfd, 0x2e, 0x14, 0x84, 0x03, 0x8c, 0xa9, 0x4d, 0x2c, 0x43, 0x6e, 0xe4, 0x12, 0xc3, 0x19, 0xf8, - 0x12, 0x0e, 0xc6, 0xe8, 0x2e, 0xe4, 0x86, 0xba, 0xeb, 0xbe, 0xb6, 0x1d, 0x96, 0x47, 0xfa, 0x8c, - 0x06, 0xd0, 0x9a, 0x0b, 0xf3, 0xbb, 0xa6, 0x7b, 0x95, 0x12, 0xdb, 0x23, 0xc8, 0xb3, 0xda, 0x1e, - 0x31, 0x71, 0xb6, 0xfb, 0xe2, 0xdb, 0x77, 0xab, 0x39, 0x06, 0x6c, 0x35, 0x54, 0xff, 0x17, 0x35, - 0x63, 0xbd, 0xe7, 0x99, 0xe7, 0x98, 0x07, 0x89, 0x7c, 0x54, 0xfb, 0x09, 0x20, 0xf1, 0xa3, 0xee, - 0xd0, 0xb6, 0x5c, 0xb2, 0x70, 0xda, 0xf4, 0xf0, 0x60, 0x32, 0x2d, 0x67, 0x74, 0x24, 0xd9, 0x55, - 0x19, 0x45, 0xed, 0xef, 0x25, 0x58, 0x38, 0x1c, 0x1a, 0xba, 0x87, 0xc7, 0x19, 0x1f, 0xe3, 0x4d, - 0x9a, 0xca, 0x1b, 0x3f, 0xc8, 0x44, 0x78, 0x90, 0x61, 0x09, 0x2a, 0x39, 0x56, 0x82, 0xba, 0x0f, - 0x15, 0xdd, 0x30, 0x34, 0x96, 0x0c, 0x68, 0x34, 0x1e, 0x4d, 0xd1, 0x78, 0xb4, 0xa4, 0x1b, 0x06, - 0x0b, 0x5d, 0x0f, 0x9d, 0xbe, 0x4b, 0xc2, 0x3e, 0x07, 0x0f, 0xec, 0x73, 0x3c, 0x46, 0x9a, 0xa6, - 0xa4, 0x32, 0xc3, 0x84, 0xd4, 0xb5, 0xaf, 0x60, 0xbe, 0xe3, 0xd9, 0xc3, 0x0f, 0xe5, 0xbf, 0xf6, - 0xef, 0x00, 0x10, 0x1e, 0xcc, 0x55, 0x76, 0x7e, 0x0f, 0xb2, 0x54, 0xba, 0x81, 0xf8, 0xe0, 0xed, - 0xbb, 0xd5, 0x0c, 0x01, 0xb5, 0x1a, 0x2a, 0xfb, 0x6b, 0x8c, 0xab, 0x40, 0x29, 0xa2, 0x02, 0xcf, - 0xa1, 0xc0, 0xaa, 0x7a, 0x2c, 0xb7, 0x58, 0xa6, 0x61, 0xc8, 0xad, 0x88, 0xbc, 0x58, 0xf9, 0x8a, - 0x26, 0x17, 0xe0, 0x06, 0xbf, 0xd1, 0xf7, 0x49, 0xf6, 0xa5, 0x7b, 0x23, 0x97, 0x17, 0x36, 0x6e, - 0x44, 0xa7, 0x51, 0xa4, 0xca, 0x89, 0xd0, 0xa7, 0x00, 0xb4, 0x6a, 0x86, 0x0d, 0x4d, 0xf7, 0xa8, - 0x43, 0x4c, 0xaa, 0x79, 0x0e, 0xa9, 0x7b, 0xe8, 0x16, 0xb5, 0x28, 0x86, 0x2c, 0x50, 0x64, 0x96, - 0x8e, 0xeb, 0xb4, 0x72, 0x38, 0xa2, 0x2a, 0x42, 0x91, 0x88, 0xcd, 0xe4, 0x90, 0x3a, 0xc9, 0x8e, - 0x32, 0xec, 0x44, 0xaa, 0x9f, 0x52, 0x7f, 0x75, 0x5b, 0xc8, 0x46, 0xa2, 0x35, 0x67, 0x72, 0x47, - 0x33, 0x62, 0xf4, 0x94, 0x98, 0x36, 0x09, 0xec, 0xab, 0x9f, 0x45, 0x32, 0x41, 0xe5, 0xcd, 0xd0, - 0x76, 0x3c, 0x95, 0x22, 0x85, 0x79, 0x8c, 0x1a, 0xed, 0x42, 0x99, 0x9e, 0x67, 0xcf, 0x1e, 0x50, - 0x3f, 0x8f, 0x79, 0x50, 0x70, 0x2f, 0x98, 0xaf, 0xda, 0xf6, 0x60, 0xdb, 0xc7, 0x46, 0x3f, 0x5f, - 0x72, 0x44, 0x2c, 0xfa, 0x3e, 0xab, 0x57, 0x97, 0x23, 0xb5, 0xbc, 0x57, 0xf8, 0x28, 0x3a, 0x91, - 0x96, 0xad, 0x15, 0x28, 0x08, 0x45, 0x93, 0xea, 0x02, 0x9d, 0xf6, 0xbd, 0xb8, 0x8a, 0x52, 0x74, - 0xba, 0x38, 0x0f, 0xb5, 0xa1, 0xc2, 0x6a, 0x38, 0xe1, 0x26, 0x58, 0x66, 0xf0, 0x6b, 0x61, 0x8d, - 0x9d, 0xe0, 0x2f, 0xdd, 0x45, 0xd9, 0x1b, 0x43, 0xa3, 0x4d, 0x48, 0x53, 0x08, 0x4f, 0x1d, 0x6e, - 0x8f, 0x2f, 0x13, 0x9d, 0xcd, 0x68, 0xd1, 0x73, 0x28, 0x73, 0xfb, 0x72, 0xb0, 0x3b, 0xea, 0x7b, - 0x6e, 0xb5, 0x12, 0xf1, 0x17, 0xcc, 0xca, 0xa8, 0xbf, 0x28, 0x31, 0x52, 0x95, 0x51, 0xa2, 0x27, - 0x50, 0xa4, 0x29, 0xb1, 0x3f, 0x53, 0xa6, 0x33, 0xe7, 0xc7, 0xaa, 0x05, 0x74, 0x5e, 0x81, 0x90, - 0xf9, 0xb3, 0xbe, 0x02, 0x3f, 0x13, 0x0b, 0x26, 0xce, 0x47, 0xea, 0x60, 0x3c, 0xed, 0x62, 0x4e, - 0xaa, 0xcc, 0xa9, 0xfd, 0xf9, 0xcf, 0xa0, 0xc4, 0xa2, 0x76, 0x7f, 0xf6, 0x62, 0x84, 0x61, 0x1a, - 0xb7, 0xb3, 0xb9, 0x45, 0x4a, 0xe9, 0xcf, 0x5c, 0x84, 0x34, 0x76, 0x1c, 0xdb, 0xe1, 0xc1, 0x02, - 0x1b, 0x10, 0xcd, 0xa6, 0x3f, 0x68, 0x16, 0x50, 0x5d, 0x62, 0x45, 0x27, 0x0a, 0x21, 0xf1, 0x3e, - 0x89, 0x44, 0x0c, 0xec, 0xe9, 0x66, 0xdf, 0xad, 0xde, 0x60, 0x91, 0x08, 0x1f, 0xa2, 0x2f, 0x60, - 0xde, 0x4f, 0x00, 0xb4, 0xbe, 0xdd, 0x63, 0xb9, 0xe6, 0x4d, 0x96, 0x97, 0xfa, 0x88, 0x5d, 0x0e, - 0x47, 0x6b, 0xb0, 0x70, 0xa4, 0xf7, 0xce, 0x46, 0x43, 0x8d, 0x57, 0x1a, 0xb4, 0x91, 0x8b, 0x8d, - 0xea, 0x2d, 0x56, 0x65, 0x65, 0x28, 0x1e, 0x70, 0x1f, 0xba, 0xd8, 0x40, 0x77, 0xa0, 0xe0, 0x60, - 0xcf, 0xb9, 0xd0, 0xe8, 0x0d, 0x5c, 0xbd, 0x4d, 0xd9, 0x02, 0x0a, 0xda, 0x26, 0x10, 0x62, 0x71, - 0xbc, 0xee, 0x92, 0x8d, 0xbc, 0xcc, 0x84, 0x02, 0x23, 0xd7, 0xc2, 0x56, 0xa2, 0x2a, 0x35, 0xa5, - 0xa0, 0xfa, 0xf2, 0x05, 0xaf, 0xec, 0x44, 0x93, 0x12, 0x5f, 0x56, 0x9c, 0x9c, 0xd5, 0x76, 0xbe, - 0x14, 0x4a, 0x35, 0xc5, 0x68, 0x75, 0x47, 0x90, 0x11, 0x9f, 0x14, 0x10, 0x6f, 0xe5, 0x21, 0xeb, - 0x30, 0x4d, 0x23, 0x39, 0x05, 0x13, 0x54, 0xed, 0x97, 0x09, 0x80, 0x90, 0xb7, 0xf8, 0x77, 0x01, - 0xc1, 0x3b, 0x25, 0xa6, 0x79, 0xa7, 0xe4, 0xb8, 0x77, 0x5a, 0x86, 0xdc, 0x58, 0xb6, 0x9f, 0x54, - 0x83, 0x31, 0xda, 0x08, 0x5c, 0x24, 0xcb, 0x0f, 0x97, 0x63, 0x0e, 0x6a, 0x2d, 0xe2, 0x27, 0x03, - 0x4d, 0xc9, 0x88, 0x9a, 0x52, 0x83, 0x52, 0x5f, 0x77, 0x89, 0xda, 0x12, 0xc1, 0xe8, 0x2c, 0xed, - 0x4b, 0xaa, 0x05, 0x02, 0x54, 0x09, 0xac, 0xee, 0x11, 0x75, 0x21, 0x68, 0x13, 0xbb, 0xf4, 0x88, - 0x4b, 0xaa, 0x3f, 0xac, 0xad, 0x41, 0x86, 0x7d, 0x05, 0x01, 0x64, 0xea, 0xdb, 0xdd, 0xd6, 0xd7, - 0x8a, 0x3c, 0x87, 0x8a, 0x90, 0xdb, 0x69, 0xed, 0xb7, 0x3a, 0x4d, 0xa5, 0x21, 0x4b, 0x04, 0xb3, - 0x53, 0x6f, 0xed, 0x2a, 0x0d, 0x39, 0x51, 0xfb, 0xa5, 0x04, 0x39, 0x5f, 0x2a, 0x7e, 0x19, 0x49, - 0x0c, 0x21, 0xfc, 0xf1, 0x47, 0x3a, 0xb6, 0x4c, 0xe4, 0xd8, 0x10, 0xa4, 0x5c, 0xf3, 0xe7, 0x98, - 0x1f, 0x27, 0xfd, 0x4d, 0xe8, 0x03, 0x45, 0x67, 0x71, 0x55, 0x30, 0xae, 0xfd, 0x4b, 0x02, 0x8a, - 0xa2, 0x4e, 0x4c, 0x16, 0x77, 0xa4, 0x99, 0x8b, 0x3b, 0xb9, 0x4b, 0x8a, 0x3b, 0x22, 0xbf, 0x89, - 0x4b, 0xf8, 0x4d, 0x0a, 0xfc, 0x7e, 0x01, 0xf3, 0xc1, 0xc2, 0x01, 0xe3, 0x2c, 0x54, 0x94, 0x7d, - 0x44, 0x60, 0xa1, 0x4f, 0x60, 0x69, 0x9c, 0x95, 0x60, 0x06, 0x73, 0x17, 0x8b, 0x22, 0x3b, 0xc1, - 0xac, 0x7b, 0x24, 0x13, 0x64, 0xde, 0x8c, 0x59, 0x6a, 0x9a, 0x7e, 0xbf, 0xc8, 0x81, 0xcc, 0x56, - 0xc7, 0x25, 0x94, 0x99, 0x26, 0xa1, 0xec, 0x98, 0x84, 0x6a, 0x7f, 0x22, 0x01, 0x84, 0xfe, 0x6c, - 0xf6, 0xea, 0xc8, 0x9d, 0xb0, 0xb4, 0x41, 0x98, 0x92, 0xe8, 0xaa, 0x7e, 0x15, 0x63, 0x92, 0xa5, - 0x2b, 0x28, 0x4d, 0xed, 0x6d, 0x02, 0x6e, 0xd4, 0x47, 0x9e, 0x3d, 0x71, 0xcf, 0x09, 0x2f, 0xb4, - 0xd2, 0x4c, 0x2f, 0xb4, 0x73, 0xb1, 0x2f, 0xb4, 0x89, 0xf7, 0xbc, 0xd0, 0xce, 0x09, 0x2f, 0xb4, - 0x3f, 0xe6, 0x37, 0x90, 0xff, 0x4c, 0x9b, 0xa4, 0x57, 0xc1, 0x72, 0x5c, 0x5d, 0x96, 0xbf, 0xd8, - 0xd2, 0xab, 0xa8, 0xcd, 0x5f, 0x6d, 0x95, 0xf0, 0x2a, 0xf2, 0x57, 0x48, 0xd1, 0x15, 0xa6, 0x56, - 0xa4, 0x83, 0x1b, 0x89, 0x2f, 0x43, 0xbc, 0x1d, 0x7f, 0x6b, 0xaf, 0xfd, 0x69, 0x02, 0x2a, 0xe4, - 0x70, 0x84, 0x2b, 0x77, 0xac, 0x04, 0x2c, 0xcd, 0x50, 0x02, 0x4e, 0x4f, 0x2b, 0x26, 0x25, 0x66, - 0x2a, 0xc0, 0x24, 0x67, 0x2e, 0xc0, 0xa4, 0xae, 0x5e, 0x4c, 0xca, 0x5c, 0xb5, 0x98, 0xf4, 0x77, - 0x29, 0x58, 0x88, 0x89, 0xe7, 0x48, 0x94, 0xcd, 0xe2, 0xb9, 0x48, 0x94, 0xcd, 0x80, 0x24, 0xca, - 0xe6, 0xbf, 0x48, 0x3a, 0x5d, 0x61, 0xcf, 0xbd, 0xf6, 0xf1, 0xb1, 0x8b, 0x3d, 0x6d, 0xe0, 0x72, - 0x9d, 0x2d, 0x51, 0x70, 0x9b, 0x42, 0xf7, 0x5c, 0xe2, 0xa2, 0xb1, 0x65, 0x08, 0x54, 0x4c, 0x79, - 0x0b, 0xd8, 0x32, 0x02, 0x1a, 0xb1, 0xab, 0x21, 0x75, 0xe5, 0xae, 0x86, 0xf4, 0xcc, 0x5d, 0x0d, - 0x99, 0xab, 0x75, 0x35, 0x64, 0xaf, 0xd1, 0xd5, 0x90, 0xfb, 0xb0, 0xae, 0x86, 0xfc, 0xec, 0x5d, - 0x0d, 0x70, 0xf5, 0xae, 0x86, 0xc2, 0xb5, 0xba, 0x1a, 0xfe, 0x35, 0x03, 0xcb, 0x97, 0x07, 0xf1, - 0xd3, 0x93, 0xea, 0x30, 0xf7, 0x4c, 0x4c, 0x69, 0x7f, 0x48, 0x46, 0x1b, 0x0f, 0xbe, 0x04, 0xf6, - 0x72, 0xa6, 0x0d, 0xcc, 0x37, 0xa6, 0x75, 0x52, 0xad, 0x50, 0x89, 0x44, 0x9e, 0xe7, 0xf7, 0x28, - 0x4e, 0x65, 0x2f, 0x91, 0x6c, 0x10, 0xe9, 0x58, 0x48, 0xcd, 0xd0, 0x37, 0x91, 0x8e, 0xe9, 0x9b, - 0x40, 0x4f, 0x78, 0x6c, 0xc6, 0x14, 0x67, 0x8a, 0x17, 0xa3, 0xf1, 0x96, 0xff, 0x00, 0xb7, 0x19, - 0x09, 0x04, 0xe3, 0x1f, 0xe0, 0xf8, 0x14, 0x3f, 0x0c, 0xfc, 0x4a, 0x88, 0xec, 0xe0, 0xfd, 0x8f, - 0x70, 0x7c, 0x76, 0xf8, 0x10, 0x17, 0xaa, 0x6d, 0xee, 0x1a, 0x6a, 0x9b, 0xbf, 0x82, 0xda, 0x46, - 0x5d, 0x7d, 0xe1, 0x6a, 0xae, 0xfe, 0x37, 0x82, 0x3c, 0xc7, 0x5f, 0xa0, 0x18, 0x4d, 0x3a, 0x84, - 0xd3, 0xf2, 0x33, 0x9d, 0x29, 0x17, 0x45, 0xe9, 0xea, 0x17, 0x05, 0xfa, 0xa1, 0x9f, 0xba, 0xf8, - 0x8b, 0x94, 0xe9, 0x22, 0xb1, 0xaf, 0x98, 0x3c, 0x77, 0xf1, 0xa7, 0x8a, 0x86, 0x25, 0xcf, 0x6e, - 0x58, 0xec, 0x43, 0xe2, 0x0d, 0xf5, 0x3f, 0x69, 0x90, 0xa3, 0x99, 0xed, 0xb7, 0xd4, 0xa3, 0x53, - 0x8c, 0xef, 0xd1, 0x09, 0xf4, 0x3e, 0xf5, 0x81, 0x7a, 0x9f, 0xfe, 0x30, 0xbd, 0xcf, 0x5c, 0x4b, - 0xef, 0xbf, 0x2d, 0x77, 0x1d, 0xd5, 0xfb, 0xfc, 0x75, 0xf5, 0x1e, 0xae, 0xa7, 0xf7, 0x85, 0x8f, - 0xa1, 0xf7, 0xa5, 0x0f, 0xd2, 0xfb, 0xf2, 0x75, 0xf4, 0xfe, 0x6f, 0x52, 0x50, 0xbd, 0xac, 0x34, - 0x33, 0xfd, 0x36, 0x11, 0x9b, 0xa7, 0x12, 0x91, 0xe6, 0xa9, 0xef, 0x41, 0x71, 0xac, 0x6b, 0x8a, - 0x59, 0x42, 0xc1, 0x0d, 0xfb, 0xa5, 0x04, 0x95, 0x49, 0x5d, 0x23, 0x2a, 0x4e, 0x5f, 0x23, 0x2a, - 0xce, 0x5c, 0x57, 0x65, 0xb2, 0xd7, 0x53, 0x99, 0xdc, 0xc7, 0x50, 0x99, 0xfc, 0x07, 0xa9, 0x0c, - 0xcc, 0xa8, 0x32, 0x82, 0xa2, 0xfc, 0x71, 0x06, 0x6e, 0x4f, 0x29, 0xbc, 0x4d, 0xd7, 0x95, 0xa7, - 0xc0, 0x1a, 0x86, 0xc2, 0xf6, 0xc2, 0x44, 0xd8, 0x5e, 0x48, 0x31, 0xbc, 0xbd, 0x50, 0x15, 0x47, - 0x06, 0x99, 0x17, 0x69, 0x4b, 0x4c, 0xc6, 0xb7, 0x25, 0x46, 0x9a, 0x12, 0xff, 0x9f, 0x5c, 0x67, - 0xee, 0x5a, 0xae, 0x33, 0x73, 0x0d, 0xd7, 0x99, 0xfd, 0x2e, 0x64, 0xf8, 0x10, 0x3b, 0xa8, 0x5c, - 0xc7, 0x75, 0xfe, 0x4a, 0x02, 0x34, 0x59, 0x43, 0x9e, 0x6e, 0x08, 0xf7, 0x85, 0x0e, 0xc5, 0xc4, - 0x44, 0x87, 0x62, 0xd8, 0x9f, 0xf8, 0x98, 0x2b, 0x70, 0x32, 0x52, 0x7c, 0x6f, 0x98, 0x0e, 0xee, - 0x79, 0x31, 0xfd, 0x66, 0x9f, 0x43, 0xe9, 0x35, 0x3e, 0x72, 0xed, 0xde, 0x19, 0xf6, 0xc2, 0x16, - 0xe4, 0xe6, 0x9c, 0x5a, 0x0c, 0xc0, 0x24, 0x96, 0x16, 0x37, 0x9f, 0xbe, 0xea, 0xe6, 0x6b, 0x7f, - 0x96, 0x00, 0x39, 0xca, 0xc1, 0x77, 0x79, 0xfc, 0x3f, 0x24, 0x60, 0x7e, 0xc2, 0x66, 0xbe, 0xad, - 0xc6, 0xb8, 0xcc, 0xb4, 0xd3, 0x4c, 0xce, 0x74, 0x9a, 0xa9, 0x99, 0x4f, 0x33, 0x7d, 0xf5, 0xd3, - 0xcc, 0x5e, 0xf5, 0x34, 0xbf, 0xf1, 0x1f, 0x5d, 0x77, 0x69, 0x72, 0xfa, 0x01, 0x8f, 0xae, 0x97, - 0xa4, 0xb9, 0xb5, 0x3f, 0x0f, 0xde, 0x73, 0x3b, 0xfc, 0xbd, 0xe6, 0xca, 0x4b, 0xf3, 0x57, 0x5a, - 0xc6, 0xaa, 0x26, 0x74, 0x0d, 0x96, 0x74, 0xc3, 0x60, 0x82, 0x8f, 0xbc, 0xd2, 0x8a, 0xa4, 0x49, - 0xf1, 0x95, 0x36, 0xa4, 0xae, 0xfd, 0x10, 0xca, 0xe3, 0x8f, 0x13, 0xe8, 0x01, 0xa4, 0x4c, 0xeb, - 0xd8, 0x9e, 0x78, 0xa4, 0x16, 0x1e, 0x9d, 0x28, 0xc1, 0xca, 0x2b, 0x28, 0x8a, 0x7d, 0xd6, 0x68, - 0x09, 0x50, 0xfd, 0xb0, 0xd1, 0x6a, 0x6b, 0xdb, 0xcd, 0xfa, 0xfe, 0xbe, 0xb2, 0xab, 0x6d, 0xb5, - 0xbb, 0x4d, 0x79, 0x6e, 0x12, 0xbe, 0xab, 0xec, 0x74, 0x65, 0x09, 0xdd, 0x84, 0x85, 0x71, 0xb8, - 0xda, 0x7a, 0xd1, 0xec, 0xca, 0x89, 0x95, 0x7f, 0x92, 0xe0, 0x46, 0xec, 0x05, 0x84, 0x64, 0x28, - 0x36, 0x37, 0x9e, 0x3e, 0xd1, 0xbe, 0xdc, 0x58, 0x3f, 0xd0, 0x36, 0xd7, 0xe5, 0xb9, 0x71, 0xc8, - 0xd3, 0x75, 0x59, 0x42, 0xf3, 0x50, 0xa2, 0x90, 0x5f, 0x5f, 0x7f, 0xc6, 0x88, 0x12, 0x11, 0xd0, - 0xd3, 0x75, 0x39, 0x89, 0x6e, 0xc1, 0x8d, 0x83, 0xb6, 0xda, 0x55, 0xeb, 0xad, 0xae, 0x36, 0xb6, - 0x64, 0xea, 0x12, 0xd4, 0xd3, 0x75, 0x39, 0x8d, 0x96, 0x61, 0x69, 0x1c, 0x15, 0x7c, 0x24, 0x73, - 0x19, 0xee, 0xe9, 0xba, 0x9c, 0x5d, 0xd9, 0xe2, 0xbd, 0xd9, 0xa1, 0xd9, 0xa1, 0x45, 0x90, 0x1b, - 0xca, 0x4e, 0xfd, 0x70, 0xb7, 0xab, 0xed, 0xb4, 0x76, 0x95, 0xee, 0x6f, 0x1f, 0x28, 0xf2, 0x1c, - 0xca, 0x42, 0x72, 0xef, 0xe0, 0x89, 0x2c, 0x91, 0x1f, 0xed, 0x17, 0x2f, 0xe4, 0x04, 0x83, 0x6c, - 0xca, 0xc9, 0x95, 0xa6, 0x2f, 0x29, 0xbf, 0xbd, 0x53, 0x5c, 0xe2, 0x40, 0x6d, 0x77, 0xdb, 0xdb, - 0xed, 0x5d, 0x79, 0x0e, 0xe5, 0x20, 0xa5, 0x76, 0xf7, 0x0e, 0xd8, 0x1a, 0x1d, 0xb5, 0x2b, 0x27, - 0x50, 0x09, 0xf2, 0xaf, 0x94, 0xad, 0x4e, 0x7b, 0xfb, 0xa5, 0xd2, 0x95, 0x93, 0x2b, 0xfb, 0x70, - 0x23, 0xb6, 0x5f, 0x14, 0xdd, 0x83, 0x3b, 0xfe, 0x82, 0x1d, 0xe5, 0xc5, 0x9e, 0xb2, 0xdf, 0x55, - 0x1a, 0x94, 0x3b, 0x71, 0x7d, 0x72, 0xe2, 0xbb, 0x9d, 0x10, 0x22, 0xad, 0x3c, 0x8e, 0xf4, 0xab, - 0xf2, 0x5e, 0xbe, 0x3c, 0xa4, 0x5b, 0xfb, 0x0d, 0xe5, 0x1b, 0x79, 0x8e, 0x30, 0xd0, 0x6d, 0xed, - 0x29, 0x9d, 0x6e, 0x9d, 0x30, 0xb6, 0x72, 0x0c, 0x95, 0x48, 0x23, 0x20, 0x51, 0x92, 0xd6, 0x5e, - 0xfd, 0x85, 0xa2, 0x75, 0x0e, 0x77, 0x76, 0x5a, 0xdf, 0x68, 0xfe, 0xcc, 0x65, 0x58, 0x1a, 0x83, - 0x0b, 0xcb, 0xa0, 0x3b, 0x70, 0x7b, 0x0c, 0xb7, 0xdf, 0xde, 0x57, 0xb4, 0xf6, 0xd7, 0x8a, 0xfa, - 0x4a, 0x6d, 0x75, 0x15, 0x39, 0xb1, 0xf2, 0x53, 0x90, 0xa3, 0x4f, 0xf5, 0x64, 0x41, 0xe5, 0x85, - 0xaa, 0x74, 0x3a, 0x5a, 0xa7, 0x7d, 0xa8, 0x6e, 0x2b, 0x1a, 0x39, 0x79, 0xed, 0x95, 0xb2, 0xc5, - 0x3e, 0x16, 0x83, 0xeb, 0x34, 0x5e, 0xca, 0xd2, 0xca, 0x5f, 0x4a, 0x50, 0x14, 0x1f, 0xf0, 0xd1, - 0x02, 0x54, 0x7c, 0xe2, 0x6e, 0x5d, 0xed, 0xb6, 0xf6, 0x5f, 0xc8, 0x73, 0x44, 0xd3, 0x38, 0x90, - 0x3f, 0x27, 0x49, 0x02, 0x48, 0xd9, 0x6f, 0x10, 0xaa, 0x84, 0x30, 0x75, 0xbb, 0xbd, 0x77, 0xb0, - 0xab, 0x74, 0x15, 0x39, 0x29, 0xd0, 0xf1, 0xf7, 0xa6, 0x14, 0x42, 0x50, 0xf6, 0x57, 0xdb, 0x6a, - 0xab, 0x5d, 0xa5, 0x21, 0xa7, 0x51, 0x15, 0x16, 0x39, 0x6c, 0xb7, 0xb5, 0xd7, 0xea, 0x6a, 0xaa, - 0x52, 0xdf, 0x6e, 0x2a, 0x0d, 0x39, 0xb3, 0x72, 0xc8, 0xff, 0x0b, 0x84, 0x57, 0xc0, 0x10, 0x94, - 0x7d, 0x61, 0xee, 0xb5, 0xbe, 0x61, 0xec, 0x2d, 0x01, 0x6a, 0x1c, 0xd6, 0x77, 0x03, 0x8b, 0xab, - 0xbf, 0x50, 0xf6, 0x89, 0x29, 0x2e, 0xc3, 0xd2, 0x38, 0x7c, 0xb7, 0xab, 0xa8, 0xfb, 0x75, 0x72, - 0x88, 0x1b, 0x7f, 0x95, 0x81, 0x0c, 0x2f, 0x9b, 0xff, 0x04, 0x0a, 0x42, 0xef, 0x00, 0x9a, 0xd6, - 0x51, 0xb0, 0x1c, 0xd7, 0xdd, 0x82, 0xea, 0x50, 0x14, 0xbb, 0x5a, 0x50, 0x18, 0x78, 0xc5, 0x34, - 0xbb, 0xc4, 0x2f, 0xa1, 0x00, 0x84, 0xad, 0x35, 0x28, 0x8c, 0x1c, 0x27, 0x9a, 0x7c, 0x96, 0x6f, - 0xc7, 0xe2, 0x78, 0x2f, 0xce, 0x8f, 0x01, 0xc2, 0xee, 0x14, 0x24, 0x3e, 0x40, 0x46, 0x5a, 0x56, - 0xe2, 0xb9, 0xe8, 0x42, 0x95, 0xee, 0x39, 0xa6, 0x1c, 0x8a, 0x66, 0xe9, 0x78, 0x88, 0x5f, 0xf5, - 0x37, 0x89, 0x89, 0xeb, 0x8e, 0x17, 0x14, 0x83, 0xd0, 0xe5, 0xad, 0x0f, 0xf1, 0x2b, 0x1c, 0xc0, - 0x12, 0x5d, 0x61, 0xf2, 0x25, 0xe8, 0xfd, 0xdd, 0x10, 0xf1, 0x2b, 0x7e, 0x0d, 0xb7, 0xe8, 0x8a, - 0x71, 0xf9, 0x17, 0x9a, 0xa9, 0x2f, 0x22, 0x7e, 0xdd, 0x06, 0xc8, 0xe1, 0xba, 0x13, 0x0a, 0x35, - 0x19, 0xdb, 0xbe, 0x47, 0xa1, 0xd8, 0x8d, 0x3d, 0xa1, 0x50, 0x63, 0x17, 0xf9, 0x7b, 0x96, 0x60, - 0xde, 0x75, 0x62, 0x89, 0xb1, 0x0b, 0x3b, 0x76, 0x89, 0xad, 0x9d, 0xdf, 0xb9, 0x77, 0x62, 0x7a, - 0xa7, 0xa3, 0xa3, 0xb5, 0x9e, 0x3d, 0x78, 0xcc, 0x09, 0x1e, 0xfb, 0xcd, 0xf7, 0x3e, 0xe0, 0x6f, - 0x13, 0xa5, 0x5d, 0xf3, 0x1c, 0xbf, 0x64, 0x1d, 0x83, 0x9e, 0xfd, 0x9f, 0x89, 0x32, 0x1f, 0x3f, - 0x7f, 0x4e, 0x01, 0x47, 0x19, 0x3a, 0x65, 0xf3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x62, 0xe5, - 0xc2, 0xab, 0x64, 0x3a, 0x00, 0x00, + 0x18, 0xdd, 0x49, 0xc5, 0xea, 0x4e, 0x7d, 0x52, 0x7a, 0xe9, 0x88, 0x55, 0x52, 0x86, 0xaf, 0x90, + 0xdc, 0x53, 0x28, 0x50, 0x3f, 0xc1, 0x7d, 0x79, 0x26, 0xe2, 0xcb, 0xe9, 0x74, 0xee, 0xcb, 0xcd, + 0xe0, 0x77, 0xac, 0xbc, 0xb3, 0x57, 0xc9, 0x3b, 0x37, 0x95, 0xbc, 0xf3, 0x53, 0xcb, 0x1b, 0x66, + 0x97, 0x77, 0x61, 0x56, 0x79, 0xff, 0x4a, 0x82, 0xd2, 0x98, 0x87, 0xe4, 0x7b, 0x91, 0xa6, 0xda, + 0x4b, 0x62, 0xea, 0xbd, 0x24, 0x67, 0xdf, 0x4b, 0x6a, 0xba, 0xbd, 0x00, 0x75, 0x60, 0xe4, 0x82, + 0x73, 0x6a, 0xff, 0x91, 0x82, 0x9c, 0xcf, 0x29, 0xba, 0x07, 0xa0, 0xf7, 0x7a, 0xd8, 0x75, 0xb5, + 0x33, 0xcc, 0xa3, 0xe1, 0xcd, 0xd4, 0x2f, 0xde, 0xad, 0x4a, 0x6a, 0x9e, 0xc1, 0x5f, 0xe2, 0x0b, + 0xf4, 0x09, 0x64, 0x5c, 0xdc, 0x73, 0x30, 0x0b, 0x5b, 0x7c, 0x02, 0x0e, 0x43, 0x8f, 0xa0, 0xe4, + 0x62, 0xd7, 0x35, 0x6d, 0x4b, 0xf3, 0xec, 0x33, 0x6c, 0x31, 0x6f, 0xc4, 0x89, 0x8a, 0x1c, 0xd5, + 0x25, 0x18, 0xb4, 0x0a, 0x15, 0xdd, 0x75, 0x47, 0x03, 0xac, 0x39, 0x76, 0x1f, 0x6b, 0xba, 0x63, + 0xd1, 0xfb, 0xd7, 0x27, 0x2e, 0x31, 0xa4, 0x6a, 0xf7, 0x71, 0xdd, 0xb1, 0x50, 0x07, 0x6e, 0x8a, + 0xd4, 0xf8, 0x8d, 0x87, 0x1d, 0x4b, 0xef, 0x93, 0x30, 0xaf, 0x44, 0x67, 0x7d, 0x42, 0x66, 0xbd, + 0x7d, 0xb7, 0xba, 0x18, 0xce, 0x53, 0x38, 0x51, 0xab, 0xa1, 0xc6, 0x41, 0x0d, 0x62, 0x6a, 0x0e, + 0x3e, 0x21, 0x8e, 0x90, 0xb9, 0x57, 0x3e, 0x22, 0x57, 0x13, 0xb6, 0x8c, 0xa1, 0x6d, 0x5a, 0x1e, + 0xb7, 0xb1, 0x60, 0x4c, 0xe6, 0x1c, 0x8d, 0x7a, 0x67, 0x3c, 0xd9, 0xce, 0xab, 0x7c, 0x84, 0x1e, + 0x82, 0x7c, 0x6c, 0x3b, 0x3d, 0xac, 0x91, 0x0b, 0x4c, 0x73, 0xbd, 0x8b, 0x3e, 0xbb, 0x59, 0x73, + 0x6a, 0x99, 0xc2, 0x0f, 0x74, 0xef, 0xb4, 0x43, 0xa0, 0xe8, 0x47, 0x90, 0x1b, 0x60, 0x4f, 0xa7, + 0xc9, 0x0b, 0xcb, 0x9e, 0xef, 0x4c, 0x68, 0xcd, 0xda, 0x1e, 0xa7, 0x50, 0x2c, 0xcf, 0xb9, 0x50, + 0x83, 0x09, 0xa8, 0x0a, 0x59, 0x4f, 0x3f, 0x39, 0x31, 0xad, 0x13, 0x6a, 0x3d, 0x79, 0xd5, 0x1f, + 0xa2, 0xc7, 0xb0, 0xd0, 0xb3, 0x2d, 0x8f, 0xfa, 0x77, 0xd3, 0x1d, 0xda, 0xae, 0x49, 0x5d, 0x7c, + 0x9e, 0x52, 0x21, 0x8e, 0x6a, 0x84, 0x18, 0x92, 0x6c, 0x0d, 0x1d, 0xfb, 0xcd, 0x05, 0x37, 0x9b, + 0x30, 0x62, 0x38, 0x20, 0x50, 0x3f, 0xd9, 0xa2, 0x24, 0xcb, 0x3f, 0x82, 0xd2, 0x18, 0x47, 0x24, + 0x77, 0x0d, 0x94, 0x44, 0x25, 0x3f, 0x89, 0x37, 0x3b, 0xd7, 0xfb, 0x23, 0xcc, 0x6f, 0x34, 0x36, + 0x78, 0x91, 0x78, 0x2e, 0xd5, 0x5e, 0x43, 0x3e, 0xd0, 0x73, 0x74, 0x1f, 0x0a, 0x3d, 0x07, 0xd3, + 0x78, 0x5a, 0xef, 0xbb, 0x63, 0x5a, 0x26, 0x22, 0x84, 0x73, 0x4e, 0x8c, 0x9d, 0x73, 0xc0, 0x75, + 0xf2, 0xbd, 0x5c, 0xd7, 0x7e, 0x21, 0x41, 0x25, 0x62, 0x37, 0xe8, 0x01, 0x14, 0xf5, 0x5e, 0xcf, + 0x1e, 0x59, 0x9e, 0x50, 0xd9, 0xf1, 0x19, 0xe0, 0x18, 0x7a, 0x5f, 0x7e, 0x0e, 0xfe, 0x90, 0x9a, + 0x83, 0xa8, 0xed, 0xc0, 0x11, 0xc4, 0x1e, 0x3e, 0x87, 0x32, 0x39, 0x5b, 0xdd, 0xb4, 0xb0, 0x23, + 0x5e, 0xd5, 0xa5, 0x00, 0x4a, 0x56, 0xab, 0xfd, 0x95, 0x04, 0x45, 0xd1, 0x1e, 0x3f, 0x86, 0xb1, + 0x7d, 0x44, 0xf5, 0xad, 0xfd, 0x3e, 0x14, 0x84, 0x03, 0x8c, 0x29, 0x4d, 0x2c, 0x43, 0x6e, 0xe4, + 0x12, 0xc3, 0x19, 0xf8, 0x12, 0x0e, 0xc6, 0xe8, 0x2e, 0xe4, 0x86, 0xba, 0xeb, 0xbe, 0xb6, 0x1d, + 0x96, 0x46, 0xfa, 0x8c, 0x06, 0xd0, 0x9a, 0x0b, 0xf3, 0xbb, 0xa6, 0x3b, 0x4b, 0x85, 0xed, 0x11, + 0xe4, 0x59, 0x69, 0x8f, 0x98, 0x38, 0xdb, 0x7d, 0xf1, 0xed, 0xbb, 0xd5, 0x1c, 0x03, 0xb6, 0x1a, + 0xaa, 0xff, 0x8b, 0x9a, 0xb1, 0xde, 0xf3, 0xcc, 0x73, 0xcc, 0x63, 0x44, 0x3e, 0xaa, 0xfd, 0x04, + 0x90, 0xf8, 0x51, 0x77, 0x68, 0x5b, 0x2e, 0x59, 0x38, 0x6d, 0x7a, 0x78, 0x30, 0x99, 0x95, 0x33, + 0x3a, 0x92, 0xeb, 0xaa, 0x8c, 0xa2, 0xf6, 0x8f, 0x12, 0x2c, 0x1c, 0x0e, 0x0d, 0xdd, 0xc3, 0xe3, + 0x8c, 0x8f, 0xf1, 0x26, 0x5d, 0xc9, 0x1b, 0x3f, 0xc8, 0x44, 0x78, 0x90, 0x61, 0x05, 0x2a, 0x39, + 0x56, 0x81, 0xba, 0x0f, 0x15, 0xdd, 0x30, 0x34, 0x96, 0x0b, 0x68, 0x34, 0x1c, 0x4d, 0xd1, 0x70, + 0xb4, 0xa4, 0x1b, 0x06, 0x8b, 0x5c, 0x0f, 0x9d, 0xbe, 0x4b, 0xa2, 0x3e, 0x07, 0x0f, 0xec, 0x73, + 0x3c, 0x46, 0x9a, 0xa6, 0xa4, 0x32, 0xc3, 0x84, 0xd4, 0xb5, 0xaf, 0x60, 0xbe, 0xe3, 0xd9, 0xc3, + 0x0f, 0xe5, 0xbf, 0xf6, 0xef, 0x00, 0x10, 0x1e, 0xcc, 0x2c, 0x3b, 0xbf, 0x07, 0x59, 0x2a, 0xdd, + 0x40, 0x7c, 0xf0, 0xf6, 0xdd, 0x6a, 0x86, 0x80, 0x5a, 0x0d, 0x95, 0xfd, 0x35, 0xc6, 0x55, 0xa0, + 0x14, 0x51, 0x81, 0x17, 0x50, 0x60, 0x45, 0x3d, 0x96, 0x5a, 0x2c, 0xd3, 0x28, 0xe4, 0x56, 0x44, + 0x5e, 0xac, 0x7a, 0x45, 0x73, 0x0b, 0x70, 0x83, 0xdf, 0xe8, 0xfb, 0x24, 0xf9, 0xd2, 0xbd, 0x91, + 0xcb, 0xeb, 0x1a, 0x37, 0xa2, 0xd3, 0x28, 0x52, 0xe5, 0x44, 0xe8, 0x53, 0x00, 0x5a, 0x34, 0xc3, + 0x86, 0xa6, 0x7b, 0xd4, 0x21, 0x26, 0xd5, 0x3c, 0x87, 0xd4, 0x3d, 0x74, 0x8b, 0x5a, 0x14, 0x43, + 0x16, 0x28, 0x32, 0x4b, 0xc7, 0x75, 0x5a, 0x38, 0x1c, 0x51, 0x15, 0xa1, 0x48, 0xc4, 0x66, 0x72, + 0x48, 0x9d, 0x24, 0x47, 0x19, 0x76, 0x22, 0xd5, 0x4f, 0xa9, 0xbf, 0xba, 0x2d, 0x24, 0x23, 0xd1, + 0x92, 0x33, 0xb9, 0xa3, 0x19, 0x31, 0x7a, 0x46, 0x4c, 0x9b, 0xc4, 0xf5, 0xd5, 0xcf, 0x22, 0x89, + 0xa0, 0xf2, 0x66, 0x68, 0x3b, 0x9e, 0x4a, 0x91, 0xc2, 0x3c, 0x46, 0x8d, 0x76, 0xa1, 0x4c, 0xcf, + 0xb3, 0x67, 0x0f, 0xa8, 0x9f, 0xc7, 0x3c, 0x28, 0xb8, 0x17, 0xcc, 0x57, 0x6d, 0x7b, 0xb0, 0xe5, + 0x63, 0xa3, 0x9f, 0x2f, 0x39, 0x22, 0x16, 0x7d, 0x9f, 0x95, 0xab, 0xcb, 0x91, 0x52, 0xde, 0x2b, + 0x7c, 0x14, 0x9d, 0x48, 0xab, 0xd6, 0x0a, 0x14, 0x84, 0x9a, 0x49, 0x75, 0x81, 0x4e, 0xfb, 0x5e, + 0x5c, 0x41, 0x29, 0x3a, 0x5d, 0x9c, 0x87, 0xda, 0x50, 0x61, 0x25, 0x9c, 0x70, 0x13, 0x2c, 0x31, + 0xf8, 0x8d, 0xb0, 0xc4, 0x4e, 0xf0, 0x97, 0xee, 0xa2, 0xec, 0x8d, 0xa1, 0xd1, 0x06, 0xa4, 0x29, + 0x84, 0x67, 0x0e, 0xb7, 0xc7, 0x97, 0x89, 0xce, 0x66, 0xb4, 0xe8, 0x05, 0x94, 0xb9, 0x7d, 0x39, + 0xd8, 0x1d, 0xf5, 0x3d, 0xb7, 0x5a, 0x89, 0xf8, 0x0b, 0x66, 0x65, 0xd4, 0x5f, 0x94, 0x18, 0xa9, + 0xca, 0x28, 0xd1, 0x53, 0x28, 0xd2, 0x8c, 0xd8, 0x9f, 0x29, 0xd3, 0x99, 0xf3, 0x63, 0xc5, 0x02, + 0x3a, 0xaf, 0x40, 0xc8, 0xfc, 0x59, 0x5f, 0x81, 0x9f, 0x88, 0x05, 0x13, 0xe7, 0x23, 0x65, 0x30, + 0x9e, 0x75, 0x31, 0x27, 0x55, 0xe6, 0xd4, 0xfe, 0xfc, 0xe7, 0x50, 0x62, 0x41, 0xbb, 0x3f, 0x7b, + 0x31, 0xc2, 0x30, 0x0d, 0xdb, 0xd9, 0xdc, 0x22, 0xa5, 0xf4, 0x67, 0x2e, 0x42, 0x1a, 0x3b, 0x8e, + 0xed, 0xf0, 0x60, 0x81, 0x0d, 0x88, 0x66, 0xd3, 0x1f, 0x34, 0x09, 0xa8, 0x2e, 0xb1, 0x9a, 0x13, + 0x85, 0x90, 0x70, 0x9f, 0x44, 0x22, 0x06, 0xf6, 0x74, 0xb3, 0xef, 0x56, 0x6f, 0xb0, 0x48, 0x84, + 0x0f, 0xd1, 0x17, 0x30, 0xef, 0xc7, 0xff, 0x5a, 0xdf, 0xee, 0xb1, 0x54, 0xf3, 0x26, 0x4b, 0x4b, + 0x7d, 0xc4, 0x2e, 0x87, 0xa3, 0x35, 0x58, 0x38, 0xd2, 0x7b, 0x67, 0xa3, 0xa1, 0xc6, 0x0b, 0x0d, + 0xda, 0xc8, 0xc5, 0x46, 0xf5, 0x16, 0x2b, 0xb2, 0x32, 0x14, 0x8f, 0xb7, 0x0f, 0x5d, 0x6c, 0xa0, + 0x3b, 0x50, 0x70, 0xb0, 0xe7, 0x5c, 0x68, 0xf4, 0x06, 0xae, 0xde, 0xa6, 0x6c, 0x01, 0x05, 0x6d, + 0x11, 0x08, 0xb1, 0x38, 0x5e, 0x76, 0xc9, 0x46, 0x1e, 0x66, 0x42, 0x81, 0x91, 0x6b, 0x61, 0x33, + 0x51, 0x95, 0x9a, 0x52, 0x50, 0x7c, 0xf9, 0x82, 0x17, 0x76, 0xa2, 0x39, 0x89, 0x2f, 0x2b, 0x4e, + 0xce, 0x4a, 0x3b, 0x5f, 0x0a, 0x95, 0x9a, 0x62, 0xb4, 0xb8, 0x23, 0xc8, 0x88, 0x4f, 0x0a, 0x88, + 0x37, 0xf3, 0x90, 0x75, 0x98, 0xa6, 0x91, 0x94, 0x82, 0x09, 0xaa, 0xf6, 0xcb, 0x04, 0x40, 0xc8, + 0x5b, 0xfc, 0xb3, 0x80, 0xe0, 0x9d, 0x12, 0x57, 0x79, 0xa7, 0xe4, 0xb8, 0x77, 0x5a, 0x86, 0xdc, + 0x58, 0xb2, 0x9f, 0x54, 0x83, 0x31, 0x5a, 0x0f, 0x5c, 0x24, 0x4b, 0x0f, 0x97, 0x63, 0x0e, 0x6a, + 0x2d, 0xe2, 0x27, 0x03, 0x4d, 0xc9, 0x88, 0x9a, 0x52, 0x83, 0x52, 0x5f, 0x77, 0x89, 0xda, 0x12, + 0xc1, 0xe8, 0x2c, 0xeb, 0x4b, 0xaa, 0x05, 0x02, 0x54, 0x09, 0xac, 0xee, 0x11, 0x75, 0x21, 0x68, + 0x13, 0xbb, 0xf4, 0x88, 0x4b, 0xaa, 0x3f, 0xac, 0xad, 0x41, 0x86, 0x7d, 0x05, 0x01, 0x64, 0xea, + 0x5b, 0xdd, 0xd6, 0xd7, 0x8a, 0x3c, 0x87, 0x8a, 0x90, 0xdb, 0x6e, 0xed, 0xb7, 0x3a, 0x4d, 0xa5, + 0x21, 0x4b, 0x04, 0xb3, 0x5d, 0x6f, 0xed, 0x2a, 0x0d, 0x39, 0x51, 0xfb, 0xa5, 0x04, 0x39, 0x5f, + 0x2a, 0x7e, 0x15, 0x49, 0x0c, 0x21, 0xfc, 0xf1, 0x47, 0x3a, 0xb6, 0x4c, 0xe4, 0xd8, 0x10, 0xa4, + 0x5c, 0xf3, 0xe7, 0x98, 0x1f, 0x27, 0xfd, 0x4d, 0xe8, 0x03, 0x45, 0x67, 0x71, 0x55, 0x30, 0xae, + 0xfd, 0x4b, 0x02, 0x8a, 0xa2, 0x4e, 0x4c, 0xd6, 0x76, 0xa4, 0xa9, 0x6b, 0x3b, 0xb9, 0x4b, 0x6a, + 0x3b, 0x22, 0xbf, 0x89, 0x4b, 0xf8, 0x4d, 0x0a, 0xfc, 0x7e, 0x01, 0xf3, 0xc1, 0xc2, 0x01, 0xe3, + 0x2c, 0x54, 0x94, 0x7d, 0x44, 0x60, 0xa1, 0x4f, 0x61, 0x69, 0x9c, 0x95, 0x60, 0x06, 0x73, 0x17, + 0x8b, 0x22, 0x3b, 0xc1, 0xac, 0x7b, 0x24, 0x13, 0x64, 0xde, 0x8c, 0x59, 0x6a, 0x9a, 0x7e, 0xbf, + 0xc8, 0x81, 0xcc, 0x56, 0xc7, 0x25, 0x94, 0xb9, 0x4a, 0x42, 0xd9, 0x31, 0x09, 0xd5, 0xfe, 0x4c, + 0x02, 0x08, 0xfd, 0xd9, 0xf4, 0xc5, 0x91, 0x3b, 0x61, 0x65, 0x83, 0x30, 0x25, 0xd1, 0x55, 0xfd, + 0x22, 0xc6, 0x24, 0x4b, 0x33, 0x28, 0x4d, 0xed, 0x6d, 0x02, 0x6e, 0xd4, 0x47, 0x9e, 0x3d, 0x71, + 0xcf, 0x09, 0x0f, 0xb4, 0xd2, 0x54, 0x0f, 0xb4, 0x73, 0xb1, 0x0f, 0xb4, 0x89, 0xf7, 0x3c, 0xd0, + 0xce, 0x09, 0x0f, 0xb4, 0x3f, 0xe6, 0x37, 0x90, 0xff, 0x4a, 0x9b, 0xa4, 0x57, 0xc1, 0x72, 0x5c, + 0x59, 0x96, 0x3f, 0xd8, 0xd2, 0xab, 0xa8, 0xcd, 0x1f, 0x6d, 0x95, 0xf0, 0x2a, 0xf2, 0x57, 0x48, + 0xd1, 0x15, 0xae, 0x2c, 0x48, 0x07, 0x37, 0x12, 0x5f, 0x86, 0x78, 0x3b, 0xfe, 0xd4, 0x5e, 0xfb, + 0xf3, 0x04, 0x54, 0xc8, 0xe1, 0x08, 0x57, 0xee, 0x58, 0x05, 0x58, 0x9a, 0xa2, 0x02, 0x9c, 0xbe, + 0xaa, 0x96, 0x94, 0x98, 0xaa, 0xfe, 0x92, 0x9c, 0xba, 0xfe, 0x92, 0x9a, 0xbd, 0xfe, 0x92, 0x99, + 0xb5, 0x96, 0xf4, 0x0f, 0x29, 0x58, 0x88, 0x89, 0xe7, 0x48, 0x94, 0xcd, 0xe2, 0xb9, 0x48, 0x94, + 0xcd, 0x80, 0x24, 0xca, 0xe6, 0xbf, 0x48, 0x3a, 0x5d, 0x61, 0xaf, 0xbd, 0xf6, 0xf1, 0xb1, 0x8b, + 0x3d, 0x6d, 0xe0, 0x72, 0x9d, 0x2d, 0x51, 0x70, 0x9b, 0x42, 0xf7, 0x5c, 0xe2, 0xa2, 0xb1, 0x65, + 0x08, 0x54, 0x4c, 0x79, 0x0b, 0xd8, 0x32, 0x02, 0x1a, 0xb1, 0xa9, 0x21, 0x35, 0x73, 0x53, 0x43, + 0x7a, 0xea, 0xa6, 0x86, 0xcc, 0x6c, 0x4d, 0x0d, 0xd9, 0x6b, 0x34, 0x35, 0xe4, 0x3e, 0xac, 0xa9, + 0x21, 0x3f, 0x7d, 0x53, 0x03, 0xcc, 0xde, 0xd4, 0x50, 0xb8, 0x56, 0x53, 0xc3, 0xbf, 0x66, 0x60, + 0xf9, 0xf2, 0x20, 0xfe, 0xea, 0xa4, 0x3a, 0xcc, 0x3d, 0x13, 0x57, 0x74, 0x3f, 0x24, 0xa3, 0x7d, + 0x07, 0x5f, 0x02, 0x7b, 0x38, 0xd3, 0x06, 0xe6, 0x1b, 0xd3, 0x3a, 0xa9, 0x56, 0xa8, 0x44, 0x22, + 0xaf, 0xf3, 0x7b, 0x14, 0xa7, 0xb2, 0x87, 0x48, 0x36, 0x88, 0x34, 0x2c, 0xa4, 0xa6, 0x68, 0x9b, + 0x48, 0xc7, 0xb4, 0x4d, 0xa0, 0xa7, 0x3c, 0x36, 0x63, 0x8a, 0x73, 0x85, 0x17, 0xa3, 0xf1, 0x96, + 0xff, 0xfe, 0xb6, 0x11, 0x09, 0x04, 0xe3, 0xdf, 0xdf, 0xf8, 0x14, 0x3f, 0x0c, 0xfc, 0x4a, 0x88, + 0xec, 0xe0, 0xfd, 0x6f, 0x70, 0x7c, 0x76, 0xf8, 0x0e, 0x17, 0xaa, 0x6d, 0xee, 0x1a, 0x6a, 0x9b, + 0x9f, 0x41, 0x6d, 0xa3, 0xae, 0xbe, 0x30, 0x9b, 0xab, 0xff, 0xad, 0x20, 0xcf, 0xf1, 0x17, 0x28, + 0x46, 0x93, 0x0e, 0xe1, 0xb4, 0xfc, 0x4c, 0xe7, 0x8a, 0x8b, 0xa2, 0x34, 0xfb, 0x45, 0x81, 0x7e, + 0xe8, 0xa7, 0x2e, 0xfe, 0x22, 0x65, 0xba, 0x48, 0xec, 0x23, 0x26, 0xcf, 0x5d, 0xfc, 0xa9, 0xa2, + 0x61, 0xc9, 0xd3, 0x1b, 0x16, 0xfb, 0x90, 0x78, 0x43, 0xfd, 0x4f, 0x1a, 0xe4, 0x68, 0x66, 0xfb, + 0x2d, 0xb5, 0xe8, 0x14, 0xe3, 0x5b, 0x74, 0x02, 0xbd, 0x4f, 0x7d, 0xa0, 0xde, 0xa7, 0x3f, 0x4c, + 0xef, 0x33, 0xd7, 0xd2, 0xfb, 0x6f, 0xcb, 0x5d, 0x47, 0xf5, 0x3e, 0x7f, 0x5d, 0xbd, 0x87, 0xeb, + 0xe9, 0x7d, 0xe1, 0x63, 0xe8, 0x7d, 0xe9, 0x83, 0xf4, 0xbe, 0x7c, 0x1d, 0xbd, 0xff, 0xbb, 0x14, + 0x54, 0x2f, 0x2b, 0xcd, 0x5c, 0x7d, 0x9b, 0x88, 0xbd, 0x53, 0x89, 0x48, 0xef, 0xd4, 0xf7, 0xa0, + 0x38, 0xd6, 0x34, 0xc5, 0x2c, 0xa1, 0xe0, 0x86, 0xed, 0x52, 0x82, 0xca, 0xa4, 0xae, 0x11, 0x15, + 0xa7, 0xaf, 0x11, 0x15, 0x67, 0xae, 0xab, 0x32, 0xd9, 0xeb, 0xa9, 0x4c, 0xee, 0x63, 0xa8, 0x4c, + 0xfe, 0x83, 0x54, 0x06, 0xa6, 0x54, 0x19, 0x41, 0x51, 0xfe, 0x34, 0x03, 0xb7, 0xaf, 0x28, 0xbc, + 0x5d, 0xad, 0x2b, 0xcf, 0x80, 0xf5, 0x0b, 0x85, 0xdd, 0x85, 0x89, 0xb0, 0xbb, 0x90, 0x62, 0x78, + 0x77, 0xa1, 0x2a, 0x8e, 0x0c, 0x32, 0x2f, 0xd2, 0x95, 0x98, 0x8c, 0xef, 0x4a, 0x8c, 0xf4, 0x24, + 0xfe, 0x3f, 0xb9, 0xce, 0xdc, 0xb5, 0x5c, 0x67, 0xe6, 0x1a, 0xae, 0x33, 0xfb, 0x5d, 0xc8, 0xf0, + 0x21, 0x76, 0x50, 0xb9, 0x8e, 0xeb, 0xfc, 0xb5, 0x04, 0x68, 0xb2, 0x86, 0x7c, 0xb5, 0x21, 0xdc, + 0x17, 0x1a, 0x14, 0x13, 0x13, 0x0d, 0x8a, 0x61, 0x7b, 0xe2, 0x63, 0xae, 0xc0, 0xc9, 0x48, 0xf1, + 0xbd, 0x61, 0x3a, 0xb8, 0xe7, 0xc5, 0xb4, 0x9b, 0x7d, 0x0e, 0xa5, 0xd7, 0xf8, 0xc8, 0xb5, 0x7b, + 0x67, 0xd8, 0x0b, 0x3b, 0x90, 0x9b, 0x73, 0x6a, 0x31, 0x00, 0x93, 0x58, 0x5a, 0xdc, 0x7c, 0x7a, + 0xd6, 0xcd, 0xd7, 0xfe, 0x22, 0x01, 0x72, 0x94, 0x83, 0xef, 0xf2, 0xf8, 0x5f, 0x25, 0x60, 0x7e, + 0xc2, 0x66, 0xbe, 0xad, 0xbe, 0xb8, 0xcc, 0x55, 0xa7, 0x99, 0x9c, 0xea, 0x34, 0x53, 0x53, 0x9f, + 0x66, 0x7a, 0xf6, 0xd3, 0xcc, 0xce, 0x7a, 0x9a, 0xdf, 0xf8, 0x8f, 0xae, 0xbb, 0x34, 0x39, 0xfd, + 0x80, 0x47, 0xd7, 0x4b, 0xd2, 0xdc, 0xda, 0x5f, 0x06, 0xef, 0xb9, 0x1d, 0xfe, 0x5e, 0x33, 0xf3, + 0xd2, 0xfc, 0x95, 0x96, 0xb1, 0xaa, 0x09, 0x4d, 0x83, 0x25, 0xdd, 0x30, 0x98, 0xe0, 0x23, 0xaf, + 0xb4, 0x22, 0x69, 0x52, 0x7c, 0xa5, 0x0d, 0xa9, 0x6b, 0x3f, 0x84, 0xf2, 0xf8, 0xe3, 0x04, 0x7a, + 0x00, 0x29, 0xd3, 0x3a, 0xb6, 0x27, 0x1e, 0xa9, 0x85, 0x47, 0x27, 0x4a, 0xb0, 0xf2, 0x0a, 0x8a, + 0x62, 0x9b, 0x35, 0x5a, 0x02, 0x54, 0x3f, 0x6c, 0xb4, 0xda, 0xda, 0x56, 0xb3, 0xbe, 0xbf, 0xaf, + 0xec, 0x6a, 0x9b, 0xed, 0x6e, 0x53, 0x9e, 0x9b, 0x84, 0xef, 0x2a, 0xdb, 0x5d, 0x59, 0x42, 0x37, + 0x61, 0x61, 0x1c, 0xae, 0xb6, 0x76, 0x9a, 0x5d, 0x39, 0xb1, 0xf2, 0x4f, 0x12, 0xdc, 0x88, 0xbd, + 0x80, 0x90, 0x0c, 0xc5, 0xe6, 0xfa, 0xb3, 0xa7, 0xda, 0x97, 0xeb, 0x4f, 0x0e, 0xb4, 0x8d, 0x27, + 0xf2, 0xdc, 0x38, 0xe4, 0xd9, 0x13, 0x59, 0x42, 0xf3, 0x50, 0xa2, 0x90, 0xdf, 0x7c, 0xf2, 0x9c, + 0x11, 0x25, 0x22, 0xa0, 0x67, 0x4f, 0xe4, 0x24, 0xba, 0x05, 0x37, 0x0e, 0xda, 0x6a, 0x57, 0xad, + 0xb7, 0xba, 0xda, 0xd8, 0x92, 0xa9, 0x4b, 0x50, 0xcf, 0x9e, 0xc8, 0x69, 0xb4, 0x0c, 0x4b, 0xe3, + 0xa8, 0xe0, 0x23, 0x99, 0xcb, 0x70, 0xcf, 0x9e, 0xc8, 0xd9, 0x95, 0x4d, 0xde, 0x9a, 0x1d, 0x9a, + 0x1d, 0x5a, 0x04, 0xb9, 0xa1, 0x6c, 0xd7, 0x0f, 0x77, 0xbb, 0xda, 0x76, 0x6b, 0x57, 0xe9, 0xfe, + 0xee, 0x81, 0x22, 0xcf, 0xa1, 0x2c, 0x24, 0xf7, 0x0e, 0x9e, 0xca, 0x12, 0xf9, 0xd1, 0xde, 0xd9, + 0x91, 0x13, 0x0c, 0xb2, 0x21, 0x27, 0x57, 0x9a, 0xbe, 0xa4, 0xfc, 0xee, 0x4e, 0x71, 0x89, 0x03, + 0xb5, 0xdd, 0x6d, 0x6f, 0xb5, 0x77, 0xe5, 0x39, 0x94, 0x83, 0x94, 0xda, 0xdd, 0x3b, 0x60, 0x6b, + 0x74, 0xd4, 0xae, 0x9c, 0x40, 0x25, 0xc8, 0xbf, 0x52, 0x36, 0x3b, 0xed, 0xad, 0x97, 0x4a, 0x57, + 0x4e, 0xae, 0xec, 0xc3, 0x8d, 0xd8, 0x76, 0x51, 0x74, 0x0f, 0xee, 0xf8, 0x0b, 0x76, 0x94, 0x9d, + 0x3d, 0x65, 0xbf, 0xab, 0x34, 0x28, 0x77, 0xe2, 0xfa, 0xe4, 0xc4, 0x77, 0x3b, 0x21, 0x44, 0x5a, + 0x79, 0x1c, 0x69, 0x57, 0xe5, 0xad, 0x7c, 0x79, 0x48, 0xb7, 0xf6, 0x1b, 0xca, 0x37, 0xf2, 0x1c, + 0x61, 0xa0, 0xdb, 0xda, 0x53, 0x3a, 0xdd, 0x3a, 0x61, 0x6c, 0xe5, 0x18, 0x2a, 0x91, 0x3e, 0x40, + 0xa2, 0x24, 0xad, 0xbd, 0xfa, 0x8e, 0xa2, 0x75, 0x0e, 0xb7, 0xb7, 0x5b, 0xdf, 0x68, 0xfe, 0xcc, + 0x65, 0x58, 0x1a, 0x83, 0x0b, 0xcb, 0xa0, 0x3b, 0x70, 0x7b, 0x0c, 0xb7, 0xdf, 0xde, 0x57, 0xb4, + 0xf6, 0xd7, 0x8a, 0xfa, 0x4a, 0x6d, 0x75, 0x15, 0x39, 0xb1, 0xf2, 0x53, 0x90, 0xa3, 0x4f, 0xf5, + 0x64, 0x41, 0x65, 0x47, 0x55, 0x3a, 0x1d, 0xad, 0xd3, 0x3e, 0x54, 0xb7, 0x14, 0x8d, 0x9c, 0xbc, + 0xf6, 0x4a, 0xd9, 0x64, 0x1f, 0x8b, 0xc1, 0x75, 0x1a, 0x2f, 0x65, 0x69, 0xe5, 0xaf, 0x25, 0x28, + 0x8a, 0x0f, 0xf8, 0x68, 0x01, 0x2a, 0x3e, 0x71, 0xb7, 0xae, 0x76, 0x5b, 0xfb, 0x3b, 0xf2, 0x1c, + 0xd1, 0x34, 0x0e, 0xe4, 0xcf, 0x49, 0x92, 0x00, 0x52, 0xf6, 0x1b, 0x84, 0x2a, 0x21, 0x4c, 0xdd, + 0x6a, 0xef, 0x1d, 0xec, 0x2a, 0x5d, 0x45, 0x4e, 0x0a, 0x74, 0xfc, 0xbd, 0x29, 0x85, 0x10, 0x94, + 0xfd, 0xd5, 0x36, 0xdb, 0x6a, 0x57, 0x69, 0xc8, 0x69, 0x54, 0x85, 0x45, 0x0e, 0xdb, 0x6d, 0xed, + 0xb5, 0xba, 0x9a, 0xaa, 0xd4, 0xb7, 0x9a, 0x4a, 0x43, 0xce, 0xac, 0x1c, 0xf2, 0x7f, 0x02, 0xe1, + 0x15, 0x30, 0x04, 0x65, 0x5f, 0x98, 0x7b, 0xad, 0x6f, 0x18, 0x7b, 0x4b, 0x80, 0x1a, 0x87, 0xf5, + 0xdd, 0xc0, 0xe2, 0xea, 0x3b, 0xca, 0x3e, 0x31, 0xc5, 0x65, 0x58, 0x1a, 0x87, 0xef, 0x76, 0x15, + 0x75, 0xbf, 0x4e, 0x0e, 0x71, 0xfd, 0x6f, 0x32, 0x90, 0xe1, 0x65, 0xf3, 0x9f, 0x40, 0x41, 0xe8, + 0x1d, 0x40, 0x57, 0x75, 0x14, 0x2c, 0xc7, 0x75, 0xb7, 0xa0, 0x3a, 0x14, 0xc5, 0xae, 0x16, 0x14, + 0x06, 0x5e, 0x31, 0xcd, 0x2e, 0xf1, 0x4b, 0x28, 0x00, 0x61, 0x6b, 0x0d, 0x0a, 0x23, 0xc7, 0x89, + 0x26, 0x9f, 0xe5, 0xdb, 0xb1, 0x38, 0xde, 0x8b, 0xf3, 0x63, 0x80, 0xb0, 0x3b, 0x05, 0x89, 0x0f, + 0x90, 0x91, 0x96, 0x95, 0x78, 0x2e, 0xba, 0x50, 0xa5, 0x7b, 0x8e, 0x29, 0x87, 0xa2, 0x69, 0x3a, + 0x1e, 0xe2, 0x57, 0xfd, 0x6d, 0x62, 0xe2, 0xba, 0xe3, 0x05, 0xc5, 0x20, 0x74, 0x79, 0xeb, 0x43, + 0xfc, 0x0a, 0x07, 0xb0, 0x44, 0x57, 0x98, 0x7c, 0x09, 0x7a, 0x7f, 0x37, 0x44, 0xfc, 0x8a, 0x5f, + 0xc3, 0x2d, 0xba, 0x62, 0x5c, 0xfe, 0x85, 0xa6, 0xea, 0x8b, 0x88, 0x5f, 0xb7, 0x01, 0x72, 0xb8, + 0xee, 0x84, 0x42, 0x4d, 0xc6, 0xb6, 0xef, 0x51, 0x28, 0x76, 0x63, 0x4f, 0x28, 0xd4, 0xd8, 0x45, + 0xfe, 0x9e, 0x25, 0x98, 0x77, 0x9d, 0x58, 0x62, 0xec, 0xc2, 0x8e, 0x5d, 0x62, 0x73, 0xfb, 0xf7, + 0xee, 0x9d, 0x98, 0xde, 0xe9, 0xe8, 0x68, 0xad, 0x67, 0x0f, 0x1e, 0x73, 0x82, 0xc7, 0x7e, 0xef, + 0xbd, 0x0f, 0xf8, 0xfb, 0x44, 0x69, 0xd7, 0x3c, 0xc7, 0x2f, 0x59, 0xc7, 0xa0, 0x67, 0xff, 0x67, + 0xa2, 0xcc, 0xc7, 0x2f, 0x5e, 0x50, 0xc0, 0x51, 0x86, 0x4e, 0xd9, 0xf8, 0xdf, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xf9, 0x07, 0xe6, 0x37, 0x63, 0x3a, 0x00, 0x00, } From bc198efff3cfe17cd9c1612452d659e379aa03ea Mon Sep 17 00:00:00 2001 From: David Colburn Date: Fri, 20 Mar 2026 16:09:40 +0800 Subject: [PATCH 13/15] update helpers --- egress/notify_options.go | 8 +++++++ egress/redact.go | 11 +++++++++ egress/types.go | 48 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/egress/notify_options.go b/egress/notify_options.go index a974b95f2..6bdfddfab 100644 --- a/egress/notify_options.go +++ b/egress/notify_options.go @@ -31,6 +31,14 @@ func GetEgressNotifyOptions(egressInfo *livekit.EgressInfo) []webhook.NotifyOpti var whs []*livekit.WebhookConfig switch req := egressInfo.Request.(type) { + case *livekit.EgressInfo_Egress: + if req.Egress != nil { + whs = req.Egress.Webhooks + } + case *livekit.EgressInfo_Replay: + if req.Replay != nil { + whs = req.Replay.Webhooks + } case *livekit.EgressInfo_RoomComposite: if req.RoomComposite != nil { whs = req.RoomComposite.Webhooks diff --git a/egress/redact.go b/egress/redact.go index 5b599bdf2..96ffe66c0 100644 --- a/egress/redact.go +++ b/egress/redact.go @@ -19,6 +19,17 @@ import ( "github.com/livekit/protocol/utils" ) +// RedactStartEgressRequest redacts secrets from a V2 StartEgressRequest. +func RedactStartEgressRequest(req EgressRequest) { + RedactUpload(req.GetStorage()) + for _, output := range req.GetOutputs() { + RedactUpload(output.Storage) + if stream := output.GetStream(); stream != nil { + RedactStreamKeys(stream) + } + } +} + func RedactUpload(req UploadRequest) { if s3 := req.GetS3(); s3 != nil { s3.AccessKey = utils.Redact(s3.AccessKey, "{access_key}") diff --git a/egress/types.go b/egress/types.go index 41ea75070..a280262d8 100644 --- a/egress/types.go +++ b/egress/types.go @@ -17,8 +17,11 @@ package egress import "github.com/livekit/protocol/livekit" const ( + EgressTypeTemplate = "template" + EgressTypeWeb = "web" + EgressTypeMedia = "media" + EgressTypeRoomComposite = "room_composite" - EgressTypeWeb = "web" EgressTypeParticipant = "participant" EgressTypeTrackComposite = "track_composite" EgressTypeTrack = "track" @@ -55,6 +58,14 @@ type DirectOutput interface { GetWebsocketUrl() string } +type EgressRequest interface { + GetMedia() *livekit.MediaSource + GetTemplate() *livekit.TemplateSource + GetWeb() *livekit.WebSource + GetOutputs() []*livekit.Output + GetStorage() *livekit.StorageConfig +} + type UploadRequest interface { GetS3() *livekit.S3Upload GetGcp() *livekit.GCPUpload @@ -63,6 +74,20 @@ type UploadRequest interface { } func GetTypes(request interface{}) (string, string) { + if r, ok := request.(EgressRequest); ok { + var egressType string + if r.GetMedia() != nil { + egressType = EgressTypeMedia + } else if r.GetTemplate() != nil { + egressType = EgressTypeTemplate + } else if r.GetWeb() != nil { + egressType = EgressTypeWeb + } else { + egressType = Unknown + } + return egressType, GetOutputTypeV2(r.GetOutputs()) + } + switch req := request.(type) { case *livekit.EgressInfo_RoomComposite: return EgressTypeRoomComposite, GetOutputType(req.RoomComposite) @@ -83,6 +108,27 @@ func GetTypes(request interface{}) (string, string) { return Unknown, Unknown } +func GetOutputTypeV2(outputs []*livekit.Output) string { + if len(outputs) == 0 { + return Unknown + } + if len(outputs) > 1 { + return OutputTypeMultiple + } + switch outputs[0].Config.(type) { + case *livekit.Output_File: + return OutputTypeFile + case *livekit.Output_Stream: + return OutputTypeStream + case *livekit.Output_Segments: + return OutputTypeSegments + case *livekit.Output_Images: + return OutputTypeImages + default: + return Unknown + } +} + func GetOutputType(req interface{}) string { if r, ok := req.(EncodedOutput); ok { outputs := make([]string, 0) From b99c2b4d76bfe51c1ba3787adf5cd3987d0b0028 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Wed, 25 Mar 2026 14:48:34 +0900 Subject: [PATCH 14/15] replay only --- protobufs/livekit_egress.proto | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index 6a77fe3ca..5e109f221 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -25,25 +25,23 @@ option ruby_package = "LiveKit::Proto"; service Egress { // Unified StartEgress RPC - rpc StartEgress(StartEgressRequest) returns (EgressInfo); + // rpc StartEgress(StartEgressRequest) returns (EgressInfo); + rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo); + rpc StartWebEgress(WebEgressRequest) returns (EgressInfo); + rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo); + rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo); + rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo); // Update url/template or stream outputs - rpc UpdateEgress(UpdateEgressRequest) returns (EgressInfo); + // rpc UpdateEgress(UpdateEgressRequest) returns (EgressInfo); + rpc UpdateLayout(UpdateLayoutRequest) returns (EgressInfo); + rpc UpdateStream(UpdateStreamRequest) returns (EgressInfo); // List available egress rpc ListEgress(ListEgressRequest) returns (ListEgressResponse); // Stop a recording or stream rpc StopEgress(StopEgressRequest) returns (EgressInfo); - - // --- Deprecated --- - rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo); - rpc StartWebEgress(WebEgressRequest) returns (EgressInfo); - rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo); - rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo); - rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo); - rpc UpdateLayout(UpdateLayoutRequest) returns (EgressInfo); - rpc UpdateStream(UpdateStreamRequest) returns (EgressInfo); } // --- Core Request --- @@ -232,7 +230,6 @@ message SegmentedFileOutput { SegmentedFileSuffix filename_suffix = 10; // (optional, default INDEX) bool disable_manifest = 8; // disable upload of manifest file (default false) - // --- Deprecated --- oneof output { S3Upload s3 = 5; GCPUpload gcp = 6; @@ -261,7 +258,6 @@ message ImageOutput { ImageCodec image_codec = 6; // (optional) bool disable_manifest = 7; // disable upload of manifest file (default false) - // --- Deprecated --- oneof output { S3Upload s3 = 8; GCPUpload gcp = 9; @@ -371,7 +367,7 @@ message EgressInfo { int64 updated_at = 18; oneof request { - StartEgressRequest egress = 29; + // StartEgressRequest egress = 29; ExportReplayRequest replay = 30; RoomCompositeEgressRequest room_composite = 4; @@ -509,7 +505,7 @@ message ExportReplayRequest { repeated WebhookConfig webhooks = 11; } -// --- Deprecated --- +// --- V1 --- message RoomCompositeEgressRequest { string room_name = 1; From 3293439d8ada19e51946cb7b363101209bac5f20 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 05:49:35 +0000 Subject: [PATCH 15/15] generated protobuf --- livekit/livekit_egress.pb.go | 254 ++-- livekit/livekit_egress.twirp.go | 2067 +++++++++++-------------------- 2 files changed, 867 insertions(+), 1454 deletions(-) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index bba9184ba..87335b813 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -1754,8 +1754,6 @@ type SegmentedFileOutput struct { SegmentDuration uint32 `protobuf:"varint,4,opt,name=segment_duration,json=segmentDuration,proto3" json:"segment_duration,omitempty"` // in seconds (optional) FilenameSuffix SegmentedFileSuffix `protobuf:"varint,10,opt,name=filename_suffix,json=filenameSuffix,proto3,enum=livekit.SegmentedFileSuffix" json:"filename_suffix,omitempty"` // (optional, default INDEX) DisableManifest bool `protobuf:"varint,8,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) - // --- Deprecated --- - // // Types that are valid to be assigned to Output: // // *SegmentedFileOutput_S3 @@ -1927,8 +1925,6 @@ type ImageOutput struct { FilenameSuffix ImageFileSuffix `protobuf:"varint,5,opt,name=filename_suffix,json=filenameSuffix,proto3,enum=livekit.ImageFileSuffix" json:"filename_suffix,omitempty"` // (optional, default INDEX) ImageCodec ImageCodec `protobuf:"varint,6,opt,name=image_codec,json=imageCodec,proto3,enum=livekit.ImageCodec" json:"image_codec,omitempty"` // (optional) DisableManifest bool `protobuf:"varint,7,opt,name=disable_manifest,json=disableManifest,proto3" json:"disable_manifest,omitempty"` // disable upload of manifest file (default false) - // --- Deprecated --- - // // Types that are valid to be assigned to Output: // // *ImageOutput_S3 @@ -2837,7 +2833,6 @@ type EgressInfo struct { UpdatedAt int64 `protobuf:"varint,18,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` // Types that are valid to be assigned to Request: // - // *EgressInfo_Egress // *EgressInfo_Replay // *EgressInfo_RoomComposite // *EgressInfo_Web @@ -2960,15 +2955,6 @@ func (x *EgressInfo) GetRequest() isEgressInfo_Request { return nil } -func (x *EgressInfo) GetEgress() *StartEgressRequest { - if x != nil { - if x, ok := x.Request.(*EgressInfo_Egress); ok { - return x.Egress - } - } - return nil -} - func (x *EgressInfo) GetReplay() *ExportReplayRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Replay); ok { @@ -3134,11 +3120,8 @@ type isEgressInfo_Request interface { isEgressInfo_Request() } -type EgressInfo_Egress struct { - Egress *StartEgressRequest `protobuf:"bytes,29,opt,name=egress,proto3,oneof"` -} - type EgressInfo_Replay struct { + // StartEgressRequest egress = 29; Replay *ExportReplayRequest `protobuf:"bytes,30,opt,name=replay,proto3,oneof"` } @@ -3162,8 +3145,6 @@ type EgressInfo_Track struct { Track *TrackEgressRequest `protobuf:"bytes,6,opt,name=track,proto3,oneof"` } -func (*EgressInfo_Egress) isEgressInfo_Request() {} - func (*EgressInfo_Replay) isEgressInfo_Request() {} func (*EgressInfo_RoomComposite) isEgressInfo_Request() {} @@ -5508,7 +5489,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fadd_stream_urls\x18\x04 \x03(\tR\raddStreamUrls\x12,\n" + "\x12remove_stream_urls\x18\x05 \x03(\tR\x10removeStreamUrls\">\n" + "\x11StopEgressRequest\x12)\n" + - "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\xe1\n" + + "\tegress_id\x18\x01 \x01(\tB\f\x9a\xec,\begressIDR\begressId\"\xaa\n" + "\n" + "\n" + "EgressInfo\x12)\n" + @@ -5524,8 +5505,7 @@ const file_livekit_egress_proto_rawDesc = "" + " \x01(\x03R\tstartedAt\x12\x19\n" + "\bended_at\x18\v \x01(\x03R\aendedAt\x12\x1d\n" + "\n" + - "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x125\n" + - "\x06egress\x18\x1d \x01(\v2\x1b.livekit.StartEgressRequestH\x00R\x06egress\x126\n" + + "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x126\n" + "\x06replay\x18\x1e \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12L\n" + "\x0eroom_composite\x18\x04 \x01(\v2#.livekit.RoomCompositeEgressRequestH\x00R\rroomComposite\x12-\n" + "\x03web\x18\x0e \x01(\v2\x19.livekit.WebEgressRequestH\x00R\x03web\x12E\n" + @@ -5774,21 +5754,19 @@ const file_livekit_egress_proto_rawDesc = "" + "\vAudioMixing\x12\x12\n" + "\x0eDEFAULT_MIXING\x10\x00\x12\x16\n" + "\x12DUAL_CHANNEL_AGENT\x10\x01\x12\x1a\n" + - "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\xa0\x06\n" + - "\x06Egress\x12?\n" + - "\vStartEgress\x12\x1b.livekit.StartEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + - "\fUpdateEgress\x12\x1c.livekit.UpdateEgressRequest\x1a\x13.livekit.EgressInfo\x12E\n" + - "\n" + - "ListEgress\x12\x1a.livekit.ListEgressRequest\x1a\x1b.livekit.ListEgressResponse\x12=\n" + - "\n" + - "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\x12T\n" + + "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\x9c\x05\n" + + "\x06Egress\x12T\n" + "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12@\n" + "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\x12P\n" + "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\x12V\n" + "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12D\n" + "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + "\fUpdateLayout\x12\x1c.livekit.UpdateLayoutRequest\x1a\x13.livekit.EgressInfo\x12A\n" + - "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfoBFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\x12E\n" + + "\n" + + "ListEgress\x12\x1a.livekit.ListEgressRequest\x1a\x1b.livekit.ListEgressResponse\x12=\n" + + "\n" + + "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfoBFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_livekit_egress_proto_rawDescOnce sync.Once @@ -5913,114 +5891,109 @@ var file_livekit_egress_proto_depIdxs = []int32{ 36, // 43: livekit.ListEgressResponse.items:type_name -> livekit.EgressInfo 7, // 44: livekit.EgressInfo.source_type:type_name -> livekit.EgressSourceType 8, // 45: livekit.EgressInfo.status:type_name -> livekit.EgressStatus - 11, // 46: livekit.EgressInfo.egress:type_name -> livekit.StartEgressRequest - 43, // 47: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest - 44, // 48: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest - 45, // 49: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest - 46, // 50: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest - 47, // 51: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest - 48, // 52: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest - 37, // 53: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo - 38, // 54: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo - 39, // 55: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo - 40, // 56: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo - 53, // 57: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList - 38, // 58: livekit.EgressInfo.file:type_name -> livekit.FileInfo - 39, // 59: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo - 10, // 60: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status - 1, // 61: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 62: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions - 50, // 63: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 64: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput - 27, // 65: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload - 28, // 66: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload - 29, // 67: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload - 30, // 68: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload - 12, // 69: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource - 13, // 70: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource - 14, // 71: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource - 1, // 72: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 73: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions - 21, // 74: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output - 26, // 75: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig - 55, // 76: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig - 9, // 77: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing - 50, // 78: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 79: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 80: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 81: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 82: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 83: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 84: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 85: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 86: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 87: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 50, // 88: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 89: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 90: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 91: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 92: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 93: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 94: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 95: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 96: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 97: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 1, // 98: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 99: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 100: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 101: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 102: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 103: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 104: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 50, // 105: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 106: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 107: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 108: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 109: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 110: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 111: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 112: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 113: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 114: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 49, // 115: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput - 55, // 116: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 27, // 117: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload - 28, // 118: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload - 29, // 119: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload - 30, // 120: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 2, // 121: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType - 27, // 122: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload - 28, // 123: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload - 29, // 124: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload - 30, // 125: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 37, // 126: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo - 11, // 127: livekit.Egress.StartEgress:input_type -> livekit.StartEgressRequest - 34, // 128: livekit.Egress.UpdateEgress:input_type -> livekit.UpdateEgressRequest - 32, // 129: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest - 35, // 130: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest - 44, // 131: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest - 45, // 132: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest - 46, // 133: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest - 47, // 134: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest - 48, // 135: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest - 51, // 136: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest - 52, // 137: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest - 36, // 138: livekit.Egress.StartEgress:output_type -> livekit.EgressInfo - 36, // 139: livekit.Egress.UpdateEgress:output_type -> livekit.EgressInfo - 33, // 140: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse - 36, // 141: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo - 36, // 142: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo - 36, // 143: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo - 36, // 144: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo - 36, // 145: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo - 36, // 146: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo - 36, // 147: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo - 36, // 148: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo - 138, // [138:149] is the sub-list for method output_type - 127, // [127:138] is the sub-list for method input_type - 127, // [127:127] is the sub-list for extension type_name - 127, // [127:127] is the sub-list for extension extendee - 0, // [0:127] is the sub-list for field type_name + 43, // 46: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest + 44, // 47: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest + 45, // 48: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest + 46, // 49: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest + 47, // 50: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest + 48, // 51: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest + 37, // 52: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo + 38, // 53: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo + 39, // 54: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo + 40, // 55: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo + 53, // 56: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList + 38, // 57: livekit.EgressInfo.file:type_name -> livekit.FileInfo + 39, // 58: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo + 10, // 59: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status + 1, // 60: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 61: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions + 50, // 62: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput + 24, // 63: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput + 27, // 64: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload + 28, // 65: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload + 29, // 66: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload + 30, // 67: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload + 12, // 68: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource + 13, // 69: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource + 14, // 70: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource + 1, // 71: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 72: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions + 21, // 73: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output + 26, // 74: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig + 55, // 75: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig + 9, // 76: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing + 50, // 77: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 78: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 79: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 80: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 81: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 82: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 83: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 84: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 85: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 86: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 50, // 87: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 88: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 89: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 90: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 91: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 92: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 93: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 94: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 95: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 96: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 1, // 97: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 98: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 99: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 100: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 101: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 102: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 103: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 50, // 104: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 105: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 106: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 107: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 108: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 109: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 110: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 111: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 112: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 113: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 49, // 114: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput + 55, // 115: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 27, // 116: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload + 28, // 117: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 118: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 119: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 2, // 120: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType + 27, // 121: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload + 28, // 122: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 123: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 124: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 37, // 125: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo + 44, // 126: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest + 45, // 127: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest + 46, // 128: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest + 47, // 129: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest + 48, // 130: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest + 51, // 131: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest + 52, // 132: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest + 32, // 133: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest + 35, // 134: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest + 36, // 135: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo + 36, // 136: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo + 36, // 137: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo + 36, // 138: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo + 36, // 139: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo + 36, // 140: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo + 36, // 141: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo + 33, // 142: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse + 36, // 143: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo + 135, // [135:144] is the sub-list for method output_type + 126, // [126:135] is the sub-list for method input_type + 126, // [126:126] is the sub-list for extension type_name + 126, // [126:126] is the sub-list for extension extendee + 0, // [0:126] is the sub-list for field type_name } func init() { file_livekit_egress_proto_init() } @@ -6075,7 +6048,6 @@ func file_livekit_egress_proto_init() { (*StorageConfig_AliOSS)(nil), } file_livekit_egress_proto_msgTypes[25].OneofWrappers = []any{ - (*EgressInfo_Egress)(nil), (*EgressInfo_Replay)(nil), (*EgressInfo_RoomComposite)(nil), (*EgressInfo_Web)(nil), diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index 7e83367bb..60cb8cd53 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -28,18 +28,7 @@ const _ = twirp.TwirpPackageMinVersion_8_1_0 type Egress interface { // Unified StartEgress RPC - StartEgress(context.Context, *StartEgressRequest) (*EgressInfo, error) - - // Update url/template or stream outputs - UpdateEgress(context.Context, *UpdateEgressRequest) (*EgressInfo, error) - - // List available egress - ListEgress(context.Context, *ListEgressRequest) (*ListEgressResponse, error) - - // Stop a recording or stream - StopEgress(context.Context, *StopEgressRequest) (*EgressInfo, error) - - // --- Deprecated --- + // rpc StartEgress(StartEgressRequest) returns (EgressInfo); StartRoomCompositeEgress(context.Context, *RoomCompositeEgressRequest) (*EgressInfo, error) StartWebEgress(context.Context, *WebEgressRequest) (*EgressInfo, error) @@ -50,9 +39,17 @@ type Egress interface { StartTrackEgress(context.Context, *TrackEgressRequest) (*EgressInfo, error) + // Update url/template or stream outputs + // rpc UpdateEgress(UpdateEgressRequest) returns (EgressInfo); UpdateLayout(context.Context, *UpdateLayoutRequest) (*EgressInfo, error) UpdateStream(context.Context, *UpdateStreamRequest) (*EgressInfo, error) + + // List available egress + ListEgress(context.Context, *ListEgressRequest) (*ListEgressResponse, error) + + // Stop a recording or stream + StopEgress(context.Context, *StopEgressRequest) (*EgressInfo, error) } // ====================== @@ -61,7 +58,7 @@ type Egress interface { type egressProtobufClient struct { client HTTPClient - urls [11]string + urls [9]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -89,11 +86,7 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") - urls := [11]string{ - serviceURL + "StartEgress", - serviceURL + "UpdateEgress", - serviceURL + "ListEgress", - serviceURL + "StopEgress", + urls := [9]string{ serviceURL + "StartRoomCompositeEgress", serviceURL + "StartWebEgress", serviceURL + "StartParticipantEgress", @@ -101,6 +94,8 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl serviceURL + "StartTrackEgress", serviceURL + "UpdateLayout", serviceURL + "UpdateStream", + serviceURL + "ListEgress", + serviceURL + "StopEgress", } return &egressProtobufClient{ @@ -111,20 +106,20 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl } } -func (c *egressProtobufClient) StartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartEgress") - caller := c.callStartEgress + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + caller := c.callStartRoomCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StartEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return c.callStartEgress(ctx, typedReq) + return c.callStartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -140,7 +135,7 @@ func (c *egressProtobufClient) StartEgress(ctx context.Context, in *StartEgressR return caller(ctx, in) } -func (c *egressProtobufClient) callStartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) if err != nil { @@ -157,20 +152,20 @@ func (c *egressProtobufClient) callStartEgress(ctx context.Context, in *StartEgr return out, nil } -func (c *egressProtobufClient) UpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") - caller := c.callUpdateEgress + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + caller := c.callStartWebEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateEgressRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return c.callUpdateEgress(ctx, typedReq) + return c.callStartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -186,7 +181,7 @@ func (c *egressProtobufClient) UpdateEgress(ctx context.Context, in *UpdateEgres return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { @@ -203,26 +198,26 @@ func (c *egressProtobufClient) callUpdateEgress(ctx context.Context, in *UpdateE return out, nil } -func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { +func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") - caller := c.callListEgress + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + caller := c.callStartParticipantEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return c.callListEgress(ctx, typedReq) + return c.callStartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -232,8 +227,8 @@ func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressReq return caller(ctx, in) } -func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - out := new(ListEgressResponse) +func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -249,20 +244,20 @@ func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgres return out, nil } -func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") - caller := c.callStopEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + caller := c.callStartTrackCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return c.callStopEgress(ctx, typedReq) + return c.callStartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -278,7 +273,7 @@ func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressReq return caller(ctx, in) } -func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { @@ -295,20 +290,20 @@ func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgres return out, nil } -func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") - caller := c.callStartRoomCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + caller := c.callStartTrackEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return c.callStartRoomCompositeEgress(ctx, typedReq) + return c.callStartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -324,7 +319,7 @@ func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in return caller(ctx, in) } -func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) if err != nil { @@ -341,20 +336,20 @@ func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, return out, nil } -func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") - caller := c.callStartWebEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + caller := c.callUpdateLayout if c.interceptor != nil { - caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return c.callStartWebEgress(ctx, typedReq) + return c.callUpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -370,7 +365,7 @@ func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgress return caller(ctx, in) } -func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { @@ -387,20 +382,20 @@ func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEg return out, nil } -func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") - caller := c.callStartParticipantEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + caller := c.callUpdateStream if c.interceptor != nil { - caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return c.callStartParticipantEgress(ctx, typedReq) + return c.callUpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -416,7 +411,7 @@ func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *P return caller(ctx, in) } -func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[6], in, out) if err != nil { @@ -433,26 +428,26 @@ func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, i return out, nil } -func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") - caller := c.callStartTrackCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + caller := c.callListEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return c.callStartTrackCompositeEgress(ctx, typedReq) + return c.callListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -462,8 +457,8 @@ func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in return caller(ctx, in) } -func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) +func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { + out := new(ListEgressResponse) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[7], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -479,20 +474,20 @@ func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context return out, nil } -func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") - caller := c.callStartTrackEgress + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + caller := c.callStopEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return c.callStartTrackEgress(ctx, typedReq) + return c.callStopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -508,7 +503,7 @@ func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEg return caller(ctx, in) } -func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[8], in, out) if err != nil { @@ -525,20 +520,74 @@ func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *Tra return out, nil } -func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +// ================== +// Egress JSON Client +// ================== + +type egressJSONClient struct { + client HTTPClient + urls [9]string + interceptor twirp.Interceptor + opts twirp.ClientOptions +} + +// NewEgressJSONClient creates a JSON client that implements the Egress interface. +// It communicates using JSON and can be configured with a custom HTTPClient. +func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.ClientOption) Egress { + if c, ok := client.(*http.Client); ok { + client = withoutRedirects(c) + } + + clientOpts := twirp.ClientOptions{} + for _, o := range opts { + o(&clientOpts) + } + + // Using ReadOpt allows backwards and forwards compatibility with new options in the future + literalURLs := false + _ = clientOpts.ReadOpt("literalURLs", &literalURLs) + var pathPrefix string + if ok := clientOpts.ReadOpt("pathPrefix", &pathPrefix); !ok { + pathPrefix = "/twirp" // default prefix + } + + // Build method URLs: []/./ + serviceURL := sanitizeBaseURL(baseURL) + serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") + urls := [9]string{ + serviceURL + "StartRoomCompositeEgress", + serviceURL + "StartWebEgress", + serviceURL + "StartParticipantEgress", + serviceURL + "StartTrackCompositeEgress", + serviceURL + "StartTrackEgress", + serviceURL + "UpdateLayout", + serviceURL + "UpdateStream", + serviceURL + "ListEgress", + serviceURL + "StopEgress", + } + + return &egressJSONClient{ + client: client, + urls: urls, + interceptor: twirp.ChainInterceptors(clientOpts.Interceptors...), + opts: clientOpts, + } +} + +func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") - caller := c.callUpdateLayout + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + caller := c.callStartRoomCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return c.callUpdateLayout(ctx, typedReq) + return c.callStartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -554,9 +603,9 @@ func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayou return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) - ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[9], in, out) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) if err != nil { twerr, ok := err.(twirp.Error) if !ok { @@ -571,20 +620,20 @@ func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateL return out, nil } -func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") - caller := c.callUpdateStream + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + caller := c.callStartWebEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return c.callUpdateStream(ctx, typedReq) + return c.callStartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -600,9 +649,9 @@ func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStrea return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) - ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[10], in, out) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { twerr, ok := err.(twirp.Error) if !ok { @@ -617,122 +666,20 @@ func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateS return out, nil } -// ================== -// Egress JSON Client -// ================== - -type egressJSONClient struct { - client HTTPClient - urls [11]string - interceptor twirp.Interceptor - opts twirp.ClientOptions -} - -// NewEgressJSONClient creates a JSON client that implements the Egress interface. -// It communicates using JSON and can be configured with a custom HTTPClient. -func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.ClientOption) Egress { - if c, ok := client.(*http.Client); ok { - client = withoutRedirects(c) - } - - clientOpts := twirp.ClientOptions{} - for _, o := range opts { - o(&clientOpts) - } - - // Using ReadOpt allows backwards and forwards compatibility with new options in the future - literalURLs := false - _ = clientOpts.ReadOpt("literalURLs", &literalURLs) - var pathPrefix string - if ok := clientOpts.ReadOpt("pathPrefix", &pathPrefix); !ok { - pathPrefix = "/twirp" // default prefix - } - - // Build method URLs: []/./ - serviceURL := sanitizeBaseURL(baseURL) - serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") - urls := [11]string{ - serviceURL + "StartEgress", - serviceURL + "UpdateEgress", - serviceURL + "ListEgress", - serviceURL + "StopEgress", - serviceURL + "StartRoomCompositeEgress", - serviceURL + "StartWebEgress", - serviceURL + "StartParticipantEgress", - serviceURL + "StartTrackCompositeEgress", - serviceURL + "StartTrackEgress", - serviceURL + "UpdateLayout", - serviceURL + "UpdateStream", - } - - return &egressJSONClient{ - client: client, - urls: urls, - interceptor: twirp.ChainInterceptors(clientOpts.Interceptors...), - opts: clientOpts, - } -} - -func (c *egressJSONClient) StartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { - ctx = ctxsetters.WithPackageName(ctx, "livekit") - ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartEgress") - caller := c.callStartEgress - if c.interceptor != nil { - caller = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { - resp, err := c.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StartEgressRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") - } - return c.callStartEgress(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - return caller(ctx, in) -} - -func (c *egressJSONClient) callStartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) - ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) - if err != nil { - twerr, ok := err.(twirp.Error) - if !ok { - twerr = twirp.InternalErrorWith(err) - } - callClientError(ctx, c.opts.Hooks, twerr) - return nil, err - } - - callClientResponseReceived(ctx, c.opts.Hooks) - - return out, nil -} - -func (c *egressJSONClient) UpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") - caller := c.callUpdateEgress + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + caller := c.callStartParticipantEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return c.callUpdateEgress(ctx, typedReq) + return c.callStartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -748,54 +695,8 @@ func (c *egressJSONClient) UpdateEgress(ctx context.Context, in *UpdateEgressReq return caller(ctx, in) } -func (c *egressJSONClient) callUpdateEgress(ctx context.Context, in *UpdateEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) - ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) - if err != nil { - twerr, ok := err.(twirp.Error) - if !ok { - twerr = twirp.InternalErrorWith(err) - } - callClientError(ctx, c.opts.Hooks, twerr) - return nil, err - } - - callClientResponseReceived(ctx, c.opts.Hooks) - - return out, nil -} - -func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - ctx = ctxsetters.WithPackageName(ctx, "livekit") - ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") - caller := c.callListEgress - if c.interceptor != nil { - caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { - resp, err := c.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") - } - return c.callListEgress(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - return caller(ctx, in) -} - -func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - out := new(ListEgressResponse) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -811,20 +712,20 @@ func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressReq return out, nil } -func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") - caller := c.callStopEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + caller := c.callStartTrackCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return c.callStopEgress(ctx, typedReq) + return c.callStartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -840,7 +741,7 @@ func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest return caller(ctx, in) } -func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { @@ -857,20 +758,20 @@ func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressReq return out, nil } -func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") - caller := c.callStartRoomCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + caller := c.callStartTrackEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return c.callStartRoomCompositeEgress(ctx, typedReq) + return c.callStartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -886,7 +787,7 @@ func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *Roo return caller(ctx, in) } -func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) if err != nil { @@ -903,20 +804,20 @@ func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in return out, nil } -func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") - caller := c.callStartWebEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + caller := c.callUpdateLayout if c.interceptor != nil { - caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return c.callStartWebEgress(ctx, typedReq) + return c.callUpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -932,7 +833,7 @@ func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequ return caller(ctx, in) } -func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { @@ -949,20 +850,20 @@ func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgress return out, nil } -func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") - caller := c.callStartParticipantEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + caller := c.callUpdateStream if c.interceptor != nil { - caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return c.callStartParticipantEgress(ctx, typedReq) + return c.callUpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -978,7 +879,7 @@ func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *Parti return caller(ctx, in) } -func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[6], in, out) if err != nil { @@ -995,26 +896,26 @@ func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *P return out, nil } -func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") - caller := c.callStartTrackCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + caller := c.callListEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return c.callStartTrackCompositeEgress(ctx, typedReq) + return c.callListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -1024,8 +925,8 @@ func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *Tr return caller(ctx, in) } -func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) +func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { + out := new(ListEgressResponse) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[7], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -1041,20 +942,20 @@ func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in return out, nil } -func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") - caller := c.callStartTrackEgress + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + caller := c.callStopEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return c.callStartTrackEgress(ctx, typedReq) + return c.callStopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1070,7 +971,7 @@ func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgress return caller(ctx, in) } -func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[8], in, out) if err != nil { @@ -1087,98 +988,6 @@ func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEg return out, nil } -func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { - ctx = ctxsetters.WithPackageName(ctx, "livekit") - ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") - caller := c.callUpdateLayout - if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { - resp, err := c.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") - } - return c.callUpdateLayout(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - return caller(ctx, in) -} - -func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { - out := new(EgressInfo) - ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[9], in, out) - if err != nil { - twerr, ok := err.(twirp.Error) - if !ok { - twerr = twirp.InternalErrorWith(err) - } - callClientError(ctx, c.opts.Hooks, twerr) - return nil, err - } - - callClientResponseReceived(ctx, c.opts.Hooks) - - return out, nil -} - -func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { - ctx = ctxsetters.WithPackageName(ctx, "livekit") - ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") - caller := c.callUpdateStream - if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { - resp, err := c.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") - } - return c.callUpdateStream(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - return caller(ctx, in) -} - -func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { - out := new(EgressInfo) - ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[10], in, out) - if err != nil { - twerr, ok := err.(twirp.Error) - if !ok { - twerr = twirp.InternalErrorWith(err) - } - callClientError(ctx, c.opts.Hooks, twerr) - return nil, err - } - - callClientResponseReceived(ctx, c.opts.Hooks) - - return out, nil -} - // ===================== // Egress Server Handler // ===================== @@ -1222,461 +1031,95 @@ func NewEgressServer(svc Egress, opts ...interface{}) TwirpServer { // If err is not a twirp.Error, it will get wrapped with twirp.InternalErrorWith(err) func (s *egressServer) writeError(ctx context.Context, resp http.ResponseWriter, err error) { writeError(ctx, resp, err, s.hooks) -} - -// handleRequestBodyError is used to handle error when the twirp server cannot read request -func (s *egressServer) handleRequestBodyError(ctx context.Context, resp http.ResponseWriter, msg string, err error) { - if context.Canceled == ctx.Err() { - s.writeError(ctx, resp, twirp.NewError(twirp.Canceled, "failed to read request: context canceled")) - return - } - if context.DeadlineExceeded == ctx.Err() { - s.writeError(ctx, resp, twirp.NewError(twirp.DeadlineExceeded, "failed to read request: deadline exceeded")) - return - } - s.writeError(ctx, resp, twirp.WrapError(malformedRequestError(msg), err)) -} - -// EgressPathPrefix is a convenience constant that may identify URL paths. -// Should be used with caution, it only matches routes generated by Twirp Go clients, -// with the default "/twirp" prefix and default CamelCase service and method names. -// More info: https://twitchtv.github.io/twirp/docs/routing.html -const EgressPathPrefix = "/twirp/livekit.Egress/" - -func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { - ctx := req.Context() - ctx = ctxsetters.WithPackageName(ctx, "livekit") - ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithResponseWriter(ctx, resp) - - var err error - ctx, err = callRequestReceived(ctx, s.hooks) - if err != nil { - s.writeError(ctx, resp, err) - return - } - - if req.Method != "POST" { - msg := fmt.Sprintf("unsupported method %q (only POST is allowed)", req.Method) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) - return - } - - // Verify path format: []/./ - prefix, pkgService, method := parseTwirpPath(req.URL.Path) - if pkgService != "livekit.Egress" { - msg := fmt.Sprintf("no handler for path %q", req.URL.Path) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) - return - } - if prefix != s.pathPrefix { - msg := fmt.Sprintf("invalid path prefix %q, expected %q, on path %q", prefix, s.pathPrefix, req.URL.Path) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) - return - } - - switch method { - case "StartEgress": - s.serveStartEgress(ctx, resp, req) - return - case "UpdateEgress": - s.serveUpdateEgress(ctx, resp, req) - return - case "ListEgress": - s.serveListEgress(ctx, resp, req) - return - case "StopEgress": - s.serveStopEgress(ctx, resp, req) - return - case "StartRoomCompositeEgress": - s.serveStartRoomCompositeEgress(ctx, resp, req) - return - case "StartWebEgress": - s.serveStartWebEgress(ctx, resp, req) - return - case "StartParticipantEgress": - s.serveStartParticipantEgress(ctx, resp, req) - return - case "StartTrackCompositeEgress": - s.serveStartTrackCompositeEgress(ctx, resp, req) - return - case "StartTrackEgress": - s.serveStartTrackEgress(ctx, resp, req) - return - case "UpdateLayout": - s.serveUpdateLayout(ctx, resp, req) - return - case "UpdateStream": - s.serveUpdateStream(ctx, resp, req) - return - default: - msg := fmt.Sprintf("no handler for path %q", req.URL.Path) - s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) - return - } -} - -func (s *egressServer) serveStartEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { - header := req.Header.Get("Content-Type") - i := strings.Index(header, ";") - if i == -1 { - i = len(header) - } - switch strings.TrimSpace(strings.ToLower(header[:i])) { - case "application/json": - s.serveStartEgressJSON(ctx, resp, req) - case "application/protobuf": - s.serveStartEgressProtobuf(ctx, resp, req) - default: - msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) - twerr := badRouteError(msg, req.Method, req.URL.Path) - s.writeError(ctx, resp, twerr) - } -} - -func (s *egressServer) serveStartEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { - var err error - ctx = ctxsetters.WithMethodName(ctx, "StartEgress") - ctx, err = callRequestRouted(ctx, s.hooks) - if err != nil { - s.writeError(ctx, resp, err) - return - } - - d := json.NewDecoder(req.Body) - rawReqBody := json.RawMessage{} - if err := d.Decode(&rawReqBody); err != nil { - s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) - return - } - reqContent := new(StartEgressRequest) - unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} - if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { - s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) - return - } - - handler := s.Egress.StartEgress - if s.interceptor != nil { - handler = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { - resp, err := s.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StartEgressRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") - } - return s.Egress.StartEgress(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - - // Call service method - var respContent *EgressInfo - func() { - defer ensurePanicResponses(ctx, resp, s.hooks) - respContent, err = handler(ctx, reqContent) - }() - - if err != nil { - s.writeError(ctx, resp, err) - return - } - if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartEgress. nil responses are not supported")) - return - } - - ctx = callResponsePrepared(ctx, s.hooks) - - marshaler := &protojson.MarshalOptions{UseProtoNames: !s.jsonCamelCase, EmitUnpopulated: !s.jsonSkipDefaults} - respBytes, err := marshaler.Marshal(respContent) - if err != nil { - s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) - return - } - - ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) - resp.Header().Set("Content-Type", "application/json") - resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) - resp.WriteHeader(http.StatusOK) - - if n, err := resp.Write(respBytes); err != nil { - msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) - twerr := twirp.NewError(twirp.Unknown, msg) - ctx = callError(ctx, s.hooks, twerr) - } - callResponseSent(ctx, s.hooks) -} - -func (s *egressServer) serveStartEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { - var err error - ctx = ctxsetters.WithMethodName(ctx, "StartEgress") - ctx, err = callRequestRouted(ctx, s.hooks) - if err != nil { - s.writeError(ctx, resp, err) - return - } - - buf, err := io.ReadAll(req.Body) - if err != nil { - s.handleRequestBodyError(ctx, resp, "failed to read request body", err) - return - } - reqContent := new(StartEgressRequest) - if err = proto.Unmarshal(buf, reqContent); err != nil { - s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) - return - } - - handler := s.Egress.StartEgress - if s.interceptor != nil { - handler = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { - resp, err := s.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StartEgressRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") - } - return s.Egress.StartEgress(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - - // Call service method - var respContent *EgressInfo - func() { - defer ensurePanicResponses(ctx, resp, s.hooks) - respContent, err = handler(ctx, reqContent) - }() - - if err != nil { - s.writeError(ctx, resp, err) - return - } - if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartEgress. nil responses are not supported")) - return - } - - ctx = callResponsePrepared(ctx, s.hooks) - - respBytes, err := proto.Marshal(respContent) - if err != nil { - s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) - return - } - - ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) - resp.Header().Set("Content-Type", "application/protobuf") - resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) - resp.WriteHeader(http.StatusOK) - if n, err := resp.Write(respBytes); err != nil { - msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) - twerr := twirp.NewError(twirp.Unknown, msg) - ctx = callError(ctx, s.hooks, twerr) - } - callResponseSent(ctx, s.hooks) -} - -func (s *egressServer) serveUpdateEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { - header := req.Header.Get("Content-Type") - i := strings.Index(header, ";") - if i == -1 { - i = len(header) - } - switch strings.TrimSpace(strings.ToLower(header[:i])) { - case "application/json": - s.serveUpdateEgressJSON(ctx, resp, req) - case "application/protobuf": - s.serveUpdateEgressProtobuf(ctx, resp, req) - default: - msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) - twerr := badRouteError(msg, req.Method, req.URL.Path) - s.writeError(ctx, resp, twerr) - } -} - -func (s *egressServer) serveUpdateEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { - var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") - ctx, err = callRequestRouted(ctx, s.hooks) - if err != nil { - s.writeError(ctx, resp, err) - return - } - - d := json.NewDecoder(req.Body) - rawReqBody := json.RawMessage{} - if err := d.Decode(&rawReqBody); err != nil { - s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) - return - } - reqContent := new(UpdateEgressRequest) - unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} - if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { - s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) - return - } - - handler := s.Egress.UpdateEgress - if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { - resp, err := s.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateEgressRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") - } - return s.Egress.UpdateEgress(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } - - // Call service method - var respContent *EgressInfo - func() { - defer ensurePanicResponses(ctx, resp, s.hooks) - respContent, err = handler(ctx, reqContent) - }() - - if err != nil { - s.writeError(ctx, resp, err) - return - } - if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateEgress. nil responses are not supported")) - return - } - - ctx = callResponsePrepared(ctx, s.hooks) - - marshaler := &protojson.MarshalOptions{UseProtoNames: !s.jsonCamelCase, EmitUnpopulated: !s.jsonSkipDefaults} - respBytes, err := marshaler.Marshal(respContent) - if err != nil { - s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) - return - } - - ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) - resp.Header().Set("Content-Type", "application/json") - resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) - resp.WriteHeader(http.StatusOK) - - if n, err := resp.Write(respBytes); err != nil { - msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) - twerr := twirp.NewError(twirp.Unknown, msg) - ctx = callError(ctx, s.hooks, twerr) - } - callResponseSent(ctx, s.hooks) -} - -func (s *egressServer) serveUpdateEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { - var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateEgress") - ctx, err = callRequestRouted(ctx, s.hooks) - if err != nil { - s.writeError(ctx, resp, err) - return - } +} - buf, err := io.ReadAll(req.Body) - if err != nil { - s.handleRequestBodyError(ctx, resp, "failed to read request body", err) +// handleRequestBodyError is used to handle error when the twirp server cannot read request +func (s *egressServer) handleRequestBodyError(ctx context.Context, resp http.ResponseWriter, msg string, err error) { + if context.Canceled == ctx.Err() { + s.writeError(ctx, resp, twirp.NewError(twirp.Canceled, "failed to read request: context canceled")) return } - reqContent := new(UpdateEgressRequest) - if err = proto.Unmarshal(buf, reqContent); err != nil { - s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) + if context.DeadlineExceeded == ctx.Err() { + s.writeError(ctx, resp, twirp.NewError(twirp.DeadlineExceeded, "failed to read request: deadline exceeded")) return } + s.writeError(ctx, resp, twirp.WrapError(malformedRequestError(msg), err)) +} - handler := s.Egress.UpdateEgress - if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateEgressRequest) (*EgressInfo, error) { - resp, err := s.interceptor( - func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateEgressRequest) - if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateEgressRequest) when calling interceptor") - } - return s.Egress.UpdateEgress(ctx, typedReq) - }, - )(ctx, req) - if resp != nil { - typedResp, ok := resp.(*EgressInfo) - if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") - } - return typedResp, err - } - return nil, err - } - } +// EgressPathPrefix is a convenience constant that may identify URL paths. +// Should be used with caution, it only matches routes generated by Twirp Go clients, +// with the default "/twirp" prefix and default CamelCase service and method names. +// More info: https://twitchtv.github.io/twirp/docs/routing.html +const EgressPathPrefix = "/twirp/livekit.Egress/" - // Call service method - var respContent *EgressInfo - func() { - defer ensurePanicResponses(ctx, resp, s.hooks) - respContent, err = handler(ctx, reqContent) - }() +func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { + ctx := req.Context() + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithResponseWriter(ctx, resp) + var err error + ctx, err = callRequestReceived(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) return } - if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateEgress. nil responses are not supported")) + + if req.Method != "POST" { + msg := fmt.Sprintf("unsupported method %q (only POST is allowed)", req.Method) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) return } - ctx = callResponsePrepared(ctx, s.hooks) - - respBytes, err := proto.Marshal(respContent) - if err != nil { - s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) + // Verify path format: []/./ + prefix, pkgService, method := parseTwirpPath(req.URL.Path) + if pkgService != "livekit.Egress" { + msg := fmt.Sprintf("no handler for path %q", req.URL.Path) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + return + } + if prefix != s.pathPrefix { + msg := fmt.Sprintf("invalid path prefix %q, expected %q, on path %q", prefix, s.pathPrefix, req.URL.Path) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) return } - ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) - resp.Header().Set("Content-Type", "application/protobuf") - resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) - resp.WriteHeader(http.StatusOK) - if n, err := resp.Write(respBytes); err != nil { - msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) - twerr := twirp.NewError(twirp.Unknown, msg) - ctx = callError(ctx, s.hooks, twerr) + switch method { + case "StartRoomCompositeEgress": + s.serveStartRoomCompositeEgress(ctx, resp, req) + return + case "StartWebEgress": + s.serveStartWebEgress(ctx, resp, req) + return + case "StartParticipantEgress": + s.serveStartParticipantEgress(ctx, resp, req) + return + case "StartTrackCompositeEgress": + s.serveStartTrackCompositeEgress(ctx, resp, req) + return + case "StartTrackEgress": + s.serveStartTrackEgress(ctx, resp, req) + return + case "UpdateLayout": + s.serveUpdateLayout(ctx, resp, req) + return + case "UpdateStream": + s.serveUpdateStream(ctx, resp, req) + return + case "ListEgress": + s.serveListEgress(ctx, resp, req) + return + case "StopEgress": + s.serveStopEgress(ctx, resp, req) + return + default: + msg := fmt.Sprintf("no handler for path %q", req.URL.Path) + s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) + return } - callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1684,9 +1127,9 @@ func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWr } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveListEgressJSON(ctx, resp, req) + s.serveStartRoomCompositeEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveListEgressProtobuf(ctx, resp, req) + s.serveStartRoomCompositeEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1694,9 +1137,9 @@ func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWr } } -func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1709,29 +1152,29 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ListEgressRequest) + reqContent := new(RoomCompositeEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.ListEgress + handler := s.Egress.StartRoomCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return s.Egress.ListEgress(ctx, typedReq) + return s.Egress.StartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -1740,7 +1183,7 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon } // Call service method - var respContent *ListEgressResponse + var respContent *EgressInfo func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1751,7 +1194,7 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) return } @@ -1777,9 +1220,9 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1791,28 +1234,28 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ListEgressRequest) + reqContent := new(RoomCompositeEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.ListEgress + handler := s.Egress.StartRoomCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return s.Egress.ListEgress(ctx, typedReq) + return s.Egress.StartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -1821,7 +1264,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re } // Call service method - var respContent *ListEgressResponse + var respContent *EgressInfo func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -1832,7 +1275,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) return } @@ -1856,7 +1299,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1864,9 +1307,9 @@ func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWr } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStopEgressJSON(ctx, resp, req) + s.serveStartWebEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStopEgressProtobuf(ctx, resp, req) + s.serveStartWebEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1874,9 +1317,9 @@ func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWr } } -func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1889,23 +1332,23 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(StopEgressRequest) + reqContent := new(WebEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StopEgress + handler := s.Egress.StartWebEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return s.Egress.StopEgress(ctx, typedReq) + return s.Egress.StartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1931,7 +1374,7 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) return } @@ -1957,9 +1400,9 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1971,22 +1414,22 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(StopEgressRequest) + reqContent := new(WebEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StopEgress + handler := s.Egress.StartWebEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return s.Egress.StopEgress(ctx, typedReq) + return s.Egress.StartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2012,7 +1455,7 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) return } @@ -2036,7 +1479,7 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2044,9 +1487,9 @@ func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp h } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartRoomCompositeEgressJSON(ctx, resp, req) + s.serveStartParticipantEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartRoomCompositeEgressProtobuf(ctx, resp, req) + s.serveStartParticipantEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2054,9 +1497,9 @@ func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp h } } -func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2069,23 +1512,23 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(RoomCompositeEgressRequest) + reqContent := new(ParticipantEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartRoomCompositeEgress + handler := s.Egress.StartParticipantEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return s.Egress.StartRoomCompositeEgress(ctx, typedReq) + return s.Egress.StartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2111,7 +1554,7 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) return } @@ -2137,9 +1580,9 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2151,22 +1594,22 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(RoomCompositeEgressRequest) + reqContent := new(ParticipantEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartRoomCompositeEgress + handler := s.Egress.StartParticipantEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return s.Egress.StartRoomCompositeEgress(ctx, typedReq) + return s.Egress.StartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2192,7 +1635,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) return } @@ -2216,7 +1659,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2224,9 +1667,9 @@ func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.Respon } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartWebEgressJSON(ctx, resp, req) + s.serveStartTrackCompositeEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartWebEgressProtobuf(ctx, resp, req) + s.serveStartTrackCompositeEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2234,9 +1677,9 @@ func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.Respon } } -func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2249,23 +1692,23 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(WebEgressRequest) + reqContent := new(TrackCompositeEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartWebEgress + handler := s.Egress.StartTrackCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return s.Egress.StartWebEgress(ctx, typedReq) + return s.Egress.StartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2291,7 +1734,7 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) return } @@ -2317,9 +1760,9 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2331,22 +1774,22 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(WebEgressRequest) + reqContent := new(TrackCompositeEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartWebEgress + handler := s.Egress.StartTrackCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return s.Egress.StartWebEgress(ctx, typedReq) + return s.Egress.StartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2372,7 +1815,7 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) return } @@ -2396,7 +1839,7 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2404,9 +1847,9 @@ func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp htt } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartParticipantEgressJSON(ctx, resp, req) + s.serveStartTrackEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartParticipantEgressProtobuf(ctx, resp, req) + s.serveStartTrackEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2414,9 +1857,9 @@ func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp htt } } -func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2429,23 +1872,23 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ParticipantEgressRequest) + reqContent := new(TrackEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartParticipantEgress + handler := s.Egress.StartTrackEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return s.Egress.StartParticipantEgress(ctx, typedReq) + return s.Egress.StartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2471,7 +1914,7 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) return } @@ -2497,9 +1940,9 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2511,22 +1954,22 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ParticipantEgressRequest) + reqContent := new(TrackEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartParticipantEgress + handler := s.Egress.StartTrackEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return s.Egress.StartParticipantEgress(ctx, typedReq) + return s.Egress.StartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2552,7 +1995,7 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) return } @@ -2576,7 +2019,7 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2584,9 +2027,9 @@ func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartTrackCompositeEgressJSON(ctx, resp, req) + s.serveUpdateLayoutJSON(ctx, resp, req) case "application/protobuf": - s.serveStartTrackCompositeEgressProtobuf(ctx, resp, req) + s.serveUpdateLayoutProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2594,9 +2037,9 @@ func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp } } -func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2609,23 +2052,23 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(TrackCompositeEgressRequest) + reqContent := new(UpdateLayoutRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartTrackCompositeEgress + handler := s.Egress.UpdateLayout if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return s.Egress.StartTrackCompositeEgress(ctx, typedReq) + return s.Egress.UpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2651,7 +2094,7 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) return } @@ -2677,9 +2120,9 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2691,22 +2134,22 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(TrackCompositeEgressRequest) + reqContent := new(UpdateLayoutRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartTrackCompositeEgress + handler := s.Egress.UpdateLayout if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return s.Egress.StartTrackCompositeEgress(ctx, typedReq) + return s.Egress.UpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2732,7 +2175,7 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) return } @@ -2756,7 +2199,7 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2764,9 +2207,9 @@ func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.Resp } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartTrackEgressJSON(ctx, resp, req) + s.serveUpdateStreamJSON(ctx, resp, req) case "application/protobuf": - s.serveStartTrackEgressProtobuf(ctx, resp, req) + s.serveUpdateStreamProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2774,9 +2217,9 @@ func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.Resp } } -func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2789,23 +2232,23 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(TrackEgressRequest) + reqContent := new(UpdateStreamRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartTrackEgress + handler := s.Egress.UpdateStream if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return s.Egress.StartTrackEgress(ctx, typedReq) + return s.Egress.UpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2831,7 +2274,7 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) return } @@ -2857,9 +2300,9 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2871,22 +2314,22 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(TrackEgressRequest) + reqContent := new(UpdateStreamRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartTrackEgress + handler := s.Egress.UpdateStream if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return s.Egress.StartTrackEgress(ctx, typedReq) + return s.Egress.UpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2912,7 +2355,7 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) return } @@ -2936,7 +2379,7 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2944,9 +2387,9 @@ func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveUpdateLayoutJSON(ctx, resp, req) + s.serveListEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveUpdateLayoutProtobuf(ctx, resp, req) + s.serveListEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2954,9 +2397,9 @@ func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.Response } } -func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2969,29 +2412,29 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(UpdateLayoutRequest) + reqContent := new(ListEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.UpdateLayout + handler := s.Egress.ListEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return s.Egress.UpdateLayout(ctx, typedReq) + return s.Egress.ListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -3000,7 +2443,7 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp } // Call service method - var respContent *EgressInfo + var respContent *ListEgressResponse func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -3011,7 +2454,7 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) return } @@ -3037,9 +2480,9 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -3051,28 +2494,28 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(UpdateLayoutRequest) + reqContent := new(ListEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.UpdateLayout + handler := s.Egress.ListEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return s.Egress.UpdateLayout(ctx, typedReq) + return s.Egress.ListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -3081,7 +2524,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. } // Call service method - var respContent *EgressInfo + var respContent *ListEgressResponse func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -3092,7 +2535,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) return } @@ -3116,7 +2559,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -3124,9 +2567,9 @@ func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveUpdateStreamJSON(ctx, resp, req) + s.serveStopEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveUpdateStreamProtobuf(ctx, resp, req) + s.serveStopEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -3134,9 +2577,9 @@ func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.Response } } -func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -3149,23 +2592,23 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(UpdateStreamRequest) + reqContent := new(StopEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.UpdateStream + handler := s.Egress.StopEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return s.Egress.UpdateStream(ctx, typedReq) + return s.Egress.StopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -3191,7 +2634,7 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) return } @@ -3217,9 +2660,9 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -3231,22 +2674,22 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(UpdateStreamRequest) + reqContent := new(StopEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.UpdateStream + handler := s.Egress.StopEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return s.Egress.UpdateStream(ctx, typedReq) + return s.Egress.StopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -3272,7 +2715,7 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) return } @@ -3312,270 +2755,268 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 4234 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4d, 0x6f, 0x1b, 0x49, - 0x76, 0x6a, 0x7e, 0xf3, 0xf1, 0xab, 0x55, 0x92, 0x65, 0x5a, 0x9e, 0x19, 0x7b, 0xe9, 0x8c, 0x3f, - 0x34, 0x5a, 0xd9, 0x91, 0xbc, 0x1e, 0xaf, 0x37, 0x3b, 0x1b, 0x4a, 0x6c, 0x89, 0x5c, 0x4b, 0xa2, - 0xd2, 0xa4, 0xc6, 0x93, 0x00, 0x49, 0xa3, 0xc5, 0x2e, 0x49, 0x0d, 0x91, 0xdd, 0xdc, 0xee, 0xa6, - 0x6c, 0xed, 0x2f, 0xd8, 0x04, 0x41, 0x12, 0x24, 0x40, 0x0e, 0x06, 0x82, 0xe4, 0x10, 0xe4, 0x10, - 0xec, 0x29, 0xbf, 0x20, 0xf7, 0x3d, 0x04, 0x48, 0x10, 0xe4, 0x9c, 0x1c, 0x03, 0x07, 0x8b, 0x1c, - 0x72, 0x0f, 0xea, 0xa3, 0xbb, 0x8b, 0xcd, 0x96, 0x4c, 0x5a, 0xce, 0xe4, 0x32, 0x27, 0xb1, 0xde, - 0x7b, 0x55, 0xfd, 0xaa, 0xde, 0x47, 0xbd, 0xf7, 0xea, 0x09, 0x16, 0xfb, 0xe6, 0x39, 0x3e, 0x33, - 0x3d, 0x0d, 0x9f, 0x38, 0xd8, 0x75, 0xd7, 0x86, 0x8e, 0xed, 0xd9, 0x28, 0xcb, 0xa1, 0xcb, 0x01, - 0x7a, 0x60, 0x1b, 0xb8, 0xcf, 0xd1, 0xcb, 0x8b, 0x7d, 0xfb, 0xe4, 0x04, 0x3b, 0x8f, 0xed, 0xa1, - 0x67, 0xda, 0x16, 0x87, 0xd6, 0xfe, 0x2d, 0x09, 0xa8, 0xe3, 0xe9, 0x8e, 0xa7, 0xd0, 0xa5, 0x54, - 0xfc, 0xb3, 0x11, 0x76, 0x3d, 0x74, 0x1b, 0xf2, 0x8e, 0x6d, 0x0f, 0x34, 0x4b, 0x1f, 0xe0, 0xaa, - 0x74, 0x57, 0x7a, 0x98, 0x57, 0x73, 0x04, 0xb0, 0xaf, 0x0f, 0x30, 0xfa, 0x01, 0xe4, 0x3c, 0x3c, - 0x18, 0xf6, 0x75, 0x0f, 0x57, 0x13, 0x77, 0xa5, 0x87, 0x85, 0xf5, 0x9b, 0x6b, 0xfc, 0x93, 0x6b, - 0x5d, 0x8e, 0xe8, 0xd8, 0x23, 0xa7, 0x87, 0x9b, 0x73, 0x6a, 0x40, 0x8a, 0xee, 0x43, 0xf2, 0x35, - 0x3e, 0xaa, 0x26, 0xe9, 0x0c, 0x14, 0xcc, 0x78, 0x85, 0x8f, 0x02, 0x62, 0x42, 0x80, 0x56, 0x21, - 0x3d, 0xc0, 0x86, 0xa9, 0x57, 0x53, 0x94, 0x72, 0x31, 0xa0, 0xdc, 0x23, 0xd0, 0x80, 0x96, 0x11, - 0xa1, 0xe7, 0x90, 0x19, 0x3a, 0xd8, 0xc5, 0x5e, 0x35, 0x7d, 0x57, 0x7a, 0x58, 0x5e, 0xff, 0x2c, - 0x20, 0x57, 0xac, 0x9e, 0x6d, 0x98, 0xd6, 0x49, 0x9b, 0x6d, 0xf8, 0x80, 0x52, 0x35, 0x25, 0x95, - 0xd3, 0xa3, 0x67, 0x90, 0xd3, 0x8d, 0x73, 0xdd, 0xea, 0x61, 0xa3, 0x9a, 0xa1, 0x9f, 0xaa, 0x5e, - 0x36, 0xb7, 0x29, 0xa9, 0x01, 0x2d, 0x7a, 0x04, 0x59, 0x7b, 0xe4, 0x0d, 0x47, 0x9e, 0x5b, 0xcd, - 0xde, 0x4d, 0x3e, 0x2c, 0xac, 0x57, 0x82, 0x69, 0x6d, 0x0a, 0x57, 0x7d, 0x3c, 0x7a, 0x02, 0x59, - 0xd7, 0xb3, 0x1d, 0xfd, 0x04, 0x57, 0x73, 0xf4, 0x0b, 0x4b, 0x01, 0x69, 0x87, 0xc1, 0xb7, 0x6c, - 0xeb, 0xd8, 0x3c, 0x51, 0x7d, 0x32, 0xb4, 0x0e, 0xb9, 0xd7, 0xf8, 0xe8, 0xd4, 0xb6, 0xcf, 0xdc, - 0x6a, 0x9e, 0xae, 0xbe, 0x24, 0x9e, 0x14, 0x41, 0xf0, 0x29, 0x01, 0xdd, 0x66, 0x0e, 0x32, 0x2e, - 0x3d, 0x95, 0x4d, 0x80, 0x1c, 0xe6, 0x9c, 0xd7, 0xfe, 0x44, 0x82, 0xf2, 0xb8, 0x34, 0xd0, 0x12, - 0x64, 0xfa, 0xfa, 0x85, 0x3d, 0xf2, 0xb8, 0x48, 0xf9, 0x08, 0x7d, 0x0a, 0xa0, 0x8f, 0x0c, 0xd3, - 0xd6, 0x6c, 0xab, 0x7f, 0x41, 0x45, 0x9a, 0x53, 0xf3, 0x14, 0xd2, 0xb6, 0xfa, 0x17, 0x04, 0x7d, - 0x6e, 0x1a, 0x98, 0xa3, 0x93, 0x0c, 0x4d, 0x21, 0x14, 0x7d, 0x1f, 0x2a, 0xbd, 0x91, 0xeb, 0xd9, - 0x03, 0xed, 0x48, 0x77, 0xb1, 0x36, 0x72, 0xfa, 0x54, 0x72, 0x79, 0xb5, 0xc4, 0xc0, 0x9b, 0xba, - 0x8b, 0x0f, 0x9d, 0x7e, 0xed, 0x0f, 0x25, 0xc8, 0x07, 0xc2, 0x46, 0x32, 0x24, 0x09, 0x25, 0x63, - 0x84, 0xfc, 0xbc, 0x26, 0x17, 0xab, 0x80, 0xf4, 0xd7, 0xba, 0xe9, 0x69, 0x2e, 0xd1, 0x66, 0xcd, - 0x35, 0x4f, 0x2c, 0x9d, 0x31, 0x92, 0x53, 0x65, 0x8a, 0xa1, 0x6a, 0xde, 0xa1, 0xf0, 0xda, 0xaf, - 0x25, 0x28, 0x08, 0xea, 0x84, 0x9e, 0x43, 0x99, 0x2d, 0xee, 0x39, 0x7a, 0xef, 0x4c, 0x33, 0x0d, - 0xc6, 0xd8, 0xa6, 0xfc, 0xf6, 0xdd, 0x6a, 0x91, 0x62, 0xba, 0x04, 0xd1, 0x6a, 0x34, 0xe7, 0x54, - 0x71, 0x6c, 0xa0, 0x26, 0xcc, 0x0f, 0x75, 0xc7, 0x33, 0x7b, 0xe6, 0x50, 0xb7, 0x3c, 0x8d, 0xe2, - 0xb8, 0x55, 0xdc, 0x0a, 0x24, 0x77, 0x10, 0x52, 0x7c, 0x4d, 0x08, 0x9a, 0x73, 0xaa, 0x3c, 0x8c, - 0xc0, 0xd0, 0x0a, 0xa4, 0xe9, 0x6e, 0xb9, 0x85, 0x84, 0x7a, 0x5f, 0x27, 0x50, 0x2e, 0x75, 0x46, - 0x82, 0x1e, 0x40, 0xca, 0xd0, 0x3d, 0xdf, 0x44, 0x16, 0x02, 0xd2, 0x86, 0xee, 0xe9, 0x9c, 0x92, - 0x12, 0x6c, 0x66, 0x21, 0x4d, 0x59, 0xaa, 0xfd, 0x01, 0xc8, 0x51, 0x2e, 0xd0, 0x32, 0xe4, 0x4c, - 0x03, 0x5b, 0x9e, 0xe9, 0x5d, 0xf8, 0x46, 0xee, 0x8f, 0xd1, 0x1a, 0x2c, 0x0c, 0x1d, 0x7c, 0x8c, - 0x1d, 0xcd, 0xed, 0x39, 0x18, 0x5b, 0x9a, 0x7b, 0xaa, 0x3b, 0x98, 0x8b, 0x65, 0x9e, 0xa1, 0x3a, - 0x14, 0xd3, 0x21, 0x88, 0xda, 0x0b, 0x28, 0x08, 0x7c, 0xa2, 0x2f, 0x20, 0xe3, 0xd8, 0x23, 0x0f, - 0xbb, 0x55, 0x89, 0x6a, 0xf1, 0xc2, 0xf8, 0x6e, 0x54, 0x82, 0x53, 0x39, 0x49, 0xed, 0xbf, 0x25, - 0x80, 0x10, 0x8c, 0x1e, 0x42, 0x2e, 0x22, 0x86, 0xc2, 0xdb, 0x77, 0xab, 0x59, 0x2f, 0x90, 0x00, - 0xff, 0x69, 0xa0, 0x0d, 0x58, 0x14, 0x0f, 0x3f, 0xd8, 0x0c, 0xe1, 0x32, 0xdf, 0x9c, 0x53, 0x17, - 0x04, 0x6c, 0xcb, 0xdf, 0xd9, 0x4f, 0x41, 0x3c, 0x7b, 0xed, 0xcc, 0xb4, 0x0c, 0x7a, 0xe4, 0xe5, - 0xf5, 0x4f, 0xe3, 0x04, 0xd6, 0xb2, 0x8e, 0xed, 0xb5, 0x97, 0xa6, 0x65, 0x34, 0xe7, 0xd4, 0x8a, - 0x30, 0x91, 0x80, 0xd0, 0x63, 0xc8, 0xf6, 0x4e, 0x75, 0xcb, 0xc2, 0x4c, 0xd5, 0xca, 0xeb, 0x37, - 0x22, 0x52, 0x63, 0x48, 0xd5, 0xa7, 0x22, 0xf2, 0x18, 0xe8, 0x5e, 0xef, 0xb4, 0x56, 0x07, 0x08, - 0x85, 0x85, 0x36, 0x20, 0xef, 0xe2, 0x3e, 0xee, 0x79, 0xb6, 0xe3, 0x9f, 0xd8, 0x8d, 0x31, 0xa1, - 0x76, 0x38, 0x56, 0x0d, 0xe9, 0x88, 0x85, 0x17, 0x45, 0xdc, 0xff, 0xf5, 0xc1, 0x2d, 0x41, 0xda, - 0xb3, 0x87, 0x66, 0x8f, 0x9e, 0x16, 0xa1, 0x62, 0xc3, 0x70, 0x4f, 0xff, 0x9c, 0x84, 0x4a, 0xc4, - 0x73, 0xa2, 0x45, 0x48, 0xbf, 0x36, 0x0d, 0xef, 0x94, 0x32, 0x94, 0x56, 0xd9, 0x80, 0x78, 0xa2, - 0x53, 0x6c, 0x9e, 0x9c, 0x7a, 0xf4, 0x8b, 0x69, 0x95, 0x8f, 0x08, 0xb5, 0x81, 0x87, 0xde, 0x29, - 0xfd, 0x44, 0x5a, 0x65, 0x03, 0xf4, 0x09, 0xe4, 0x8f, 0x1d, 0x7d, 0x80, 0x1d, 0x72, 0xe3, 0xa4, - 0x28, 0x26, 0x04, 0xa0, 0xa7, 0x50, 0x60, 0x7e, 0xa3, 0x67, 0x1b, 0xb8, 0xc7, 0xaf, 0x81, 0x85, - 0xa8, 0xf5, 0x18, 0xb8, 0xa7, 0x32, 0xff, 0x42, 0x7f, 0xa3, 0x7b, 0x50, 0x62, 0xb3, 0x8e, 0x4c, - 0x8f, 0xae, 0x9b, 0xa1, 0xeb, 0x16, 0x29, 0x70, 0x93, 0xc1, 0xd0, 0x03, 0xa8, 0x30, 0xa2, 0x63, - 0x87, 0x5c, 0x8c, 0x56, 0xef, 0xa2, 0x9a, 0xa5, 0x64, 0x65, 0x0a, 0xde, 0xf6, 0xa1, 0x84, 0x07, - 0xe6, 0x3f, 0x18, 0x0f, 0xb9, 0x08, 0x0f, 0xd4, 0xdc, 0x38, 0x0f, 0xe7, 0xc1, 0x6f, 0xc2, 0x03, - 0x9b, 0xe5, 0xf3, 0x90, 0x67, 0x3c, 0x50, 0xa0, 0xcf, 0xc3, 0x2a, 0xa0, 0x33, 0x7c, 0xa1, 0xd1, - 0xfd, 0x6a, 0xa6, 0xe5, 0x61, 0xe7, 0x5c, 0xef, 0x57, 0xe1, 0xae, 0xf4, 0x50, 0x52, 0xe5, 0x33, - 0x7c, 0xb1, 0x4d, 0x10, 0x2d, 0x0e, 0x47, 0x0f, 0xfc, 0x6d, 0xfd, 0x6c, 0xa4, 0xf7, 0x89, 0x44, - 0x0b, 0x64, 0xc9, 0xcd, 0x44, 0x55, 0xe2, 0x5b, 0xfb, 0x1d, 0x06, 0x27, 0x84, 0xec, 0xdb, 0x3e, - 0x61, 0x31, 0x24, 0xa4, 0x08, 0x4e, 0x58, 0xfb, 0xe3, 0x04, 0x64, 0xd8, 0xbd, 0x86, 0x1e, 0x41, - 0xea, 0xd8, 0xec, 0xb3, 0x80, 0x40, 0x34, 0xe9, 0x6d, 0xb3, 0x8f, 0x19, 0x49, 0x73, 0x4e, 0xa5, - 0x24, 0xe8, 0x31, 0x64, 0x5c, 0xcf, 0xc1, 0xfa, 0x80, 0xfb, 0xc2, 0x1b, 0xc2, 0xc5, 0x47, 0xc0, - 0x01, 0x39, 0x27, 0x43, 0x2f, 0x20, 0xe7, 0xe2, 0x93, 0x01, 0xb6, 0x3c, 0x97, 0x3b, 0xc0, 0x4f, - 0xc2, 0x29, 0x0c, 0x81, 0x8d, 0xb1, 0x0f, 0x05, 0xf4, 0x68, 0x0d, 0x32, 0xe6, 0x40, 0x3f, 0xc1, - 0xee, 0x44, 0xc8, 0xd0, 0x22, 0xe0, 0xf0, 0x5b, 0x8c, 0x4a, 0xbc, 0x96, 0x33, 0x53, 0x5d, 0xcb, - 0xe4, 0x8a, 0xed, 0x51, 0x50, 0xed, 0x8f, 0x24, 0x80, 0x90, 0x0d, 0xf4, 0x03, 0xc8, 0x93, 0xfd, - 0x6a, 0xde, 0xc5, 0x90, 0x9d, 0x4b, 0x39, 0x1a, 0x45, 0x30, 0xae, 0xbb, 0x17, 0x43, 0xac, 0xe6, - 0x8e, 0xf9, 0x2f, 0xe2, 0x79, 0xc9, 0xef, 0xa1, 0xee, 0x9d, 0x32, 0x9b, 0x53, 0x83, 0x31, 0x7a, - 0x04, 0xb2, 0x61, 0xba, 0xfa, 0x51, 0x1f, 0x6b, 0x03, 0xdd, 0x32, 0x8f, 0xb1, 0xeb, 0xf1, 0xeb, - 0xae, 0xc2, 0xe1, 0x7b, 0x1c, 0x5c, 0x7b, 0x05, 0x45, 0xf1, 0x38, 0xd1, 0x06, 0xe4, 0x68, 0x58, - 0xd7, 0xb3, 0xfb, 0x9c, 0x99, 0x9b, 0x91, 0x73, 0x3f, 0xe0, 0x68, 0x35, 0x20, 0x44, 0x08, 0x52, - 0x23, 0xa7, 0xef, 0x56, 0x13, 0x77, 0x93, 0x0f, 0xf3, 0x2a, 0xfd, 0x5d, 0xfb, 0xdb, 0x14, 0x2c, - 0xc4, 0x9c, 0x3a, 0x91, 0x52, 0xe4, 0x03, 0x9f, 0xc5, 0x4b, 0x29, 0xe6, 0x3b, 0x0f, 0xa0, 0x42, - 0xf6, 0x48, 0x42, 0x4a, 0x8d, 0xdc, 0x1f, 0xe6, 0x1b, 0xbe, 0xf5, 0xb2, 0x0f, 0x3e, 0xa0, 0x50, - 0x62, 0x16, 0xc3, 0xbe, 0x7e, 0xd1, 0x37, 0x5d, 0x8f, 0x05, 0xa0, 0xd4, 0xdf, 0xa8, 0x45, 0x1f, - 0x48, 0x83, 0xd0, 0x55, 0x40, 0xe4, 0xc3, 0xda, 0x38, 0x65, 0x81, 0x52, 0xca, 0x04, 0x73, 0x20, - 0x52, 0x3f, 0x02, 0x99, 0x6b, 0x8b, 0x66, 0x8c, 0x1c, 0x9d, 0xb8, 0x26, 0xaa, 0x2b, 0x25, 0xb5, - 0xc2, 0xe1, 0x0d, 0x0e, 0x46, 0x8a, 0xc0, 0xa6, 0x3b, 0x3a, 0x26, 0x6c, 0x02, 0xdd, 0xe9, 0x25, - 0xfa, 0xd8, 0xa1, 0x34, 0xe1, 0x26, 0xd8, 0x38, 0x56, 0x8a, 0xb9, 0x58, 0x29, 0xa2, 0x7b, 0x90, - 0x70, 0x37, 0xa8, 0xdf, 0x2a, 0xac, 0xcf, 0x87, 0x1f, 0xd9, 0x38, 0x1c, 0xf6, 0x6d, 0x9d, 0x5c, - 0x3b, 0x09, 0x77, 0x83, 0x44, 0xcf, 0x27, 0xbd, 0x21, 0xd7, 0xd7, 0x30, 0x7a, 0xde, 0xd9, 0x3a, - 0x08, 0xc8, 0x08, 0x01, 0x7a, 0x02, 0x69, 0xfd, 0xe7, 0x23, 0x07, 0x53, 0x47, 0x25, 0x86, 0xb4, - 0x75, 0x02, 0xdd, 0xec, 0xdb, 0x47, 0x01, 0x3d, 0x23, 0x24, 0xa6, 0xaa, 0xf7, 0xcd, 0x76, 0xa7, - 0x43, 0xdd, 0x8f, 0x68, 0xaa, 0x75, 0x0a, 0x0e, 0xe8, 0x39, 0x19, 0x31, 0x06, 0x16, 0xe0, 0xd6, - 0xfe, 0x2b, 0x09, 0x05, 0xc1, 0xc4, 0xc8, 0xa6, 0x7b, 0xfa, 0xd0, 0x1b, 0x39, 0x82, 0xa7, 0x92, - 0xd8, 0x31, 0x73, 0x78, 0xe0, 0xa8, 0x82, 0x7b, 0x21, 0x11, 0x7f, 0x2f, 0x24, 0xc7, 0xee, 0x85, - 0x18, 0xdd, 0x49, 0xc5, 0xea, 0x4e, 0x7d, 0x52, 0x7a, 0xe9, 0x88, 0x55, 0x52, 0x86, 0xaf, 0x90, - 0xdc, 0x53, 0x28, 0x50, 0x3f, 0xc1, 0x7d, 0x79, 0x26, 0xe2, 0xcb, 0xe9, 0x74, 0xee, 0xcb, 0xcd, - 0xe0, 0x77, 0xac, 0xbc, 0xb3, 0x57, 0xc9, 0x3b, 0x37, 0x95, 0xbc, 0xf3, 0x53, 0xcb, 0x1b, 0x66, - 0x97, 0x77, 0x61, 0x56, 0x79, 0xff, 0x4a, 0x82, 0xd2, 0x98, 0x87, 0xe4, 0x7b, 0x91, 0xa6, 0xda, - 0x4b, 0x62, 0xea, 0xbd, 0x24, 0x67, 0xdf, 0x4b, 0x6a, 0xba, 0xbd, 0x00, 0x75, 0x60, 0xe4, 0x82, - 0x73, 0x6a, 0xff, 0x91, 0x82, 0x9c, 0xcf, 0x29, 0xba, 0x07, 0xa0, 0xf7, 0x7a, 0xd8, 0x75, 0xb5, - 0x33, 0xcc, 0xa3, 0xe1, 0xcd, 0xd4, 0x2f, 0xde, 0xad, 0x4a, 0x6a, 0x9e, 0xc1, 0x5f, 0xe2, 0x0b, - 0xf4, 0x09, 0x64, 0x5c, 0xdc, 0x73, 0x30, 0x0b, 0x5b, 0x7c, 0x02, 0x0e, 0x43, 0x8f, 0xa0, 0xe4, - 0x62, 0xd7, 0x35, 0x6d, 0x4b, 0xf3, 0xec, 0x33, 0x6c, 0x31, 0x6f, 0xc4, 0x89, 0x8a, 0x1c, 0xd5, - 0x25, 0x18, 0xb4, 0x0a, 0x15, 0xdd, 0x75, 0x47, 0x03, 0xac, 0x39, 0x76, 0x1f, 0x6b, 0xba, 0x63, - 0xd1, 0xfb, 0xd7, 0x27, 0x2e, 0x31, 0xa4, 0x6a, 0xf7, 0x71, 0xdd, 0xb1, 0x50, 0x07, 0x6e, 0x8a, - 0xd4, 0xf8, 0x8d, 0x87, 0x1d, 0x4b, 0xef, 0x93, 0x30, 0xaf, 0x44, 0x67, 0x7d, 0x42, 0x66, 0xbd, - 0x7d, 0xb7, 0xba, 0x18, 0xce, 0x53, 0x38, 0x51, 0xab, 0xa1, 0xc6, 0x41, 0x0d, 0x62, 0x6a, 0x0e, - 0x3e, 0x21, 0x8e, 0x90, 0xb9, 0x57, 0x3e, 0x22, 0x57, 0x13, 0xb6, 0x8c, 0xa1, 0x6d, 0x5a, 0x1e, - 0xb7, 0xb1, 0x60, 0x4c, 0xe6, 0x1c, 0x8d, 0x7a, 0x67, 0x3c, 0xd9, 0xce, 0xab, 0x7c, 0x84, 0x1e, - 0x82, 0x7c, 0x6c, 0x3b, 0x3d, 0xac, 0x91, 0x0b, 0x4c, 0x73, 0xbd, 0x8b, 0x3e, 0xbb, 0x59, 0x73, - 0x6a, 0x99, 0xc2, 0x0f, 0x74, 0xef, 0xb4, 0x43, 0xa0, 0xe8, 0x47, 0x90, 0x1b, 0x60, 0x4f, 0xa7, - 0xc9, 0x0b, 0xcb, 0x9e, 0xef, 0x4c, 0x68, 0xcd, 0xda, 0x1e, 0xa7, 0x50, 0x2c, 0xcf, 0xb9, 0x50, - 0x83, 0x09, 0xa8, 0x0a, 0x59, 0x4f, 0x3f, 0x39, 0x31, 0xad, 0x13, 0x6a, 0x3d, 0x79, 0xd5, 0x1f, - 0xa2, 0xc7, 0xb0, 0xd0, 0xb3, 0x2d, 0x8f, 0xfa, 0x77, 0xd3, 0x1d, 0xda, 0xae, 0x49, 0x5d, 0x7c, - 0x9e, 0x52, 0x21, 0x8e, 0x6a, 0x84, 0x18, 0x92, 0x6c, 0x0d, 0x1d, 0xfb, 0xcd, 0x05, 0x37, 0x9b, - 0x30, 0x62, 0x38, 0x20, 0x50, 0x3f, 0xd9, 0xa2, 0x24, 0xcb, 0x3f, 0x82, 0xd2, 0x18, 0x47, 0x24, - 0x77, 0x0d, 0x94, 0x44, 0x25, 0x3f, 0x89, 0x37, 0x3b, 0xd7, 0xfb, 0x23, 0xcc, 0x6f, 0x34, 0x36, - 0x78, 0x91, 0x78, 0x2e, 0xd5, 0x5e, 0x43, 0x3e, 0xd0, 0x73, 0x74, 0x1f, 0x0a, 0x3d, 0x07, 0xd3, - 0x78, 0x5a, 0xef, 0xbb, 0x63, 0x5a, 0x26, 0x22, 0x84, 0x73, 0x4e, 0x8c, 0x9d, 0x73, 0xc0, 0x75, - 0xf2, 0xbd, 0x5c, 0xd7, 0x7e, 0x21, 0x41, 0x25, 0x62, 0x37, 0xe8, 0x01, 0x14, 0xf5, 0x5e, 0xcf, - 0x1e, 0x59, 0x9e, 0x50, 0xd9, 0xf1, 0x19, 0xe0, 0x18, 0x7a, 0x5f, 0x7e, 0x0e, 0xfe, 0x90, 0x9a, - 0x83, 0xa8, 0xed, 0xc0, 0x11, 0xc4, 0x1e, 0x3e, 0x87, 0x32, 0x39, 0x5b, 0xdd, 0xb4, 0xb0, 0x23, - 0x5e, 0xd5, 0xa5, 0x00, 0x4a, 0x56, 0xab, 0xfd, 0x95, 0x04, 0x45, 0xd1, 0x1e, 0x3f, 0x86, 0xb1, - 0x7d, 0x44, 0xf5, 0xad, 0xfd, 0x3e, 0x14, 0x84, 0x03, 0x8c, 0x29, 0x4d, 0x2c, 0x43, 0x6e, 0xe4, - 0x12, 0xc3, 0x19, 0xf8, 0x12, 0x0e, 0xc6, 0xe8, 0x2e, 0xe4, 0x86, 0xba, 0xeb, 0xbe, 0xb6, 0x1d, - 0x96, 0x46, 0xfa, 0x8c, 0x06, 0xd0, 0x9a, 0x0b, 0xf3, 0xbb, 0xa6, 0x3b, 0x4b, 0x85, 0xed, 0x11, - 0xe4, 0x59, 0x69, 0x8f, 0x98, 0x38, 0xdb, 0x7d, 0xf1, 0xed, 0xbb, 0xd5, 0x1c, 0x03, 0xb6, 0x1a, - 0xaa, 0xff, 0x8b, 0x9a, 0xb1, 0xde, 0xf3, 0xcc, 0x73, 0xcc, 0x63, 0x44, 0x3e, 0xaa, 0xfd, 0x04, - 0x90, 0xf8, 0x51, 0x77, 0x68, 0x5b, 0x2e, 0x59, 0x38, 0x6d, 0x7a, 0x78, 0x30, 0x99, 0x95, 0x33, - 0x3a, 0x92, 0xeb, 0xaa, 0x8c, 0xa2, 0xf6, 0x8f, 0x12, 0x2c, 0x1c, 0x0e, 0x0d, 0xdd, 0xc3, 0xe3, - 0x8c, 0x8f, 0xf1, 0x26, 0x5d, 0xc9, 0x1b, 0x3f, 0xc8, 0x44, 0x78, 0x90, 0x61, 0x05, 0x2a, 0x39, - 0x56, 0x81, 0xba, 0x0f, 0x15, 0xdd, 0x30, 0x34, 0x96, 0x0b, 0x68, 0x34, 0x1c, 0x4d, 0xd1, 0x70, - 0xb4, 0xa4, 0x1b, 0x06, 0x8b, 0x5c, 0x0f, 0x9d, 0xbe, 0x4b, 0xa2, 0x3e, 0x07, 0x0f, 0xec, 0x73, - 0x3c, 0x46, 0x9a, 0xa6, 0xa4, 0x32, 0xc3, 0x84, 0xd4, 0xb5, 0xaf, 0x60, 0xbe, 0xe3, 0xd9, 0xc3, - 0x0f, 0xe5, 0xbf, 0xf6, 0xef, 0x00, 0x10, 0x1e, 0xcc, 0x2c, 0x3b, 0xbf, 0x07, 0x59, 0x2a, 0xdd, - 0x40, 0x7c, 0xf0, 0xf6, 0xdd, 0x6a, 0x86, 0x80, 0x5a, 0x0d, 0x95, 0xfd, 0x35, 0xc6, 0x55, 0xa0, - 0x14, 0x51, 0x81, 0x17, 0x50, 0x60, 0x45, 0x3d, 0x96, 0x5a, 0x2c, 0xd3, 0x28, 0xe4, 0x56, 0x44, - 0x5e, 0xac, 0x7a, 0x45, 0x73, 0x0b, 0x70, 0x83, 0xdf, 0xe8, 0xfb, 0x24, 0xf9, 0xd2, 0xbd, 0x91, - 0xcb, 0xeb, 0x1a, 0x37, 0xa2, 0xd3, 0x28, 0x52, 0xe5, 0x44, 0xe8, 0x53, 0x00, 0x5a, 0x34, 0xc3, - 0x86, 0xa6, 0x7b, 0xd4, 0x21, 0x26, 0xd5, 0x3c, 0x87, 0xd4, 0x3d, 0x74, 0x8b, 0x5a, 0x14, 0x43, - 0x16, 0x28, 0x32, 0x4b, 0xc7, 0x75, 0x5a, 0x38, 0x1c, 0x51, 0x15, 0xa1, 0x48, 0xc4, 0x66, 0x72, - 0x48, 0x9d, 0x24, 0x47, 0x19, 0x76, 0x22, 0xd5, 0x4f, 0xa9, 0xbf, 0xba, 0x2d, 0x24, 0x23, 0xd1, - 0x92, 0x33, 0xb9, 0xa3, 0x19, 0x31, 0x7a, 0x46, 0x4c, 0x9b, 0xc4, 0xf5, 0xd5, 0xcf, 0x22, 0x89, - 0xa0, 0xf2, 0x66, 0x68, 0x3b, 0x9e, 0x4a, 0x91, 0xc2, 0x3c, 0x46, 0x8d, 0x76, 0xa1, 0x4c, 0xcf, - 0xb3, 0x67, 0x0f, 0xa8, 0x9f, 0xc7, 0x3c, 0x28, 0xb8, 0x17, 0xcc, 0x57, 0x6d, 0x7b, 0xb0, 0xe5, - 0x63, 0xa3, 0x9f, 0x2f, 0x39, 0x22, 0x16, 0x7d, 0x9f, 0x95, 0xab, 0xcb, 0x91, 0x52, 0xde, 0x2b, - 0x7c, 0x14, 0x9d, 0x48, 0xab, 0xd6, 0x0a, 0x14, 0x84, 0x9a, 0x49, 0x75, 0x81, 0x4e, 0xfb, 0x5e, - 0x5c, 0x41, 0x29, 0x3a, 0x5d, 0x9c, 0x87, 0xda, 0x50, 0x61, 0x25, 0x9c, 0x70, 0x13, 0x2c, 0x31, - 0xf8, 0x8d, 0xb0, 0xc4, 0x4e, 0xf0, 0x97, 0xee, 0xa2, 0xec, 0x8d, 0xa1, 0xd1, 0x06, 0xa4, 0x29, - 0x84, 0x67, 0x0e, 0xb7, 0xc7, 0x97, 0x89, 0xce, 0x66, 0xb4, 0xe8, 0x05, 0x94, 0xb9, 0x7d, 0x39, - 0xd8, 0x1d, 0xf5, 0x3d, 0xb7, 0x5a, 0x89, 0xf8, 0x0b, 0x66, 0x65, 0xd4, 0x5f, 0x94, 0x18, 0xa9, - 0xca, 0x28, 0xd1, 0x53, 0x28, 0xd2, 0x8c, 0xd8, 0x9f, 0x29, 0xd3, 0x99, 0xf3, 0x63, 0xc5, 0x02, - 0x3a, 0xaf, 0x40, 0xc8, 0xfc, 0x59, 0x5f, 0x81, 0x9f, 0x88, 0x05, 0x13, 0xe7, 0x23, 0x65, 0x30, - 0x9e, 0x75, 0x31, 0x27, 0x55, 0xe6, 0xd4, 0xfe, 0xfc, 0xe7, 0x50, 0x62, 0x41, 0xbb, 0x3f, 0x7b, - 0x31, 0xc2, 0x30, 0x0d, 0xdb, 0xd9, 0xdc, 0x22, 0xa5, 0xf4, 0x67, 0x2e, 0x42, 0x1a, 0x3b, 0x8e, - 0xed, 0xf0, 0x60, 0x81, 0x0d, 0x88, 0x66, 0xd3, 0x1f, 0x34, 0x09, 0xa8, 0x2e, 0xb1, 0x9a, 0x13, - 0x85, 0x90, 0x70, 0x9f, 0x44, 0x22, 0x06, 0xf6, 0x74, 0xb3, 0xef, 0x56, 0x6f, 0xb0, 0x48, 0x84, - 0x0f, 0xd1, 0x17, 0x30, 0xef, 0xc7, 0xff, 0x5a, 0xdf, 0xee, 0xb1, 0x54, 0xf3, 0x26, 0x4b, 0x4b, - 0x7d, 0xc4, 0x2e, 0x87, 0xa3, 0x35, 0x58, 0x38, 0xd2, 0x7b, 0x67, 0xa3, 0xa1, 0xc6, 0x0b, 0x0d, - 0xda, 0xc8, 0xc5, 0x46, 0xf5, 0x16, 0x2b, 0xb2, 0x32, 0x14, 0x8f, 0xb7, 0x0f, 0x5d, 0x6c, 0xa0, - 0x3b, 0x50, 0x70, 0xb0, 0xe7, 0x5c, 0x68, 0xf4, 0x06, 0xae, 0xde, 0xa6, 0x6c, 0x01, 0x05, 0x6d, - 0x11, 0x08, 0xb1, 0x38, 0x5e, 0x76, 0xc9, 0x46, 0x1e, 0x66, 0x42, 0x81, 0x91, 0x6b, 0x61, 0x33, - 0x51, 0x95, 0x9a, 0x52, 0x50, 0x7c, 0xf9, 0x82, 0x17, 0x76, 0xa2, 0x39, 0x89, 0x2f, 0x2b, 0x4e, - 0xce, 0x4a, 0x3b, 0x5f, 0x0a, 0x95, 0x9a, 0x62, 0xb4, 0xb8, 0x23, 0xc8, 0x88, 0x4f, 0x0a, 0x88, - 0x37, 0xf3, 0x90, 0x75, 0x98, 0xa6, 0x91, 0x94, 0x82, 0x09, 0xaa, 0xf6, 0xcb, 0x04, 0x40, 0xc8, - 0x5b, 0xfc, 0xb3, 0x80, 0xe0, 0x9d, 0x12, 0x57, 0x79, 0xa7, 0xe4, 0xb8, 0x77, 0x5a, 0x86, 0xdc, - 0x58, 0xb2, 0x9f, 0x54, 0x83, 0x31, 0x5a, 0x0f, 0x5c, 0x24, 0x4b, 0x0f, 0x97, 0x63, 0x0e, 0x6a, - 0x2d, 0xe2, 0x27, 0x03, 0x4d, 0xc9, 0x88, 0x9a, 0x52, 0x83, 0x52, 0x5f, 0x77, 0x89, 0xda, 0x12, - 0xc1, 0xe8, 0x2c, 0xeb, 0x4b, 0xaa, 0x05, 0x02, 0x54, 0x09, 0xac, 0xee, 0x11, 0x75, 0x21, 0x68, - 0x13, 0xbb, 0xf4, 0x88, 0x4b, 0xaa, 0x3f, 0xac, 0xad, 0x41, 0x86, 0x7d, 0x05, 0x01, 0x64, 0xea, - 0x5b, 0xdd, 0xd6, 0xd7, 0x8a, 0x3c, 0x87, 0x8a, 0x90, 0xdb, 0x6e, 0xed, 0xb7, 0x3a, 0x4d, 0xa5, - 0x21, 0x4b, 0x04, 0xb3, 0x5d, 0x6f, 0xed, 0x2a, 0x0d, 0x39, 0x51, 0xfb, 0xa5, 0x04, 0x39, 0x5f, - 0x2a, 0x7e, 0x15, 0x49, 0x0c, 0x21, 0xfc, 0xf1, 0x47, 0x3a, 0xb6, 0x4c, 0xe4, 0xd8, 0x10, 0xa4, - 0x5c, 0xf3, 0xe7, 0x98, 0x1f, 0x27, 0xfd, 0x4d, 0xe8, 0x03, 0x45, 0x67, 0x71, 0x55, 0x30, 0xae, - 0xfd, 0x4b, 0x02, 0x8a, 0xa2, 0x4e, 0x4c, 0xd6, 0x76, 0xa4, 0xa9, 0x6b, 0x3b, 0xb9, 0x4b, 0x6a, - 0x3b, 0x22, 0xbf, 0x89, 0x4b, 0xf8, 0x4d, 0x0a, 0xfc, 0x7e, 0x01, 0xf3, 0xc1, 0xc2, 0x01, 0xe3, - 0x2c, 0x54, 0x94, 0x7d, 0x44, 0x60, 0xa1, 0x4f, 0x61, 0x69, 0x9c, 0x95, 0x60, 0x06, 0x73, 0x17, - 0x8b, 0x22, 0x3b, 0xc1, 0xac, 0x7b, 0x24, 0x13, 0x64, 0xde, 0x8c, 0x59, 0x6a, 0x9a, 0x7e, 0xbf, - 0xc8, 0x81, 0xcc, 0x56, 0xc7, 0x25, 0x94, 0xb9, 0x4a, 0x42, 0xd9, 0x31, 0x09, 0xd5, 0xfe, 0x4c, - 0x02, 0x08, 0xfd, 0xd9, 0xf4, 0xc5, 0x91, 0x3b, 0x61, 0x65, 0x83, 0x30, 0x25, 0xd1, 0x55, 0xfd, - 0x22, 0xc6, 0x24, 0x4b, 0x33, 0x28, 0x4d, 0xed, 0x6d, 0x02, 0x6e, 0xd4, 0x47, 0x9e, 0x3d, 0x71, - 0xcf, 0x09, 0x0f, 0xb4, 0xd2, 0x54, 0x0f, 0xb4, 0x73, 0xb1, 0x0f, 0xb4, 0x89, 0xf7, 0x3c, 0xd0, - 0xce, 0x09, 0x0f, 0xb4, 0x3f, 0xe6, 0x37, 0x90, 0xff, 0x4a, 0x9b, 0xa4, 0x57, 0xc1, 0x72, 0x5c, - 0x59, 0x96, 0x3f, 0xd8, 0xd2, 0xab, 0xa8, 0xcd, 0x1f, 0x6d, 0x95, 0xf0, 0x2a, 0xf2, 0x57, 0x48, - 0xd1, 0x15, 0xae, 0x2c, 0x48, 0x07, 0x37, 0x12, 0x5f, 0x86, 0x78, 0x3b, 0xfe, 0xd4, 0x5e, 0xfb, - 0xf3, 0x04, 0x54, 0xc8, 0xe1, 0x08, 0x57, 0xee, 0x58, 0x05, 0x58, 0x9a, 0xa2, 0x02, 0x9c, 0xbe, - 0xaa, 0x96, 0x94, 0x98, 0xaa, 0xfe, 0x92, 0x9c, 0xba, 0xfe, 0x92, 0x9a, 0xbd, 0xfe, 0x92, 0x99, - 0xb5, 0x96, 0xf4, 0x0f, 0x29, 0x58, 0x88, 0x89, 0xe7, 0x48, 0x94, 0xcd, 0xe2, 0xb9, 0x48, 0x94, - 0xcd, 0x80, 0x24, 0xca, 0xe6, 0xbf, 0x48, 0x3a, 0x5d, 0x61, 0xaf, 0xbd, 0xf6, 0xf1, 0xb1, 0x8b, - 0x3d, 0x6d, 0xe0, 0x72, 0x9d, 0x2d, 0x51, 0x70, 0x9b, 0x42, 0xf7, 0x5c, 0xe2, 0xa2, 0xb1, 0x65, - 0x08, 0x54, 0x4c, 0x79, 0x0b, 0xd8, 0x32, 0x02, 0x1a, 0xb1, 0xa9, 0x21, 0x35, 0x73, 0x53, 0x43, - 0x7a, 0xea, 0xa6, 0x86, 0xcc, 0x6c, 0x4d, 0x0d, 0xd9, 0x6b, 0x34, 0x35, 0xe4, 0x3e, 0xac, 0xa9, - 0x21, 0x3f, 0x7d, 0x53, 0x03, 0xcc, 0xde, 0xd4, 0x50, 0xb8, 0x56, 0x53, 0xc3, 0xbf, 0x66, 0x60, - 0xf9, 0xf2, 0x20, 0xfe, 0xea, 0xa4, 0x3a, 0xcc, 0x3d, 0x13, 0x57, 0x74, 0x3f, 0x24, 0xa3, 0x7d, - 0x07, 0x5f, 0x02, 0x7b, 0x38, 0xd3, 0x06, 0xe6, 0x1b, 0xd3, 0x3a, 0xa9, 0x56, 0xa8, 0x44, 0x22, - 0xaf, 0xf3, 0x7b, 0x14, 0xa7, 0xb2, 0x87, 0x48, 0x36, 0x88, 0x34, 0x2c, 0xa4, 0xa6, 0x68, 0x9b, - 0x48, 0xc7, 0xb4, 0x4d, 0xa0, 0xa7, 0x3c, 0x36, 0x63, 0x8a, 0x73, 0x85, 0x17, 0xa3, 0xf1, 0x96, - 0xff, 0xfe, 0xb6, 0x11, 0x09, 0x04, 0xe3, 0xdf, 0xdf, 0xf8, 0x14, 0x3f, 0x0c, 0xfc, 0x4a, 0x88, - 0xec, 0xe0, 0xfd, 0x6f, 0x70, 0x7c, 0x76, 0xf8, 0x0e, 0x17, 0xaa, 0x6d, 0xee, 0x1a, 0x6a, 0x9b, - 0x9f, 0x41, 0x6d, 0xa3, 0xae, 0xbe, 0x30, 0x9b, 0xab, 0xff, 0xad, 0x20, 0xcf, 0xf1, 0x17, 0x28, - 0x46, 0x93, 0x0e, 0xe1, 0xb4, 0xfc, 0x4c, 0xe7, 0x8a, 0x8b, 0xa2, 0x34, 0xfb, 0x45, 0x81, 0x7e, - 0xe8, 0xa7, 0x2e, 0xfe, 0x22, 0x65, 0xba, 0x48, 0xec, 0x23, 0x26, 0xcf, 0x5d, 0xfc, 0xa9, 0xa2, - 0x61, 0xc9, 0xd3, 0x1b, 0x16, 0xfb, 0x90, 0x78, 0x43, 0xfd, 0x4f, 0x1a, 0xe4, 0x68, 0x66, 0xfb, - 0x2d, 0xb5, 0xe8, 0x14, 0xe3, 0x5b, 0x74, 0x02, 0xbd, 0x4f, 0x7d, 0xa0, 0xde, 0xa7, 0x3f, 0x4c, - 0xef, 0x33, 0xd7, 0xd2, 0xfb, 0x6f, 0xcb, 0x5d, 0x47, 0xf5, 0x3e, 0x7f, 0x5d, 0xbd, 0x87, 0xeb, - 0xe9, 0x7d, 0xe1, 0x63, 0xe8, 0x7d, 0xe9, 0x83, 0xf4, 0xbe, 0x7c, 0x1d, 0xbd, 0xff, 0xbb, 0x14, - 0x54, 0x2f, 0x2b, 0xcd, 0x5c, 0x7d, 0x9b, 0x88, 0xbd, 0x53, 0x89, 0x48, 0xef, 0xd4, 0xf7, 0xa0, - 0x38, 0xd6, 0x34, 0xc5, 0x2c, 0xa1, 0xe0, 0x86, 0xed, 0x52, 0x82, 0xca, 0xa4, 0xae, 0x11, 0x15, - 0xa7, 0xaf, 0x11, 0x15, 0x67, 0xae, 0xab, 0x32, 0xd9, 0xeb, 0xa9, 0x4c, 0xee, 0x63, 0xa8, 0x4c, - 0xfe, 0x83, 0x54, 0x06, 0xa6, 0x54, 0x19, 0x41, 0x51, 0xfe, 0x34, 0x03, 0xb7, 0xaf, 0x28, 0xbc, - 0x5d, 0xad, 0x2b, 0xcf, 0x80, 0xf5, 0x0b, 0x85, 0xdd, 0x85, 0x89, 0xb0, 0xbb, 0x90, 0x62, 0x78, - 0x77, 0xa1, 0x2a, 0x8e, 0x0c, 0x32, 0x2f, 0xd2, 0x95, 0x98, 0x8c, 0xef, 0x4a, 0x8c, 0xf4, 0x24, - 0xfe, 0x3f, 0xb9, 0xce, 0xdc, 0xb5, 0x5c, 0x67, 0xe6, 0x1a, 0xae, 0x33, 0xfb, 0x5d, 0xc8, 0xf0, - 0x21, 0x76, 0x50, 0xb9, 0x8e, 0xeb, 0xfc, 0xb5, 0x04, 0x68, 0xb2, 0x86, 0x7c, 0xb5, 0x21, 0xdc, - 0x17, 0x1a, 0x14, 0x13, 0x13, 0x0d, 0x8a, 0x61, 0x7b, 0xe2, 0x63, 0xae, 0xc0, 0xc9, 0x48, 0xf1, - 0xbd, 0x61, 0x3a, 0xb8, 0xe7, 0xc5, 0xb4, 0x9b, 0x7d, 0x0e, 0xa5, 0xd7, 0xf8, 0xc8, 0xb5, 0x7b, - 0x67, 0xd8, 0x0b, 0x3b, 0x90, 0x9b, 0x73, 0x6a, 0x31, 0x00, 0x93, 0x58, 0x5a, 0xdc, 0x7c, 0x7a, - 0xd6, 0xcd, 0xd7, 0xfe, 0x22, 0x01, 0x72, 0x94, 0x83, 0xef, 0xf2, 0xf8, 0x5f, 0x25, 0x60, 0x7e, - 0xc2, 0x66, 0xbe, 0xad, 0xbe, 0xb8, 0xcc, 0x55, 0xa7, 0x99, 0x9c, 0xea, 0x34, 0x53, 0x53, 0x9f, - 0x66, 0x7a, 0xf6, 0xd3, 0xcc, 0xce, 0x7a, 0x9a, 0xdf, 0xf8, 0x8f, 0xae, 0xbb, 0x34, 0x39, 0xfd, - 0x80, 0x47, 0xd7, 0x4b, 0xd2, 0xdc, 0xda, 0x5f, 0x06, 0xef, 0xb9, 0x1d, 0xfe, 0x5e, 0x33, 0xf3, - 0xd2, 0xfc, 0x95, 0x96, 0xb1, 0xaa, 0x09, 0x4d, 0x83, 0x25, 0xdd, 0x30, 0x98, 0xe0, 0x23, 0xaf, - 0xb4, 0x22, 0x69, 0x52, 0x7c, 0xa5, 0x0d, 0xa9, 0x6b, 0x3f, 0x84, 0xf2, 0xf8, 0xe3, 0x04, 0x7a, - 0x00, 0x29, 0xd3, 0x3a, 0xb6, 0x27, 0x1e, 0xa9, 0x85, 0x47, 0x27, 0x4a, 0xb0, 0xf2, 0x0a, 0x8a, - 0x62, 0x9b, 0x35, 0x5a, 0x02, 0x54, 0x3f, 0x6c, 0xb4, 0xda, 0xda, 0x56, 0xb3, 0xbe, 0xbf, 0xaf, - 0xec, 0x6a, 0x9b, 0xed, 0x6e, 0x53, 0x9e, 0x9b, 0x84, 0xef, 0x2a, 0xdb, 0x5d, 0x59, 0x42, 0x37, - 0x61, 0x61, 0x1c, 0xae, 0xb6, 0x76, 0x9a, 0x5d, 0x39, 0xb1, 0xf2, 0x4f, 0x12, 0xdc, 0x88, 0xbd, - 0x80, 0x90, 0x0c, 0xc5, 0xe6, 0xfa, 0xb3, 0xa7, 0xda, 0x97, 0xeb, 0x4f, 0x0e, 0xb4, 0x8d, 0x27, - 0xf2, 0xdc, 0x38, 0xe4, 0xd9, 0x13, 0x59, 0x42, 0xf3, 0x50, 0xa2, 0x90, 0xdf, 0x7c, 0xf2, 0x9c, - 0x11, 0x25, 0x22, 0xa0, 0x67, 0x4f, 0xe4, 0x24, 0xba, 0x05, 0x37, 0x0e, 0xda, 0x6a, 0x57, 0xad, - 0xb7, 0xba, 0xda, 0xd8, 0x92, 0xa9, 0x4b, 0x50, 0xcf, 0x9e, 0xc8, 0x69, 0xb4, 0x0c, 0x4b, 0xe3, - 0xa8, 0xe0, 0x23, 0x99, 0xcb, 0x70, 0xcf, 0x9e, 0xc8, 0xd9, 0x95, 0x4d, 0xde, 0x9a, 0x1d, 0x9a, - 0x1d, 0x5a, 0x04, 0xb9, 0xa1, 0x6c, 0xd7, 0x0f, 0x77, 0xbb, 0xda, 0x76, 0x6b, 0x57, 0xe9, 0xfe, - 0xee, 0x81, 0x22, 0xcf, 0xa1, 0x2c, 0x24, 0xf7, 0x0e, 0x9e, 0xca, 0x12, 0xf9, 0xd1, 0xde, 0xd9, - 0x91, 0x13, 0x0c, 0xb2, 0x21, 0x27, 0x57, 0x9a, 0xbe, 0xa4, 0xfc, 0xee, 0x4e, 0x71, 0x89, 0x03, - 0xb5, 0xdd, 0x6d, 0x6f, 0xb5, 0x77, 0xe5, 0x39, 0x94, 0x83, 0x94, 0xda, 0xdd, 0x3b, 0x60, 0x6b, - 0x74, 0xd4, 0xae, 0x9c, 0x40, 0x25, 0xc8, 0xbf, 0x52, 0x36, 0x3b, 0xed, 0xad, 0x97, 0x4a, 0x57, - 0x4e, 0xae, 0xec, 0xc3, 0x8d, 0xd8, 0x76, 0x51, 0x74, 0x0f, 0xee, 0xf8, 0x0b, 0x76, 0x94, 0x9d, - 0x3d, 0x65, 0xbf, 0xab, 0x34, 0x28, 0x77, 0xe2, 0xfa, 0xe4, 0xc4, 0x77, 0x3b, 0x21, 0x44, 0x5a, - 0x79, 0x1c, 0x69, 0x57, 0xe5, 0xad, 0x7c, 0x79, 0x48, 0xb7, 0xf6, 0x1b, 0xca, 0x37, 0xf2, 0x1c, - 0x61, 0xa0, 0xdb, 0xda, 0x53, 0x3a, 0xdd, 0x3a, 0x61, 0x6c, 0xe5, 0x18, 0x2a, 0x91, 0x3e, 0x40, - 0xa2, 0x24, 0xad, 0xbd, 0xfa, 0x8e, 0xa2, 0x75, 0x0e, 0xb7, 0xb7, 0x5b, 0xdf, 0x68, 0xfe, 0xcc, - 0x65, 0x58, 0x1a, 0x83, 0x0b, 0xcb, 0xa0, 0x3b, 0x70, 0x7b, 0x0c, 0xb7, 0xdf, 0xde, 0x57, 0xb4, - 0xf6, 0xd7, 0x8a, 0xfa, 0x4a, 0x6d, 0x75, 0x15, 0x39, 0xb1, 0xf2, 0x53, 0x90, 0xa3, 0x4f, 0xf5, - 0x64, 0x41, 0x65, 0x47, 0x55, 0x3a, 0x1d, 0xad, 0xd3, 0x3e, 0x54, 0xb7, 0x14, 0x8d, 0x9c, 0xbc, - 0xf6, 0x4a, 0xd9, 0x64, 0x1f, 0x8b, 0xc1, 0x75, 0x1a, 0x2f, 0x65, 0x69, 0xe5, 0xaf, 0x25, 0x28, - 0x8a, 0x0f, 0xf8, 0x68, 0x01, 0x2a, 0x3e, 0x71, 0xb7, 0xae, 0x76, 0x5b, 0xfb, 0x3b, 0xf2, 0x1c, - 0xd1, 0x34, 0x0e, 0xe4, 0xcf, 0x49, 0x92, 0x00, 0x52, 0xf6, 0x1b, 0x84, 0x2a, 0x21, 0x4c, 0xdd, - 0x6a, 0xef, 0x1d, 0xec, 0x2a, 0x5d, 0x45, 0x4e, 0x0a, 0x74, 0xfc, 0xbd, 0x29, 0x85, 0x10, 0x94, - 0xfd, 0xd5, 0x36, 0xdb, 0x6a, 0x57, 0x69, 0xc8, 0x69, 0x54, 0x85, 0x45, 0x0e, 0xdb, 0x6d, 0xed, - 0xb5, 0xba, 0x9a, 0xaa, 0xd4, 0xb7, 0x9a, 0x4a, 0x43, 0xce, 0xac, 0x1c, 0xf2, 0x7f, 0x02, 0xe1, - 0x15, 0x30, 0x04, 0x65, 0x5f, 0x98, 0x7b, 0xad, 0x6f, 0x18, 0x7b, 0x4b, 0x80, 0x1a, 0x87, 0xf5, - 0xdd, 0xc0, 0xe2, 0xea, 0x3b, 0xca, 0x3e, 0x31, 0xc5, 0x65, 0x58, 0x1a, 0x87, 0xef, 0x76, 0x15, - 0x75, 0xbf, 0x4e, 0x0e, 0x71, 0xfd, 0x6f, 0x32, 0x90, 0xe1, 0x65, 0xf3, 0x9f, 0x40, 0x41, 0xe8, - 0x1d, 0x40, 0x57, 0x75, 0x14, 0x2c, 0xc7, 0x75, 0xb7, 0xa0, 0x3a, 0x14, 0xc5, 0xae, 0x16, 0x14, - 0x06, 0x5e, 0x31, 0xcd, 0x2e, 0xf1, 0x4b, 0x28, 0x00, 0x61, 0x6b, 0x0d, 0x0a, 0x23, 0xc7, 0x89, - 0x26, 0x9f, 0xe5, 0xdb, 0xb1, 0x38, 0xde, 0x8b, 0xf3, 0x63, 0x80, 0xb0, 0x3b, 0x05, 0x89, 0x0f, - 0x90, 0x91, 0x96, 0x95, 0x78, 0x2e, 0xba, 0x50, 0xa5, 0x7b, 0x8e, 0x29, 0x87, 0xa2, 0x69, 0x3a, - 0x1e, 0xe2, 0x57, 0xfd, 0x6d, 0x62, 0xe2, 0xba, 0xe3, 0x05, 0xc5, 0x20, 0x74, 0x79, 0xeb, 0x43, - 0xfc, 0x0a, 0x07, 0xb0, 0x44, 0x57, 0x98, 0x7c, 0x09, 0x7a, 0x7f, 0x37, 0x44, 0xfc, 0x8a, 0x5f, - 0xc3, 0x2d, 0xba, 0x62, 0x5c, 0xfe, 0x85, 0xa6, 0xea, 0x8b, 0x88, 0x5f, 0xb7, 0x01, 0x72, 0xb8, - 0xee, 0x84, 0x42, 0x4d, 0xc6, 0xb6, 0xef, 0x51, 0x28, 0x76, 0x63, 0x4f, 0x28, 0xd4, 0xd8, 0x45, - 0xfe, 0x9e, 0x25, 0x98, 0x77, 0x9d, 0x58, 0x62, 0xec, 0xc2, 0x8e, 0x5d, 0x62, 0x73, 0xfb, 0xf7, - 0xee, 0x9d, 0x98, 0xde, 0xe9, 0xe8, 0x68, 0xad, 0x67, 0x0f, 0x1e, 0x73, 0x82, 0xc7, 0x7e, 0xef, - 0xbd, 0x0f, 0xf8, 0xfb, 0x44, 0x69, 0xd7, 0x3c, 0xc7, 0x2f, 0x59, 0xc7, 0xa0, 0x67, 0xff, 0x67, - 0xa2, 0xcc, 0xc7, 0x2f, 0x5e, 0x50, 0xc0, 0x51, 0x86, 0x4e, 0xd9, 0xf8, 0xdf, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xf9, 0x07, 0xe6, 0x37, 0x63, 0x3a, 0x00, 0x00, + // 4193 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4b, 0x6f, 0x1b, 0x49, + 0x7a, 0x6a, 0xbe, 0xf9, 0xf1, 0xd5, 0x2a, 0x3d, 0x4c, 0xcb, 0x33, 0x63, 0x2f, 0x9d, 0xf1, 0x43, + 0xa3, 0x95, 0x15, 0xc9, 0xe3, 0xf1, 0x7a, 0xb3, 0x93, 0x50, 0x62, 0x4b, 0xe4, 0x5a, 0x12, 0x95, + 0x26, 0x35, 0x9e, 0x04, 0x48, 0x1a, 0x2d, 0x76, 0x49, 0x6a, 0x88, 0xec, 0xe6, 0x76, 0x17, 0x65, + 0x6b, 0x7f, 0xc1, 0x26, 0x08, 0x92, 0x20, 0x01, 0x72, 0x30, 0x12, 0xe4, 0x12, 0xe4, 0xb0, 0xd8, + 0x53, 0x7e, 0x41, 0xee, 0x7b, 0x08, 0x90, 0x20, 0xc8, 0x3d, 0xc7, 0xc0, 0xc1, 0x22, 0x87, 0xdc, + 0x83, 0x7a, 0xf4, 0x83, 0xad, 0x96, 0x4c, 0x5a, 0xce, 0xec, 0x65, 0x4f, 0x62, 0x7d, 0x8f, 0xea, + 0xaf, 0xea, 0x7b, 0xd4, 0x57, 0x5f, 0x7d, 0x82, 0xf9, 0xbe, 0x79, 0x8e, 0xcf, 0x4c, 0xa2, 0xe1, + 0x13, 0x07, 0xbb, 0xee, 0xea, 0xd0, 0xb1, 0x89, 0x8d, 0xb2, 0x02, 0xba, 0xe4, 0xa3, 0x07, 0xb6, + 0x81, 0xfb, 0x02, 0xbd, 0x34, 0xdf, 0xb7, 0x4f, 0x4e, 0xb0, 0xf3, 0xc4, 0x1e, 0x12, 0xd3, 0xb6, + 0x04, 0xb4, 0xf6, 0x1f, 0x49, 0x40, 0x1d, 0xa2, 0x3b, 0x44, 0x61, 0x53, 0xa9, 0xf8, 0x27, 0x23, + 0xec, 0x12, 0x74, 0x07, 0xf2, 0x8e, 0x6d, 0x0f, 0x34, 0x4b, 0x1f, 0xe0, 0xaa, 0x74, 0x4f, 0x7a, + 0x94, 0x57, 0x73, 0x14, 0xb0, 0xaf, 0x0f, 0x30, 0xfa, 0x12, 0x72, 0x04, 0x0f, 0x86, 0x7d, 0x9d, + 0xe0, 0x6a, 0xe2, 0x9e, 0xf4, 0xa8, 0xb0, 0x7e, 0x6b, 0x55, 0x7c, 0x72, 0xb5, 0x2b, 0x10, 0x1d, + 0x7b, 0xe4, 0xf4, 0x70, 0x73, 0x46, 0xf5, 0x49, 0xd1, 0x03, 0x48, 0xbe, 0xc6, 0x47, 0xd5, 0x24, + 0xe3, 0x40, 0x3e, 0xc7, 0x2b, 0x7c, 0xe4, 0x13, 0x53, 0x02, 0xb4, 0x02, 0xe9, 0x01, 0x36, 0x4c, + 0xbd, 0x9a, 0x62, 0x94, 0xf3, 0x3e, 0xe5, 0x1e, 0x85, 0xfa, 0xb4, 0x9c, 0x08, 0x3d, 0x87, 0xcc, + 0xd0, 0xc1, 0x2e, 0x26, 0xd5, 0xf4, 0x3d, 0xe9, 0x51, 0x79, 0xfd, 0x33, 0x9f, 0x5c, 0xb1, 0x7a, + 0xb6, 0x61, 0x5a, 0x27, 0x6d, 0xbe, 0xe0, 0x03, 0x46, 0xd5, 0x94, 0x54, 0x41, 0x8f, 0x9e, 0x41, + 0x4e, 0x37, 0xce, 0x75, 0xab, 0x87, 0x8d, 0x6a, 0x86, 0x7d, 0xaa, 0x7a, 0x15, 0x6f, 0x53, 0x52, + 0x7d, 0x5a, 0xf4, 0x18, 0xb2, 0xf6, 0x88, 0x0c, 0x47, 0xc4, 0xad, 0x66, 0xef, 0x25, 0x1f, 0x15, + 0xd6, 0x2b, 0x3e, 0x5b, 0x9b, 0xc1, 0x55, 0x0f, 0x8f, 0xd6, 0x20, 0xeb, 0x12, 0xdb, 0xd1, 0x4f, + 0x70, 0x35, 0xc7, 0xbe, 0xb0, 0xe8, 0x93, 0x76, 0x38, 0x7c, 0xcb, 0xb6, 0x8e, 0xcd, 0x13, 0xd5, + 0x23, 0x43, 0xeb, 0x90, 0x7b, 0x8d, 0x8f, 0x4e, 0x6d, 0xfb, 0xcc, 0xad, 0xe6, 0xd9, 0xec, 0x8b, + 0xe1, 0x9d, 0xa2, 0x08, 0xc1, 0xe2, 0xd3, 0x6d, 0xe6, 0x20, 0xe3, 0xb2, 0x5d, 0xd9, 0x04, 0xc8, + 0x61, 0x21, 0x79, 0xed, 0xcf, 0x25, 0x28, 0x8f, 0x6b, 0x03, 0x2d, 0x42, 0xa6, 0xaf, 0x5f, 0xd8, + 0x23, 0x22, 0x54, 0x2a, 0x46, 0xe8, 0x53, 0x00, 0x7d, 0x64, 0x98, 0xb6, 0x66, 0x5b, 0xfd, 0x0b, + 0xa6, 0xd2, 0x9c, 0x9a, 0x67, 0x90, 0xb6, 0xd5, 0xbf, 0xa0, 0xe8, 0x73, 0xd3, 0xc0, 0x02, 0x9d, + 0xe4, 0x68, 0x06, 0x61, 0xe8, 0x07, 0x50, 0xe9, 0x8d, 0x5c, 0x62, 0x0f, 0xb4, 0x23, 0xdd, 0xc5, + 0xda, 0xc8, 0xe9, 0x33, 0xcd, 0xe5, 0xd5, 0x12, 0x07, 0x6f, 0xea, 0x2e, 0x3e, 0x74, 0xfa, 0xb5, + 0x3f, 0x91, 0x20, 0xef, 0x2b, 0x1b, 0xc9, 0x90, 0xa4, 0x94, 0x5c, 0x10, 0xfa, 0xf3, 0x86, 0x52, + 0xac, 0x00, 0xd2, 0x5f, 0xeb, 0x26, 0xd1, 0x5c, 0x6a, 0xcd, 0x9a, 0x6b, 0x9e, 0x58, 0x3a, 0x17, + 0x24, 0xa7, 0xca, 0x0c, 0xc3, 0xcc, 0xbc, 0xc3, 0xe0, 0xb5, 0x5f, 0x49, 0x50, 0x08, 0x99, 0x13, + 0x7a, 0x0e, 0x65, 0x3e, 0x39, 0x71, 0xf4, 0xde, 0x99, 0x66, 0x1a, 0x5c, 0xb0, 0x4d, 0xf9, 0xed, + 0xbb, 0x95, 0x22, 0xc3, 0x74, 0x29, 0xa2, 0xd5, 0x68, 0xce, 0xa8, 0xe1, 0xb1, 0x81, 0x9a, 0x30, + 0x3b, 0xd4, 0x1d, 0x62, 0xf6, 0xcc, 0xa1, 0x6e, 0x11, 0x8d, 0xe1, 0x84, 0x57, 0xdc, 0xf6, 0x35, + 0x77, 0x10, 0x50, 0x7c, 0x43, 0x09, 0x9a, 0x33, 0xaa, 0x3c, 0x8c, 0xc0, 0xd0, 0x32, 0xa4, 0xd9, + 0x6a, 0x85, 0x87, 0x04, 0x76, 0x5f, 0xa7, 0x50, 0xa1, 0x75, 0x4e, 0x82, 0x1e, 0x42, 0xca, 0xd0, + 0x89, 0xe7, 0x22, 0x73, 0x3e, 0x69, 0x43, 0x27, 0xba, 0xa0, 0x64, 0x04, 0x9b, 0x59, 0x48, 0x33, + 0x91, 0x6a, 0x7f, 0x0c, 0x72, 0x54, 0x0a, 0xb4, 0x04, 0x39, 0xd3, 0xc0, 0x16, 0x31, 0xc9, 0x85, + 0xe7, 0xe4, 0xde, 0x18, 0xad, 0xc2, 0xdc, 0xd0, 0xc1, 0xc7, 0xd8, 0xd1, 0xdc, 0x9e, 0x83, 0xb1, + 0xa5, 0xb9, 0xa7, 0xba, 0x83, 0x85, 0x5a, 0x66, 0x39, 0xaa, 0xc3, 0x30, 0x1d, 0x8a, 0xa8, 0xbd, + 0x80, 0x42, 0x48, 0x4e, 0xf4, 0x05, 0x64, 0x1c, 0x7b, 0x44, 0xb0, 0x5b, 0x95, 0x98, 0x15, 0xcf, + 0x8d, 0xaf, 0x46, 0xa5, 0x38, 0x55, 0x90, 0xd4, 0xfe, 0x47, 0x02, 0x08, 0xc0, 0xe8, 0x11, 0xe4, + 0x22, 0x6a, 0x28, 0xbc, 0x7d, 0xb7, 0x92, 0x25, 0xbe, 0x06, 0xc4, 0x4f, 0x03, 0x6d, 0xc0, 0x7c, + 0x78, 0xf3, 0xfd, 0xc5, 0x50, 0x29, 0xf3, 0xcd, 0x19, 0x75, 0x2e, 0x84, 0x6d, 0x79, 0x2b, 0xfb, + 0x31, 0x84, 0xf7, 0x5e, 0x3b, 0x33, 0x2d, 0x83, 0x6d, 0x79, 0x79, 0xfd, 0xd3, 0x38, 0x85, 0xb5, + 0xac, 0x63, 0x7b, 0xf5, 0xa5, 0x69, 0x19, 0xcd, 0x19, 0xb5, 0x12, 0x62, 0xa4, 0x20, 0xf4, 0x04, + 0xb2, 0xbd, 0x53, 0xdd, 0xb2, 0x30, 0x37, 0xb5, 0xf2, 0xfa, 0x42, 0x44, 0x6b, 0x1c, 0xa9, 0x7a, + 0x54, 0x54, 0x1f, 0x03, 0x9d, 0xf4, 0x4e, 0x6b, 0x75, 0x80, 0x40, 0x59, 0x68, 0x03, 0xf2, 0x2e, + 0xee, 0xe3, 0x1e, 0xb1, 0x1d, 0x6f, 0xc7, 0x16, 0xc6, 0x94, 0xda, 0x11, 0x58, 0x35, 0xa0, 0xa3, + 0x1e, 0x5e, 0x0c, 0xe3, 0xfe, 0xbf, 0x37, 0x6e, 0x11, 0xd2, 0xc4, 0x1e, 0x9a, 0x3d, 0xb6, 0x5b, + 0x94, 0x8a, 0x0f, 0x83, 0x35, 0xfd, 0x6b, 0x12, 0x2a, 0x91, 0xc8, 0x89, 0xe6, 0x21, 0xfd, 0xda, + 0x34, 0xc8, 0x29, 0x13, 0x28, 0xad, 0xf2, 0x01, 0x8d, 0x44, 0xa7, 0xd8, 0x3c, 0x39, 0x25, 0xec, + 0x8b, 0x69, 0x55, 0x8c, 0x28, 0xb5, 0x81, 0x87, 0xe4, 0x94, 0x7d, 0x22, 0xad, 0xf2, 0x01, 0xfa, + 0x04, 0xf2, 0xc7, 0x8e, 0x3e, 0xc0, 0x0e, 0x3d, 0x71, 0x52, 0x0c, 0x13, 0x00, 0xd0, 0x53, 0x28, + 0xf0, 0xb8, 0xd1, 0xb3, 0x0d, 0xdc, 0x13, 0xc7, 0xc0, 0x5c, 0xd4, 0x7b, 0x0c, 0xdc, 0x53, 0x79, + 0x7c, 0x61, 0xbf, 0xd1, 0x7d, 0x28, 0x71, 0xae, 0x23, 0x93, 0xb0, 0x79, 0x33, 0x6c, 0xde, 0x22, + 0x03, 0x6e, 0x72, 0x18, 0x7a, 0x08, 0x15, 0x4e, 0x74, 0xec, 0xd0, 0x83, 0xd1, 0xea, 0x5d, 0x54, + 0xb3, 0x8c, 0xac, 0xcc, 0xc0, 0xdb, 0x1e, 0x94, 0xca, 0xc0, 0xe3, 0x07, 0x97, 0x21, 0x17, 0x91, + 0x81, 0xb9, 0x9b, 0x90, 0xe1, 0xdc, 0xff, 0x4d, 0x65, 0xe0, 0x5c, 0x9e, 0x0c, 0x79, 0x2e, 0x03, + 0x03, 0x7a, 0x32, 0xac, 0x00, 0x3a, 0xc3, 0x17, 0x1a, 0x5b, 0xaf, 0x66, 0x5a, 0x04, 0x3b, 0xe7, + 0x7a, 0xbf, 0x0a, 0xf7, 0xa4, 0x47, 0x92, 0x2a, 0x9f, 0xe1, 0x8b, 0x6d, 0x8a, 0x68, 0x09, 0x38, + 0x7a, 0xe8, 0x2d, 0xeb, 0x27, 0x23, 0xbd, 0x4f, 0x35, 0x5a, 0xa0, 0x53, 0x6e, 0x26, 0xaa, 0x92, + 0x58, 0xda, 0xef, 0x73, 0x38, 0x25, 0xe4, 0xdf, 0xf6, 0x08, 0x8b, 0x01, 0x21, 0x43, 0x08, 0xc2, + 0xda, 0x9f, 0x25, 0x20, 0xc3, 0xcf, 0x35, 0xf4, 0x18, 0x52, 0xc7, 0x66, 0x9f, 0x27, 0x04, 0x61, + 0x97, 0xde, 0x36, 0xfb, 0x98, 0x93, 0x34, 0x67, 0x54, 0x46, 0x82, 0x9e, 0x40, 0xc6, 0x25, 0x0e, + 0xd6, 0x07, 0x22, 0x16, 0x2e, 0x84, 0x0e, 0x3e, 0x0a, 0xf6, 0xc9, 0x05, 0x19, 0x7a, 0x01, 0x39, + 0x17, 0x9f, 0x0c, 0xb0, 0x45, 0x5c, 0x11, 0x00, 0x3f, 0x09, 0x58, 0x38, 0x02, 0x1b, 0x63, 0x1f, + 0xf2, 0xe9, 0xd1, 0x2a, 0x64, 0xcc, 0x81, 0x7e, 0x82, 0xdd, 0x4b, 0x29, 0x43, 0x8b, 0x82, 0x83, + 0x6f, 0x71, 0xaa, 0xf0, 0xb1, 0x9c, 0x99, 0xe8, 0x58, 0xa6, 0x47, 0x6c, 0x8f, 0x81, 0x6a, 0x7f, + 0x2a, 0x01, 0x04, 0x62, 0xa0, 0x2f, 0x21, 0x4f, 0xd7, 0xab, 0x91, 0x8b, 0x21, 0xdf, 0x97, 0x72, + 0x34, 0x8b, 0xe0, 0x52, 0x77, 0x2f, 0x86, 0x58, 0xcd, 0x1d, 0x8b, 0x5f, 0x34, 0xf2, 0xd2, 0xdf, + 0x43, 0x9d, 0x9c, 0x72, 0x9f, 0x53, 0xfd, 0x31, 0x7a, 0x0c, 0xb2, 0x61, 0xba, 0xfa, 0x51, 0x1f, + 0x6b, 0x03, 0xdd, 0x32, 0x8f, 0xb1, 0x4b, 0xc4, 0x71, 0x57, 0x11, 0xf0, 0x3d, 0x01, 0xae, 0xbd, + 0x82, 0x62, 0x78, 0x3b, 0xd1, 0x06, 0xe4, 0x58, 0x5a, 0xd7, 0xb3, 0xfb, 0x42, 0x98, 0x5b, 0x91, + 0x7d, 0x3f, 0x10, 0x68, 0xd5, 0x27, 0x44, 0x08, 0x52, 0x23, 0xa7, 0xef, 0x56, 0x13, 0xf7, 0x92, + 0x8f, 0xf2, 0x2a, 0xfb, 0x5d, 0xfb, 0x87, 0x14, 0xcc, 0xc5, 0xec, 0x3a, 0xd5, 0x52, 0xe4, 0x03, + 0x9f, 0xc5, 0x6b, 0x29, 0xe6, 0x3b, 0x0f, 0xa1, 0x42, 0xd7, 0x48, 0x53, 0x4a, 0x8d, 0x9e, 0x1f, + 0xe6, 0x1b, 0xb1, 0xf4, 0xb2, 0x07, 0x3e, 0x60, 0x50, 0xea, 0x16, 0xc3, 0xbe, 0x7e, 0xd1, 0x37, + 0x5d, 0xc2, 0x13, 0x50, 0x16, 0x6f, 0xd4, 0xa2, 0x07, 0x64, 0x49, 0xe8, 0x0a, 0x20, 0xfa, 0x61, + 0x6d, 0x9c, 0xb2, 0xc0, 0x28, 0x65, 0x8a, 0x39, 0x08, 0x53, 0x3f, 0x06, 0x59, 0x58, 0x8b, 0x66, + 0x8c, 0x1c, 0x9d, 0x86, 0x26, 0x66, 0x2b, 0x25, 0xb5, 0x22, 0xe0, 0x0d, 0x01, 0x46, 0x4a, 0x48, + 0x4c, 0x77, 0x74, 0x4c, 0xc5, 0x04, 0xb6, 0xd2, 0x2b, 0xec, 0xb1, 0xc3, 0x68, 0x82, 0x45, 0xf0, + 0x71, 0xac, 0x16, 0x73, 0xb1, 0x5a, 0x44, 0xf7, 0x21, 0xe1, 0x6e, 0xb0, 0xb8, 0x55, 0x58, 0x9f, + 0x0d, 0x3e, 0xb2, 0x71, 0x38, 0xec, 0xdb, 0x3a, 0x3d, 0x76, 0x12, 0xee, 0x06, 0xcd, 0x9e, 0x4f, + 0x7a, 0x43, 0x61, 0xaf, 0x41, 0xf6, 0xbc, 0xb3, 0x75, 0xe0, 0x93, 0x51, 0x02, 0xb4, 0x06, 0x69, + 0xfd, 0xa7, 0x23, 0x07, 0xb3, 0x40, 0x15, 0x4e, 0x69, 0xeb, 0x14, 0xba, 0xd9, 0xb7, 0x8f, 0x7c, + 0x7a, 0x4e, 0x48, 0x5d, 0x55, 0xef, 0x9b, 0xed, 0x4e, 0x87, 0x85, 0x9f, 0xb0, 0xab, 0xd6, 0x19, + 0xd8, 0xa7, 0x17, 0x64, 0xd4, 0x19, 0x78, 0x82, 0x5b, 0xfb, 0xef, 0x24, 0x14, 0x42, 0x2e, 0x46, + 0x17, 0xdd, 0xd3, 0x87, 0x64, 0xe4, 0x84, 0x22, 0x95, 0xc4, 0xb7, 0x59, 0xc0, 0xfd, 0x40, 0xe5, + 0x9f, 0x0b, 0x89, 0xf8, 0x73, 0x21, 0x39, 0x76, 0x2e, 0xc4, 0xd8, 0x4e, 0x2a, 0xd6, 0x76, 0xea, + 0x97, 0xb5, 0x97, 0x8e, 0x78, 0x25, 0x13, 0xf8, 0x1a, 0xcd, 0x3d, 0x85, 0x02, 0x8b, 0x13, 0x22, + 0x96, 0x67, 0x22, 0xb1, 0x9c, 0xb1, 0x8b, 0x58, 0x6e, 0xfa, 0xbf, 0x63, 0xf5, 0x9d, 0xbd, 0x4e, + 0xdf, 0xb9, 0x89, 0xf4, 0x9d, 0x9f, 0x58, 0xdf, 0x30, 0xbd, 0xbe, 0x0b, 0xd3, 0xea, 0xfb, 0x97, + 0x12, 0x94, 0xc6, 0x22, 0xa4, 0x58, 0x8b, 0x34, 0xd1, 0x5a, 0x12, 0x13, 0xaf, 0x25, 0x39, 0xfd, + 0x5a, 0x52, 0x93, 0xad, 0x05, 0x58, 0x00, 0xa3, 0x07, 0x9c, 0x53, 0xfb, 0xcf, 0x14, 0xe4, 0x3c, + 0x49, 0xd1, 0x7d, 0x00, 0xbd, 0xd7, 0xc3, 0xae, 0xab, 0x9d, 0x61, 0x91, 0x0d, 0x6f, 0xa6, 0x7e, + 0xf6, 0x6e, 0x45, 0x52, 0xf3, 0x1c, 0xfe, 0x12, 0x5f, 0xa0, 0x4f, 0x20, 0xe3, 0xe2, 0x9e, 0x83, + 0x79, 0xda, 0xe2, 0x11, 0x08, 0x18, 0x7a, 0x0c, 0x25, 0x17, 0xbb, 0xae, 0x69, 0x5b, 0x1a, 0xb1, + 0xcf, 0xb0, 0xc5, 0xa3, 0x91, 0x20, 0x2a, 0x0a, 0x54, 0x97, 0x62, 0xd0, 0x0a, 0x54, 0x74, 0xd7, + 0x1d, 0x0d, 0xb0, 0xe6, 0xd8, 0x7d, 0xac, 0xe9, 0x8e, 0xc5, 0xce, 0x5f, 0x8f, 0xb8, 0xc4, 0x91, + 0xaa, 0xdd, 0xc7, 0x75, 0xc7, 0x42, 0x1d, 0xb8, 0x15, 0xa6, 0xc6, 0x6f, 0x08, 0x76, 0x2c, 0xbd, + 0x4f, 0xd3, 0xbc, 0x12, 0xe3, 0xfa, 0x84, 0x72, 0xbd, 0x7d, 0xb7, 0x32, 0x1f, 0xf0, 0x29, 0x82, + 0xa8, 0xd5, 0x50, 0xe3, 0xa0, 0x06, 0x75, 0x35, 0x07, 0x9f, 0xd0, 0x40, 0xc8, 0xc3, 0xab, 0x18, + 0xd1, 0xa3, 0x09, 0x5b, 0xc6, 0xd0, 0x36, 0x2d, 0x22, 0x7c, 0xcc, 0x1f, 0x53, 0x9e, 0xa3, 0x51, + 0xef, 0x4c, 0x5c, 0xb6, 0xf3, 0xaa, 0x18, 0xa1, 0x47, 0x20, 0x1f, 0xdb, 0x4e, 0x0f, 0x6b, 0xf4, + 0x00, 0xd3, 0x5c, 0x72, 0xd1, 0xe7, 0x27, 0x6b, 0x4e, 0x2d, 0x33, 0xf8, 0x81, 0x4e, 0x4e, 0x3b, + 0x14, 0x8a, 0x7e, 0x08, 0xb9, 0x01, 0x26, 0x3a, 0xbb, 0xbc, 0xf0, 0xdb, 0xf3, 0xdd, 0x4b, 0x56, + 0xb3, 0xba, 0x27, 0x28, 0x14, 0x8b, 0x38, 0x17, 0xaa, 0xcf, 0x80, 0xaa, 0x90, 0x25, 0xfa, 0xc9, + 0x89, 0x69, 0x9d, 0x30, 0xef, 0xc9, 0xab, 0xde, 0x10, 0x3d, 0x81, 0xb9, 0x9e, 0x6d, 0x11, 0x16, + 0xdf, 0x4d, 0x77, 0x68, 0xbb, 0x26, 0x0b, 0xf1, 0x79, 0x46, 0x85, 0x04, 0xaa, 0x11, 0x60, 0xe8, + 0x65, 0x6b, 0xe8, 0xd8, 0x6f, 0x2e, 0x84, 0xdb, 0x04, 0x19, 0xc3, 0x01, 0x85, 0x7a, 0x97, 0x2d, + 0x46, 0xb2, 0xf4, 0x43, 0x28, 0x8d, 0x49, 0x44, 0xef, 0xae, 0xbe, 0x91, 0xa8, 0xf4, 0x27, 0x8d, + 0x66, 0xe7, 0x7a, 0x7f, 0x84, 0xc5, 0x89, 0xc6, 0x07, 0x2f, 0x12, 0xcf, 0xa5, 0xda, 0x6b, 0xc8, + 0xfb, 0x76, 0x8e, 0x1e, 0x40, 0xa1, 0xe7, 0x60, 0x96, 0x4f, 0xeb, 0x7d, 0x77, 0xcc, 0xca, 0xc2, + 0x88, 0xd0, 0x3e, 0x27, 0xc6, 0xf6, 0xd9, 0x97, 0x3a, 0xf9, 0x5e, 0xa9, 0x6b, 0x3f, 0x93, 0xa0, + 0x12, 0xf1, 0x1b, 0xf4, 0x10, 0x8a, 0x7a, 0xaf, 0x67, 0x8f, 0x2c, 0x12, 0xaa, 0xec, 0x78, 0x02, + 0x08, 0x0c, 0x3b, 0x2f, 0x3f, 0x07, 0x6f, 0xc8, 0xdc, 0x21, 0x6c, 0xed, 0x20, 0x10, 0xd4, 0x1f, + 0x3e, 0x87, 0x32, 0xdd, 0x5b, 0xdd, 0xb4, 0xb0, 0x13, 0x3e, 0xaa, 0x4b, 0x3e, 0x94, 0xce, 0x56, + 0xfb, 0x3b, 0x09, 0x8a, 0x61, 0x7f, 0xfc, 0x18, 0xce, 0xf6, 0x11, 0xcd, 0xb7, 0xf6, 0x47, 0x50, + 0x08, 0x6d, 0x60, 0x4c, 0x69, 0x62, 0x09, 0x72, 0x23, 0x97, 0x3a, 0xce, 0xc0, 0xd3, 0xb0, 0x3f, + 0x46, 0xf7, 0x20, 0x37, 0xd4, 0x5d, 0xf7, 0xb5, 0xed, 0xf0, 0x6b, 0xa4, 0x27, 0xa8, 0x0f, 0xad, + 0xb9, 0x30, 0xbb, 0x6b, 0xba, 0xd3, 0x54, 0xd8, 0x1e, 0x43, 0x9e, 0x97, 0xf6, 0xa8, 0x8b, 0xf3, + 0xd5, 0x17, 0xdf, 0xbe, 0x5b, 0xc9, 0x71, 0x60, 0xab, 0xa1, 0x7a, 0xbf, 0x98, 0x1b, 0xeb, 0x3d, + 0x62, 0x9e, 0x63, 0x91, 0x23, 0x8a, 0x51, 0xed, 0x77, 0x01, 0x85, 0x3f, 0xea, 0x0e, 0x6d, 0xcb, + 0xa5, 0x13, 0xa7, 0x4d, 0x82, 0x07, 0x97, 0x6f, 0xe5, 0x9c, 0x8e, 0xde, 0x75, 0x55, 0x4e, 0x51, + 0xfb, 0x67, 0x09, 0xe6, 0x0e, 0x87, 0x86, 0x4e, 0xf0, 0xb8, 0xe0, 0x63, 0xb2, 0x49, 0xd7, 0xca, + 0x26, 0x36, 0x32, 0x11, 0x6c, 0x64, 0x50, 0x81, 0x4a, 0x8e, 0x55, 0xa0, 0x1e, 0x40, 0x45, 0x37, + 0x0c, 0x8d, 0xdf, 0x05, 0x34, 0x96, 0x8e, 0xa6, 0x58, 0x3a, 0x5a, 0xd2, 0x0d, 0x83, 0x67, 0xae, + 0x87, 0x4e, 0xdf, 0xa5, 0x59, 0x9f, 0x83, 0x07, 0xf6, 0x39, 0x1e, 0x23, 0x4d, 0x33, 0x52, 0x99, + 0x63, 0x02, 0xea, 0xda, 0xd7, 0x30, 0xdb, 0x21, 0xf6, 0xf0, 0x43, 0xe5, 0xaf, 0xfd, 0x1c, 0x00, + 0x82, 0x8d, 0x99, 0x66, 0xe5, 0xf7, 0x21, 0xcb, 0xb4, 0xeb, 0xab, 0x0f, 0xde, 0xbe, 0x5b, 0xc9, + 0x50, 0x50, 0xab, 0xa1, 0xf2, 0xbf, 0xc6, 0xb8, 0x09, 0x94, 0x22, 0x26, 0xf0, 0x02, 0x0a, 0xbc, + 0xa8, 0xc7, 0xaf, 0x16, 0x4b, 0x2c, 0x0b, 0xb9, 0x1d, 0xd1, 0x17, 0xaf, 0x5e, 0xb1, 0xbb, 0x05, + 0xb8, 0xfe, 0x6f, 0xf4, 0x7d, 0x7a, 0xf9, 0xd2, 0xc9, 0xc8, 0x15, 0x75, 0x8d, 0x85, 0x28, 0x1b, + 0x43, 0xaa, 0x82, 0x08, 0x7d, 0x0a, 0xc0, 0x8a, 0x66, 0xd8, 0xd0, 0x74, 0xc2, 0x02, 0x62, 0x52, + 0xcd, 0x0b, 0x48, 0x9d, 0xa0, 0xdb, 0xcc, 0xa3, 0x38, 0xb2, 0xc0, 0x90, 0x59, 0x36, 0xae, 0xb3, + 0xc2, 0xe1, 0x88, 0x99, 0x08, 0x43, 0x22, 0xce, 0x29, 0x20, 0x75, 0x82, 0x9e, 0x51, 0x1f, 0xa5, + 0x09, 0x7a, 0xf5, 0xb3, 0xc8, 0x8d, 0x4e, 0x79, 0x33, 0xb4, 0x1d, 0xa2, 0x32, 0xa4, 0x50, 0x0c, + 0x3d, 0xa4, 0x39, 0x35, 0xda, 0x85, 0x32, 0xdb, 0x98, 0x9e, 0x3d, 0x60, 0x01, 0x1b, 0x8b, 0xd3, + 0xfd, 0xbe, 0xcf, 0xaf, 0xda, 0xf6, 0x60, 0xcb, 0xc3, 0x8e, 0xe9, 0xb7, 0x39, 0xa3, 0x96, 0x9c, + 0x30, 0x16, 0x7d, 0x9f, 0xd7, 0x9d, 0xcb, 0x91, 0x9a, 0xdc, 0x2b, 0x7c, 0x14, 0x65, 0x64, 0xe5, + 0x67, 0x05, 0x0a, 0xa1, 0xe2, 0x47, 0x75, 0x8e, 0xb1, 0x7d, 0x2f, 0xae, 0x32, 0x14, 0x65, 0x0f, + 0xf3, 0xa1, 0x36, 0x54, 0x78, 0x2d, 0x26, 0x58, 0x04, 0xcf, 0xf0, 0x7f, 0x2b, 0xa8, 0x95, 0x53, + 0xfc, 0x95, 0xab, 0x28, 0x93, 0x31, 0x34, 0xda, 0x80, 0x34, 0x83, 0x88, 0x2b, 0xc0, 0x9d, 0xf1, + 0x69, 0xa2, 0xdc, 0x9c, 0x16, 0xbd, 0x80, 0xb2, 0x70, 0x14, 0x07, 0xbb, 0xa3, 0x3e, 0x71, 0xab, + 0x95, 0x88, 0xe3, 0x73, 0x77, 0x61, 0x8e, 0x5f, 0xe2, 0xa4, 0x2a, 0xa7, 0x44, 0x4f, 0xa1, 0xc8, + 0xae, 0xb6, 0x1e, 0xa7, 0xcc, 0x38, 0x67, 0xc7, 0x6e, 0xfd, 0x8c, 0xaf, 0x40, 0xc9, 0x3c, 0xae, + 0xaf, 0xc1, 0xbb, 0x51, 0xf9, 0x8c, 0xb3, 0x91, 0x7a, 0x96, 0xb8, 0x3e, 0xf1, 0x68, 0x53, 0x16, + 0xd4, 0x1e, 0xff, 0x73, 0x28, 0xf1, 0xec, 0xdb, 0xe3, 0x9e, 0x8f, 0x08, 0xcc, 0xf2, 0x6f, 0xce, + 0x5b, 0x64, 0x94, 0x1e, 0xe7, 0x3c, 0xa4, 0xb1, 0xe3, 0xd8, 0x8e, 0x38, 0xf5, 0xf9, 0x80, 0x9a, + 0x28, 0xfb, 0xc1, 0xb2, 0xf9, 0xea, 0x22, 0x2f, 0x1e, 0x31, 0x08, 0xcd, 0xdb, 0x69, 0x4a, 0x61, + 0x60, 0xa2, 0x9b, 0x7d, 0xb7, 0xba, 0xc0, 0x53, 0x0a, 0x31, 0x44, 0x5f, 0xc0, 0xac, 0x97, 0xc8, + 0x6b, 0x7d, 0xbb, 0xc7, 0xef, 0x8c, 0xb7, 0xf8, 0xfd, 0xd2, 0x43, 0xec, 0x0a, 0x38, 0x5a, 0x85, + 0xb9, 0x23, 0xbd, 0x77, 0x36, 0x1a, 0x6a, 0xa2, 0x62, 0xa0, 0x8d, 0x5c, 0x6c, 0x54, 0x6f, 0xf3, + 0x6a, 0x29, 0x47, 0x89, 0xc4, 0xf9, 0xd0, 0xc5, 0x06, 0xba, 0x0b, 0x05, 0x07, 0x13, 0xe7, 0x42, + 0x63, 0x47, 0x69, 0xf5, 0x0e, 0x13, 0x0b, 0x18, 0x68, 0x8b, 0x42, 0xd0, 0x97, 0x7e, 0xfd, 0x24, + 0x1b, 0x79, 0x61, 0x09, 0x14, 0x46, 0xe3, 0xfb, 0x66, 0xa2, 0x2a, 0x35, 0x25, 0xbf, 0x8a, 0xf2, + 0x85, 0xa8, 0xd0, 0x44, 0x2f, 0x17, 0x9e, 0xae, 0x04, 0x39, 0xaf, 0xd1, 0x7c, 0x15, 0x2a, 0xb9, + 0x14, 0xa3, 0x55, 0x9a, 0x90, 0x8e, 0x04, 0x93, 0x4f, 0xbc, 0x99, 0x87, 0xac, 0xc3, 0x2d, 0x8d, + 0xde, 0x0d, 0xb8, 0xa2, 0x6a, 0xbf, 0x48, 0x00, 0x04, 0xb2, 0xc5, 0xd7, 0xf7, 0x43, 0x61, 0x26, + 0x71, 0x5d, 0x98, 0x49, 0x8e, 0x87, 0x99, 0x25, 0xc8, 0x8d, 0xdd, 0xda, 0x93, 0xaa, 0x3f, 0x46, + 0xeb, 0x7e, 0xac, 0xe3, 0xf7, 0xbc, 0xa5, 0x98, 0x8d, 0x5a, 0x8d, 0x04, 0x3c, 0xdf, 0x52, 0x32, + 0x61, 0x4b, 0xa9, 0x41, 0xa9, 0xaf, 0xbb, 0xd4, 0x6c, 0xa9, 0x62, 0x74, 0x7e, 0x7d, 0x4b, 0xaa, + 0x05, 0x0a, 0x54, 0x29, 0xac, 0x4e, 0xa8, 0xb9, 0x50, 0xb4, 0x89, 0x5d, 0xb6, 0xc5, 0x25, 0xd5, + 0x1b, 0xd6, 0x56, 0x21, 0xc3, 0xbf, 0x82, 0x00, 0x32, 0xf5, 0xad, 0x6e, 0xeb, 0x1b, 0x45, 0x9e, + 0x41, 0x45, 0xc8, 0x6d, 0xb7, 0xf6, 0x5b, 0x9d, 0xa6, 0xd2, 0x90, 0x25, 0x8a, 0xd9, 0xae, 0xb7, + 0x76, 0x95, 0x86, 0x9c, 0xa8, 0xfd, 0x42, 0x82, 0x9c, 0xa7, 0x15, 0xaf, 0x1c, 0x14, 0xce, 0x05, + 0xbc, 0xf1, 0x47, 0xda, 0xb6, 0x4c, 0x64, 0xdb, 0x10, 0xa4, 0x5c, 0xf3, 0xa7, 0x58, 0x6c, 0x27, + 0xfb, 0x4d, 0xe9, 0x7d, 0x43, 0xe7, 0x09, 0x92, 0x3f, 0xae, 0xfd, 0x5b, 0x02, 0x8a, 0x61, 0x9b, + 0xb8, 0x5c, 0xa4, 0x91, 0x26, 0x2e, 0xd2, 0xe4, 0xae, 0x28, 0xd2, 0x84, 0xe5, 0x4d, 0x5c, 0x21, + 0x6f, 0x32, 0x24, 0xef, 0x17, 0x30, 0xeb, 0x4f, 0xec, 0x0b, 0xce, 0x73, 0x3e, 0xd9, 0x43, 0xf8, + 0x1e, 0xfa, 0x14, 0x16, 0xc7, 0x45, 0xf1, 0x39, 0x78, 0xb8, 0x98, 0x0f, 0x8b, 0xe3, 0x73, 0xdd, + 0xa7, 0x57, 0x3a, 0x1e, 0xcd, 0xb8, 0xa7, 0xa6, 0xd9, 0xf7, 0x8b, 0x02, 0xc8, 0x7d, 0x75, 0x5c, + 0x43, 0x99, 0xeb, 0x34, 0x94, 0x1d, 0xd3, 0x50, 0xed, 0x2f, 0x25, 0x80, 0x20, 0x9e, 0x4d, 0x5e, + 0xe5, 0xb8, 0x1b, 0x94, 0x28, 0xa8, 0x50, 0x12, 0x9b, 0xd5, 0xab, 0x46, 0x5c, 0x16, 0x69, 0x0a, + 0xa3, 0xa9, 0xbd, 0x4d, 0xc0, 0x42, 0x7d, 0x44, 0xec, 0x4b, 0xe7, 0x5c, 0xe8, 0xa5, 0x55, 0x9a, + 0xe8, 0xa5, 0x75, 0x26, 0xf6, 0xa5, 0x35, 0xf1, 0x9e, 0x97, 0xd6, 0x99, 0xd0, 0x4b, 0xeb, 0x8f, + 0xc4, 0x09, 0xe4, 0x3d, 0xb7, 0x26, 0xd9, 0x51, 0xb0, 0x14, 0x57, 0x5f, 0x15, 0x2f, 0xaf, 0xec, + 0x28, 0x6a, 0x8b, 0xd7, 0x57, 0x25, 0x38, 0x8a, 0xbc, 0x19, 0x52, 0x6c, 0x86, 0x6b, 0x2b, 0xcb, + 0xfe, 0x89, 0x24, 0xa6, 0xa1, 0xd1, 0x4e, 0xbc, 0x99, 0xd7, 0xfe, 0x2a, 0x01, 0x15, 0xba, 0x39, + 0xa1, 0x23, 0x77, 0xac, 0x94, 0x2b, 0x4d, 0x50, 0xca, 0x4d, 0x5f, 0x57, 0x14, 0x4a, 0x4c, 0x54, + 0x48, 0x49, 0x4e, 0x5c, 0x48, 0x49, 0x4d, 0x5f, 0x48, 0xc9, 0x4c, 0x5b, 0x14, 0xfa, 0xa7, 0x14, + 0xcc, 0xc5, 0xe4, 0x73, 0x34, 0x5d, 0xe6, 0xf9, 0x5c, 0x24, 0x5d, 0xe6, 0x40, 0x9a, 0x2e, 0x8b, + 0x5f, 0xf4, 0x5e, 0x5c, 0xe1, 0xcf, 0xb6, 0xf6, 0xf1, 0xb1, 0x8b, 0x89, 0x36, 0x70, 0x85, 0xcd, + 0x96, 0x18, 0xb8, 0xcd, 0xa0, 0x7b, 0x2e, 0x0d, 0xd1, 0xd8, 0x32, 0x42, 0x54, 0xdc, 0x78, 0x0b, + 0xd8, 0x32, 0x7c, 0x9a, 0x70, 0x77, 0x42, 0x6a, 0xea, 0xee, 0x84, 0xf4, 0xc4, 0xdd, 0x09, 0x99, + 0xe9, 0xba, 0x13, 0xb2, 0x37, 0xe8, 0x4e, 0xc8, 0x7d, 0x58, 0x77, 0x42, 0x7e, 0xf2, 0xee, 0x04, + 0x98, 0xbe, 0x3b, 0xa1, 0x70, 0xa3, 0xee, 0x84, 0x7f, 0xcf, 0xc0, 0xd2, 0xd5, 0x49, 0xfc, 0xf5, + 0xb7, 0xe3, 0xe0, 0x12, 0x99, 0xb8, 0xa6, 0x8d, 0x21, 0x19, 0x6d, 0x20, 0xf8, 0x0a, 0xf8, 0x0b, + 0x98, 0x36, 0x30, 0xdf, 0x98, 0xd6, 0x49, 0xb5, 0xc2, 0x34, 0x12, 0x79, 0x66, 0xdf, 0x63, 0x38, + 0x95, 0xbf, 0x28, 0xf2, 0x41, 0xa4, 0xf3, 0x20, 0x35, 0x41, 0xff, 0x43, 0x3a, 0xa6, 0xff, 0x01, + 0x3d, 0x15, 0xb9, 0x19, 0x37, 0x9c, 0x6b, 0xa2, 0x18, 0xcb, 0xb7, 0xbc, 0x87, 0xb4, 0x8d, 0x48, + 0x22, 0x18, 0xff, 0x90, 0x26, 0x58, 0xbc, 0x34, 0xf0, 0xeb, 0x50, 0x66, 0x07, 0xef, 0x7f, 0x4c, + 0x13, 0xdc, 0xc1, 0x83, 0x5a, 0x60, 0xb6, 0xb9, 0x1b, 0x98, 0x6d, 0x7e, 0x0a, 0xb3, 0x8d, 0x86, + 0xfa, 0xc2, 0x74, 0xa1, 0xfe, 0x77, 0xfc, 0x7b, 0x8e, 0x37, 0x41, 0x31, 0x7a, 0xe9, 0x08, 0xed, + 0x96, 0x77, 0xd3, 0xb9, 0xe6, 0xa0, 0x28, 0x4d, 0x7f, 0x50, 0xa0, 0x1f, 0x78, 0x57, 0x17, 0x6f, + 0x92, 0x32, 0x9b, 0x24, 0xf6, 0x35, 0x52, 0xdc, 0x5d, 0x3c, 0xd6, 0xb0, 0x63, 0xc9, 0x93, 0x3b, + 0x16, 0xff, 0x50, 0xf8, 0x84, 0xfa, 0xdf, 0x34, 0xc8, 0xd1, 0x9b, 0xed, 0x77, 0xd4, 0x6b, 0x53, + 0x8c, 0xef, 0xb5, 0xf1, 0xed, 0x3e, 0xf5, 0x81, 0x76, 0x9f, 0xfe, 0x30, 0xbb, 0xcf, 0xdc, 0xc8, + 0xee, 0xbf, 0xab, 0x70, 0x1d, 0xb5, 0xfb, 0xfc, 0x4d, 0xed, 0x1e, 0x6e, 0x66, 0xf7, 0x85, 0x8f, + 0x61, 0xf7, 0xa5, 0x0f, 0xb2, 0xfb, 0xf2, 0x4d, 0xec, 0xfe, 0x1f, 0x53, 0x50, 0xbd, 0xaa, 0x34, + 0x73, 0xfd, 0x69, 0x12, 0x6e, 0x82, 0x4a, 0x44, 0x9a, 0xa0, 0xbe, 0x07, 0xc5, 0xb1, 0xee, 0x27, + 0xee, 0x09, 0x05, 0x37, 0xe8, 0x7b, 0x0a, 0x99, 0x4c, 0xea, 0x06, 0x59, 0x71, 0xfa, 0x06, 0x59, + 0x71, 0xe6, 0xa6, 0x26, 0x93, 0xbd, 0x99, 0xc9, 0xe4, 0x3e, 0x86, 0xc9, 0xe4, 0x3f, 0xc8, 0x64, + 0x60, 0x42, 0x93, 0x09, 0x19, 0xca, 0x5f, 0x64, 0xe0, 0xce, 0x35, 0x85, 0xb7, 0xeb, 0x6d, 0xe5, + 0x19, 0xf0, 0xc6, 0x9f, 0xa0, 0x4d, 0x30, 0x11, 0xb4, 0x09, 0x32, 0x8c, 0x68, 0x13, 0x54, 0xc3, + 0x23, 0x83, 0xf2, 0x45, 0xda, 0x0b, 0x93, 0xf1, 0xed, 0x85, 0x91, 0xe6, 0xc2, 0x5f, 0x53, 0xe8, + 0xcc, 0xdd, 0x28, 0x74, 0x66, 0x6e, 0x10, 0x3a, 0xb3, 0xbf, 0x49, 0x19, 0x3e, 0xc4, 0x0f, 0x2a, + 0x37, 0x09, 0x9d, 0xbf, 0x92, 0x00, 0x5d, 0xae, 0x21, 0x5f, 0xef, 0x08, 0x0f, 0x42, 0x9d, 0x86, + 0x89, 0x4b, 0x9d, 0x86, 0x41, 0x9f, 0xe1, 0x13, 0x61, 0xc0, 0xc9, 0x48, 0xf1, 0xbd, 0x61, 0x3a, + 0xb8, 0x47, 0x62, 0xfa, 0xc6, 0x3e, 0x87, 0xd2, 0x6b, 0x7c, 0xe4, 0xda, 0xbd, 0x33, 0x4c, 0x82, + 0x56, 0xe2, 0xe6, 0x8c, 0x5a, 0xf4, 0xc1, 0x34, 0x97, 0x0e, 0x2f, 0x3e, 0x3d, 0xed, 0xe2, 0x6b, + 0x7f, 0x9d, 0x00, 0x39, 0x2a, 0xc1, 0x6f, 0xee, 0xf1, 0xbf, 0x4c, 0xc0, 0xec, 0x25, 0x9f, 0xf9, + 0xae, 0x1a, 0xdc, 0x32, 0xd7, 0xed, 0x66, 0x72, 0xa2, 0xdd, 0x4c, 0x4d, 0xbc, 0x9b, 0xe9, 0xe9, + 0x77, 0x33, 0x3b, 0xed, 0x6e, 0x7e, 0xeb, 0xbd, 0x9e, 0xee, 0xb2, 0xcb, 0xe9, 0x07, 0xbc, 0x9e, + 0x5e, 0x71, 0xcd, 0xad, 0xfd, 0x8d, 0xff, 0x30, 0xdb, 0x11, 0xef, 0x35, 0x53, 0x4f, 0x2d, 0x9e, + 0x5b, 0xb9, 0xa8, 0x5a, 0xa8, 0xfb, 0xaf, 0xa4, 0x1b, 0x06, 0x57, 0x7c, 0xe4, 0xb9, 0x35, 0x4c, + 0x9a, 0x0c, 0x3f, 0xb7, 0x06, 0xd4, 0xb5, 0x1f, 0x40, 0x79, 0xfc, 0x71, 0x02, 0x3d, 0x84, 0x94, + 0x69, 0x1d, 0xdb, 0x97, 0x5e, 0x9b, 0x43, 0x8f, 0x4e, 0x8c, 0x60, 0xf9, 0x15, 0x14, 0xc3, 0xfd, + 0xd2, 0x68, 0x11, 0x50, 0xfd, 0xb0, 0xd1, 0x6a, 0x6b, 0x5b, 0xcd, 0xfa, 0xfe, 0xbe, 0xb2, 0xab, + 0x6d, 0xb6, 0xbb, 0x4d, 0x79, 0xe6, 0x32, 0x7c, 0x57, 0xd9, 0xee, 0xca, 0x12, 0xba, 0x05, 0x73, + 0xe3, 0x70, 0xb5, 0xb5, 0xd3, 0xec, 0xca, 0x89, 0xe5, 0x7f, 0x91, 0x60, 0x21, 0xf6, 0x00, 0x42, + 0x32, 0x14, 0x9b, 0xeb, 0xcf, 0x9e, 0x6a, 0x5f, 0xad, 0xaf, 0x1d, 0x68, 0x1b, 0x6b, 0xf2, 0xcc, + 0x38, 0xe4, 0xd9, 0x9a, 0x2c, 0xa1, 0x59, 0x28, 0x31, 0xc8, 0x6f, 0xaf, 0x3d, 0xe7, 0x44, 0x89, + 0x08, 0xe8, 0xd9, 0x9a, 0x9c, 0x44, 0xb7, 0x61, 0xe1, 0xa0, 0xad, 0x76, 0xd5, 0x7a, 0xab, 0xab, + 0x8d, 0x4d, 0x99, 0xba, 0x02, 0xf5, 0x6c, 0x4d, 0x4e, 0xa3, 0x25, 0x58, 0x1c, 0x47, 0xf9, 0x1f, + 0xc9, 0x5c, 0x85, 0x7b, 0xb6, 0x26, 0x67, 0x97, 0x37, 0x45, 0x8f, 0x75, 0xe0, 0x76, 0x68, 0x1e, + 0xe4, 0x86, 0xb2, 0x5d, 0x3f, 0xdc, 0xed, 0x6a, 0xdb, 0xad, 0x5d, 0xa5, 0xfb, 0x07, 0x07, 0x8a, + 0x3c, 0x83, 0xb2, 0x90, 0xdc, 0x3b, 0x78, 0x2a, 0x4b, 0xf4, 0x47, 0x7b, 0x67, 0x47, 0x4e, 0x70, + 0xc8, 0x86, 0x9c, 0x5c, 0x6e, 0x7a, 0x9a, 0xf2, 0xda, 0x34, 0xc3, 0x53, 0x1c, 0xa8, 0xed, 0x6e, + 0x7b, 0xab, 0xbd, 0x2b, 0xcf, 0xa0, 0x1c, 0xa4, 0xd4, 0xee, 0xde, 0x01, 0x9f, 0xa3, 0xa3, 0x76, + 0xe5, 0x04, 0x2a, 0x41, 0xfe, 0x95, 0xb2, 0xd9, 0x69, 0x6f, 0xbd, 0x54, 0xba, 0x72, 0x72, 0x79, + 0x1f, 0x16, 0x62, 0xfb, 0x3e, 0xd1, 0x7d, 0xb8, 0xeb, 0x4d, 0xd8, 0x51, 0x76, 0xf6, 0x94, 0xfd, + 0xae, 0xd2, 0x60, 0xd2, 0x85, 0xe7, 0xa7, 0x3b, 0xbe, 0xdb, 0x09, 0x20, 0xd2, 0xf2, 0x93, 0x48, + 0xdf, 0xa9, 0xe8, 0xc9, 0xcb, 0x43, 0xba, 0xb5, 0xdf, 0x50, 0xbe, 0x95, 0x67, 0xa8, 0x00, 0xdd, + 0xd6, 0x9e, 0xd2, 0xe9, 0xd6, 0xa9, 0x60, 0xcb, 0xc7, 0x50, 0x89, 0x34, 0xf4, 0x51, 0x23, 0x69, + 0xed, 0xd5, 0x77, 0x14, 0xad, 0x73, 0xb8, 0xbd, 0xdd, 0xfa, 0x56, 0xf3, 0x38, 0x97, 0x60, 0x71, + 0x0c, 0x1e, 0x9a, 0x06, 0xdd, 0x85, 0x3b, 0x63, 0xb8, 0xfd, 0xf6, 0xbe, 0xa2, 0xb5, 0xbf, 0x51, + 0xd4, 0x57, 0x6a, 0xab, 0xab, 0xc8, 0x89, 0xe5, 0x1f, 0x83, 0x1c, 0x7d, 0x73, 0xa7, 0x13, 0x2a, + 0x3b, 0xaa, 0xd2, 0xe9, 0x68, 0x9d, 0xf6, 0xa1, 0xba, 0xa5, 0x68, 0x74, 0xe7, 0xb5, 0x57, 0xca, + 0x26, 0xff, 0x58, 0x0c, 0xae, 0xd3, 0x78, 0x29, 0x4b, 0xcb, 0x7f, 0x2f, 0x41, 0x31, 0xfc, 0x12, + 0x8f, 0xe6, 0xa0, 0xe2, 0x11, 0x77, 0xeb, 0x6a, 0xb7, 0xb5, 0xbf, 0x23, 0xcf, 0x50, 0x4b, 0x13, + 0x40, 0xf1, 0x9c, 0x24, 0x85, 0x40, 0xca, 0x7e, 0x83, 0x52, 0x25, 0x42, 0xac, 0x5b, 0xed, 0xbd, + 0x83, 0x5d, 0xa5, 0xab, 0xc8, 0xc9, 0x10, 0x9d, 0x78, 0x6f, 0x4a, 0x21, 0x04, 0x65, 0x6f, 0xb6, + 0xcd, 0xb6, 0xda, 0x55, 0x1a, 0x72, 0x1a, 0x55, 0x61, 0x5e, 0xc0, 0x76, 0x5b, 0x7b, 0xad, 0xae, + 0xa6, 0x2a, 0xf5, 0xad, 0xa6, 0xd2, 0x90, 0x33, 0xcb, 0x87, 0xe2, 0xbf, 0x39, 0x44, 0x05, 0x0c, + 0x41, 0xd9, 0x53, 0xe6, 0x5e, 0xeb, 0x5b, 0x2e, 0xde, 0x22, 0xa0, 0xc6, 0x61, 0x7d, 0xd7, 0xf7, + 0xb8, 0xfa, 0x8e, 0xb2, 0x4f, 0x5d, 0x71, 0x09, 0x16, 0xc7, 0xe1, 0xbb, 0x5d, 0x45, 0xdd, 0xaf, + 0xd3, 0x4d, 0x5c, 0xff, 0xdb, 0x34, 0x64, 0x44, 0xd9, 0xbc, 0x0b, 0x55, 0x56, 0x24, 0x88, 0x29, + 0x02, 0xa2, 0x49, 0xde, 0xf9, 0x97, 0xe2, 0x7a, 0x57, 0xd0, 0xef, 0x51, 0xc3, 0xd6, 0x1d, 0xe2, + 0x97, 0x40, 0xd0, 0xd5, 0x0f, 0xfe, 0xf1, 0x33, 0x1c, 0xc0, 0x22, 0x9b, 0xe1, 0xf2, 0xfb, 0xc7, + 0xfb, 0x7b, 0x00, 0xe2, 0x67, 0xfc, 0x06, 0x6e, 0xb3, 0x19, 0xe3, 0x6e, 0x1d, 0x68, 0xa2, 0x6e, + 0x80, 0xf8, 0x79, 0x1b, 0x20, 0x07, 0xf3, 0x8a, 0xe9, 0xae, 0xeb, 0x0a, 0x88, 0x9f, 0xa5, 0x0e, + 0xc5, 0xf0, 0x39, 0x85, 0x82, 0xfc, 0x35, 0xe6, 0xf8, 0x7a, 0xcf, 0x14, 0x3c, 0xa6, 0x5c, 0x9a, + 0x62, 0xec, 0x98, 0x8a, 0x9f, 0x42, 0x01, 0x08, 0xba, 0x95, 0x50, 0x90, 0xc3, 0x5f, 0xea, 0x9b, + 0x5a, 0xba, 0x13, 0x8b, 0x13, 0xed, 0x4d, 0x3f, 0x02, 0x08, 0x1a, 0x7e, 0x50, 0xf8, 0x29, 0x38, + 0xd2, 0x05, 0x14, 0x2b, 0xc5, 0xe6, 0xf6, 0x1f, 0xde, 0x3f, 0x31, 0xc9, 0xe9, 0xe8, 0x68, 0xb5, + 0x67, 0x0f, 0x9e, 0x08, 0x82, 0x27, 0x5e, 0x03, 0xbb, 0x07, 0xf8, 0x79, 0xa2, 0xb4, 0x6b, 0x9e, + 0xe3, 0x97, 0xbc, 0xed, 0x8e, 0xd8, 0xff, 0x95, 0x28, 0x8b, 0xf1, 0x8b, 0x17, 0x0c, 0x70, 0x94, + 0x61, 0x2c, 0x1b, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe8, 0xb8, 0x76, 0xef, 0xa8, 0x39, 0x00, + 0x00, }